分布式项目17 订单order,用dubbo来实现

news2024/11/18 1:47:58

说明:只要当一个订单生成时,处理订单的信息之外,还有订单中包含的订单商品数据以及订单物流信息,而订单的信息封装在“tb_order”表中,关于tb_order表结构如下图所示:
在这里插入图片描述
订单商品数据封装在“tb_order_item”表结构如图所示:
在这里插入图片描述
说明:tb_order表和tb_order_item表的关系是一对多的关系,因为一个订单中可以包含多个商品。订单物流数据封装“tb_order_shipping”表,表结构如图所示:

在这里插入图片描述
说明:tb_order表和tb_order_shipping表示一对一的关系。因为一个订单只会对应一条物流信息。
第一步:创建jt-order系统
01.创建jt-order系统
在这里插入图片描述
02.编辑jt-order项目的pom.xml文件
在这里插入图片描述
从jt-sso中的pom.xml文件中复制一个插件

<build>
<plugins>
<!--跳过测试类打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

03.导入资源
说明:将课程资料中的day18—src导入到自己创建的jt-order项目中。
在这里插入图片描述
04.创建pojo对象
在这里插入图片描述
05.创建独立接口DubboOrderService
说明:在jt-common项目下的com.jt.service包下创建DubboOrderService接口
代码如下:

package com.jt.service;
public interface DubboOrderService {
}

06.修改DubboOrderServiceImpl实现类,代码如下:

@Service
public class DubboOrderServiceImpl implements DubboOrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderShippingMapper orderShippingMapper;
@Autowired
private OrderItemMapper orderItemMapper;
}

将jt-order项目下的redis.properties文件删掉,如图所示:
在这里插入图片描述
07.修改jt-order项目下的application.yml文件

server:
port: 8095
servlet:
context-path: /
spring:
datasource:
#引入druid数据源
#type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jtdb?
serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true
&allowMultiQueries=true
username: root
password: root
#mybatis-plush配置
mybatis-plus:
type-aliases-package: com.jt.pojo
mapper-locations: classpath:/mybatis/mappers/*.xml
configuration:
map-underscore-to-camel-case: true
#引入日志信息
logging:
level:
com.jt.mapper: debug
#dubbo配置
dubbo:
scan:
basePackages: com.jt
application:
name: provider-order
registry:
address: zookeeper://192.168.126.129:2181?
backup=192.168.126.129:2182,192.168.126.129:2183
protocol:
name: dubbo
port: 20882

第二步:订单提交业务
01.页面url分析
在这里插入图片描述
02.页面js(order.js)分析

function submit_Order() {
$("#submit_message").hide();
jQuery.ajax( {
type : "POST",
dataType : "json",
url : "/order/submit",
//获取整个表单数据
data : $("#orderForm").serialize(),
cache : false,
success : function(result) {
if(result.status == 200){
location.href = "/order/success.html?id="+result.data;
}else{
$("#submit_message").html("订单提交失败,请稍后重试...").show();
}
},
error : function(error) {
$("#submit_message").html("亲爱的用户请不要频繁点击, 请稍后重
试...").show();
}
});
}

03.表单数据
在这里插入图片描述
04.order-cart.jsp分析

<form id="orderForm" class="hide">
<input type="hidden" name="paymentType" value="1"/>
<c:forEach items="${carts}" var="cart" varStatus="status">
<--计算订单的总价格-->
<c:set var="totalPrice" value="${ totalPrice + (cart.itemPrice *
cart.num)}"/>
<input type="hidden" name="orderItems[${status.index}].itemId"
value="${cart.itemId}"/>
<input type="hidden" name="orderItems[${status.index}].num"
value="${cart.num }"/>
<input type="hidden" name="orderItems[${status.index}].price"
value="${cart.itemPrice}"/>
<input type="hidden" name="orderItems[${status.index}].totalFee"
value="${cart.itemPrice * cart.num}"/>
<input type="hidden" name="orderItems[${status.index}].title"
value="${cart.itemTitle}"/>
<input type="hidden" name="orderItems[${status.index}].picPath"
value="${cart.itemImage}"/>
</c:forEach>
<input type="hidden" name="payment" value="<fmt:formatNumber
groupingUsed="false" maxFractionDigits="2" minFractionDigits="2"
value="${totalPrice/100 }"/>"/>
<input type="hidden" name="orderShipping.receiverName" value="陈晨"/>
<input type="hidden" name="orderShipping.receiverMobile"
value="13800807944"/>
<input type="hidden" name="orderShipping.receiverState" value="北京"/>
<input type="hidden" name="orderShipping.receiverCity" value="北京"/>
<input type="hidden" name="orderShipping.receiverDistrict" value="海淀
区"/>
<input type="hidden" name="orderShipping.receiverAddress" value="清华大
学"/>
</form>

05.订单入库业务实现
第一步:编辑jt-web的OrderController

@Controller
@RequestMapping("/order")
public class OrderController {
@Reference(check = false)
private DubboCartService cartService;
@Reference(check = false)
private DubboOrderService orderService;
/**
* 实现订单入库功能
* url:http://www.jt.com/order/submit
* 参数:表单数据,使用对象接
* 返回值:SysResult对象包含orderId(后期需要基于orderId实现订单信息的回显)
*/
@RequestMapping("/submit")
@ResponseBody
public SysResult saveOrder(Order order,HttpServletRequest request) {
//动态获取userId
User user = (User)request.getAttribute("JT_USER");
Long userId=user.getId();
order.setUserId(userId);
String orderId = orderService.saveOrder(order);
return SysResult.success(orderId);
}
}

