当前位置: 首页 > news >正文

B076-项目实战--宠物上下架 展示 领养 收购订单

目录

      • 上下架功能提供
        • 后台宠物列表实现
      • 前台展示
        • 前台宠物列表和详情展示
        • 店铺展示
      • 领养
        • 分析
        • 前台
        • 后端
          • PetController
          • PetServiceImpl
      • 订单
        • 需求分析
          • 可能产生订单的模块
          • 订单模块额外功能
        • 订单设计
          • 表设计
          • 流程设计
        • 集成基础代码
        • 收购订单
          • 创建订单
            • 前端
            • 后端

上下架功能提供

后台宠物列表实现

后端:拷贝product模块,替换大小写字母,调整字段名,时间显示格式等,
后台:拷贝资源中的pet.vue,配置路由,调整变量名,

前台展示

前台宠物列表和详情展示

前台拷贝product.html为pet.html,替换大小写字母,首页跳转过来,pet能跳转其他,
前台拷贝productDetail.html为petDetail.html,替换大小写字母,改预定须知为领养须知,
修改后端loadById查详情sql,前端取店名展示

    <resultMap id="petMap" type="Pet"><id property="id" column="id"></id><result property="name" column="name"></result><result property="resources" column="resources"></result><result property="saleprice" column="saleprice"></result><result property="costprice" column="costprice"></result><result property="offsaletime" column="offsaletime"></result><result property="onsaletime" column="onsaletime"></result><result property="state" column="state"></result><result property="createtime" column="createtime"></result><!--private PetDetail detail = new PetDetail();--><association property="detail" javaType="PetDetail"><id property="id" column="pdid"></id><result property="intro" column="intro"></result><result property="adoptNotice" column="adoptNotice"></result></association><association property="shop" javaType="Shop"><id property="id" column="sid"></id><result property="name" column="sname"></result></association></resultMap><select id="loadById" parameterType="long" resultMap="petMap">selectp.*,pd.id pdid,pd.intro,pd.adoptNotice,s.id sid,s.name snamefrom t_pet pLEFT JOIN t_pet_detail pd on p.id = pd.pet_idLEFT join t_shop s on p.shop_id = s.idwhere p.id = #{id}</select>
                <!--名称--><div class="tb-detail-hd"><h1>【{{pet.shop.name}}】 {{pet.name}}</h1></div>

店铺展示

petDetail页面的大包装右边展示店铺名称
通过:href="shopUrl"携带shopid跳往shop页面

<li class="qc last"><a :href="shopUrl" style="color: green">{{pet.shop.name}}</a></li>
shopUrl:"",
mounted(){let petId = parseUrlParams2Obj(location.href).petId;this.$http.get("/pet/"+petId).then(result=>{this.pet = result.data;if(this.pet.resources){this.resources = this.pet.resources.split(',');}this.shopUrl = "shop.html?shopId="+this.pet.shop.id;}).catch(result=>{console.log(result);alert("系统错误");})}

