二型糖尿病居家管理小程序的设计与实现(消息订阅、websocket及时通讯、协同过滤算法)
🎈系统亮点:消息订阅(当用户设置了用药提醒后,小程序将会在wx里进行提醒用户)该逻辑需要进行配置openId和修改小部分代码、websocket及时通讯、协同过滤算法;
文档包含包图、用例图、系统功能图、流程图、总体E-R图、实体属性图。
一.系统开发工具与环境搭建
1.系统设计开发工具
后端
使用Java编程语言的Spring boot框架
项目架构:B/S架构
运行环境:win10/win11、jdk17
小程序端:
技术:Uniapp;UI库:colorUI;
开发工具:HBuilderX;
前端:
技术:框架Vue.js;UI库:ElementUI;
开发工具:Visual Studio Code;
后端:
技术:Java语言、mybatis plus、Spring boot框架;
开发工具:IDEA 2023.3.3版本;
数据库:
数据库:mysql5.7/8.0
数据库工具:Navicat12版本;
二.系统实现(部分截图)
用户端
1.用户登录
用户登录小程序,根据页面提示输入用户名和密码,选择对应的角色信息,进行登录。最外层使用<view>标签包裹整个登录卡片,添加了login-card和animate-slide-up两个类名,login-card用于设置卡片的样式,animate-slide-up 用于实现卡片向上滑动的动画效果。内部包含一个 <form> 表单,用于组织登录所需的各个输入项和操作按钮。
后端通过 AppUserMapper 从数据库中查询匹配的用户记录。若查询到用户记录,则使用用户的ID和 RoleType 生成JWT令牌并返回;若未查询到用户记录,则抛出 CustomException 提示用户检查登录信息,将用户的关键信息存储在JWT中并返回给客户端。客户端可以使用这个令牌在后续的请求中进行身份验证,服务端可以通过解析令牌来获取用户信息和进行权限控制。
2.用户注册
注册界面设置了用于输入用户昵称、登录密码和联系手机号的输入框,每个输入框都配备了对应的提示标签,并且利用v-model指令与formData对象中的相应属性进行双向数据绑定,以便实时获取用户输入的信息。界面底部设有一个注册按钮,当用户点击该按钮时,会触发Register()方法,从而启动注册流程。
后端通过 AppUserMapper 从数据库中查询匹配的用户记录。若查询到用户记录,则使用用户的ID和 RoleType 生成JWT令牌并返回;若未查询到用户记录,则抛出 CustomException 提示用户检查登录信息,将用户的关键信息存储在JWT中并返回给客户端。客户端可以使用这个令牌在后续的请求中进行身份验证,服务端可以通过解析令牌来获取用户信息和进行权限控制。
3.病例档案
用户登录系统后,跳转到首页界面。用户可以自己添加病历档案,包括空腹血糖、餐后不同时间的血糖、糖化血红蛋白、空腹及餐后不同时间的C肽和胰岛素数值。有助于患者和医护人员更好地跟踪和管理健康状况。通过v-for指令遍历CaseFilesList数组,为数组中的每个元素生成一个档案卡片组件。
用户可以查看自己的病历档案信息,进入界面,则会直接调用后端的查询列表接口,后端先构建分页查询模型,根据输入的页码和每页记录数进行查询病例档案数据。然后将查询得到的病例档案实体列表转换为传输模型列表,返回给前端,方便前端进行分页展示和数据处理。
4.在线问诊
在线问诊功能,当用户首次进入聊天界面时获取聊天记录。前端通过$http.PostAsyn向后端接口/WechatMessage/List发送请求,传递当前用户 SelfUserId 和对方用户OtherUserId的参数,获取聊天记录数据。将返回数据中的Items赋值给 MessageList 数组,并调用ScrollBottom方法滚动到消息底部,使界面显示最新消息。
在线问诊,用户进入在线问诊界面,后端使用for-each 循环遍历查询到的 wechatCollections 列表。对于列表中的每个WechatCollection实体对象,将其 lastTime 属性设置为当前时间,表示最后消息的时间;将其 lastMessage 属性设置为传入的 message,表示最后一条消息的内容。
5.医生列表
6.饮食管理
用户可以在前端查看饮食记录列表、日期切换处理、餐别选择、导航到添加食物页面以及推查看推荐食谱页面。当用户选择不同的餐别时,该方法被触发。更新this.selectedMeal 为用户选择的餐别类型,同时将该类型设置到筛选条件 this.where.DietType 中,然后调用 GetDietRecordListApi方法重新获取该餐别的饮食记录列表,实现按餐别筛选饮食记录的功能。
用户可以查看系统推荐食谱信息,input.getPage()获取当前页码,input.getLimit() 获取每页显示的记录数。通过这两个参数,创建了一个分页查询的模型 page,后续将使用这个模型进行数据库的分页查询,从数据库中查询出符合条件的指定页码和每页记录数的食谱数据,并将结果封装在IPage<Recipe>对象 pageRecords 中。
7.运动管理
当运动记录数据更新时调用此方法,更新图表展示的数据。该方法根据this.RunRecordData 中的运动记录数据,计算热量、糖分和运动时长的相对数据,构建一个包含这些数据的对象 res。使用 JSON.parse(JSON.stringify(res)) 进行深拷贝,将结果赋值给 this.chartData,通常用于图表展示,确保数据在传递过程中不会相互影响。
当用户在前端发起添加运动记录的操作时,前端会将相关参数传递至后端。后端接收到这些参数后,会把输入的数据精准映射为RunRecord 运动记录实体。后端会调用数据库对应的保存或更新方法,对这个 RunRecord 实体进行持久化操作。后端会将处理好的 RunRecord 实体映射为传输对象,并将其返回给前端。前端接收到该传输对象后,可直接从中提取运动记录的关键信息,如消耗热量、消耗糖分、运动时长等,并将这些信息展示给用户。
8.运动管理
当运动记录数据更新时调用此方法,更新图表展示的数据。该方法根据this.RunRecordData 中的运动记录数据,计算热量、糖分和运动时长的相对数据,构建一个包含这些数据的对象 res。使用 JSON.parse(JSON.stringify(res)) 进行深拷贝,将结果赋值给 this.chartData,通常用于图表展示,确保数据在传递过程中不会相互影响。
当用户在前端发起添加运动记录的操作时,前端会将相关参数传递至后端。后端接收到这些参数后,会把输入的数据精准映射为RunRecord 运动记录实体。后端会调用数据库对应的保存或更新方法,对这个 RunRecord 实体进行持久化操作。后端会将处理好的 RunRecord 实体映射为传输对象,并将其返回给前端。前端接收到该传输对象后,可直接从中提取运动记录的关键信息,如消耗热量、消耗糖分、运动时长等,并将这些信息展示给用户。
9.课堂列表
10.论坛
11.个人中心
医生端
1.接诊记录
医生可以查看自己所有的接诊记录信息,可以选择完成接诊记录或回复患者信息。record-list 类用于包含所有的接诊记录项。v-for 指令遍历 filteredRecords 数组,为每个记录项生成一个 record-item元素,key 为每个记录项提供唯一标识,便于Vue高效更新DOM。
接诊记录中支持患者和医生进行聊天。后端如果查询到当前用户最近给对方发过消息,说明当前用户在对方未回复的情况下已经发过消息,此时抛出 CustomException 异常,提示 “24小时内只能发送一条消息,在对方给你发消息之前,你不能发送消息”,以此来限制消息的发送频率。
2.话题论坛
医生在首页进行浏览话题论坛,可以和其他用户进行评价、点赞和收藏话题。使用 <u-parse> 组件来渲染文章内容,文章内容数据来自 Detail.Content。u-parse 用于解析和渲染富文本内容的自定义组件。评论区通过 <CommentTree> 组件来展示评论列表。RelativeI和 Type 是传递给 CommentTree 组件的属性,RelativeId 的值来自 Id,Type 的值固定为 0。用于递归渲染评论及其回复,实现评论树的展示效果。
查询话题论坛的数据列表,通过数据库中查询与item关联的TopicType记录,关联条件是TopicType 表中的 Id 字段等于item的TopicTypeId。若查询到对应的 TopicType 记录,则将其属性复制到 TopicTypeDto 数据传输对象中;若未查询到,则使用一个空的 TopicType 对象。最后将 TopicTypeDto 设置到 item 对象中,使得 item 包含了与之关联的话题类型信息。
管理端
1.用户管理
2.话题管理
3.话题统计
话题统计界面主要展示了一个柱状统计图,标题为“最近一周各话题浏览人次”,图表横轴代表一周中的七天,纵轴代表浏览人次。图例标识了不同颜色柱子对应的糖尿病相关话题,如糖尿病基础知识、糖尿病预防等。前端获取后端的 Data.datas 数组进行映射操作,为每个话题生成数据,包含话题名称、图表类型为柱状图。
获取话题统计数据分析的数据,通过调用/Topic/TopicAnalyse接口,通过循环七天,对于每一天,从 topicRecords1 中筛选出创建时间等于当天日期的浏览记录,将这些记录的数量添加到 counts 列表中。将统计得到的最近七天每天的浏览记录数量列表 counts 作为 values 键的值存入之前创建的 data 映射中,然后将 data 映射添加到 allDataList 列表中。
4.医生管理
医生管理模块,前端调用 $PostSigleUpdate 方法,传入获取医生信息的接口路径/Doctor/Get、创建或编辑医生信息的接口路径/Doctor/CreateOrEdit。通过 this.$refs.PaginationTableId.Reload(this.searchForm) 重新加载医生信息表格,展示更新后的内容。
管理员拥有对医生模块数据进行管理的权限,可执行增加、删除、修改和查询操作。当管理员需要修改某条医生数据时,选中目标医生,系统会先调用 /Doctor/Get 接口,该接口会返回该医生的原始数据供管理员查看。管理员依据实际需求对这些数据信息进行修改,修改完成后,点击提交,系统将调用 /Doctor/CreateOrEdit 接口,把修改后的数据提交到系统进行保存更新。
5.食物管理
6.食物单位管理
7.科普视频
8.食谱管理
食谱管理模块,设有“搜索”和“重置”按钮,方便快速查找食谱。通过属于食谱标题和食谱介绍进行搜索相关食谱,前端将会把文本框的值作为参数传递给后端,进行查询对应食谱信息。前端以表格形式展示食谱信息,每一行对应一个食谱。可对食谱进行增删改查操作。
管理员拥有维护食谱信息的权限。管理员所设置的食谱信息可供用户参考,用户能够依据这些信息记录自己每日的饮食情况。当管理员需要删除某条食谱信息时,需先选中该条数据。系统会对该食谱进行查询,确认其确实存在于系统中。若食谱存在,系统将调用/Recipe/Delete 接口执行删除操作,完成对该条食谱信息的删除。