基于SpringBoot+Vue的智能健康饮食管理系统(TDEE算法、WebSocket实时通讯、协同过滤算法、支付宝沙盒支付、Echarts图形化分析)
🎈系统亮点:TDEE算法、WebSocket实时通讯、协同过滤算法、支付宝沙盒支付、Echarts图形化分析;
🎈系统亮点:TDEE算法、WebSocket实时通讯、协同过滤算法、支付宝沙盒支付、Echarts图形化分析;
一.系统开发工具与环境搭建
1.系统设计开发工具
后端使用Java编程语言的Spring boot框架
项目架构:B/S架构
运行环境:win10/win11、jdk17
前端:
技术:框架Vue.js;UI库:ElementUI;
开发工具:Visual Studio Code;
后端:
技术:Java语言、mybatis plus、Spring boot框架;
开发工具:IDEA 2023.3.3版本;
数据库:
数据库:mysql5.7/8.0
数据库工具:Navicat12版本;
二.系统实现(部分截图)
2.1 用户
2.1.1 首页
用户登录系统后,系统会获取到登录的用户Id。然后系统会先创建UserCalculateCosineSimilarity对象列表,用于存储每个其他用户与当前用户的相似度信息。随后系统将会自动从userRatings中提取相关的必要信息。userRatings是一个Map<Integer,Map<Integer,Double>>类型的数据结构,其外层键代表用户Id,内层键代表美食Id,而对应的值则是用户对该美食的评分。系统会获取userRatings中所有用户的Id,并将其整理成一个列表,方便后续的遍历操作。系统会对这个用户Id列表进行遍历。在遍历过程中,如果遇到与当前登录用户Id相同的情况会直接跳过,因为不需要计算用户自身的相似度。对于其他用户,系统会调用CalculateCosineSimilarity方法来计算当前登录用户与该其他用户之间的余弦相似度。同时,系统会从userRatings中提取该其他用户评分过的美食Id列表。接着系统会创建一个UserCalculateCosineSimilarity对象,包含当前用户Id、其他用户Id、其他用户评分过的美食Id列表以及计算得到的相似度。创建完成后,将这个对象添加到之前创建的相似度列表中。完成所有用户的相似度计算和对象添加后,系统会使用Collections.sort方法对相似度列表进行排序。排序的规则是按照相似度进行从高到低的有序排列,然后系统再通过自定义比较器来比较两个UserCalculateCosineSimilarity对象的相似度值,确保列表中的用户按照相似度降序排列。找到与当前用户兴趣相似的其他用户,系统将会通过这些用户喜欢的美食推荐给当前登录的用户。若查不到用户信息,则返回一个空的分页结果。

2.1.2 美食详情

2.1.3 咨询商家
前端通过topstory-container类包裹整个聊天框,左侧为商家列表通过chat-list类展示。右侧为chat-window窗口,包含聊天头部、聊天内容区域和消息发送区域。组件挂载后调用InitSelectWechatUser方法初始化好友列表,并调用AddSocketMessageMonitor方法添加 WebSocket 消息监控,msgId作为监控标识,OnMessage方法作为消息处理函数。用户在浏览商品的时候,遇到问题可以随时咨询商家客服了解餐品相关问题,商家也可以主动向用户推送该店的优惠信息。系统通过集成WebSocket实现聊天功能,能够为用户和商家之间提供实时的沟通渠道。打破了传统的HTTP请求,可以实现类似面对面聊天的效果。