拷贝success页面为shop页面,替换引入路径,修改标题,引入vue和Axios,
写个div把body以内全包起来,发请求拿shop数据过来展示,

 <script type="text/javascript">new Vue({el:"#myShop",data:{shop:{}},methods:{getShop(){let shopId = parseUrlParams2Obj(location.href).shopId;this.$http.get("/shop/"+shopId).then(result=>{this.shop = result.data;$("#myTitle").html(this.shop.name);//自己去yyy}).catch(result=>{console.log(result);alert("系统错误");})}},mounted(){this.getShop();}})</script>

领养

分析

领养即购买,立即领养进入领养流程,购物车可通过加一个表实现(包含userid和宠物信息),

点击立即购买后流程:
传入宠物信息,修改为下架,绑定购买者userid,生成订单和支付(这两个放到后面)

前台

petDetail页面把立即购买包进div里,
立即购买超链接绑定事件,发请求到后端进入处理流程,(扩展:处理完后进入个人中心-我的领养 展示宠物表中userId是自己的)

<a id="LikBuy" title="点此按钮到下一步确认购买信息" href="javascript:;" @click="adopt">立即购买</a>
		adopt(){let petId = this.pet.id;let flag = window.confirm("你确认领养吗?")if(flag){this.$http.get("/pet/adopt/"+petId).then(result=>{result = result.data;if(result.success){alert("领养成功!");//本来应该跳转到个人中心,查案个人领养宠物信息//这里我们就跳转到首页location.href="index.html";}else{alert(result.message);}}).catch(result=>{alert("系统错误");})}//location.href="adoptOrder.html?petId="+this.pet.id;}

后端

PetController
    /*** 领养宠物*/@GetMapping("/adopt/{petId}")public AjaxResult adopt(@PathVariable("petId") Long petId, HttpServletRequest request){try {Logininfo loginIn = LoginContext.getLoginIn(request);petService.adopt(petId,loginIn.getId());return AjaxResult.me();} catch (Exception e) {e.printStackTrace();return AjaxResult.me().setMessage("领养失败!"+e.getMessage());}}
PetServiceImpl
    @Overridepublic void adopt(Long petId, Long loginInfoId) {//1.修改状态  下架Pet pet = petMapper.loadById(petId);pet.setState(0);pet.setOffsaletime(new Date());//2.绑定用户User user = userMapper.loadByloginInfoId(loginInfoId);pet.setUser(user);pet.setUser_id(user.getId());pet.setShop_id(pet.getShop().getId());//3.保存petMapper.update(pet);//@TODO 生成领养订单  + 支付System.out.println("领养成功!");}

订单

需求分析

可能产生订单的模块

1.宠物收购订单-店家给用户钱
垫付:用户立马就能获取到钱,员工定时报账。
余额支付:付款余额,用户可以提现。 平台相当于给了用户钱,店家用给平台钱。
银行转账:银行转账,店家财务依次给用户转账。
2.服务订单(多次消费)-用户给店家钱
3.领养订单(一次)-用户给店家钱
4.充值订单(一次)-用户充值平台,用户消费后,平台要给店铺打钱。
5.商品订单(多次)-用户给店家钱

特别说明一下:
大平台一般钱先到平台,用户确认后,平台才划账到店家。如果用户长时间不确认,自动确认。
我们小平台直接到店家,我们没有支付牌照。

每一类型的订单都要有独立的表来存

订单模块额外功能

1.系统报表、财务报表等
2.商家的账单下载(easyPOI的导入与导出)
3.系统对账服务(退款,支付异常等)
4.30分钟未支付取消订单(定时器)

订单设计

表设计

九张: 用户地址 订单地址 收购订单 领养订单 充值订单 商品订单 商品订单详情 服务订单 服务订单详情

我们需要关心的五张表:
t_user_address:用户地址,
t_order_address:订单地址,下单时的用户地址,绑定某个订单
t_order_pet_acquisition:收购订单,一次性,不需要存详情
t_order_adopt:领养订单,一次性,不需要存详情
t_order_product:服务订单,可多次消费,需要存详情
在这里插入图片描述

在这里插入图片描述

流程设计

用户付钱给商家,两个定时任务
在这里插入图片描述
商家付款给用户(收购订单)
在这里插入图片描述
工作人员上门,应该带一个手提电脑,处理完并下单。以后需要商家版App,可以在上面操作,不需要手提电脑。

集成基础代码

拷贝资源

收购订单

创建订单
前端

待处理消息处理窗口增加支付选项下拉框

后端

SearchMasterMsgController

    /*** 处理消息*/@PutMapping("/handle")public AjaxResult handle(@RequestBody Pet pet,HttpServletRequest request){try {Logininfo loginIn = LoginContext.getLoginIn(request);seachMasterMsgService.handle(pet,loginIn.getId());return AjaxResult.me();} catch (Exception e) {e.printStackTrace();return AjaxResult.me().setMessage("处理失败!"+e.getMessage());}}

SearchMasterMsgServiceImpl

	/*** 处理消息*/@Overridepublic void handle(Pet pet,Long loginInfoId) {//1.改状态  --已处理searchMasterMsgMapper.updateStateForProcessed(pet.getSearch_master_msg_id());//2.生成宠物基本信息petMapper.save(pet);//3.宠物详情PetDetail detail = pet.getDetail();if(detail != null){detail.setPet_id(pet.getId());petDetailMapper.save(detail);}//4.生成订单Employee employee = employeeMapper.loadByLoginInfoId(loginInfoId);SearchMasterMsg searchMasterMsg = searchMasterMsgMapper.loadById(pet.getSearch_master_msg_id());PetAcquisitionOrder order = pet2order(pet, searchMasterMsg, employee.getId());petAcquisitionOrderMapper.save(order);//5.生成支付@TODO}private PetAcquisitionOrder pet2order(Pet pet, SearchMasterMsg adopt,Long employeeId) {PetAcquisitionOrder order = new PetAcquisitionOrder();order.setDigest("[摘要]对"+pet.getName()+"收购订单!");order.setState(0);//待支付order.setPrice(pet.getCostprice());order.setAddress(adopt.getAddress());String orderSn = CodeGenerateUtils.generateOrderSn(adopt.getUser_id());order.setOrderSn(orderSn);order.setPet_id(pet.getId());order.setUser_id(adopt.getUser_id());order.setPaytype(0);order.setShop_id(pet.getShop_id());order.setEmp_id(employeeId);return order;}

相关文章:

B076-项目实战--宠物上下架 展示 领养 收购订单

目录 上下架功能提供后台宠物列表实现 前台展示前台宠物列表和详情展示店铺展示 领养分析前台后端PetControllerPetServiceImpl 订单需求分析可能产生订单的模块订单模块额外功能 订单设计表设计流程设计 集成基础代码收购订单创建订单前端后端 上下架功能提供 后台宠物列表实…...

【iOS】—— 持久化

文章目录 数据持久化的目的iOS中数据持久化方案数据持久化方式分类内存缓存磁盘缓存 沙盒机制获取应用程序的沙盒路径沙盒目录的获取方式 持久化数据存储方式XML属性列表Preferences偏好设置&#xff08;UserDefaults&#xff09;数据库存储什么是序列化和反序列化&#xff0c;…...

教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023

1. 本篇适用范围与目的 1.1. 适用范围 严格使用 Vue3 TypeScript 的前端项目&#xff0c;包管理器默认使用 pnpm 构建工具使用 Vite4 使用原生 CesiumJS 依赖做应用开发 客户端渲染&#xff0c;因为我不太熟悉 Vue 的服务端渲染&#xff0c;有本篇的介绍后&#xff0c;熟悉…...

最优化方法

一. 图论 1.最小生成树 图的生成树是它的一颗含有其所有顶点的无环连通子图,一 幅加权图的最小生成树(MST)是它的一颗权值(树中的所有边的权值之和) 最小的生成树 • 适用场景&#xff1a;道路规划、通讯网络规划、管道铺设、电线布设等 题目数据 kruskal算法 稀疏图&#x…...

Mongodb 多文档聚合操作处理方法二(Map-reduce 函数)

聚合 聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来&#xff1a; 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作&#xff0c;您可以使用&#xff1a; 聚合管道 单一目的聚合方法 Map-reduce 函…...

ant design vue j-modal 修改高度

问题描述 今天在项目中遇到关于j-modal组件修改弹窗大小问题&#xff0c;我尝试使用直接使用:height"300"&#xff0c;没用效果&#xff0c;弹窗大小依然和没改之前一样&#xff0c;后来找到了这种方式可以去修改j-modal弹窗大小&#xff0c;下面来看下代码实现&…...

spring学习笔记七

一、自动装配 1.1、BookDao接口和实现类 public interface BookDao {void save(); } public class BookDaoImpl implements BookDao {public void save(){System.out.println("book dao save......");} } 1.2、BookService接口和实现类 public interface BookSer…...

hw技战法整理参考

目录 IP溯源反制 账户安全策略及预警 蜜罐部署联动方案...

uniapp 全局数据(globalData)的设置,获取,更改

globalData&#xff0c;这是一种简单的全局变量机制。这套机制在uni-app里也可以使用&#xff0c;并且全端通用 因为uniapp基本上都是将页面&#xff0c;或者页面中相同的部分&#xff0c;进行组件化&#xff0c;所以会存在父&#xff0c;子&#xff0c;&#xff08;子&#xf…...

Profinet转EtherNet/IP网关连接AB PLC的应用案例

西门子S7-1500 PLC&#xff08;profinet&#xff09;与AB PLC以太网通讯&#xff08;EtherNet/IP&#xff09;。本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关&#xff0c;连接西门子S7-1500 PLC与AB PLC 通讯的配置过程&#xff0c;供大家参考。 1, 新建工程&…...

Python组合模式介绍、使用方法

一、Python组合模式介绍 概念&#xff1a; 组合模式(Composite Pattern)是一种结构型设计模式&#xff0c;它通过将对象组合成树状结构来表示“整体/部分”层次结构&#xff0c;让客户端可以以相同的方式处理单个对象和组合对象。 功能&#xff1a; 统一对待组合对象和叶子对…...

生成模型和判别模型工作原理介绍

您解决的大多数机器学习和深度学习问题都是从生成模型和判别模型中概念化的。在机器学习中,人们可以清楚地区分两种建模类型: 将图像分类为狗或猫属于判别性建模生成逼真的狗或猫图像是一个生成建模问题神经网络被采用得越多,生成域和判别域就增长得越多。要理解基于这些模型…...

shardingsphere读写分离配置

注&#xff1a; 如果是升级之前的单库单表&#xff0c;要将之前的 数据库接池 druid-spring-boot-starter 注释掉&#xff0c;换成 druid&#xff0c;否则无法连接数据库。 原因&#xff1a; 因为数据连接池的starter&#xff08;比如druid&#xff09;可能会先加载并且其创…...

登录报错 “msg“:“Request method ‘GET‘ not supported“,“code“:500

1. 登录失败 2. 排查原因, 把 PostMapping请求注释掉, 或改成GetMapping请求就不会报错 3. 找到SecurityConfig.java , 新增 .antMatchers("/**/**").permitAll() //匹配允许所有路径 4. 登录成功...

Python 日期和时间

Python 日期和时间 Python 程序能用很多方式处理日期和时间&#xff0c;转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜&#xff08;历元&…...

pytorch的发展历史,与其他框架的联系

我一直是这样以为的&#xff1a;pytorch的底层实现是c(这一点没有问题&#xff0c;见下边的pytorch结构图),然后这个部分顺理成章的被命名为torch,并提供c接口,我们在python中常用的是带有python接口的&#xff0c;所以被称为pytorch。昨天无意中看到Torch是由lua语言写的&…...

Kibana-elastic--Elastic Stack--ELK Stack

Kibana 是什么&#xff1f; | Elastic 将数据转变为结果、响应和解决方案 使用 Kibana 针对大规模数据快速运行数据分析&#xff0c;以实现可观测性、安全和搜索。对来自任何来源的任何数据进行全面透彻的分析&#xff0c;从威胁情报到搜索分析&#xff0c;从日志到应用程序监测…...

Docker复杂命令便捷操作

启动所有状态为Created的容器 要启动所有状态为"created"的Docker容器&#xff0c;可以使用以下命令&#xff1a; docker container start $(docker container ls -aq --filter "statuscreated")上述命令执行了以下步骤&#xff1a; docker container l…...

Python中的datetime模块

time模块用于取得UNIX纪元时间戳&#xff0c;并加以处理。但是&#xff0c;如果以方便的格式显示日期&#xff0c;或对日期进行算数运算&#xff0c;就应该使用datetime模块。 目录 1. datetime数据类型 1&#xff09; datetime.datetime.now()表示特定时刻 2&#xff09;da…...

Flutter - 微信朋友圈、十字滑动效果(微博/抖音个人中心效果)

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 前言 一般APP都有类似微博/抖音个人中心的效果&#xff0c;支持上下拉刷新&#xff0c;并且顶部有个图片可以下拉放大&#xff0c;图片底部是几个tab&#xff0c;可…...

MySQL检索数据和排序数据

目录 一、select语句 1.检索单个列&#xff08;SELECT 列名 FROM 表名;&#xff09; 2.检索多个列&#xff08;SELECT 列名1&#xff0c;列名2&#xff0c;列名3 FROM 表名;&#xff09; 3.检索所有的列&#xff08;SELECT * FROM 表名;&#xff09; 4.检索不同的行&#x…...

通过STM32内部ADC将烟雾传感器发送的信号值显示在OLED上

一.CubeMX配置 首先我们在CubeMX配置ADC1, 设置一个定时器TIM2定时1s采样一次以及刷新一次OLED&#xff0c; 打开IIC用于驱动OLED显示屏。 二.程序 在Keil5中添加好oled的显示库&#xff0c;以及用来显示的函数、初始化函数、清屏函数等。在主程序中初始化oled,并将其清屏。…...

ZEPHYR 快速开发指南

简介 国内小伙伴在学习zephyr的时候&#xff0c;有以下几个痛点&#xff1a; 学习门槛过高github访问不畅&#xff0c;下载起来比较费劲。 这篇文章将我自己踩的坑介绍一下&#xff0c;顺便给大家优化一些地方&#xff0c;避免掉所有的坑。 首先用virtualbox 来安装一个ubu…...

【FPGA + 串口】功能完备的串口测试模块,三种模式:自发自收、交叉收发、内源

【FPGA 串口】功能完备的串口测试模块&#xff0c;三种模式&#xff1a;自发自收、交叉收发、内源 VIO 控制单元 wire [1:0] mode;vio_uart UART_VIO (.clk(ad9361_l_clk), // input wire clk.probe_out0(mode) // output wire [1 : 0] probe_out0 );将 mod…...

初步了解预训练语言模型BERT

本文字数&#xff1a;&#xff1a;4024字 预计阅读时间&#xff1a;12分钟 BERT是由Google提出的预训练语言模型&#xff0c;它基于transformer架构&#xff0c;被广泛应用于自然语言处理领域&#xff0c;是当前自然语言处理领域最流行的预训练模型之一。而了解BERT需要先了解注…...

Android Hook系统 Handler 消息实现

前言 主线程的Handler 主要依赖于 ActivityThread&#xff0c;Android是消息驱动&#xff0c;比如view的刷新&#xff0c;activity的创建等&#xff0c;如果能打印系统层Handler消息日志&#xff0c;就需要对于系统层的Handler 进行Hook 原理 ActivityThread中 mH对象主要负责…...

R语言从入门到精通之【R语言的使用】

系列文章目录 1.R语言从入门到精通之【R语言介绍】 2.R语言从入门到精通之【R语言下载与安装】 3.R语言从入门到精通之【R语言的使用】 文章目录 系列文章目录一、新手上路1.R语句构成2.获取帮助3.工作空间二、包1.包的安装2.实践应用总结一、新手上路 1.R语句构成 R语句由函…...

WPF实战学习笔记29-登录数据绑定,编写登录服务

添加登录绑定字段、命令、方法 修改对象&#xff1a;Mytodo.ViewModels.ViewModels using Mytodo.Service; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; using System; using System.CodeDom.Compiler; using System.Collec…...

c++函数式编程:统计文件字符串,文件流

头文件 #include <iostream> #include <fstream> #include <string> #include <sstream> #include <algorithm> #include <vector>统计方法 int count_lines(const std::string &filename) {std::ifstream in{filename};return std:…...

scp命令----跨服务器传输文件

scp命令 Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的&#xff0c;rcp 是不加密的&#xff0c;scp 是 rcp 的加强版。 一、Linux scp 命令 以下是scp命令常用的…...

自己做一个网站一年的费用/seo搜索引擎工具

首先做一个窗体如下 然后单元中如下代码&#xff1a; 在implementation下面声明两个方法如下&#xff1a; //外部方法&#xff0c;只声明一个参数&#xff0c;此时按照标准的对象内部事件方法TNotifyEvent声明,此声明中&#xff0c;Sender则对应为产生该事件的对象指针。…...

广州云脑网站建设/媒体吧软文平台

效果&#xff1a; 代码&#xff1a; 第一步&#xff1a;页面底部放两个浮动层&#xff0c;让指向图标不透明&#xff1a; <div class"share" style"display:none;filter:alpha(Opacity30);-moz-opacity:0.9;opacity: 0.5;width:100%;height:90%; background:…...

哪个网站做漂流瓶任务/个人网站设计方案

3dsmax是一款很重要的3d场景绘制软件&#xff0c;可以做3d游戏&#xff0c;3d场景建模&#xff0c;3d动画等&#xff0c;但是软件比较大&#xff0c;安装也比较难&#xff0c;这就直接导致很多人心有余而力不足&#xff0c;想学&#xff0c;却找不到抓手&#xff0c;所以&#…...

微信分销网站建设比较好/2023网站推广入口

2008年的年末到2009年的初始&#xff0c;翻过C的书、VC的教程&#xff0c;看过VC的视频&#xff0c;试图编写过VC的程序&#xff1b;安装过Delphi 7的程序&#xff0c;翻过Diphi的基础教程&#xff1b;甚至下载过Java的视频教程。而VB6的程序&#xff0c;几乎一个没写&#xff…...

常州网站制作czyzj/能打开任何网站浏览器

1. Python时间类型简介 Python中常用的时间表示方法有以下几种&#xff1a; 时间戳格式化的时间字符串time模块的time.struct_time类datetime模块的datetime类 其中 时间戳&#xff08;imestamp&#xff09; 又称为Unix时间、POSIX时间。它表示从格林尼治时间1970年1月1日0时…...

怎么弄网站/广告营销公司

org.hibernate.cfg.Configuration实例代表了应用程序到SQL数据库的映射配置&#xff0c; Configuration对象提供了一个buildSessionFactory方法&#xff0c;该方法可以产生一个不可变的SessionFactory对象。 也可以直接实例化Configuration来获取一个实例&#xff0c;并为它指…...