电商系统-下单功能 - 努力-

news/2026/1/25 21:14:40/文章来源:https://www.cnblogs.com/kongsq/p/19530507

一、 订单结算页

本文介绍:订单结算页,用户地址列表,支付方式选择,用户商品清单,生成订单
,分布式ID,库存扣减,增加用户积分业务功能。

1.1 订单结算页

用户收货地址列表
用户从购物车页面点击结算,跳转到订单结算页,结算页需要加载用户对应的收件地址,我们可以根据用户登录名去tb_address表中查询对应的数据。

默认收件地址选中,记录选中收件人

配置路由Gateway网关,application.yml添加:

  predicates:- Path=/api/webcart/**,/api/weborder/**

网关过滤器,添加 order微服务,支付方式选中

 public static String filterPath="/api/weborder/**";

获取用户地址接口

1.2 购物车清单:

二、下单功能

点击提交订单的时候,会立即创建订单数据,创建订单数据会将数据存入到2张表中,分别是订单表和订单明细表,此处还需要修改商品对应的库存数量。

2.1 生成订单号

import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.NetworkInterface;/*** <p>名称:IdWorker.java</p>* <p>描述:分布式自增长ID</p>* @author */
public class IdWorker {// 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)private final static long twepoch = 1288834974657L;// 机器标识位数private final static long workerIdBits = 5L;// 数据中心标识位数private final static long datacenterIdBits = 5L;// 机器ID最大值private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);// 数据中心ID最大值private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);// 毫秒内自增位private final static long sequenceBits = 12L;// 机器ID偏左移12位private final static long workerIdShift = sequenceBits;// 数据中心ID左移17位private final static long datacenterIdShift = sequenceBits + workerIdBits;// 时间毫秒左移22位private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;private final static long sequenceMask = -1L ^ (-1L << sequenceBits);/* 上次生产id时间戳 */private static long lastTimestamp = -1L;// 0,并发控制private long sequence = 0L;private final long workerId;// 数据标识id部分private final long datacenterId;public IdWorker(){this.datacenterId = getDatacenterId(maxDatacenterId);this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);}/*** @param workerId*            工作机器ID* @param datacenterId*            序列号*/public IdWorker(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}/*** 获取下一个ID** @return*/public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}if (lastTimestamp == timestamp) {// 当前毫秒内,则+1sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {// 当前毫秒内计数满了,则等待下一秒timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;// ID偏移组合生成最终的ID,并返回IDlong nextId = ((timestamp - twepoch) << timestampLeftShift)| (datacenterId << datacenterIdShift)| (workerId << workerIdShift) | sequence;return nextId;}private long tilNextMillis(final long lastTimestamp) {long timestamp = this.timeGen();while (timestamp <= lastTimestamp) {timestamp = this.timeGen();}return timestamp;}private long timeGen() {return System.currentTimeMillis();}/*** <p>* 获取 maxWorkerId* </p>*/protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {StringBuffer mpid = new StringBuffer();mpid.append(datacenterId);String name = ManagementFactory.getRuntimeMXBean().getName();if (!name.isEmpty()) {/** GET jvmPid*/mpid.append(name.split("@")[0]);}/** MAC + PID 的 hashcode 获取16个低位*/return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);}/*** <p>* 数据标识id部分* </p>*/protected static long getDatacenterId(long maxDatacenterId) {long id = 0L;try {InetAddress ip = InetAddress.getLocalHost();NetworkInterface network = NetworkInterface.getByInetAddress(ip);if (network == null) {id = 1L;} else {byte[] mac = network.getHardwareAddress();id = ((0x000000FF & (long) mac[mac.length - 1])| (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;id = id % (maxDatacenterId + 1);}} catch (Exception e) {System.out.println(" getDatacenterId: " + e.getMessage());}return id;}public static void main(String[] args) {IdWorker idWorker=new IdWorker(0,0);for(int i=0;i<10000;i++){long nextId = idWorker.nextId();System.out.println(nextId);}}}

2.2 下单实现

订单表和订单详细表;
1)获取所有购物项
2)统计计算:总金额,总数量
3)填充订单数据并保存
4)获取每一个购物项保存到orderItem
5)删除购物车中数据

