1. 项目背景与核心价值
人格障碍诊断系统在精神卫生领域具有重要应用价值。传统纸质问卷和单机版诊断工具存在数据孤岛、统计分析困难、诊断标准不统一等问题。这套基于SpringBoot+Vue的前后端分离系统实现了以下突破:
- 标准化诊断流程:内置ICD-10和DSM-5双标准评估体系
- 动态诊断逻辑:根据患者回答自动跳转关联问题
- 可视化报告:自动生成包含雷达图、历史对比的电子报告
- 多端协同:支持PC端医生诊断和移动端患者自评
关键设计决策:选择前后端分离架构是为了应对诊断过程中复杂的交互逻辑(如动态跳题)和后期多端扩展需求。Vue的响应式特性完美匹配动态表单渲染需求。
2. 技术栈选型解析
2.1 后端技术组合
-
SpringBoot 2.7.x:快速构建RESTful API
- 选用原因:内嵌Tomcat简化部署,Starter机制快速集成MyBatis等组件
- 关键配置:
yaml复制spring: datasource: url: jdbc:mysql://localhost:3306/pdds?useSSL=false&serverTimezone=UTC username: root password: 加密方案见4.3节
-
MyBatis-Plus 3.5.x:数据持久层
- 优势:内置通用Mapper减少30%样板代码
- 动态SQL示例:
xml复制<select id="selectByCondition" resultType="Patient"> SELECT * FROM patient <where> <if test="name != null">AND name LIKE CONCAT('%',#{name},'%')</if> <if test="gender != null">AND gender = #{gender}</if> </where> </select>
2.2 前端技术方案
-
Vue 3 + TypeScript:构建诊断界面
- 核心功能实现:
- 动态表单渲染:通过
<component :is="questionType"/>动态加载不同题型 - 逻辑跳转:利用watch监听答题状态触发路由跳转
typescript复制watch(() => currentScore, (newVal) => { if(newVal > threshold) router.push('/sectionB') }) - 动态表单渲染:通过
- 核心功能实现:
-
ECharts 5:可视化报告
- 典型配置:
javascript复制option = { radar: { indicator: [ { name: '偏执型', max: 100 }, { name: '分裂样', max: 100 } ] }, series: [{ data: [{value: [65, 70]}] }] }
- 典型配置:
3. 系统核心模块实现
3.1 诊断引擎设计
采用规则引擎+机器学习双模式:
-
规则引擎:基于决策树实现标准诊断流程
java复制public DiagnosisResult evaluate(AnswerSheet sheet) { if(sheet.getScore("A") > 70) { return checkClusterA(sheet); } else { return basicEvaluation(sheet); } } -
机器学习模型:使用XGBoost进行辅助判断
- 特征工程:提取答题时间、修改次数等行为特征
- 模型部署:通过Python Flask微服务提供预测接口
3.2 前后端交互关键点
-
安全控制:
- JWT令牌刷新机制
- 敏感数据加密传输
java复制@PostMapping("/submit") public Result submit(@RequestBody @Encrypted AnswerDTO dto) { // 解密逻辑 } -
性能优化:
- 问题列表分块加载
- 答案自动本地缓存
javascript复制// Vue组件内 useLocalStorage('answerCache', answers)
4. 部署实战指南
4.1 环境准备
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 11+ | 推荐Amazon Corretto |
| MySQL | 8.0+ | 需配置大小写敏感 |
| Node.js | 16+ | 建议使用nvm管理版本 |
4.2 数据库初始化
-
执行SQL脚本创建表结构
sql复制CREATE TABLE `diagnosis_record` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `patient_id` BIGINT NOT NULL, `doctor_id` BIGINT NOT NULL, `diagnosis_result` JSON NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -
初始化基础数据
bash复制
mysql -u root -p pdds < init_data.sql
4.3 安全配置要点
-
密码加密:
java复制public String encrypt(String raw) { return new BCryptPasswordEncoder().encode(raw); } -
API防护:
- 启用Spring Security
- 配置CORS白名单
java复制http.cors().configurationSource(request -> { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("https://clinic.example.com"); return config; });
5. 常见问题排查
5.1 跨域问题解决方案
-
开发环境:配置Vue代理
javascript复制devServer: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } -
生产环境:Nginx配置
nginx复制location /api/ { proxy_pass http://backend:8080/; add_header 'Access-Control-Allow-Origin' '$http_origin'; }
5.2 MyBatis映射异常处理
典型错误场景:
java复制// 错误示例:属性名与字段名不一致导致映射失败
public class Patient {
private String patientName; // 数据库字段为name
}
解决方案:
-
使用@Result注解显式映射
java复制@Results({ @Result(property = "patientName", column = "name") }) -
或配置全局下划线转驼峰:
yaml复制mybatis: configuration: map-underscore-to-camel-case: true
6. 项目优化方向
-
诊断流程优化:
- 添加中断恢复功能
- 实现语音输入答题
-
技术架构升级:
- 引入Redis缓存常用诊断规则
- 使用WebSocket实现实时协作诊断
-
数据分析增强:
sql复制-- 建立诊断结果分析视图 CREATE VIEW diagnosis_stats AS SELECT result->>'$.type' AS type, COUNT(*) AS count, AVG(age) AS avg_age FROM diagnosis_record GROUP BY type;
这套系统在实际部署时需要注意医疗数据合规性要求,建议参考等保2.0三级标准进行安全加固。前端打包建议使用--modern模式生成现代浏览器兼容包,可减小30%体积。
