网站怎么修改模板内容,小说网站如何赚钱,郑州+高端网站建设,如何制作自己的网站免费概述
智慧医药系统#xff08;smart-medicine#xff09;是一个基于 SpringBoot 开发的Web 项目。整体页面简约大气#xff0c;增加了AI医生问诊功能#xff0c;功能设计的较为简单。
开源地址
https://gitcode.net/NVG_Haru/Java_04
界面预览 功能介绍
游客功能介绍 …
概述
智慧医药系统smart-medicine是一个基于 SpringBoot 开发的Web 项目。整体页面简约大气增加了AI医生问诊功能功能设计的较为简单。
开源地址
https://gitcode.net/NVG_Haru/Java_04
界面预览 功能介绍
游客功能介绍
功能模块功能描述登录注册方面注册成为系统用户系统主页浏览系统主页、疾病、药品信息搜索、详情的查看统计浏览量
用户功能介绍
功能模块功能描述登录注册方面填写用户信息进行账号注册邮件接收验证码、使用账号密码进行登录个人资料方面修改个人资料姓名、年龄、手机号、头像等、修改登录密码系统反馈方面提交系统反馈意见智能医生方面与智能医生进行交流聊天
管理员功能介绍
功能模块功能描述登录注册方面填写用户信息进行账号注册邮件接收验证码、使用账号密码进行登录个人资料方面修改个人资料姓名、年龄、手机号、头像等、修改登录密码系统反馈方面提交系统反馈意见智能医生方面与智能医生进行交流聊天疾病管理方面发布疾病、编辑名称、原因、症状、分类等、删除药品等药品管理方面发布药品、编辑名称、搜索关键词、功效、用法用量、类型等、关联疾病、删除药品等反馈管理方面管理用户提交的反馈信息
数据库设计 代码讲解
AI 问诊功能
这个功能借助阿里通义千问大模型实现调用了com.alibaba.dashscope.*sdk提供的接口主要流程如下
创建Generation对象创建MessageManager对象创建系统消息将系统消息和用户消息添加到MessageManager中创建QwenParam对象调用Generation的call方法获取GenerationResult对象获取GenerationResult对象的输出部分获取输出中的第一个消息并返回 public String query(String queryMessage) {// 设置API keyConstants.apiKey apiKey;try {// 创建Generation对象Generation gen new Generation();// 创建MessageManager对象MessageManager msgManager new MessageManager(10);// 创建系统消息Message systemMsg Message.builder().role(Role.SYSTEM.getValue()).content(你是智能医生你只回答与医疗相关的问题不要回答其他问题).build();// 创建用户消息Message userMsg Message.builder().role(Role.USER.getValue()).content(queryMessage).build();// 将系统消息和用户消息添加到MessageManager中msgManager.add(systemMsg);msgManager.add(userMsg);// 创建QwenParam对象QwenParam param QwenParam.builder().model(Generation.Models.QWEN_TURBO).messages(msgManager.get()).resultFormat(QwenParam.ResultFormat.MESSAGE).build();// 调用Generation的call方法获取GenerationResult对象GenerationResult result gen.call(param);// 获取GenerationResult对象的输出部分GenerationOutput output result.getOutput();// 获取输出中的第一个消息Message message output.getChoices().get(0).getMessage();// 返回消息的内容return message.getContent();} catch (Exception e) {return 智能医生现在不在线请稍后再试;}}反馈功能
主要讲解一下query这个查询函数该函数接受一个Feedback实体函数实际上这是一种偷懒的做法最佳方案还是确定好哪些参数可以进入函数。
package world.xuewei.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import world.xuewei.dao.FeedbackDao;
import world.xuewei.entity.Feedback;
import world.xuewei.utils.Assert;
import world.xuewei.utils.BeanUtil;
import world.xuewei.utils.VariableNameUtils;import java.io.Serializable;
import java.util.List;
import java.util.Map;/*** 反馈服务类**/
Service
public class FeedbackService extends BaseServiceFeedback {Autowiredprotected FeedbackDao userDao;/*** 查询满足指定条件的Feedback列表** param o 查询条件对象* return 满足条件的Feedback列表*/Overridepublic ListFeedback query(Feedback o) {// 创建QueryWrapper对象QueryWrapperFeedback wrapper new QueryWrapper();if (Assert.notEmpty(o)) {// 将对象转换为MapMapString, Object bean2Map BeanUtil.bean2Map(o);// 遍历Map中的键值对for (String key : bean2Map.keySet()) {if (Assert.isEmpty(bean2Map.get(key))) {continue;}// 根据键值对创建查询条件wrapper.eq(VariableNameUtils.humpToLine(key), bean2Map.get(key));}}// 执行查询操作return userDao.selectList(wrapper);}Overridepublic ListFeedback all() {return query(null);}Overridepublic Feedback save(Feedback o) {if (Assert.isEmpty(o.getId())) {userDao.insert(o);} else {userDao.updateById(o);}return userDao.selectById(o.getId());}Overridepublic Feedback get(Serializable id) {return userDao.selectById(id);}Overridepublic int delete(Serializable id) {return userDao.deleteById(id);}
}疾病功能
package world.xuewei.service;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import world.xuewei.dao.IllnessDao;
import world.xuewei.entity.*;
import world.xuewei.utils.Assert;
import world.xuewei.utils.BeanUtil;
import world.xuewei.utils.VariableNameUtils;import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 疾病服务类** author XUEW*/
Service
public class IllnessService extends BaseServiceIllness {Autowiredprotected IllnessDao illnessDao;Overridepublic ListIllness query(Illness o) {QueryWrapperIllness wrapper new QueryWrapper();if (Assert.notEmpty(o)) {MapString, Object bean2Map BeanUtil.bean2Map(o);for (String key : bean2Map.keySet()) {if (Assert.isEmpty(bean2Map.get(key))) {continue;}wrapper.eq(VariableNameUtils.humpToLine(key), bean2Map.get(key));}}return illnessDao.selectList(wrapper);}Overridepublic ListIllness all() {return query(null);}Overridepublic Illness save(Illness o) {if (Assert.isEmpty(o.getId())) {illnessDao.insert(o);} else {illnessDao.updateById(o);}return illnessDao.selectById(o.getId());}Overridepublic Illness get(Serializable id) {return illnessDao.selectById(id);}Overridepublic int delete(Serializable id) {return illnessDao.deleteById(id);}public MapString, Object findIllness(Integer kind, String illnessName, Integer page) {MapString, Object map new HashMap(4);QueryWrapperIllness illnessQueryWrapper new QueryWrapper();if (Assert.notEmpty(illnessName)) {illnessQueryWrapper.like(illness_name, illnessName).or().like(include_reason, illnessName).or().like(illness_symptom, illnessName).or().like(special_symptom, illnessName);}if (kind ! null) {if (Assert.notEmpty(illnessName)) {illnessQueryWrapper.last(and (kind_id kind ) ORDER BY create_time DESC limit (page - 1) * 9 , page * 9);} else {illnessQueryWrapper.eq(kind_id, kind);illnessQueryWrapper.orderByDesc(create_time);illnessQueryWrapper.last(limit (page - 1) * 9 , page * 9);}} else {illnessQueryWrapper.orderByDesc(create_time);illnessQueryWrapper.last(limit (page - 1) * 9 , page * 9);}int size illnessDao.selectMaps(illnessQueryWrapper).size();ListMapString, Object list illnessDao.selectMaps(illnessQueryWrapper);list.forEach(l - {Integer id MapUtil.getInt(l, id);Pageview pageInfo pageviewDao.selectOne(new QueryWrapperPageview().eq(illness_id, id));l.put(kindName, 暂无归属类);l.put(create_time, MapUtil.getDate(l, create_time));l.put(pageview, pageInfo null ? 0 : pageInfo.getPageviews());Integer kindId MapUtil.getInt(l, kind_id);if (Assert.notEmpty(kindId)) {IllnessKind illnessKind illnessKindDao.selectById(kindId);if (Assert.notEmpty(illnessKind)) {l.put(kindName, illnessKind.getName());}}});map.put(illness, list);map.put(size, size 9 ? 1 : size / 9 1);return map;}public MapString, Object findIllnessOne(Integer id) {Illness illness illnessDao.selectOne(new QueryWrapperIllness().eq(id, id));ListIllnessMedicine illnessMedicines illnessMedicineDao.selectList(new QueryWrapperIllnessMedicine().eq(illness_id, id));ListMedicine list new ArrayList(4);MapString, Object map new HashMap(4);Pageview illness_id pageviewDao.selectOne(new QueryWrapperPageview().eq(illness_id, id));if (Assert.isEmpty(illness_id)) {illness_id new Pageview();illness_id.setIllnessId(id);illness_id.setPageviews(1);pageviewDao.insert(illness_id);} else {illness_id.setPageviews(illness_id.getPageviews() 1);pageviewDao.updateById(illness_id);}map.put(illness, illness);if (CollUtil.isNotEmpty(illnessMedicines)) {illnessMedicines.forEach(illnessMedicine - {Medicine medicine medicineDao.selectOne(new QueryWrapperMedicine().eq(id, illnessMedicine.getMedicineId()));if (ObjectUtil.isNotNull(medicine)) {list.add(medicine);}});map.put(medicine, list);}return map;}public Illness getOne(QueryWrapperIllness queryWrapper) {return illnessDao.selectOne(queryWrapper);}
}讲一讲findIllnessOne这个函数是一个用于查找疾病信息的方法。它接受三个参数kind表示疾病类型illnessName表示疾病名称page表示页码。函数首先创建一个HashMap用于存储结果。然后创建一个QueryWrapper对象用于构建查询条件。如果illnessName不为空则通过like操作符模糊匹配illness_name、include_reason、illness_symptom和special_symptom字段中的任意一个包含illnessName的内容。接下来根据kind和illnessName的值构建查询条件包括对kind_id和create_time的筛选和排序。然后通过调用illnessDao.selectMaps方法获取查询结果的列表。接着遍历列表对每个疾病对象获取id并通过pageviewDao.selectOne方法查询对应的pageview信息。然后将一些字段放入疾病对象的HashMap中包括kindName默认值为暂无归属类、create_time、pageview如果查询失败则为0和kindName如果有。接下来根据疾病列表的大小计算总页数并将疾病列表和总页数放入HashMap中。最后将HashMap作为结果返回。
主要问题有 重复代码在kind ! null和else部分关于orderByDesc和last的查询条件重复了分页逻辑。可以简化这两个部分的代码。 查询条件构造like操作的字段和值应该使用占位符这样可以避免SQL注入。 断言Assert.notEmpty的使用代码中使用了Assert.notEmpty这通常用于校验条件但在这个上下文中这个校验似乎是多余的因为如果illnessName为空之前的like条件就无法匹配任何结果。 使用更合适的数据容器List和Map已经足够表达结果可以考虑直接返回一个Page对象而不是Map其中包含数据列表和分页信息。 代码可读性一些变量的命名可以更加清晰例如map变量可以命名为pageResult以更清楚地表示它包含的是分页结果。 避免硬编码分页大小即每页9条记录被硬编码在查询中可以作为常量提取出来。 异常处理在查询过程中应该有适当的异常处理机制以处理潜在的数据库访问错误。 数据映射数据映射和处理逻辑可以封装到单独的方法中以提高代码的可读性和可维护性。