第二步:编辑DubboOrderService独立接口

public interface DubboOrderService {
String saveOrder(Order order);
}

第三步:编辑DubboOrderServiceImpl

/**
* 业务分析:
* 表单数据提交
* 表单数据包含订单信息,订单商品信息以及订单物流信息
* 所以这三部分数据需要同时在三张表中实现入库
* orderId=用户登录id+当前时间戳
*/
@Override
public String saveOrder(Order order) {
//1.动态生成orderId
String orderId=""+order.getUserId()+System.currentTimeMillis();
//2.完成订单信息,订单商品信息以及订单物流信息数据的入库
//2.1订单入库
Date date=new Date();
order.setOrderId(orderId).setStatus(1).setCreated(date).setUpdated(date);
orderMapper.insert(order);
System.out.println("订单入库成功!");
//2.2订单商品信息的入库
List<OrderItem> orderItems = order.getOrderItems();
for (OrderItem orderItem : orderItems) {
orderItem.setOrderId(orderId).setCreated(date).setUpdated(date);
orderItemMapper.insert(orderItem);
}
System.out.println("订单商品信息入库成功!");
//2.3订单物流信息的入库
OrderShipping orderShipping = order.getOrderShipping();
orderShipping.setOrderId(orderId).setCreated(date).setUpdated(date);
orderShippingMapper.insert(orderShipping);
System.out.println("订单物流信息入库成功");
return orderId;
}

06.订单回显业务实现
第一步:页面url分析
在这里插入图片描述
第二步:页面JS分析

<div class="mc" id="success_detail">
<ul class="list-order">
<li class="li-st">
<div class="fore1">订单号:<a
href="javascript:void(0)">${order.orderId}</a></div>
<!-- 货到付款 -->
<div class="fore2">货到付款:<strong class="ftx-
01">${order.payment}元</strong></div>
<div class="fore3">
京淘快递 &nbsp; 送货时间: 预计 ${date} 送达&nbsp;
</div>
</li>
</ul>
<!-- 在线支付按钮 -->
<div id="bookDiv"></div>
<p class="i-tips01">
您的订单已经在处理中,发货后订单内容会显示承运人联系方式,
如有必要您可以联系对方
</p>
</div>
</div>

第三步:编辑jt-web的OrderController

@Controller
@RequestMapping("/order")
public class OrderController {
@Reference(check = false)
private DubboCartService cartService;
@Reference(check = false)
private DubboOrderService orderService;
/**
* 需求:根据orderId查询订单信息 3张表查询
* url:http://www.jt.com/order/success.html?id=121622786609949
* 参数:orderId
* 返回值:具体页面信息
*/
@RequestMapping("/success")
public String success(@RequestParam("id")String orderId,Model model) {
//1.根据orderId查询order对象信息
Order order=orderService.findOrderById(orderId);
model.addAttribute("order", order);
return "success";
}
}

