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

news2024/11/16 9:32:09

目录

      • 上下架功能提供
        • 后台宠物列表实现
      • 前台展示
        • 前台宠物列表和详情展示
        • 店铺展示
      • 领养
        • 分析
        • 前台
        • 后端
          • 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">
        select
         p.*,
         pd.id pdid,pd.intro,pd.adoptNotice,
         s.id sid,s.name sname
         from t_pet p
        LEFT JOIN t_pet_detail pd on p.id = pd.pet_id
        LEFT join t_shop s on p.shop_id = s.id
        where 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
    @Override
    public 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

	/**
     * 处理消息
     */
    @Override
    public 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;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/799457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生成虚拟淘宝购买记录截图图片制作

大家都知道&#xff0c;淘宝购买记录截图在某些情况下非常重要&#xff0c;但手动制作却非常繁琐&#xff0c;耗费时间和精力。如果你也遇到了这个问题&#xff0c;那么不妨试试淘宝订单生成器&#xff0c;它能够帮助你轻松生成淘宝购买记录截图&#xff0c;提升工作效率。 虚拟…

Docker 容器高级操作

Docker容器高级操作 Docker容器创建、停止、启动、删除等基础操作上篇已述,然Docker容器被广大开发者青睐,不可能只有如此简单的功能,必有高阶功法。那么接下来 让我们一同走进容器操作的高级篇,领略其高级操作的魅力。 查看容器 docker ps -a | grep tomcat [root@tudou…

【数据结构】实验十:哈夫曼编码

实验十 哈夫曼编码 一、实验目的与要求 1&#xff09;掌握树、森林与二叉树的转换&#xff1b; 2&#xff09;掌握哈夫曼树和哈夫曼编码算法的实现&#xff1b; 二、 实验内容 1. 请编程实现如图所示的树转化为二叉树。 2. 编程实现一个哈夫曼编码系统&#xff0c;系统功能…

PingCAP 陈煜琦:深耕中国市场,构建客户成功生态

在 PingCAP 用户峰会 2023 上&#xff0c;PingCAP 副总裁陈煜琦分享了“激流入海&#xff0c;PingCAP 中国业务发展策略”的演讲&#xff0c;介绍了 PingCAP 在技术层面的发展方向&#xff0c;强调了 PingCAP 服务于中国企业客户的重要性&#xff0c;并介绍了 PingCAP 助力 客户…

Pytest学习教程_基础知识(一)

前言 pytest是一个用于编写和执行Python单元测试的框架。它提供了丰富的功能和灵活性&#xff0c;使得编写和运行测试变得简单而高效。 pytest的一些主要特点和解释如下&#xff1a; 自动发现测试&#xff1a;pytest会自动查找以"test_"开头的文件、类和函数&#x…

TEE GP(Global Platform)功能认证方案

TEE之GP(Global Platform)认证汇总 一、功能认证介绍 二、功能认证测试套和测试工具 1、“测试套件”是指由GlobalPlatform测试文档、测试脚本和/或其他材料组成的套件&#xff0c;基于给定的GlobalPlatform规范和相关配置&#xff0c;由GlobalPlatform发布&#xff0c;目的是…

【C++】类和对象-对象特性

1.构造函数和析构函数 2.函数的分类以及调用 以后采用括号法 int main() { /******************************************///test01();//test02();Person p;/******************************************/system("pause");return 0; }&#xff08;1&#xff09…

行业追踪,2023-07-27

自动复盘 2023-07-27 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

linux系统下(centos7.9)安装Jenkins全流程

一、卸载历史版本 # rpm卸载 rpm -e jenkins# 检查是否卸载成功 rpm -ql jenkins# 彻底删除残留文件 find / -iname jenkins | xargs -n 1000 rm -rf二、环境依赖安装 yum -y install epel-releaseyum -y install daemonize三、安装Jenkins Jenkins官网传送带&#xff1a; …

【bar堆叠图形绘制】

绘制条形图示例 在数据可视化中&#xff0c;条形图是一种常用的图表类型&#xff0c;用于比较不同类别的数据值。Python的matplotlib库为我们提供了方便易用的功能来绘制条形图。 1. 基本条形图 首先&#xff0c;我们展示如何绘制基本的条形图。假设我们有一个包含十个类别的…

【数据结构】实验四:循环链表

实验四 循环链表 一、实验目的与要求 1&#xff09;熟悉循环链表的类型定义和基本操作&#xff1b; 2&#xff09;灵活应用循环链表解决具体应用问题。 二、实验内容 题目一&#xff1a;有n个小孩围成一圈&#xff0c;给他们从1开始依次编号&#xff0c;从编号为1的小孩开…

写给新手的单元测试框架unittest运行的简单问题

当使用unittest框架编写和运行单元测试时&#xff0c;需要遵循以下步骤&#xff1a; 1、导入unittest模块&#xff1a;在代码中首先导入unittest模块。 import unittest 2、创建测试类&#xff1a;创建一个继承自unittest.TestCase的测试类。该类将包含一系列测试方法。 cla…

#P1006. [NOIP2010普及组] 三国游戏

题目描述 小涵很喜欢电脑游戏&#xff0c;这些天他正在玩一个叫做《三国》的游戏。 在游戏中&#xff0c;小涵和计算机各执一方&#xff0c;组建各自的军队进行对战。游戏中共有 NN 位武将&#xff08;NN为偶数且不小于44&#xff09;&#xff0c;任意两个武将之间有一个“默…

什么是低代码开发平台?它可以实现哪些功能?

什么是低代码开发平台&#xff1f; 低代码来源于英文“Low Code&#xff0c;它意指一种快速开发的方式&#xff0c;使用最少的代码、以最快的速度来交付应用程序。通俗的来说&#xff0c;就是所需代码数量低&#xff0c;开发人员门槛低&#xff0c;操作难度低。一般采用简单的…

模拟实现二叉搜索树

1、TreeSet和TreeMap插入元素时一定要比较大小&#xff0c;因为其底层是红黑树&#xff08;由二叉搜索树调整形成&#xff09;。 2、删除二叉搜索树的目标节点时有三种情况&#xff1a; &#xff08;1&#xff09;cur.leftnull ①cur是root&#xff0c;则rootcur.right ②cur不…

一百多行 C 语言代码实现一个简单异步事件触发机制!

一、简介 QT 中有一种异步处理机制叫做信号和槽函数&#xff0c;通过将信号与槽函数进行绑定连接&#xff0c;后续若该信号触发&#xff0c;会自动调用对应的槽函数。这种机制很适合处理很繁琐的逻辑程序&#xff0c;例如我点击界面的 close 按钮&#xff0c;便触发 close 信号…

基于穷举搜索的AI自动实现俄罗斯方块游戏(核心代码详解)

一、算法思想核心 这个俄罗斯方块AI的核心思想是通过穷举搜索当前形状和下一个形状的所有可能的放置组合&#xff0c;并为每个组合计算一个得分。得分是根据游戏板面的状态来评估每个组合的优劣&#xff0c;最终选择得分最高的放置策略。 具体的实现步骤和核心思想如下&#…

怎么恢复回收站清空的文件,教你三种恢复的方法

不论是笔记本电脑还是台式机电脑&#xff0c;都有回收站这样的“后悔药”&#xff0c;我们许多误删除的文件夹、图片、视频、文档等都能从它里面找到&#xff0c;回收站在灵活运用下能更好地为我们服务&#xff0c;但是使用过程中难免会出现失误&#xff0c;比如说不小心清空了…

pdf合并大小不一样怎么办?有这几个方法就够了

pdf合并大小不一样怎么办&#xff1f;在日常工作和生活中&#xff0c;我们经常需要处理PDF文件。在将多个PDF文件合并成一个时&#xff0c;由于这些文件的大小和格式可能不同&#xff0c;可能会遇到一些问题。但不用担心&#xff0c;接下来将介绍几种方法来解决这个问题。 方法…

JAVA缓存技术介绍

OSCache OSCache是个一个广泛采用的高性能的J2EE缓存框架&#xff0c;OSCache能用于任何Java应用程序的普通的缓存解决方案。 OSCache有以下特点&#xff1a; 我创建了一个群&#xff0c;群里不定期分享技术干货&#xff0c;行业秘闻&#xff0c;汇集各类奇妙好玩的话题和流行动…