前言
博主介绍:优快云特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输出高质量技术内容、深耕Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解。
💯文末获取源码+数据库💯
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人。
详细视频演示
具体实现截图
后端框架SpringBoot
Spring Boot允许开发者快速构建出既可以独立运行又满足生产级别标准的Spring基础应用程序。此框架通过提供一系列便捷的工具和服务,极大地促进了基于Spring的应用开发工作的效率和质量。通过提供一系列大型项目中常用的默认配置,Spring Boot最大化减少配置文件的使用,开发者能够迅速启动和运行Spring应用程序。
Spring Boot通过约定优于配置的原则,避免了许多传统Spring应用开发时繁琐的配置,该框架支持对内嵌服务器的自动配置,如Tomcat、Jetty或Undertow,从而简化了Web应用的部署过程。
微信小程序
小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。
整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View)。小程序提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑。
持久层框架MyBaits
MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的编写和管理。MyBatis的核心思想是将SQL语句和Java代码分离,通过XML或注解的方式来描述数据库操作,从而实现了数据访问层的解耦和灵活性。
MyBatis的优势主要包括以下几点:
简化数据库操作:MyBatis通过提供强大的SQL映射功能,可以将Java对象与数据库表进行映射,开发者无需手动编写繁琐的SQL语句,大大简化了数据库操作的编写和维护。
灵活的SQL控制:MyBatis支持动态SQL,可以根据不同的条件和逻辑来动态生成SQL语句,使得查询、更新等操作更加灵活和可控。
缓存支持:MyBatis提供了一级缓存和二级缓存的支持,可以有效减少数据库的访问次数,提高系统性能。
可扩展性强:MyBatis采用插件机制,可以方便地扩展和定制自己的功能,满足各种不同的业务需求。
所有项目均为博主亲自收集、开发并严格测试,确保源码完整、可运行,无缺失依赖或兼容性问题!同学们拿到后就能使用!博主具备多年高级开发经验,能深入讲解代码架构、核心逻辑及技术难点,助你高效掌握项目精髓。
成功系统案例:
参考代码
package com.xxxy.ssm_shop.controller;
import com.xxxy.ssm_shop.model.CartItem;
import com.xxxy.ssm_shop.model.Order;
import com.xxxy.ssm_shop.model.OrderItem;
import com.xxxy.ssm_shop.model.User;
import com.xxxy.ssm_shop.service.IOrderService;
import com.xxxy.ssm_shop.service.IUserService;
import com.xxxy.ssm_shop.service.impl.CartItemService;
import com.xxxy.ssm_shop.utils.PageBean;
import com.xxxy.ssm_shop.utils.Result;
import com.xxxy.ssm_shop.utils.UUIDUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping(value = "/order")
public class OrderController extends BaseController{
@Autowired
private CartItemService cartItemService;
@Autowired
private IOrderService orderService;
@RequestMapping(value = "/addOrder")
public String addOrder(Model model) {
User user = (User) getSessionUser();
List<CartItem> carItemsByUid = cartItemService.findCarItemsByUid(user.getUid());
Order order = new Order();
String uuid = String.valueOf(System.currentTimeMillis());
order.setOid(uuid);
order.setTotal(carItemsByUid.stream().map(CartItem::getSubtotal).reduce(0d, Double::sum));
order.setOrdertime(new Date());
order.setState(2);
order.setUser(user);
List<OrderItem> orderItemList = new ArrayList<>();
orderService.saveOrder(order);
for (CartItem cartItem : carItemsByUid) {
OrderItem orderItem = new OrderItem();
orderItem.setCount(cartItem.getCount());
orderItem.setSubtotal(cartItem.getSubtotal());
orderItem.setProduct(cartItem.getProduct());
orderItem.setOrder(order);
orderItemList.add(orderItem);
orderService.saveOrderItem(orderItem);
}
order.setOrderItemList(orderItemList);
model.addAttribute("order", order);
cartItemService.delClearCartItem(user.getUid());
return "order";
}
@RequestMapping(value = "/addOrderWx")
@ResponseBody
public Result addOrderWx(Integer[] pids) {
User user = (User) getSessionUser();
List<CartItem> carItems = new ArrayList<>();
for(Integer pid :pids){
CartItem cartItem = cartItemService.findCartItemBypidAndUid(pid, user.getUid());
carItems.add(cartItem);
}
Order order = new Order();
String uuid = String.valueOf(System.currentTimeMillis());
order.setOid(uuid);
order.setTotal(carItems.stream().map(CartItem::getSubtotal).reduce(0d, Double::sum));
order.setOrdertime(new Date());
order.setState(1);
order.setUser(user);
order.setName(user.getName());
order.setPhone(user.getPhone());
order.setAddr(user.getAddr());
List<OrderItem> orderItemList = new ArrayList<>();
orderService.saveOrder(order);
for (CartItem cartItem : carItems) {
OrderItem orderItem = new OrderItem();
orderItem.setCount(cartItem.getCount());
orderItem.setSubtotal(cartItem.getSubtotal());
orderItem.setProduct(cartItem.getProduct());
orderItem.setOrder(order);
orderItemList.add(orderItem);
orderService.saveOrderItem(orderItem);
}
order.setOrderItemList(orderItemList);
for(Integer pid :pids){
cartItemService.delCartItemBypidAndUid(pid,user.getUid());
}
return Result.success();
}
/*用户订单列表*/
@RequestMapping(value = "/findOrderByUid")
public String findOrderByUid(@RequestParam(defaultValue = "1") int page, Model model) {
User existUser = (User) getSessionUser();
Integer uid = existUser.getUid();
PageBean<Order> pageBean = orderService.findByUid(uid, page);
model.addAttribute("pageBean", pageBean);
return "orderList";
}
/*用户订单列表*/
@RequestMapping(value = "/findOrderByUidWx")
@ResponseBody
public Result findOrderByUid(@RequestParam(defaultValue = "1") int page) {
User existUser = (User) getSessionUser();
Integer uid = existUser.getUid();
PageBean<Order> pageBean = orderService.findByUid(uid, page);
return Result.success(pageBean);
}
/*去付款*/
@RequestMapping("/findByOid")
String findOrderByOid(@RequestParam String oid, Model model) {
model.addAttribute("order", orderService.findByOid(oid));
return "order";
}
/*支付*/
@RequestMapping("/payOrder")
String payOrder(@ModelAttribute Order order) {
Order payOrder = orderService.findByOid(order.getOid());
if (payOrder != null && 1 == payOrder.getState()) {
payOrder.setAddr(order.getAddr());
payOrder.setName(order.getName());
payOrder.setPhone(order.getPhone());
payOrder.setState(2);
orderService.updateOrder(payOrder);
}
return "redirect:/order/findOrderByUid";
}
/*确认收货*/
@RequestMapping("/updateState")
String updateState(@RequestParam String oid) {
Order order = orderService.findByOid(oid);
if(order != null && order.getState() == 3){
order.setState(4);
orderService.updateOrder(order);
}
return "redirect:/order/findOrderByUid";
}
}
数据库
/*
-- ----------------------------
-- Table structure for adminuser
-- ----------------------------
DROP TABLE IF EXISTS `adminuser`;
CREATE TABLE `adminuser` (
`uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
`type` int(11) NULL DEFAULT 0 COMMENT '用户类型(0表示普通,1表示管理员等)',
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '管理员用户表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of adminuser
-- ----------------------------
INSERT INTO `adminuser` VALUES (1, 'admin', 'admin', 1);
INSERT INTO `adminuser` VALUES (2, 'superadmin', 'superpass', 0);
INSERT INTO `adminuser` VALUES (3, 'operator', 'operatorpass', 1);
-- ----------------------------
-- Table structure for cart
-- ----------------------------
DROP TABLE IF EXISTS `cart`;
CREATE TABLE `cart` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
`user_id` int(11) NOT NULL COMMENT '所属用户ID',
`total` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '购物车总金额',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `user_id`(`user_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '购物车表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of cart
-- ----------------------------
-- ----------------------------
-- Table structure for cartitem
-- ----------------------------
DROP TABLE IF EXISTS `cartitem`;
CREATE TABLE `cartitem` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '购物项主键ID',
`uid` int(11) NOT NULL COMMENT '用户ID,关联用户表',
`pid` int(11) NOT NULL COMMENT '商品ID,关联商品表',
`count` int(11) NOT NULL DEFAULT 1 COMMENT '商品数量',
`subtotal` decimal(10, 2) NOT NULL COMMENT '小计金额',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '购物车项表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of cartitem
-- ----------------------------
-- ----------------------------
-- Table structure for category
-- ----------------------------
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
`cid` int(11) NOT NULL AUTO_INCREMENT COMMENT '一级分类ID',
`cname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '一级分类名称',
PRIMARY KEY (`cid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品一级分类表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of category
-- ----------------------------
INSERT INTO `category` VALUES (1, '徽菜');
INSERT INTO `category` VALUES (2, '川菜');
INSERT INTO `category` VALUES (3, '湘菜');
-- ----------------------------
-- Table structure for categorysecond
-- ----------------------------
DROP TABLE IF EXISTS `categorysecond`;
CREATE TABLE `categorysecond` (
`csid` int(11) NOT NULL AUTO_INCREMENT COMMENT '二级分类ID',
`csname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '二级分类名称',
`cid` int(11) NOT NULL COMMENT '所属一级分类ID',
PRIMARY KEY (`csid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品二级分类表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of categorysecond
-- ----------------------------
INSERT INTO `categorysecond` VALUES (1, '精美凉菜', 1);
INSERT INTO `categorysecond` VALUES (2, '家常小菜', 1);
INSERT INTO `categorysecond` VALUES (3, '海鲜', 1);
-- ----------------------------
-- Table structure for orderitem
-- ----------------------------
DROP TABLE IF EXISTS `orderitem`;
CREATE TABLE `orderitem` (
`itemid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
`count` int(11) NOT NULL COMMENT '购买数量',
`subtotal` double NOT NULL COMMENT '小计金额',
`pid` int(11) NOT NULL COMMENT '商品ID,关联product表',
`oid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单ID,关联orders表',
PRIMARY KEY (`itemid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单项表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of orderitem
-- ----------------------------
INSERT INTO `orderitem` VALUES (1, 1, 19, 1, '1751882626360');
INSERT INTO `orderitem` VALUES (2, 1, 19, 1, '1753538242787');
-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`oid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单ID',
`total` double NULL DEFAULT NULL COMMENT '订单总金额',
`ordertime` datetime NULL DEFAULT NULL COMMENT '下单时间',
`state` int(11) NULL DEFAULT NULL COMMENT '订单状态:1未付款,2已付款,3已发货,4已完成',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收货人姓名',
`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`addr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收货地址',
`uid` int(11) NULL DEFAULT NULL COMMENT '用户ID',
PRIMARY KEY (`oid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('1751882626360', 19, '2025-07-07 18:03:46', 2, '张三', '13800000001', '北京市朝阳区', 1);
INSERT INTO `orders` VALUES ('1753538242787', 19, '2025-07-26 21:57:23', 2, '张三', '13800000001', '北京市朝阳区', 1);
-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`pname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '商品名称',
`market_price` double NULL DEFAULT 0 COMMENT '市场价格',
`shop_price` double NULL DEFAULT 0 COMMENT '商店价格',
`image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商品图片路径',
`pdesc` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '商品描述',
`is_hot` tinyint(1) NULL DEFAULT 0 COMMENT '是否热销,1为是,0为否',
`pdate` date NULL DEFAULT NULL COMMENT '上架日期',
`csid` int(11) NOT NULL COMMENT '二级分类ID,外键',
PRIMARY KEY (`pid`) USING BTREE,
INDEX `fk_product_category_second`(`csid` ASC) USING BTREE,
CONSTRAINT `fk_product_category_second` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES (1, '凉拌紫甘蓝', 19, 19, 'products/1753538530282.jpeg', '凉拌紫甘蓝', 0, NULL, 1);
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电子邮件',
`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号',
`addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址',
`state` int(11) NULL DEFAULT 0 COMMENT '用户状态(例如激活状态)',
`code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '激活码或验证码',
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'zhangsan', '123456', '张三', 'zhangsan@example.com', '13800000001', '北京市朝阳区', 1, NULL);
INSERT INTO `user` VALUES (2, 'lisi', 'password', '李四', 'lisi@example.com', '13800000002', '上海市浦东新区', 1, NULL);
INSERT INTO `user` VALUES (3, 'wangwu', 'passwd123', '王五', 'wangwu@example.com', '13800000003', '广州市天河区', 0, 'activationcode123');
SET FOREIGN_KEY_CHECKS = 1;
源码获取
如需交流/获取资料,请先【关注+私信】我,私信获取源码~