第四步:编辑DubboOrderService接口

public interface DubboOrderService {
Order findOrderById(String orderId);
}

第五步:
编辑DubboOrderServiceImpl实现类

@Override
public Order findOrderById(String orderId) {
//1.根据orderId查询订单信息
Order order = orderMapper.selectById(orderId);
//对订单的创建时间进行重新的封装(+3天),这个是预测货单到达时间
Calendar calender=Calendar.getInstance();
calender.setTime(order.getCreated());
calender.add(Calendar.DAY_OF_MONTH, 3);//+3天
order.setCreated(calender.getTime());
//2.根据订单id查询订单物流信息
OrderShipping shipping = orderShippingMapper.selectById(orderId);
//3.根据订单id查询订单商品信息
QueryWrapper<OrderItem> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("order_id", orderId);
List<OrderItem> items = orderItemMapper.selectList(queryWrapper);
//4.将商品信息和物流信息封装到订单对象中
order.setOrderItems(items).setOrderShipping(shipping);
return order;
}

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

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

相关文章

STM32使用PWM实现led亮度变化

原理及代码讲解 1.序言2.频率3.占空比4.控制led亮度变化原理5.代码实例5.1 初始化引脚5.2 配置定时器15.3配置输出PWM 6.结语 1.序言 这里我以stm32F103c8te为例&#xff0c;讲解一下pwm如何输出&#xff0c; pwm又是如何控制led灯的亮度变化&#xff0c;以及具体代码又是 如何…

