562 lines
20 KiB
Markdown
562 lines
20 KiB
Markdown
# 心理测评系统技术架构设计
|
||
|
||
## 系统架构概述
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 用户层 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ 桌面浏览器 │ 移动浏览器 │ 微信小程序 │ 第三方系统API │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↕
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 前端应用层 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ Vue 2.6 + Element UI + Vuex + Router │
|
||
│ ┌────────────┬──────────────┬──────────────┬────────────┐ │
|
||
│ │量表管理模块│ 测评执行模块 │ 统计报表模块 │ 系统配置 │ │
|
||
│ └────────────┴──────────────┴──────────────┴────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↕ (HTTP/RESTful API)
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 网关/负载均衡 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ Nginx / 反向代理 │
|
||
│ ┌────────────┬──────────────┬──────────────┐ │
|
||
│ │静态资源 │ 请求转发 │ SSL/TLS │ │
|
||
│ └────────────┴──────────────┴──────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↕
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 应用服务层 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ Spring Boot 2.5 + Spring Security │
|
||
│ ┌──────────────────────────────────────────────────────┐ │
|
||
│ │ Controller层 │ │
|
||
│ │ ┌────────────┬──────────────┬──────────────┐ │ │
|
||
│ │ │量表管理Controller│测评Controller│报告Controller│ │ │
|
||
│ │ └────────────┴──────────────┴──────────────┘ │ │
|
||
│ ├──────────────────────────────────────────────────────┤ │
|
||
│ │ Service层 │ │
|
||
│ │ ┌────────────┬──────────────┬──────────────┐ │ │
|
||
│ │ │量表服务 │ 测评服务 │ 报告服务 │ │ │
|
||
│ │ └────────────┴──────────────┴──────────────┘ │ │
|
||
│ ├──────────────────────────────────────────────────────┤ │
|
||
│ │ Mapper层 (MyBatis) │ │
|
||
│ │ ┌────────────┬──────────────┬──────────────┐ │ │
|
||
│ │ │量表Mapper │ 测评Mapper │ 报告Mapper │ │ │
|
||
│ │ └────────────┴──────────────┴──────────────┘ │ │
|
||
│ └──────────────────────────────────────────────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↕
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 数据存储层 │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ ┌──────────────┬──────────────┬──────────────┬─────────┐ │
|
||
│ │ MySQL │ Redis │ 文件存储 │ TTS │ │
|
||
│ │ (数据持久) │ (缓存/会话) │ (报告/音频) │ (语音) │ │
|
||
│ └──────────────┴──────────────┴──────────────┴─────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 模块划分
|
||
|
||
### 后端模块结构
|
||
|
||
```
|
||
ry-news (根模块)
|
||
├── ry-news-admin (启动模块)
|
||
│ ├── controller (控制器层)
|
||
│ │ ├── psychology (心理测评)
|
||
│ │ │ ├── PsyScaleController
|
||
│ │ │ ├── PsyAssessmentController
|
||
│ │ │ ├── PsyReportController
|
||
│ │ │ ├── PsyWarningController
|
||
│ │ │ └── ...
|
||
│ │ └── api (开放API)
|
||
│ │ └── ApiController
|
||
│ └── core (配置)
|
||
│
|
||
├── ry-news-system (系统模块)
|
||
│ └── psychology (心理测评业务逻辑)
|
||
│ ├── domain (实体类)
|
||
│ │ ├── PsyScale
|
||
│ │ ├── PsyAssessment
|
||
│ │ └── ...
|
||
│ ├── mapper (数据访问)
|
||
│ │ ├── PsyScaleMapper
|
||
│ │ ├── PsyAssessmentMapper
|
||
│ │ └── ...
|
||
│ ├── service (业务逻辑接口)
|
||
│ │ ├── IPsyScaleService
|
||
│ │ ├── IPsyAssessmentService
|
||
│ │ └── ...
|
||
│ └── service.impl (业务逻辑实现)
|
||
│ ├── PsyScaleServiceImpl
|
||
│ ├── PsyAssessmentServiceImpl
|
||
│ └── ...
|
||
│
|
||
├── ry-news-framework (框架模块)
|
||
│ ├── security (安全配置)
|
||
│ ├── config (系统配置)
|
||
│ └── web (通用组件)
|
||
│
|
||
├── ry-news-common (公共模块)
|
||
│ ├── core (核心类)
|
||
│ ├── utils (工具类)
|
||
│ └── constants (常量)
|
||
│
|
||
├── ry-news-generator (代码生成器)
|
||
│
|
||
└── ry-news-quartz (定时任务)
|
||
```
|
||
|
||
### 前端模块结构
|
||
|
||
```
|
||
ruoyi-ui
|
||
├── src
|
||
│ ├── views
|
||
│ │ ├── psychology (心理测评模块)
|
||
│ │ │ ├── scale (量表管理)
|
||
│ │ │ │ ├── index.vue (列表页)
|
||
│ │ │ │ └── form.vue (表单页)
|
||
│ │ │ ├── assessment (测评执行)
|
||
│ │ │ │ ├── index.vue (测评页面)
|
||
│ │ │ │ └── history.vue (历史记录)
|
||
│ │ │ ├── report (测评报告)
|
||
│ │ │ │ ├── list.vue (报告列表)
|
||
│ │ │ │ └── detail.vue (报告详情)
|
||
│ │ │ ├── statistics (统计分析)
|
||
│ │ │ │ ├── group.vue (团体统计)
|
||
│ │ │ │ └── individual.vue (个体统计)
|
||
│ │ │ ├── warning (危机预警)
|
||
│ │ │ │ └── index.vue (预警管理)
|
||
│ │ │ ├── questionnaire (自定义问卷)
|
||
│ │ │ │ └── ...
|
||
│ │ │ ├── website (心理网站)
|
||
│ │ │ │ └── ...
|
||
│ │ │ └── config (系统配置)
|
||
│ │ │ └── ...
|
||
│ │ └── system (现有系统模块)
|
||
│ │
|
||
│ ├── api
|
||
│ │ ├── psychology (测评API)
|
||
│ │ │ ├── scale.js
|
||
│ │ │ ├── assessment.js
|
||
│ │ │ └── ...
|
||
│ │ └── system (系统API)
|
||
│ │
|
||
│ ├── components
|
||
│ │ ├── Psychology (测评组件)
|
||
│ │ │ ├── ItemEditor (题目编辑器)
|
||
│ │ │ ├── AudioPlayer (语音播放器)
|
||
│ │ │ ├── ReportViewer (报告查看器)
|
||
│ │ │ └── QRCodeGenerator (二维码生成器)
|
||
│ │ └── RuoYi (现有组件)
|
||
│ │
|
||
│ └── assets
|
||
│ ├── audio (语音文件)
|
||
│ └── images (图片资源)
|
||
```
|
||
|
||
---
|
||
|
||
## 数据库设计
|
||
|
||
### 核心表关系
|
||
|
||
```
|
||
sys_user (用户表)
|
||
↓ (1:N)
|
||
psy_assessment (测评记录表)
|
||
↓ (1:N) ↓ (1:N)
|
||
psy_assessment_answer psy_assessment_report
|
||
↓ (N:1) ↓ (1:1)
|
||
psy_scale_item psy_result_interpretation
|
||
↓ (N:1) ↓ (1:1)
|
||
psy_scale (量表表) psy_factor (因子表)
|
||
↓ (1:N) ↓ (1:N)
|
||
psy_factor_rule psy_factor_score
|
||
↓ (N:1)
|
||
psy_scale_item
|
||
```
|
||
|
||
### 关键表说明
|
||
|
||
**1. psy_scale (量表表)**
|
||
- 存储量表基本信息
|
||
- 关联量表类型、作者、来源
|
||
- 支持版本管理
|
||
|
||
**2. psy_scale_item (题目表)**
|
||
- 量表题目内容
|
||
- 题目类型、是否必填、反向计分
|
||
- 与量表多对一关系
|
||
|
||
**3. psy_scale_option (选项表)**
|
||
- 题目选项内容
|
||
- 选项分值
|
||
- 与题目多对一关系
|
||
|
||
**4. psy_factor (因子表)**
|
||
- 量表因子/维度
|
||
- 因子描述、解释
|
||
- 与量表多对一关系
|
||
|
||
**5. psy_factor_rule (因子计分规则表)**
|
||
- 定义因子计算方法
|
||
- 题目与因子的关系
|
||
- 权重、计算方式
|
||
|
||
**6. psy_assessment (测评记录表)**
|
||
- 测评基本信息
|
||
- 开始/提交时间、状态
|
||
- 用户关联(支持匿名)
|
||
|
||
**7. psy_assessment_answer (测评答案表)**
|
||
- 答题记录
|
||
- 选项/文本答案
|
||
- 得分
|
||
|
||
**8. psy_factor_score (因子得分表)**
|
||
- 各因子得分
|
||
- 标准分、百分位
|
||
- 与测评记录关联
|
||
|
||
**9. psy_assessment_report (测评报告表)**
|
||
- 报告内容(HTML)
|
||
- 图表数据(JSON)
|
||
- PDF路径
|
||
|
||
**10. psy_warning (危机预警表)**
|
||
- 预警记录
|
||
- 预警因子、得分
|
||
- 预警状态(未处理/已处理)
|
||
|
||
---
|
||
|
||
## 核心业务流程
|
||
|
||
### 测评流程
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant User as 用户
|
||
participant Frontend as 前端
|
||
participant Backend as 后端
|
||
participant DB as 数据库
|
||
participant Redis as Redis缓存
|
||
participant TTS as TTS服务
|
||
|
||
User->>Frontend: 选择量表
|
||
Frontend->>Backend: 创建测评记录
|
||
Backend->>DB: 插入assessment
|
||
Backend-->>Frontend: 返回assessmentId
|
||
|
||
loop 答题循环
|
||
Frontend->>Backend: 获取题目列表
|
||
Backend->>DB: 查询题目+选项
|
||
Backend-->>Frontend: 返回题目数据
|
||
|
||
Frontend->>Backend: 请求语音(TTS/缓存)
|
||
alt 缓存有语音
|
||
Backend->>Redis: 获取语音URL
|
||
else 需要生成语音
|
||
Backend->>TTS: 生成语音
|
||
Backend->>Redis: 缓存语音URL
|
||
end
|
||
Backend-->>Frontend: 返回语音URL
|
||
|
||
User->>Frontend: 选择答案
|
||
Frontend->>Backend: 保存答案(可暂停)
|
||
Backend->>DB: 保存answer
|
||
Backend-->>Frontend: 返回成功
|
||
|
||
alt 用户暂停
|
||
Backend->>DB: 更新状态为暂停
|
||
end
|
||
end
|
||
|
||
User->>Frontend: 提交测评
|
||
Frontend->>Backend: 提交评估
|
||
Backend->>Backend: 计算总分
|
||
Backend->>Backend: 计算因子分
|
||
Backend->>DB: 保存因子得分
|
||
|
||
Backend->>Backend: 检测危机预警
|
||
alt 触发预警
|
||
Backend->>DB: 插入预警记录
|
||
Backend->>Backend: 通知管理员
|
||
end
|
||
|
||
Backend->>Backend: 生成报告
|
||
Backend->>DB: 保存报告
|
||
Backend-->>Frontend: 返回报告ID
|
||
|
||
Frontend->>User: 展示测评报告
|
||
```
|
||
|
||
### 预警流程
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Assessment as 测评提交
|
||
participant Calculator as 计分服务
|
||
participant Warning as 预警服务
|
||
participant DB as 数据库
|
||
participant Admin as 管理员
|
||
|
||
Assessment->>Calculator: 提交测评数据
|
||
Calculator->>Calculator: 计算因子得分
|
||
Calculator->>DB: 保存因子得分
|
||
Calculator->>Warning: 触发预警检测
|
||
|
||
Warning->>DB: 查询预警规则
|
||
Warning->>Warning: 匹配预警条件
|
||
|
||
alt 触发预警
|
||
Warning->>DB: 插入预警记录
|
||
Warning->>Admin: 发送预警通知(邮件/短信)
|
||
Admin->>Warning: 查看预警详情
|
||
Admin->>Warning: 处理预警
|
||
|
||
Note over Admin,Warning: 用户接受干预后
|
||
Admin->>Assessment: 请求复查
|
||
Assessment->>Warning: 提交复查结果
|
||
Warning->>Warning: 判断是否解除预警
|
||
|
||
alt 解除预警
|
||
Warning->>DB: 更新预警状态为已解除
|
||
Warning->>Warning: 记录解除原因
|
||
end
|
||
end
|
||
```
|
||
|
||
---
|
||
|
||
## 技术选型
|
||
|
||
### 后端技术栈
|
||
|
||
| 技术 | 版本 | 用途 | 备注 |
|
||
|------|------|------|------|
|
||
| Spring Boot | 2.5.15 | 框架 | 稳定版本 |
|
||
| Spring Security | 5.7 | 安全认证 | JWT + 权限控制 |
|
||
| MyBatis | 3.x | ORM | 性能优良 |
|
||
| MySQL | 5.7+ | 数据库 | 主存储 |
|
||
| Redis | 6.x | 缓存 | 会话/数据缓存 |
|
||
| Druid | 1.2.23 | 连接池 | 监控支持 |
|
||
| JWT | 0.9.1 | 认证 | 无状态认证 |
|
||
| POI | 4.1.2 | Excel | 导入导出 |
|
||
| Swagger | 3.0.0 | API文档 | 接口文档 |
|
||
| TTS | - | 语音 | 阿里云/腾讯云 |
|
||
|
||
### 前端技术栈
|
||
|
||
| 技术 | 版本 | 用途 | 备注 |
|
||
|------|------|------|------|
|
||
| Vue | 2.6.12 | 框架 | 稳定版本 |
|
||
| Element UI | 2.15 | UI组件 | 丰富组件 |
|
||
| Vuex | 3.6.0 | 状态管理 | 全局状态 |
|
||
| Vue Router | 3.4.9 | 路由 | 单页应用 |
|
||
| Axios | 0.28.1 | HTTP请求 | 拦截器 |
|
||
| ECharts | 5.4.0 | 图表 | 数据可视化 |
|
||
| QRCode | - | 二维码 | 生成扫码 |
|
||
|
||
### 第三方服务
|
||
|
||
| 服务 | 用途 | 成本 |
|
||
|------|------|------|
|
||
| TTS (可选) | 语音合成 | 按量计费 |
|
||
| OSS (可选) | 对象存储 | 按量计费 |
|
||
| 短信服务 (可选) | 预警通知 | 按量计费 |
|
||
|
||
---
|
||
|
||
## 安全设计
|
||
|
||
### 1. 认证授权
|
||
|
||
- **JWT Token**:无状态认证
|
||
- **RBAC**:基于角色的权限控制
|
||
- **API Key**:开放API认证
|
||
- **会话管理**:Redis存储
|
||
|
||
### 2. 数据安全
|
||
|
||
- **密码加密**:BCrypt
|
||
- **SQL注入防护**:MyBatis参数化
|
||
- **XSS防护**:输入过滤
|
||
- **CSRF防护**:Token验证
|
||
|
||
### 3. 接口安全
|
||
|
||
- **限流**:防止恶意请求
|
||
- **签名验证**:API请求签名
|
||
- **IP白名单**:第三方系统访问
|
||
- **HTTPS**:传输加密
|
||
|
||
### 4. 数据备份
|
||
|
||
- **定时备份**:每日自动备份
|
||
- **增量备份**:减少存储
|
||
- **异地备份**:容灾准备
|
||
- **恢复测试**:定期演练
|
||
|
||
---
|
||
|
||
## 性能优化策略
|
||
|
||
### 1. 缓存策略
|
||
|
||
- **Redis缓存**:
|
||
- 量表信息缓存(24h)
|
||
- 题目列表缓存(24h)
|
||
- 会话信息缓存
|
||
- 语音URL缓存
|
||
|
||
- **本地缓存**:
|
||
- 配置信息(Caffeine)
|
||
- 字典数据
|
||
|
||
### 2. 数据库优化
|
||
|
||
- **索引优化**:核心字段建索引
|
||
- **分页查询**:避免大查询
|
||
- **读写分离**:主从复制
|
||
- **连接池**:合理配置
|
||
|
||
### 3. 代码优化
|
||
|
||
- **异步处理**:报告生成
|
||
- **批量操作**:答案提交
|
||
- **懒加载**:关联查询
|
||
- **分库分表**:大数据量(后期)
|
||
|
||
### 4. 前端优化
|
||
|
||
- **CDN加速**:静态资源
|
||
- **懒加载**:路由组件
|
||
- **虚拟滚动**:长列表
|
||
- **图片压缩**:减少体积
|
||
|
||
---
|
||
|
||
## 部署架构
|
||
|
||
### 开发环境
|
||
|
||
```
|
||
单机部署
|
||
├── MySQL (3306)
|
||
├── Redis (6379)
|
||
├── Spring Boot (8080)
|
||
└── Vue (80)
|
||
```
|
||
|
||
### 生产环境
|
||
|
||
```
|
||
负载均衡 (Nginx)
|
||
├── 应用服务器1 (Spring Boot :8080)
|
||
├── 应用服务器2 (Spring Boot :8080)
|
||
├── 静态文件服务器
|
||
│ └── Nginx (80/443)
|
||
├── 数据库集群
|
||
│ ├── MySQL Master
|
||
│ └── MySQL Slave (读写分离)
|
||
├── Redis集群 (主从+哨兵)
|
||
└── 文件存储
|
||
├── 本地存储
|
||
└── OSS (可选)
|
||
```
|
||
|
||
---
|
||
|
||
## API设计规范
|
||
|
||
### RESTful规范
|
||
|
||
| 方法 | 用途 | 示例 |
|
||
|------|------|------|
|
||
| GET | 查询 | `/psychology/scale/list` |
|
||
| POST | 新增 | `/psychology/scale/add` |
|
||
| PUT | 修改 | `/psychology/scale/edit` |
|
||
| DELETE | 删除 | `/psychology/scale/remove/{id}` |
|
||
|
||
### 响应格式
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {}
|
||
}
|
||
```
|
||
|
||
### 错误码设计
|
||
|
||
| 错误码 | 说明 |
|
||
|--------|------|
|
||
| 200 | 成功 |
|
||
| 401 | 未授权 |
|
||
| 403 | 无权限 |
|
||
| 404 | 资源不存在 |
|
||
| 500 | 服务器错误 |
|
||
| 1001 | 业务错误(自定义) |
|
||
|
||
---
|
||
|
||
## 日志与监控
|
||
|
||
### 日志
|
||
|
||
- **操作日志**:sys_oper_log
|
||
- **登录日志**:sys_logininfor
|
||
- **应用日志**:Logback
|
||
- **日志分级**:DEBUG/INFO/WARN/ERROR
|
||
|
||
### 监控
|
||
|
||
- **系统监控**:CPU/内存/磁盘
|
||
- **接口监控**:响应时间/成功率
|
||
- **慢查询监控**:SQL性能
|
||
- **预警通知**:邮件/短信
|
||
|
||
---
|
||
|
||
## 开发规范
|
||
|
||
### 命名规范
|
||
|
||
- **包名**:小写,单词用点分隔
|
||
- **类名**:大驼峰(PascalCase)
|
||
- **方法/变量**:小驼峰(camelCase)
|
||
- **常量**:全大写,下划线分隔
|
||
- **数据库表**:下划线分隔(snake_case)
|
||
|
||
### 代码规范
|
||
|
||
- **注释**:类/方法必须注释
|
||
- **异常处理**:捕获并记录
|
||
- **事务管理**:必要时加@Transactional
|
||
- **参数校验**:使用@Valid注解
|
||
- **日志输出**:关键操作记录日志
|
||
|
||
### Git规范
|
||
|
||
- **分支策略**:master/main开发,feature/功能分支
|
||
- **提交信息**:feat/fix/docs/refactor/perf
|
||
- **代码审查**:合并前review
|
||
- **版本标签**:v1.0.0格式
|
||
|
||
---
|
||
|
||
**文档版本**: v1.0
|
||
**创建日期**: 2025-11-01
|
||
**最后更新**: 待定
|
||
|