SpringBoot+微信小程序在线订餐小程序系统 附带详细运行指导视频

文章目录

  • 一、项目演示
  • 二、项目介绍
  • 三、运行截图
  • 四、主要代码

一、项目演示

项目演示地址: 视频地址

二、项目介绍

项目描述:这是一个基于SpringBoot+微信小程序框架开发的在线订餐小程序系统。首先,这是一个前后端分离的项目,代码简洁规范,注释说明详细,易于理解和学习。其次,这项目功能丰富,具有一个在线订餐小程序系统该有的所有功能。

项目功能:此项目分为两个角色:普通用户管理员普通用户有登录注册、浏览商品信息、添加购物车、结算订单、查看个人信息、查看个人订单详情、管理个人地址信息、发布评价信息等等功能。管理员有管理所有商品信息、管理所有订单信息、管理所有用户信息、管理所有评价信息等等功能。

应用技术:SpringBoot + 微信小程序 + MySQL + MyBatis + Redis + ElementUI + Lua + Vue + Vant Weapp

运行环境:IntelliJ IDEA2019.3.5 + 微信开发者工具(项目压缩包中自带)+ MySQL5.7(项目压缩包中自带) + Redis5.0.5(项目压缩包中自带) + JDK1.8 + Maven3.6.3(项目压缩包中自带)+ Node14.16.1(项目压缩包中自带)

三、运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、主要代码

