✌全网粉丝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进行用户对应的运动推荐
二、项目技术简介:
- JAVA:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
- Vue:Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助开发者高效地开发用户界面。
Vue是一个独立的社区驱动的项目,它是由尤雨溪在2014年作为其个人项目创建, 是一个成熟的、经历了无数实战考验的框架,它是目前生产环境中使用最广泛的JavaScript框架之一,可以轻松处理大多数web应用的场景,并且几乎不需要手动优化,并且Vue完全有能力处理大规模的应用。 - Element-UI:Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。
- SpringBoot:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
- Mybatis-Plus:MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。
- smart:微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。
全面开放申请后,主体类型为企业、政府、媒体、其他组织或个人的开发者,均可申请注册小程序。微信小程序、微信订阅号、微信服务号、微信企业号是并行的体系。
微信小程序是一种不用下载就能使用的应用,也是一项创新,经过将近两年的发展,已经构造了新的微信小程序开发环境和开发者生态。微信小程序也是这么多年来中国IT行业里一个真正能够影响到普通程序员的创新成果,已经有超过150万的开发者加入到了微信小程序的开发,与我们一起共同发力推动微信小程序的发展,微信小程序应用数量超过了一百万,覆盖200多个细分的行业,日活用户达到两个亿,微信小程序还在许多城市实现了支持地铁、公交服务。微信小程序发展带来更多的就业机会,2017年小程序带动就业104万人,社会效应不断提升。 - 协同过滤算法:协同过滤算法是一种基于用户历史行为数据的推荐算法,它通过对用户历史行为数据的挖掘发现用户的偏好,基于不同的偏好对用户进行群组划分并推荐品味相似的商品。协同过滤推荐算法分为两类,分别是基于用户的协同过滤算法和基于物品的协同过滤算法。
基于用户的协同过滤算法是根据用户之间的相似性来进行推荐,而基于物品的协同过滤算法则是根据物品之间的相似性来进行推荐。
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<PlansDTO> 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<PlanDetailDTO> 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<FoodRecordsDTO> 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<MotionRecordsDTO> 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的减肥小程序的开发最终目标就是让系统更具人性化,同时在逻辑设计上,让系统能够更加的严谨。
八、源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取项目下载链接,博主联系方式👇🏻👇🏻👇🏻
链接点击直达:下载链接