53、基于51单片机蓄电池充电器过充过放保护LCD液晶屏显示系统设计(程序+原理图+PCB源文件+参考论文+参考PPT+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;AT89C52是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&…

STL之Stack与queue的模拟实现与duque的底层结构(3千字长文详解)

STL之Stack与queue的模拟实现与duque的底层结构 文章目录 STL之Stack与queue的模拟实现与duque的底层结构设计模式的概念适配器模式 stack的实现queue的实现双端队列——dequedeque的底层结构 设计模式的概念 设计模式像是古代的兵法&#xff0c;是以前的人总结出来的一些在特定…

TClientDataSet 模拟 EXCEL表

日常处理数据时&#xff0c;经常需要&#xff0c;从EXCEL表格中&#xff0c;批量导入数据&#xff0c;通过 XLSReadWriteII编程&#xff0c;会很快导入。 但是&#xff0c;客户提供的EXCEL表的字段&#xff0c;数据格式&#xff0c;字段的排序&#xff0c;有很大的区别。因此&a…

PostmanScript脚本功能使用详解!

目录 前言&#xff1a; 一、Pre-requestScript 二、TestScript 三、随机参数&#xff1a; 前言&#xff1a; Postman 是一个强大的 API 工具&#xff0c;可以用于构建、测试和文档化 Web API。Postman 还提供了一个名为 PostmanScript 的功能&#xff0c;它可以用于自动化…

【5】Midjourney Prompt

Prompt 是Midjourney Bot解释以生成图像的简短文本短语。 Midjourney Bot将Prompt 中的单词和短语分解成为Token的较小部分&#xff0c;可以将其与训练数据进行比较&#xff0c;然后用于生成图像。 精心制作的 Prompt可以帮助生成独特且令人兴奋的图像。 Structure 结构 基本…

Spring Boot + Vue3前后端分离实战wiki知识库系统<八>--分类管理功能开发二

接着上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统&#xff1c;七&#xff1e;--分类管理功能开发的分类功能继续完善。 分类编辑功能优化&#xff1a; 概述&#xff1a; 现在分类编辑时的界面长这样&#xff1a; 很明显目前的父分类的展现形式不太人性&#xf…

【JVM】JVM常用指令

文章目录 1、jps2、jinfo3、jstat4、jstack5、jmap6、jhat 1、jps jps&#xff08;java process status tool&#xff09;&#xff0c; 用于查看java进程及相关信息&#xff0c;如果你想找到一个java进程的pid&#xff0c;可以使用jps命令代替linux的ps命令。 命令格式&#…

ansible常见模块应用简介

目录 command, shell, raw模块file 模块copy 模块fetch 模块lineinfile模块unarchive解包解压缩 模块user 模块yum_repository 仓库管理yum/dnf模块Service/systemd模块firewalld 模块nmcli 模块get_url 模块mount模块 注意&#xff1a;该文档需要有 Linux 基础的看 command, s…

【架构基础】高内聚低耦合

软件设计目标&#xff1a;实现需求、易于重用、易于理解、没有冗余。 Dont reinvent the wheel, just realign it. --Anthony J D’ Angelo 高内聚低耦合&#xff0c;是软件工程中判断软件设计好坏的标准。主要评判模块或类的内聚性是否高&#xff0c;耦合度是否低。目的是使…

【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

TCP的安全和效率机制

目录 0.TCP协议格式 ​编辑 一.确认应答(安全机制) 二.超时重传(安全机制) 1.SYN丢包 2.ACK丢包 三.连接管理(安全机制) 1.三次握手建立连接 ​编辑 2.四次挥手断开连接 3.建立和断开连接 四.滑动窗口(效率机制) 五.流量控制(效率机制) 六.拥塞控制(安全机制) 七…

算法扩展第一次:收集雪花 【hash表,双指针,stl中的map】

算法详解 这道题需要新学的知识一个是双指针&#xff0c;一个是c库中的unordered_map容器 双指针 双指针原先我写过很多这方面的题&#xff0c;但是这道题我一开始是低估了它的难度&#xff0c;而且压根没有想到要用双指针&#xff0c;属于是长见识了&#xff0c;这道题的双…

Virtual box安装Ubuntu1804乱码

Virtual box安装Ubuntu1804乱码 1. 首先检查编码格式 运行以下命令打开locale配置文件&#xff1a; sudo nano /etc/default/locale2. 可能缺少字体&#xff0c;打开终端&#xff0c;先执行更新 sudo apt-get update 接着进入设置&#xff0c;搜索language&#xff0c;进入…

机器学习-搭建轻量级GPT2训练对话

在自己的机器上部署一个GPT简直太酷啦&#xff0c;因为模型数据缘故&#xff0c;所以这个机器人有时候傻傻的。。。 需要安装环境&#xff1a;python3.7 、Transformers4.2.0、pytorch1.7.0、nginx&#xff08;映射网页文件&#xff09; 我的系统&#xff1a;MAC m2 Mac默认是…

Jmeter如何安装jp@gc - Ultimate Thread Group插件(终极线程组)

首先明确一点&#xff0c;我们为什么要做压力测试&#xff1f; 压力测试是为了确保系统能够在负载高峰期和长时间运行的情况下保持高性能、稳定和可靠。同时也是软件开发生命周期中不可或缺的一环&#xff0c;帮助开发人员和系统管理员优化和调整系统&#xff0c;以提供卓越的…

2023春期末考试选择题R2-8计算最小生成树总权重详解

题目如图&#xff1a; 分析和计算&#xff1a; 题目给出一个图的邻接矩阵表示&#xff0c;要求求最小生成树的总开销。 根据Kruskal算法&#xff0c;根据邻接矩阵顶点连接情况&#xff0c;收集开销最小的边&#xff0c;直到所有顶点被收集&#xff0c;且无环路&#xff0c;即…

Debian 12 “bookworm“ 发布 - 通用操作系统

Debian 12 “bookworm” 发布 - 通用操作系统 基于 Linux kernel 6.1 LTS&#xff0c;支持 APFS 读写 请访问原文链接&#xff1a;https://sysin.org/blog/debian-12/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Debian 1…

(数组) 1365. 有多少小于当前数字的数字 ——【Leetcode每日一题】

❓1365. 有多少小于当前数字的数字 难度&#xff1a;简单 给你一个数组 nums&#xff0c;对于其中每个元素 nums[i]&#xff0c;请你统计数组中比它小的所有数字的数目。 换而言之&#xff0c;对于每个 nums[i] 你必须计算出有效的 j 的数量&#xff0c;其中 j 满足 j ! i 且…

希捷科技:具有周期性价值的全球云存储之王

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;根据Statista的数据&#xff0c;希捷科技是全球硬盘驱动器市场的领导者&#xff0c;在全球拥有约43%的市场份额。 &#xff08;2&#xff09;希捷科技的管理层近期已经宣布了一…