1.提交订单代码

	/*** 提交订单操作处理* @param orderDTO* @return*/@Overridepublic ResponseDTO<OrderDTO> submitOrder(OrderDTO orderDTO) {UserDTO userDTO = new UserDTO();userDTO.setToken(orderDTO.getToken());ResponseDTO<UserDTO> loginUserResponse = userService.getLoginUser(userDTO);if(!CodeMsg.SUCCESS.getCode().equals(loginUserResponse.getCode())) {return ResponseDTO.errorByMsg(CodeMsg.USER_SESSION_EXPIRED);}// 获取登录用户信息userDTO = loginUserResponse.getData();AddressExample addressExample = new AddressExample();addressExample.createCriteria().andUserIdEqualTo(userDTO.getId());if(addressMapper.selectByExample(addressExample).size() == 0) {return ResponseDTO.errorByMsg(CodeMsg.ADDRESS_NOT_EXIST);}String[] cartIdList = orderDTO.getCartIdList().split(",");CartExample cartExample = new CartExample();cartExample.createCriteria().andIdIn(Arrays.stream(cartIdList).collect(Collectors.toList()));List<Cart> cartList = cartMapper.selectByExample(cartExample);List<String> productIdList = cartList.stream().map(Cart::getProductId).collect(Collectors.toList());ProductExample productExample = new ProductExample();productExample.createCriteria().andIdIn(productIdList);List<Product> productList = productMapper.selectByExample(productExample);List<String> productNameList = productList.stream().map(Product::getName).collect(Collectors.toList());List<String> productPriceList = productList.stream().map(Product::getPrice).map(String::valueOf).collect(Collectors.toList());List<String> productPhotoList = productList.stream().map(Product::getPhoto).map(String::valueOf).collect(Collectors.toList());List<String> cartQuantityList = cartList.stream().map(Cart::getQuantity).map(String::valueOf).collect(Collectors.toList());String orderId = UuidUtil.getShortUuid();String orderDate = CommonUtil.getFormatterDate(new Date(), "yyyy-MM-dd HH:mm:ss");// 执行lua脚本String result = stringRedisTemplate.execute(SECKILL_SCRIPT,Collections.singletonList(RedisConstant.STOCK_REDIS_KEY_TEMPLATE),StringUtils.join(productIdList, ","),StringUtils.join(productNameList, ","),StringUtils.join(cartQuantityList, ","),orderId,userDTO.getId(),orderDate,StringUtils.join(productPriceList, ","),StringUtils.join(productPhotoList, ","),StringUtils.join(Arrays.asList(cartIdList), ","));if(!"成功".equals(result)) {CodeMsg codeMsg = CodeMsg.PRODUCT_STOCK_OVER;codeMsg.setMsg(result);return ResponseDTO.errorByMsg(codeMsg);}orderDTO.setId(orderId);return ResponseDTO.success(orderDTO);}

2.购物车保存操作(添加、减少)代码

 	/*** 购物车保存操作(添加、减少)* @param cartDTO* @return*/@Overridepublic ResponseDTO<Boolean> saveCart(CartDTO cartDTO) {UserDTO userDTO = new UserDTO();userDTO.setToken(cartDTO.getToken());ResponseDTO<UserDTO> loginUserResponse = userService.getLoginUser(userDTO);if(!CodeMsg.SUCCESS.getCode().equals(loginUserResponse.getCode())) {return ResponseDTO.errorByMsg(CodeMsg.USER_SESSION_EXPIRED);}// 获取登录用户信息userDTO = loginUserResponse.getData();cartDTO.setUserId(userDTO.getId());Product product = productMapper.selectByPrimaryKey(cartDTO.getProductId());if (product == null) {return ResponseDTO.errorByMsg(CodeMsg.PRODUCT_NOT_EXIST);}Cart cart = CopyUtil.copy(cartDTO, Cart.class);// 判断购物车是否已经有此商品CartExample cartExample = new CartExample();cartExample.createCriteria().andProductIdEqualTo(cartDTO.getProductId()).andUserIdEqualTo(cartDTO.getUserId());List<Cart> cartList = cartMapper.selectByExample(cartExample);if(cartList.size() > 0) {// 购物车中已经有此商品if(CartOperateEnum.ADD.getCode().equals(cartDTO.getOperateType())) {// 添加操作if(cart.getQuantity() + cartList.get(0).getQuantity() > product.getStock()) {return ResponseDTO.errorByMsg(CodeMsg.PRODUCT_STOCK_OVER);}cartList.get(0).setQuantity(cart.getQuantity() + cartList.get(0).getQuantity());} else if (CartOperateEnum.SUB.getCode().equals(cartDTO.getOperateType())) {// 减少操作if(cartList.get(0).getQuantity() <= cart.getQuantity()) {// 删除CartDTO copy = CopyUtil.copy(cartList.get(0), CartDTO.class);copy.setToken(cartDTO.getToken());removeCart(copy);return ResponseDTO.successByMsg(true, "购物车操作成功!");} else {cartList.get(0).setQuantity(cartList.get(0).getQuantity() - cart.getQuantity());}}// 更新数据if(cartMapper.updateByPrimaryKeySelective(cartList.get(0)) == 0) {return ResponseDTO.errorByMsg(CodeMsg.CART_SAVE_ERROR);}} else {// 购物车中没有此商品if(product.getStock() == 0) {return ResponseDTO.errorByMsg(CodeMsg.PRODUCT_STOCK_OVER);}cart.setId(UuidUtil.getShortUuid());// 添加数据if(cartMapper.insertSelective(cart) == 0) {return ResponseDTO.errorByMsg(CodeMsg.CART_SAVE_ERROR);}}return ResponseDTO.successByMsg(true, "购物车操作成功!");}

3.小程序登录操作代码

	/*** 小程序用户登录操作* @param userDTO* @return*/@Overridepublic ResponseDTO<UserDTO> appLogin(UserDTO userDTO) {// 进行是否为空判断if(CommonUtil.isEmpty(userDTO.getUsername())){return ResponseDTO.errorByMsg(CodeMsg.USERNAME_EMPTY);}if(CommonUtil.isEmpty(userDTO.getPassword())){return ResponseDTO.errorByMsg(CodeMsg.PASSWORD_EMPTY);}// 对比昵称和密码是否正确UserExample userExample = new UserExample();userExample.createCriteria().andUsernameEqualTo(userDTO.getUsername()).andPasswordEqualTo(userDTO.getPassword());List<User> userList = userMapper.selectByExample(userExample);if(userList == null || userList.size() != 1){return ResponseDTO.errorByMsg(CodeMsg.USERNAME_PASSWORD_ERROR);}// 生成登录token并存入Redis中User selectedUser = userList.get(0);UserDTO selectedUserDTO = CopyUtil.copy(selectedUser, UserDTO.class);String token = UuidUtil.getShortUuid();selectedUserDTO.setToken(token);//把token存入redis中 有效期1小时stringRedisTemplate.opsForValue().set("USER_" + token, JSON.toJSONString(selectedUser), 3600, TimeUnit.SECONDS);return ResponseDTO.successByMsg(selectedUserDTO, "登录成功!");}

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

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

相关文章

并行计算框架Polars、Dask的数据处理性能对比

在Pandas 2.0发布以后&#xff0c;我们发布过一些评测的文章&#xff0c;这次我们看看&#xff0c;除了Pandas以外&#xff0c;常用的两个都是为了大数据处理的并行数据框架的对比测试。 本文我们使用两个类似的脚本来执行提取、转换和加载(ETL)过程。 测试内容 这两个脚本主…

我爱学QT--qt的网络编程

学习地址&#xff1a; QT网络编程之TCP通信_哔哩哔哩_bilibili QT网络编程有TCP和UDP。 TCP编程需要用到两个类&#xff1a;QTcpServer和QTcpSocket 本节课目标&#xff1a; 完成一个服务器和一个客户端 首先是经典的几步 先设计ui再设计逻辑实现 多看看写的文件理解吧

设计模式-简单工厂模式

文章目录 简单工厂设计模式什么是简单工厂?为什么使用简单工厂工厂模式代码实现简单工厂优缺点优点&#xff1a; 简单工厂设计模式 学习视频 什么是简单工厂? 简单工厂模式属于类的创建型模式&#xff0c;又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实…

vue中使用Pinia和Vuex详解

最具有争议的Pinia和Vuex那个更好&#xff1f; 我们使用Vue2的时候&#xff0c;Vuex作为一个状态管理工具在组件中使用方便了很多。Vue3推出后&#xff0c;虽然相对于Vue2很多东西都变了&#xff0c;但是核心的东西还是没有变的&#xff0c;比如说状态管理、路由等等。实际上&a…

Group, AnimationUpdate, Menu 的使用

1. Group 组堆栈布局的使用 1.1 实现 // 组堆栈 struct GroupBootcamp: View {var body: some View {VStack(spacing: 50) {Text("Hello, world!")Group() {Text("Hello, world!")Text("Hello, world!")}.font(.caption).foregroundColor(.gree…

智头条|第25届中国建博会(广州)成功举行,马斯克组建xAI公司

行业动态&#xff1a; 第25届中国建博会&#xff08;广州&#xff09;成功举行 7月8日至11日期间&#xff0c;2023中国建博会(广州)暨首届广州卫博会在广州如火如荼地进行。本届展会以“冠军企业首秀平台”为定位&#xff0c;以“建装理想家&#xff0c;服务新格局”为主题&a…

conda的使用

一、conda 1、为什么使用conda 在安装Python包的过程中&#xff0c;可能遇到依赖包的问题。例如&#xff0c;要安装numpy&#xff0c;需要先安装BLAS和LAPACK等库。在使用pip等包管理工具时&#xff0c;这些依赖包需要手动安装&#xff0c;操作起来可能比较繁琐。而conda是一个…

Redis的缓存问题

说起Redis的缓存&#xff0c;我们知道前端发出的请求到后端&#xff0c;后端先从Redis中查询&#xff0c;如果查询到了则直接返回&#xff0c;如果Redis中未查询到&#xff0c;就去数据库中查询&#xff0c;如果数据库中存在&#xff0c;则返回结果并且更新到Redis缓存当中&…

Redis_简介(1)

目录 Redis简介 Redis特性 Redis 优势 Redis应用场景 源码等资料获取方法 Redis简介 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。从2010年3月15日起&#xff0c;Redis的开发工作由…

leetcode 450. 删除二叉搜索树中的节点

2023.7.14 搜索二叉树相关的题一般都能用递归解决。 本体大致思路是&#xff1a;使用递归的方式&#xff0c;在树中查找目标节点&#xff0c;并根据节点的情况进行删除操作。如果目标节点是叶子节点&#xff0c;直接删除它&#xff1b;如果目标节点只有一个子树&#xff0c;将子…

mysql笔记

目录 1、root用户密码忘记 2、SQL的分类 2.1、DQL数据查询语言 前言 2.1.1、设置别名 2.1.2、去除重复行 2.1.3、空值参与运算 2.1.4、着重号 2.1.5、显示表结构 2.1.6、算数运算符 2.1.7、比较运算符 2.1.8、逻辑运算符 2.1.9、位运算符 2.1.10、 模糊查询 2.1.…

经典CNN(一):ResNet-50算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 ResNet理论 深度残差网络ResNet(deep residual network)在2015年由何凯明等提出&#xff0c;因为它简单与实用并存&#xff0c;随后很多研究…