✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌
🍅文末获取项目下载方式🍅
一、项目背景介绍:
小程序用户登录,注册,然后填写自己的个人信息(姓名,性别,出生日期,身高,当前体重),然后可以为自己添加减肥计划(比如 需要通过几周减肥XX斤变成目标体重,并且选择自己的运行类型(久坐不动,少量运行,中等运动),如果设置目标体重时,经计算得出每日减肥体重大于健康减肥体重系统(初始体重的%1)给出提示),系统获取到用户计划之后 为用户进行相关计算
相关计算包括(和当日体重有关的计算都应当动态变化,体重变化周期以日为单位),1:通过对应公式计算用户的BMR,然后通过BMR和用户运动类型计算出对应的 用户一天需要摄入的卡路里;2:减肥一千克需要减少摄入9000卡路里 然后通过用户一天该摄入的卡路里减去9000得出 系统建议用户一天摄入的卡路里;3:通过上述计算之后得出用户一天建议摄入的卡路里之后 然后通过某个比例得出早中晚三次应该摄入的比例(比如,早中晚分别对应2 5 3,就是假如系统建议用户一天摄入1000卡路里那么得出的 早餐中餐晚餐应该摄入的卡路里就是200 500 300);4:通过上述建议的早中晚三餐应该摄入的卡路里和协同过滤算法来推荐今日对应的食谱;5:计算出用户当前体重的BMI,然后通过人工智能AI进行用户对应的运动推荐
二、项目技术简介:
基于用户的协同过滤算法是根据用户之间的相似性来进行推荐,而基于物品的协同过滤算法则是根据物品之间的相似性来进行推荐。
8. 爬虫:网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 通俗地讲,我们把互联网比作一张大蜘蛛网,每个站点资源比作蜘蛛网上的一个结点,爬虫就像一只蜘蛛,按照设计好的路线和规则在这张蜘蛛网上找到目标结点,获取资源。
三、系统功能模块介绍:
四、数据库设计:
1:‘管理员’(admins)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 管理员编号 |
ad_name | varchar | NULL | 昵称 |
ad_username | varchar | NULL | 账号 |
ad_password | varchar | NULL | 密码 |
ad_header | varchar | NULL | 头像 |
2:‘文章’(blogs)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 文章编号 |
title | varchar | NULL | 文章标题 |
cover_img | varchar | NULL | 封面图片 |
content | text | NULL | 详情 |
detail | text | NULL | 图片数组 |
create_time | datetime | NULL | 发布时间 |
3:‘评论’(comment)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 评论编号 |
content | varchar | NULL | 评论内容 |
blog_id | bigint | NULL | 文章编号 |
user_id | bigint | NULL | 用户编号 |
parent_id | bigint | NULL | 父评论编号 |
create_time | datetime | NULL | 创建时间 |
4:‘饮水记录’(drink_records)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 饮水记录编号 |
user_id | bigint | NULL | 所属用户 |
ml | int | NULL | 饮水量 |
create_time | date | NULL | 创建时间 |
plan_id | bigint | NULL | 所属计划 |
update_time | datetime | NULL | 修改时间 |
5:‘饮食记录管理’(food_records)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 记录编号 |
plan_id | bigint | NULL | 所属计划 |
user_id | bigint | NULL | 所属用户 |
food_id | bigint | NULL | 食品编号 |
type | int | NULL | 类型[0:早餐,1:午餐,2:晚餐,3:加餐] |
create_time | date | NULL | 创建时间 |
update_time | datetime | NULL | 更新时间 |
6:‘食品管理’(foods)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 食品编号 |
food_name | varchar | NULL | 食品名称 |
food_img | varchar | NULL | 食品图片 |
calorie | varchar | NULL | 热量 |
food_type | bigint | NULL | 商品分类 |
time_type | int | NULL | 时间类型[0:早餐,1:午餐,2:晚餐] |
create_time | datetime | NULL | 创建时间 |
7:‘运动记录管理’(motion_records)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 运动记录编号 |
plan_id | bigint | NULL | 所属计划 |
user_id | bigint | NULL | 所属用户 |
motion_id | bigint | NULL | 所属运动 |
create_time | date | NULL | 创建时间 |
8:‘运动管理’(motions)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 运动编号 |
motion_name | varchar | NULL | 运动名称 |
motion_img | varchar | NULL | 运动图标 |
calorie | varchar | NULL | 热量 |
type_id | bigint | NULL | 所属分类 |
create_time | datetime | NULL | 创建时间 |
9:‘每日计划详细’(plan_detail)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 记录编号 |
current_weight | varchar | NULL | 当前体重 |
bmr | varchar | NULL | 基础代谢率 |
bmi | varchar | NULL | 身体质量指数 |
drink | varchar | NULL | 推荐饮水量 |
normal_calories | varchar | NULL | 正常卡路里 |
recommend_calories | varchar | NULL | 推荐卡路里 |
motions_info | text | NULL | 运动推荐 |
breakfast | bigint | NULL | 推荐早餐编号 |
lunch | bigint | NULL | 午餐推荐编号 |
dinner | bigint | NULL | 晚餐推荐编号 |
plan_id | bigint | NULL | 所属计划 |
user_id | bigint | NULL | 所属用户 |
create_time | date | NULL | 创建时间 |
10:‘计划管理’(plans)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 计划编号 |
user_id | bigint | NULL | 所属用户 |
plan_name | varchar | NULL | 计划名称 |
plan_start_time | date | NULL | 计划开始时间 |
plan_end_time | date | NULL | 计划结束时间 |
status | int | NULL | 计划状态[0:启用,1:禁用] |
target_weight | varchar | NULL | 目标体重 |
motion_type | int | NULL | 运动类型[0:久坐不动,1:少量运行,2:中等运动,3:大量运动] |
create_time | datetime | NULL | 创建时间 |
11:‘分类管理’(types)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 分类编号 |
type_name | varchar | NULL | 分类名称 |
type | int | NULL | 分类[0:食品,1:运动] |
create_time | datetime | NULL | 创建时间 |
12:‘用户管理’(users)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 用户编号 |
nickname | varchar | NULL | 用户姓名 |
sex | int | NULL | 性别[0:男,1:女] |
avatar | varchar | NULL | 头像 |
birthday | varchar | NULL | 出生日期 |
weight | varchar | NULL | 当前体重 |
height | varchar | NULL | 身高 |
username | varchar | NULL | 用户名 |
password | varchar | NULL | 密码 |
create_time | datetime | NULL | 创建时间 |
五、功能模块:
小程序登录注册:用户可以进行账号登录已经注册
小程序首页:小程序首页包含减肥计划,以及体重记录,热量记录入口,当前饮水已经二十摄入,运动训练记录
饮食记录:记录用户今日摄入的卡路里,消耗的卡路里,以及早中晚三餐的具体饮食,运动详情
饮食记录:记录用户每日的饮水量
减肥资讯:通过爬虫自动获取减肥资讯,用户可以进行相关评论
饮食推荐:根据用户体重情况以及协同过滤算法来推荐用户的早中晚三餐
运动推荐:AI通过用户的体重来进行合适的运动推荐
后台管理:对整个系统的数据进行管理,包括饮食分类,食品,运动,用户,减肥计划等数据管理
六、代码示例:
@GetMapping("/home/init/{id}") public ReturnMsg homeInit(@PathVariable Long id) throws Exception { UsersDTO usersDTO = usersService.getById(id); // 查询用户当前计划 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(PlansDTO::getStatus, 0).eq(PlansDTO::getUserId, id).last("limit 1"); PlansDTO plansDTO = baseService.getOne(queryWrapper); if (plansDTO == null) throw new Exception("暂无减肥计划"); boolean greaterOrEqual = LocalDateTimeUtils.isCurrentDateGreaterOrEqual(plansDTO.getPlanStartTime()); if (!greaterOrEqual) throw new Exception("减肥计划未到达开始时间"); Long planId = plansDTO.getId(); String currentDay = LocalDateTimeUtils.formatNowyyMMdd(); LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); queryWrapper1.eq(PlanDetailDTO::getPlanId, planId) .eq(PlanDetailDTO::getCreateTime, currentDay) .eq(PlanDetailDTO::getUserId, id).last("limit 1"); PlanDetailDTO planDetailDTO = planDetailService.getOne(queryWrapper1); HomeVO homeVO = new HomeVO(); homeVO.setPlanId(planId); homeVO.setStartTime(plansDTO.getPlanStartTime()); homeVO.setEndTime(plansDTO.getPlanEndTime()); // 当前体重 String currentWeight = getCurrentWeight(id, planId, usersDTO); homeVO.setCurrentWeight(currentWeight); // 开始体重 homeVO.setStartWeight(usersDTO.getWeight()); // 每天需要减肥 double needWeight = Double.parseDouble(currentWeight) - Double.parseDouble(plansDTO.getTargetWeight()); if (needWeight <= 0) { homeVO.setDayWeight(0d); } else { int days = LocalDateTimeUtils.differentDays(new Date(), plansDTO.getPlanEndTime()); double dayNeedWeight = needWeight / days; homeVO.setDayWeight(handleScale(dayNeedWeight)); } if (planDetailDTO == null) { // 处理今日计划 planDetailDTO = handlePlanDetail(plansDTO, usersDTO, homeVO.getCurrentWeight()); planDetailDTO.setCurrentWeight(currentWeight); planDetailService.save(planDetailDTO); // 运动推荐 handleMotionsInfo(planDetailDTO.getId(), usersDTO, homeVO.getCurrentWeight(), plansDTO); // 早中晚三餐推荐 handleFood(planDetailDTO.getId(), planDetailDTO.getRecommendCalories()); } homeVO.setPlanDetailId(planDetailDTO.getId()); homeVO.setUpdateTime(planDetailDTO.getCreateTime()); // 今日目标饮水量 homeVO.setDayDrink(planDetailDTO.getDrink()); // 还需要的饮水量 homeVO.setDrink(dayDrink(planId, usersDTO.getId(), planDetailDTO.getDrink())); // 目标体重 homeVO.setTargetWeight(plansDTO.getTargetWeight()); // 热量记录查询 FoodRecordsDTO foodRecordsDTO = new FoodRecordsDTO(); foodRecordsDTO.setUserId(id); foodRecordsDTO.setPlanId(planId); foodRecordsDTO.setCreateTimeStr(currentDay); List foodRecordsDTOS = foodRecordsService.findList(foodRecordsDTO); homeVO.setFoodRecordsDTOS(foodRecordsDTOS); // 饮食卡路里 double foodCaloriesTotal = 0d; // 运动消耗的卡路里 double motionsCaloriesTotal = 0d; if (CollectionUtil.isNotEmpty(foodRecordsDTOS)) { homeVO.setFoodUpdateTime(foodRecordsDTOS.get(0).getUpdateTime()); for (FoodRecordsDTO recordsDTO : foodRecordsDTOS) { foodCaloriesTotal += Double.parseDouble(recordsDTO.getCalorie()); } } homeVO.setFoodCalories(foodCaloriesTotal); homeVO.setRecommendCalories(handleScale(Double.parseDouble(planDetailDTO.getRecommendCalories()))); // 运动记录查询 MotionRecordsDTO motionRecordsDTO = new MotionRecordsDTO(); motionRecordsDTO.setUserId(id); motionRecordsDTO.setPlanId(planId); motionRecordsDTO.setCreateTimeStr(currentDay); List motionRecordsDTOS = motionRecordsService.findList(motionRecordsDTO); homeVO.setMotionRecordsDTOS(motionRecordsDTOS); if (CollectionUtil.isNotEmpty(motionRecordsDTOS)) { for (MotionRecordsDTO recordsDTO : motionRecordsDTOS) { motionsCaloriesTotal += Double.parseDouble(recordsDTO.getCalorie()); } } // 设置今日运动消耗卡路里 homeVO.setMotionCalories(motionsCaloriesTotal); // 今日还可卡路里 = 推荐卡路里 + 运动消耗的卡路里 - 饮食的卡路里 double dayCalories = Double.parseDouble(planDetailDTO.getRecommendCalories()) + motionsCaloriesTotal - foodCaloriesTotal; homeVO.setDayCalories(handleScale(dayCalories)); return ReturnMsg.ok(homeVO); }
七、项目总结:
通过对基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序的开发,让我深刻明白开发一个程序软件需要经历的流程,当确定要开发一个基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序的程序时,
我在开发期间,对其功能进行合理的需求分析,然后才是程序软件的功能的框架设计,数据库的实体与数据表设计,
程序软件的功能详细界面实现,以及程序的功能测试等进行全方位的细致考虑,虽然在此过程中,各个环节都遇到了大大小小的困难,但是通过对这些问题进行反复的分析,深入的思考,
借助各种相关文献资料提供的方法与解决思路成功解决面临的各个问题,最后成功的让我开发的基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序得以正常运行。
基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序在功能上面是基本可以满足用户对系统的操作,但是这个程序软件也有许多方面是不足的,因此,在下一个时间阶段,有几点需要改进的地方需要提出来,它们分别是:
(1)操作页面可以满足用户简易操作的要求,但是在页面多样化设计层面上需要把一些比较丰富的设计结构考虑进来。
(2)程序软件的总体安全性能需要优化,例如程序的退出安全性,以及程序的并发性等问题都需要进行安全性升级,让开发的基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序中的相关网站更贴合。
(3)需要对程序的数据结构方面,程序的代码方面等进行优化,让运行起来的程序可以保持稳定运行,也让程序能够保证短时间内处理相关事务,节省处理事务的时间,提高事务处理的效率,
同时对服务器上资源占用的比例进行降低。
基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序的开发一方面是对自身专业知识技能进行最终考核,另一方面也是让自己学会独立解决程序开发过程中所遇到的问题,掌握将理论知识运用于程序开发实践的方法。
基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序的开发最终目标就是让系统更具人性化,同时在逻辑设计上,让系统能够更加的严谨。
八、源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取项目下载链接,博主联系方式👇🏻👇🏻👇🏻
链接点击直达:下载链接