2.3 库存扣减

我们在下单之后,应该调用商品微服务,将下单的商品库存减少,销量增加。每次订单微服务只需要将用户名传到商品微服务,库存减少需要控制当前商品库存>=销售数量。

2.4 增加积分

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

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

相关文章

软件测试—即时通讯测试方法

一、即时通讯实现方式 1.短轮询&#xff08;Short Polling&#xff09; 短轮询是一种客户端定期向服务器发送HTTP请求以检查是否有新数据的简单技术。无论服务器是否有新数据&#xff0c;客户端都会在固定的时间间隔后再次请求。 实现机制 客户端向服务器发送HTTP请求&#xff…

告别if-else噩梦:流程编排技术

作为一个优秀的程序员&#xff0c;要守住职业的底线。能简单快速的完成的一件事&#xff0c;就一定要用简单的方案快速完成。不可过度的设计&#xff0c;始终保持系统的简洁&#xff01; 曾几何时&#xff0c;我对于流程编排这件事 嗤之以鼻&#xff0c;为什么呢&#xff1f;我…

attn_scores注意力分计算-记录

querys 是 2*6*2&#xff0c;keys也是2*6*2 attn_scores querys keys.transpose(1,2)attn_scores 最终维度是 266&#xff1b;数值上是两个矩阵的批量矩阵乘法结果&#xff0c;每个样本对应一个 66 的注意力分数矩阵 transpose(1,2) 交换 keys 的第 1 维和第 2 维&#xff1…

多头注意力中的张量重塑

view PyTorch 的view() 是张量「重塑&#xff08;Reshape&#xff09;」函数&#xff0c;用于改变张量的维度形状但不改变数据本身 在多头注意力中&#xff0c;view()的核心作用是将总隐藏维度拆分为「注意力头数 单头维度」&#xff0c;实现多头并行计算 核心规则 tensor.vie…

第二周作业wp

第二周作业wp [SWPUCTF 2021 新生赛]easyupload3.0 题目提示已经很明显了&#xff0c;我们要提交一个.jpg的文件。那么我们就把一个木马文件做成jpg文件。 这里我们把文件成功上传&#xff0c;然后通过蚁剑连接 连接之后&#xff0c;寻找flag。 如图&#xff0c;成功找到。 2…

吐血推荐专科生必用TOP9AI论文网站

吐血推荐专科生必用TOP9AI论文网站 2026年专科生论文写作工具测评&#xff1a;为何需要一份精准榜单&#xff1f; 随着AI技术在教育领域的深入应用&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上五花八门的论文辅助平台&#xff0c;…

Python 调用大模型(LLM) - 努力-

Python 调用大模型(LLM)Python 调用大模型(LLM),提示词工程一、提示词工程 提示词(Prompt):是引导大模型(LLM)进行内容生成的命令(一句话、一个问题等)。 提示词工程(Prompt Enginnering):通过有技巧的编写提示…

Python核心语法-Python自定义模块、Python包 - 努力-

Python核心语法-Python自定义模块、Python包Python核心语法,Python自定义模块、Python包一、python 模块 Python模块(module):一个Python文件(.py)就是一个模块,模块是Python程序的基本组织单位。在模块中可以定义…

亲测好用9个一键生成论文工具,助本科生轻松写论文!

亲测好用9个一键生成论文工具&#xff0c;助本科生轻松写论文&#xff01; AI 工具的崛起&#xff0c;让论文写作不再难 对于本科生来说&#xff0c;写论文一直是令人头疼的事情。从选题、查资料到撰写和降重&#xff0c;每一个环节都可能成为“卡壳”的点。而随着 AI 技术的不…

为什么您的机房必须选择本地化 U 位资产管理系统?供应商服务深度解析

机房 U 位资产管理是数据中心运营的核心环节&#xff0c;传统云端管理模式在实时性、数据安全与服务响应上的短板&#xff0c;进一步放大了空间利用率低、资产跟踪难、安全合规难三大痛点&#xff0c;成为机房高效运营的阻碍。本地化 U 位资产管理系统依托数据本地存储、实时交…

