当前位置:   article > 正文

免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~_uniapp 外卖小程序

uniapp 外卖小程序

大家好,我是java1234_小锋老师,看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现)  ,分享下哈。

项目视频演示

【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) Java毕业设计,非常好的源码_哔哩哔哩_bilibili【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) Java毕业设计,非常好的源码项目来自互联网,免费开源分享,严禁商业。更多毕业设源码:http://www.java1234.com/a/bysj/javaweb/, 视频播放量 547、弹幕量 0、点赞数 22、投硬币枚数 7、收藏人数 38、转发人数 4, 视频作者 java1234官方, 作者简介 公众号:java1234 微信:java9266,相关视频:【免费】微信小程序扫码点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) Java毕业设计,非常好的源码,PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~,【免费】Springboot+Vue个人博客系统 毕业设计 Java毕业设计,uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) ( 火爆连载更新中... ),SpringBoot微信小程序电商实战项目课程 Vue3.2 Element Plus后台管理 ( 火爆连载更新中... ),2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...,【免费】javaweb网络订餐系统毕业设计,打造前后端分离 权限系统 基于SpringBoot2+SpringSecurity+Vue3.2+Element Plus 视频教程 (火爆连载更新中..),【免费】Springboot+Vue停车场管理系统 Java毕业设计,【免费】javaweb房屋租赁管理信息系统毕业设计icon-default.png?t=N7T8https://www.bilibili.com/video/BV1r64y1w7NU/

项目介绍

自从计算机发展开始,计算机软硬件相关技术的发展速度越来越快,在信息化高速发展的今天,计算机应用技术似乎已经应用到了各个领域。

在餐饮行业,除了外卖以外就是到店里就餐,在店里就餐如果需要等待点餐的话,用户的体验度就会急剧下降,很多餐饮店也开始开发线上订餐的系统,这样的系统给用户带来了新的体验,尤其是在时间和空间上,让使用者不管身在何处,只要连上网就能够选购菜品,进行订餐。

外卖系统小程序的开发项目以Springboot框架为基础,基于B/S模式,采用Java编程语言,使用MySQL数据库,首选对外卖系统小程序的各个功能以及用户的需求做出了解释,然后根据用户线上订餐的需求,再介绍了系统的总体设计以及其详细设计,给用户提供了外卖系统小程序的总体结构的搭建方法。从而满足用户线上订餐的需求。

系统展示