2.1.4 订单确认
订单模块,前端跳转到/Front/Good界面查看美食信息,界面创建时立即调用created 钩子函数,调用名为 GetGoodApi 的方法,从后端接口获取商品的基本信息,商品名称、价格、描述等,前端通过两栏式布局展示商品详情,商品名称Detail.Name和已售数量Detail.BuyCount,营养成分通过nutrition-title设置标题,使用nutrition-grid和nutrition-item类构建网格结构,每行展示一种营养成分。用户了解商品,决定购买,立即购买按钮执行ToOrderBtn函数,检查商品的当前库存this.Detail.Stock,若库存为 0,则提示 "美食没有库存"。在用户下单,跳转至/Front/ToOrder界面,确认订单信息。首先,用户需要选择要选择收货地址,可以核实购买的商品信息或增加商品的数量,数量一旦增加,总价格会随之增加,如果购买的商品满足优惠券,则可以使用该优惠。最后,选择支付的方式,进行下单支付。调用/OrderInfo/ToOrder接口,会校验购买的美食的库存数量是否满足订单的需求,如果库存小于订单明细中的商品数量,会提示相应美食库存不足,终止订单。库存充足,则会自动生成一个订单号OrderNo,计算订单的总价格和总数量。系统接入了支付宝沙盒支付,当用户唤起支付宝方式进行支付,向后端/OrderInfo/AliPay接口发送支付请求,携带订单号和回调 URL,后端返回的requestContent应为 HTML 表单内容,创建一个临时的Div元素插入到页面中,自动提交表单以触发支付宝支付流程,进行模拟真实的支付场景。如果是支付宝支付,订单状态为待支付;否则为待发货,并设置订单的过期时间为当前时间加上30分钟。如果订单使用了优惠券,就根据优惠券Id查询优惠券记录,对于使用的优惠券,可设置使用时间和关联的订单编号,并累加优惠券的金额。更新优惠券记录到数据库。

2.1.5 订单

2.1.6 健康轻食交流

2.1.7 轻食交流详情

2.1.8 体重记录

2.1.9 体重变化

2.1.10 饮食记录

2.1.11 添加饮食记录
添加饮食记录模块,跳转到/Front/MyDietRecordList我的饮食记录界面,通过POST请求/DietRecord/List接口获取所有的饮食记录信息,通过el-card组件进行展示数据。用户记录自己每天的饮食记录,触发添加记录按钮,前端弹出添加饮食记录的el-dialog对话框,用户进行选择饮食类型(早中晚)、记录的时间、摄入的食物进行添加,前端将用户录入的数据传递给/DietRecord/BatchCreateOrEdit接口,声明一个饮食记录DietRecord实体,调用数据库的saveOrUpdate新增方法,新增新增饮食记录。当用户下单外卖后,用户可以在“我的订单”处进行同步饮食按钮,触发SyncToDietRecord()函数,无需手动录入即可将购买的餐品添加到饮食记录,调用/OrderInfo/SyncToDietRecord接口进行添加饮食记录。

2.1.12 运动记录

2.1.13 个人分析
查看个人分析模块,前端跳转/Front/PersonAnalyse界面。该模块使用el-calendar组件展示日历。可以自动为用户提供精准、合理的营养摄入与能量消耗分析。调用/Archives/GetUserData接口展示显示饮食摄入的总热量UserData.TotalIncalorie,运动消耗显示的总热量UserData.TotalOutcalorie,并使用使用el-progress组件展示碳水化合物、蛋白质、脂肪的摄入百分比和摄入量与推荐量的对比。运用特定公式计算基础代谢率,汇总用户当日记录的运动产生的总消耗热量(totalOutcalorie)以及记录饮食的总摄入热量(totalIncalorie),通过公式Tdee + totalOutcalorie - totalIncalorie,计算出用户当日还可摄入的热量值。在营养成分分析层面,模块按照科学比例针对碳水化合物、蛋白质、脂肪三大营养素分别计算推荐摄入量。具体公式为(Tdee*对应比例) /对应每克热量,其中比例与每克热量依据营养学标准设定。

2.1.14 营养分析

2.1.15 我的购物车

2.1.16 个人中心

2.1.17 个人档案

2.2 商家
2.2.1我的店铺

2.2.2 美食维护
美食维护功能,前端跳转/Admin/GoodList界面维护店铺的餐品信息,可通过名称Input框进行调用/Good/List接口,后端通过模糊查询搜索美食信息,将数据以Json格式返回给前端,前端通过PaginationTable组件展示美食列表。管理店铺售卖的餐品,调用/Good/CreateOrEdit进行新增餐品。当商家决定不再售卖当前商品,可以进行删除商品,调用/Good/Delete进行删除商品,删除商品后前端会重新刷新界面。当商品需要修改时,选择一条商品信息前端就会弹出修改的窗口,然后进行调用/Good/Get方法进行获取餐品的初始数据,商家结合情况并根据需求进行修改餐品,进行调用/Good/CreateOrEdit进行修改。同时商家可以导出商品信息并生成excel表,便于对店铺内容进行备份处理。