人群仿真软件:Vadere_(3).用户界面操作

用户界面操作 1. 基本操作 Vadere是一款强大的人群仿真软件&#xff0c;其用户界面设计旨在为用户提供直观且易用的操作体验。在本节中&#xff0c;我们将详细介绍如何进行基本的用户界面操作&#xff0c;包括启动软件、创建和加载仿真场景、基本导航和工具栏的使用。 1.1 启…

人群仿真软件:Vadere_(1).Vadere简介与安装

Vadere简介与安装 Vadere简介 Vadere是一款开源的人群仿真软件&#xff0c;旨在模拟复杂环境中的行人流动行为。它结合了多种先进的仿真算法和模型&#xff0c;能够准确地预测和分析人群在不同环境下的动态行为。Vadere不仅可以用于学术研究&#xff0c;还可以在城市规划、建…

人群仿真软件:Vadere_(2).Vadere基本操作与界面

Vadere基本操作与界面 启动Vadere 启动过程 Vadere是一款基于Java的人群仿真软件&#xff0c;可以通过以下步骤启动&#xff1a; 安装Java环境&#xff1a;确保您的计算机上安装了Java运行环境&#xff08;JRE&#xff09;或Java开发工具包&#xff08;JDK&#xff09;。您可…

AI原生应用领域:思维树带来的变革

AI原生应用领域&#xff1a;思维树带来的变革 关键词&#xff1a;AI原生应用、思维树&#xff08;Tree of Thoughts&#xff09;、大语言模型、多步推理、认知架构、智能决策、生成式AI 摘要&#xff1a;传统AI应用常因“单步思维”局限于简单任务&#xff0c;而“思维树&#…

免费工艺流程模板下载_在线编辑建筑/汽车/物流工艺流程图图表

良功绘图网站 (https://www.lghuitu.com ) 在建筑、汽车、物流等行业的日常运营与项目推进中&#xff0c;工艺流程可视化是提升效率、规范管理的核心手段。无论是建筑工程的施工管控、汽车制造的生产线优化&#xff0c;还是物流行业的仓储配送调度&#xff0c;一份清晰、规范的…

亲测好用!8个AI论文平台测评,研究生毕业论文必备

亲测好用&#xff01;8个AI论文平台测评&#xff0c;研究生毕业论文必备 2026年AI论文平台测评&#xff1a;从功能到体验的深度解析 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多的研究生开始依赖AI工具来提升论文写作效率。然而&#xff0c;面对市场上五花八门的…

提升效率:如何为企业挑选完美的RFID解决方案

在物联网赋能企业数字化转型的进程中&#xff0c;RFID&#xff08;射频识别&#xff09;技术凭借非接触式批量读取、数据实时上传、标签抗磨损等核心优势&#xff0c;已成为物流仓储、智能制造、零售管控等领域提升效率的关键抓手。然而&#xff0c;多数企业在选型时易陷入“参…

第三十四周 学习周报

摘要 今日通过排气岐管的模型学习了CFD前处理中几何结构定义的关键设置&#xff0c;通过回答模型类型、开口封堵及区域抽取等核心问题&#xff0c;将实体CAD模型转化为可用于流体仿真的计算域&#xff0c;为网格划分奠定基础。 Abstract Today, through the exhaust manifol…

智能座舱:汽车内饰的交互革命

一、引言&#xff1a;从交通工具到第三空间的本质变革 汽车产业的百年演进中&#xff0c;座舱始终是连接人与车的核心载体。从最初仅满足驾乘功能的机械空间&#xff0c;到如今集成人工智能、物联网、显示技术的智能终端&#xff0c;座舱的进化史本质上是一部人机交互的革命史。…

学校教室多功能布局平面图在线设计的实用技巧和方法

在教育多元化发展的当下&#xff0c;学校教室早已不再是单一的“授课空间”&#xff0c;而是需要兼顾知识传授、小组协作、实践操作、活动开展等多重需求的多功能场景。一套科学合理的教室布局平面图&#xff0c;不仅能提升空间利用率&#xff0c;还能适配不同教学模式&#xf…