部分代码

  1. package com.yu.app.moudles.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.yu.app.moudles.mapper.GoodsCategoryMapper;
  4. import com.yu.app.moudles.mapper.GoodsMapper;
  5. import com.yu.app.moudles.mapper.GoodsPropertyMapper;
  6. import com.yu.common.common.constant.Const;
  7. import com.yu.common.common.enums.GoodsPropertyCategory;
  8. import com.yu.common.entity.app.Goods;
  9. import com.yu.common.entity.app.GoodsCategory;
  10. import com.yu.common.entity.app.GoodsProperty;
  11. import com.yu.common.entity.app.vo.GoodsMenuVO;
  12. import com.yu.common.entity.app.vo.GoodsVO;
  13. import com.yu.common.entity.app.vo.SameCategoryPropertyVO;
  14. import com.yu.common.service.RedisService;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.beans.BeanUtils;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.util.CollectionUtils;
  19. import javax.annotation.Resource;
  20. import java.util.*;
  21. @Slf4j
  22. @Service
  23. public class GoodsServiceImpl {
  24. @Resource
  25. private GoodsCategoryMapper goodsCategoryMapper;
  26. @Resource
  27. private GoodsMapper goodsMapper;
  28. @Resource
  29. private GoodsPropertyMapper goodsPropertyMapper;
  30. @Resource
  31. private RedisService redisService;
  32. // TODO 本地商品菜单缓存
  33. private List<GoodsMenuVO> goodsMenuVOSLocalCache = new ArrayList<>();
  34. public List<GoodsMenuVO> getGoodsMenuDetailList() {
  35. Object o = redisService.get(Const.CONST_goods_menu_vo_cache);
  36. if (o != null && !CollectionUtils.isEmpty(goodsMenuVOSLocalCache))
  37. return goodsMenuVOSLocalCache;
  38. List<GoodsCategory> goodsCategoryList = goodsCategoryMapper.selectList(null);
  39. // 使用2个map去关联关系
  40. HashMap<String, List<Goods>> sameCategoryGoodsMap = new HashMap<>(goodsCategoryList.size());
  41. HashMap<String, GoodsMenuVO> goodsMenuVOMap = new HashMap<>(goodsCategoryList.size());
  42. for (GoodsCategory goodsCategory : goodsCategoryList) {
  43. sameCategoryGoodsMap.put(goodsCategory.getName(), new ArrayList<>());
  44. GoodsMenuVO goodsMenuVO = new GoodsMenuVO();
  45. goodsMenuVO.setGoodsCategoryName(goodsCategory.getName());
  46. goodsMenuVO.setGoodsCategoryName(goodsCategory.getName());
  47. goodsMenuVO.setDisplayOrder(goodsCategory.getDisplayOrder());
  48. goodsMenuVO.setGoodsCategoryShow(goodsCategory.getShowStatus());
  49. goodsMenuVOMap.put(goodsCategory.getName(), goodsMenuVO);
  50. }
  51. List<Goods> allGoods = goodsMapper.selectList(null);
  52. // 将所有商品分类
  53. for (Goods good : allGoods)
  54. if (sameCategoryGoodsMap.containsKey(good.getGoodsCategoryName()))
  55. sameCategoryGoodsMap.get(good.getGoodsCategoryName()).add(good);
  56. Random random = new Random(10000);
  57. // 关联同类商品排好序后放到到对应的类别里
  58. for (Map.Entry<String, GoodsMenuVO> goodsMenuVOEntry : goodsMenuVOMap.entrySet()) {
  59. List<Goods> sameCategoryGoodsList = sameCategoryGoodsMap.get(goodsMenuVOEntry.getKey());
  60. sameCategoryGoodsList.sort((o1, o2) -> o1.getDisplayOrder() - o2.getDisplayOrder());
  61. List<GoodsVO> goodsVos = new ArrayList<>();
  62. // 填充商品的属性
  63. for (Goods goods : sameCategoryGoodsList) {
  64. List<GoodsProperty> goodsPropertyList = goodsPropertyMapper.selectList(
  65. new QueryWrapper<GoodsProperty>().eq("goods_id", goods.getId()));
  66. HashMap<String, List<GoodsProperty>> propertyMap = new HashMap<>();
  67. for (GoodsProperty goodsProperty : goodsPropertyList) {
  68. if (propertyMap.containsKey(goodsProperty.getCategory())) {
  69. propertyMap.get(goodsProperty.getCategory()).add(goodsProperty);
  70. } else {
  71. propertyMap.put(goodsProperty.getCategory(), new ArrayList<GoodsProperty>() {{
  72. add(goodsProperty);
  73. }});
  74. }
  75. if (goodsProperty.getIsDefault() && GoodsPropertyCategory.ENUM_size.value.equals(goodsProperty.getCategory()))
  76. goods.setDefaultPrice(goodsProperty.getRebasePrice()); // 重新设置商品的默认价格
  77. }
  78. List<SameCategoryPropertyVO> goodsPropertyVos = new ArrayList<>();
  79. for (Map.Entry<String, List<GoodsProperty>> entry : propertyMap.entrySet()) {
  80. // 属性类别->属性列表 转换成对象
  81. SameCategoryPropertyVO goodsPropertyVo = new SameCategoryPropertyVO();
  82. goodsPropertyVo.setCategory(entry.getKey());
  83. goodsPropertyVo.setRequired(!GoodsPropertyCategory.ENUM_jia_liao.value.equalsIgnoreCase(entry.getKey())); // 除了加料其他全部必选
  84. goodsPropertyVo.setPropertyList(entry.getValue());
  85. goodsPropertyVos.add(goodsPropertyVo);
  86. }
  87. GoodsVO goodsVo = new GoodsVO();
  88. BeanUtils.copyProperties(goods, goodsVo);
  89. goodsVo.setGoodsPropertyVos(goodsPropertyVos);
  90. goodsVo.setRealPrice(goods.getDefaultPrice());
  91. goodsVo.setImage(goodsVo.getImage() + "?random=" + random.nextInt()); // 动态刷新小程序里的图片
  92. goodsVos.add(goodsVo);
  93. }
  94. goodsMenuVOEntry.getValue().setGoodsList(goodsVos);
  95. }
  96. List<GoodsMenuVO> goodsMenuVOList = new ArrayList<>(goodsMenuVOMap.values());
  97. // 最后对菜单进行排序
  98. goodsMenuVOList.sort((o1, o2) -> o1.getDisplayOrder() - o2.getDisplayOrder());
  99. redisService.set(Const.CONST_goods_menu_vo_cache, true, Const.CONST_one_hour); // 失效时间
  100. this.goodsMenuVOSLocalCache = goodsMenuVOList;
  101. return goodsMenuVOList;
  102. }
  103. }
  1. <template>
  2. <div>
  3. <div style="text-align: left; margin: 5px 10px">
  4. </div>
  5. <!--增加或更新的表单弹窗-->
  6. <el-dialog :title=formTitle :visible.sync="formDialogVisible">
  7. <el-form ref="form" :model="formData" :rules="rules" size="large" label-width="100px">
  8. <el-form-item label="姓名" prop="name">
  9. <el-input v-model="formData.name" placeholder="姓名"></el-input>
  10. </el-form-item>
  11. <el-form-item label="手机号" prop="phone">
  12. <el-input v-model="formData.phone" placeholder="手机号"></el-input>
  13. </el-form-item>
  14. <el-form-item>
  15. <el-button @click="resetForm">重置</el-button>
  16. <el-button type="primary" @click="handelConfirm">确定</el-button>
  17. </el-form-item>
  18. </el-form>
  19. </el-dialog>
  20. <!--列表-->
  21. <div style="margin: 0px 10px;text-align: left;">
  22. <el-table
  23. :data="userAdmins"
  24. stripe
  25. :default-sort="{prop: 'name', order: 'ascending'}">
  26. <el-table-column prop="name" label="姓名"></el-table-column>
  27. <el-table-column prop="phone" label="手机号"></el-table-column>
  28. <el-table-column prop="wxAvatar" label="微信头像">
  29. <template slot-scope="scope">
  30. <img :src="scope.row.wxAvatar" alt="" style="width: 50px; height: 50px; border-radius: 50%;">
  31. </template>
  32. </el-table-column>
  33. <!-- 账号状态-->
  34. <el-table-column label="账号状态">
  35. <template slot-scope="scope">
  36. <el-switch
  37. v-model="scope.row.status"
  38. active-color="green"
  39. inactive-color="red"
  40. @change="(value) => commitStatusChange(value, scope.row)">
  41. </el-switch>
  42. </template>
  43. </el-table-column>
  44. <el-table-column label="操作" width="120">
  45. <template slot-scope="scope">
  46. <el-button type="text" size="mini" @click="toEdit(scope.row)">编辑</el-button>
  47. <!-- <el-button type="text" size="mini" @click="toDelete(scope.row.wxOpenid)">删除</el-button>-->
  48. </template>
  49. </el-table-column>
  50. </el-table>
  51. <!--分页组件-->
  52. <el-row style="float: right">
  53. <el-pagination
  54. @current-change="changePageNo"
  55. @size-change="changePageSize"
  56. :current-page.sync="searchParams.pageNo"
  57. :page-sizes="[5, 10, 20, 30, 50, 100]"
  58. :page-size.sync="searchParams.pageSize"
  59. layout="total, sizes, prev, pager, next, jumper"
  60. :total="total">
  61. </el-pagination>
  62. </el-row>
  63. </div>
  64. </div>
  65. </template>
  66. <script>
  67. import {addUserAdmin, deleteUserAdmins, getUserAdmins, updateUserAdmin} from "@/api/modules/app/userAdminApi.js";
  68. export default {
  69. name: "userAdminComponent",
  70. data() {
  71. return {
  72. // 查询参数
  73. searchParams: {
  74. searchParam1: null,
  75. pageNo: 1,
  76. pageSize: 10,
  77. },
  78. total: 0,
  79. userAdmins: [],
  80. formDialogVisible: false,
  81. formTitle: '添加',
  82. formData: {
  83. wxOpenid: null, name: null, phone: null, sex: null, wxAvatar: null, status: null
  84. },
  85. rules: {
  86. name: [
  87. {required: true, message: '姓名不能为空', trigger: 'blur'}
  88. ], phone: [
  89. {required: true, message: '手机号不能为空', trigger: 'blur'}
  90. ]
  91. }
  92. }
  93. },
  94. mounted() {
  95. this.getUserAdmins()
  96. },
  97. methods: {
  98. // 获取数据
  99. getUserAdmins() {
  100. let that = this;
  101. getUserAdmins(that.searchParams.pageNo, that.searchParams.pageSize).then(result => {
  102. that.userAdmins = result.data.records;
  103. that.total = result.data.total;
  104. })
  105. },
  106. // 切换页数
  107. changePageNo(pageNo) {
  108. this.searchParams.pageNo = pageNo;
  109. this.getUserAdmins()
  110. },
  111. // 改变页面大小
  112. changePageSize(pageSize) {
  113. this.searchParams.pageSize = pageSize;
  114. this.getUserAdmins()
  115. },
  116. // 清除查询参数
  117. clearSearchParams() {
  118. this.searchParams.searchParam1 = null;
  119. },
  120. // 重置表单
  121. resetForm() {
  122. // 手动重置 不然数据被绑定在toEdit时深克隆出来的对象
  123. this.formData = {
  124. wxOpenid: null, name: null, phone: null, sex: null, wxAvatar: null, status: null
  125. }
  126. },
  127. // 增加
  128. toAdd() {
  129. this.resetForm()
  130. this.formDialogVisible = true
  131. this.formTitle = '添加'
  132. },
  133. // 删除
  134. toDelete(id) {
  135. let that = this;
  136. this.$confirm("提示", "是否删除", {}).then(() => {
  137. deleteUserAdmins([id]).then(() => {
  138. this.$notify.success("删除成功");
  139. that.getUserAdmins();
  140. })
  141. }).catch(() => {
  142. })
  143. },
  144. // 编辑
  145. toEdit(selectedUserAdmin) {
  146. // 深拷贝一个对象 不然在表格显示的数据会受到印象
  147. this.formData = JSON.parse(JSON.stringify(selectedUserAdmin));
  148. this.formDialogVisible = true
  149. this.formTitle = '更新'
  150. },
  151. // 提交表单
  152. handelConfirm() {
  153. this.$refs['form'].validate(valid => {
  154. console.log(this.formTitle)
  155. if (!valid)
  156. return
  157. this.formDialogVisible = false;
  158. if (this.formTitle.startsWith('添加')) {
  159. addUserAdmin(this.formData).then(result => {
  160. this.$notify.success("添加成功");
  161. this.getUserAdmins()
  162. })
  163. } else if (this.formTitle.startsWith('更新')) {
  164. updateUserAdmin(this.formData).then(result => {
  165. this.$notify.success("更新成功");
  166. this.getUserAdmins()
  167. })
  168. }
  169. })
  170. },
  171. // 改变状态
  172. commitStatusChange(value, userAdmin) {
  173. this.$confirm(value === false ? '冻结?' : '激活?').then(() => {
  174. let obj = {
  175. wxOpenid: userAdmin.wxOpenid,
  176. status: userAdmin.status
  177. }
  178. updateUserAdmin(obj).then(() => {
  179. this.$notify.success(value === false ? "已冻结" : "已激活")
  180. }).catch(() => {
  181. userAdmin.status = !userAdmin.status;
  182. })
  183. }).catch(() => {
  184. userAdmin.status = !userAdmin.status;
  185. })
  186. },
  187. }
  188. }
  189. </script>

源码下载

CSDN 1积分下载:https://download.csdn.net/download/caofeng891102/88785846

或者免费领取加小锋老师wx:java9266

热门推荐

免费分享一套微信小程序扫码点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~-CSDN博客

免费分享一套Springboot+Vue前后端分离的在线教育平台系统,挺漂亮的-CSDN博客

免费分享一套Springboot+Vue前后端分离的停车场管理系统,挺漂亮的-CSDN博客

免费分享一套Springboot+Vue前后端分离的个人博客系统,挺漂亮的_免费的开源的springboot+vue项目-CSDN博客

免费分享一套 SpringBoot + Vue + ElementUI 的人力资源管理系统,挺漂亮的_element+springboot员工工资管理-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/96424
推荐阅读
相关标签
  

闽ICP备14008679号