2.2.3 库存记录
库存记录界面提供提供备注和美食两个搜索条件,通过SigleSelect组件动态加载美食列表,且根据当前店铺 ID 过滤:where="{ ShopId: ShopId }"。商家可以查看库存并维护库存信息,商家跳转到库存记录界面,前端就会立即调用/GoodStock/List接口获取库存信息,使用自定义组件PaginationTable实现库存表格。当商家新增库存时,商品的库存会相应增加,当商家减少库存时,商品的库存也会相应减少。当商家进行删除当前库存记录,触发删除按钮,触发ShowDeleteModal事件,将当前库存记录ID当做参数传递,调用封装好的$PostDelete方法向后端发送删除请求,当发起请求时,会弹出删除确认的对话框,当商家确定要删除这条库存记录,执行/GoodStock/Delete接口进行删除,通过库存记录ID获取当前库存记录,调用GoodStockMapper.deleteById(entity)进行删除。

2.2.4 商家订单

2.2.5 订单评论

2.2.6订单分析
订单分析界面使用el-card展示内容,通过el-row和el-col进行布局管理。summary-list区域展示今日订单、7天订单等统计数据,每个统计项有对应的图标、标题和数值,且背景有不同的渐变样式。利用el-card分别展示四个图表,包括季度销售分布、最近30天总收益趋势、24小时销量分布和热门美食销量排行。从Vuex中获取Token、UserInfo等数据,用于API请求时传递店铺ID 等信息。在mounted钩子函数中调用多个API 方法,如GetOrderSummaryDataApi获取订单统计数据,GetOrderIncomeDataApi获取订单收入数据等。通过Echarts技术生成各类图表。采用类似面积图的形式展示季度销售分布,折线图展示最近30天总收益趋势,结合柱状图和折线图展示24小时内销量情况。柱状图展示不同美食的销量排行情况。

2.2.7 优惠券

2.2.8优惠券发放记录

2.2.9客户会话

2.3 管理员
2.3.1 用户管理
作为管理员拥有最高权限,维护用户管理,跳转到用户管理Admin/UserList,界面可以管理系统的用户信息,包含账号、邮箱、姓名、头像等信息。新增用户信息,将录入的信息通过HTTP请求调用User/CreateOrEdit接口,进行新增用户,为用户分配权限。修改用户信息,先获取该用户的初始数据,调用User/Get接口获取数据,随后将用户Id传递给User/CreateOrEdit接口进行修改用户信息。删除用户信息调用User/Deleted接口进行删除操作。管理员可以通过条件查询用户信息,并将用户信息进行导出Excel。

2.3.2 用户档案

2.3.3 食物管理

2.3.4 运动方式

2.3.5 店铺管理

2.3.6 美食维护

2.3.7 库存记录

2.3.8 库存预警

2.3.9 话题信息
管理员通过“话题信息”导航栏进行话题管理界面,界面调用Topic/List接口获取所有话题的信息,包含话题标题、话题类型、话题内容、创建人等信息。当话题未审核时,数据的操作框会有“审核通过”、“审核不通过”两个 按钮,触发审核通过功能,调用UpdateEntityAsync方法,将AuditStatus设为 2(已通过)触发审核不通过功能,调用UpdateEntityAsync方法,将AuditStatus设为 3(未通过)。审核通过后,用户可以在前台查看话题信息;若审核失败,则用户看不到发布的话题信息。管理员自己发布的话题,自动审核成功。当审核通过后,当条件为v-if="scope.row.AuditStatus == 2"才会显示“推荐”与“取消推荐”按钮,当触发话题推荐功能,调用UpdateEntityAsync将IsRecommand设为true,触发取消推荐功能,调用相同方法将IsRecommand设为false。管理员可修改话题信息,删除不合规的话题信息维护网络健康。

2.3.10 综合分析

2.3.11 商家订单

2.3.12 封面管理

三、系统代码结构截图
1.前端

2.后端

3.数据库

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)