# his **Repository Path**: w1114303045/his ## Basic Information - **Project Name**: his - **Description**: 云脑医疗实训 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-22 - **Last Updated**: 2026-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HIS 医疗信息系统 · 项目文档 > 版本:v1.3.0 | 日期:2026-06-29 --- ## 目录 1. [项目概述](#1-项目概述) 2. [技术选型](#2-技术选型) 3. [系统架构](#3-系统架构) 4. [功能模块说明](#4-功能模块说明) 5. [数据库设计](#5-数据库设计) 6. [后端接口说明](#6-后端接口说明) 7. [项目结构](#7-项目结构) 8. [环境准备与部署](#8-环境准备与部署) 9. [默认账号](#9-默认账号) --- ## 1 项目概述 HIS(Hospital Information System,医院信息系统)是一套面向中小型医疗机构的 **Web 端综合管理平台**,覆盖用户权限、医生排班、医疗设备、患者管理与 AI 智能分诊等核心业务场景。 ### 主要功能 | 模块 | 核心功能 | |------|---------| | 用户权限 | 用户/角色/菜单 CRUD,基于角色的菜单权限控制,JWT 登录鉴权 | | 医生排班 | 科室管理、医生注册(含账号创建)、班次配置、排班日历(周视图)、批量排班、停诊管理、医生自查排班 | | 医疗设备 | 设备分类树、设备台账、状态管理、使用记录、维修维护记录 | | 患者管理 | 患者建档、挂号登记、取消挂号、队列号自动生成 | | AI 智能分诊 | 接入 DeepSeek 大模型,根据症状自动生成优先级、推荐科室、初步诊断 | --- ## 2 技术选型 ### 后端 | 技术 | 版本 | 说明 | |------|------|------| | Java | 17 | 核心语言 | | Spring Boot | 3.5.x | 应用框架 | | Spring Security | 6.x | 认证与鉴权 | | MyBatis-Plus | 3.5.14 | ORM 框架,内置分页、逻辑删除 | | MySQL | 8.0 | 关系型数据库 | | JJWT | 0.12.6 | JWT Token 生成与解析 | | Lombok | latest | 简化实体样板代码 | | Jakarta Validation | 3.x | 接口参数校验 | ### 前端 | 技术 | 版本 | 说明 | |------|------|------| | Vue | 3.x | 前端框架(Composition API) | | Vite | 8.x | 构建工具 | | Element Plus | 2.14.x | UI 组件库 | | Vue Router | 5.x | 路由管理 | | Pinia | 3.x | 全局状态管理 | | Axios | 1.x | HTTP 请求封装 | | ECharts | 6.x | 数据可视化图表 | | dayjs | 1.11.x | 日期处理 | ### AI 集成 | 服务 | 说明 | |------|------| | DeepSeek API | 调用 `deepseek-chat` 模型,通过 OpenAI 兼容接口实现 AI 分诊,返回 JSON 格式结果 | --- ## 3 系统架构 ``` ┌─────────────────────────────────────────────────────────┐ │ 浏览器客户端 │ │ Vue 3 + Element Plus + Pinia + Axios │ └──────────────────────────┬──────────────────────────────┘ │ HTTP / REST API (JWT) ▼ ┌─────────────────────────────────────────────────────────┐ │ Spring Boot 后端服务 │ │ ┌──────────┐ ┌──────────┐ ┌─────────────────────┐ │ │ │ Security │ │ JWT │ │ GlobalException │ │ │ │ Filter │→ │ Auth │ │ Handler │ │ │ └──────────┘ └──────────┘ └─────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ 业务模块 Controller Layer │ │ │ │ user │ schedule │ equipment │ patient │ triage │ │ │ └──────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ Service + MyBatis-Plus │ │ │ └──────────────────────────────────────────────────┘ │ └─────────────────────────┬───────────────────────────────┘ │ │ ┌───────────▼──────┐ ┌───────▼──────────┐ │ MySQL 8.0 │ │ DeepSeek API │ │ his_db │ │ (AI 分诊) │ └──────────────────┘ └──────────────────┘ ``` ### 认证流程 ``` 客户端 → POST /api/user/login (username + password) ← 返回 JWT Token 客户端 → 后续请求 Header: Authorization: Bearer → JwtAuthenticationFilter 解析 Token,写入 SecurityContext ← 业务接口正常响应 ``` --- ## 4 功能模块说明 ### 4.1 module-user · 用户权限模块 **功能列表:** - **登录/登出**:BCrypt 密码校验,返回 JWT Token,支持自动过期 - **用户管理**:分页查询、新建用户(含角色分配)、启用/禁用、重置密码 - **角色管理**:角色 CRUD、菜单权限分配(树形勾选) - **菜单管理**:树形菜单维护,支持目录/菜单/按钮三类,控制前端路由与按钮权限 - **动态菜单**:用户登录后根据角色动态返回其有权访问的菜单树 **权限设计:** - 采用 RBAC(Role-Based Access Control)模型:`用户 → 角色 → 菜单/权限` - 接口级权限通过 `perms` 字段标识(如 `user:add`、`role:delete`) - 前端路由 `meta.roles` 声明可访问角色,侧边栏与路由守卫双重拦截: - 侧边栏:仅渲染当前角色有权看到的菜单项 - 路由守卫:URL 直接访问越权页面时自动跳转到角色默认首页 - 角色默认首页:`ROLE_ADMIN` → `/dashboard`,`ROLE_DOCTOR` → `/schedule/my` --- ### 4.2 module-schedule · 医生排班模块 **功能列表:** - **科室管理**:科室 CRUD,支持层级结构(上下级科室) - **医生注册(新)**:管理端一键注册医生——同时创建 `sys_user` 登录账号(自动分配 `ROLE_DOCTOR` 角色)与 `doctor` 档案,无需分步操作;编辑时可同步更新登录信息 - **班次配置**:上午诊、下午诊、夜班等班次 CRUD,配置接诊人数上限 - **排班管理(核心)**: - **周日历视图**:按周展示每日各班次排班情况,色块区分出诊状态 - **列表视图**:带进度条显示已挂号/上限 - **快速新增**:点击日历空白格直接新增排班 - **批量排班**:同一医生同一班次可一次选多个日期批量创建(重复自动跳过) - **停诊/恢复**:可随时停诊并填写原因,支持恢复 - **我的排班(新)**:医生账号登录后可查看个人排班,支持日期范围筛选,页面底部汇总当期出诊次数与累计挂号数 --- ### 4.3 module-equipment · 医疗设备模块 **功能列表:** - **设备分类**:左侧树形分类管理,支持多层级,点击分类可筛选设备 - **设备台账**:设备 CRUD,含型号、厂商、购入日期、价格、存放位置 - **状态管理**:正常使用 / 停用 / 维修中 / 报废,快捷切换 - **维护预警**:下次维护日期临近(≤7天)橙色高亮,已过期红色警告 - **使用记录**:登记设备每次使用情况,记录操作人、患者、用途、结果 - **维修记录**:记录定期维护 / 故障维修 / 校准,维修时自动更新设备状态: - 提交故障维修 → 设备自动变为「维修中」 - 维修结果「已修复」→ 恢复「正常使用」 - 维修结果「报废处理」→ 变为「报废」 --- ### 4.4 module-patient · 患者与挂号模块 **功能列表:** - **患者建档**:患者 CRUD,含身份证、血型、过敏史、既往病史、备注,系统自动生成患者编号 - **患者搜索**:支持姓名/患者号/手机/身份证模糊搜索 - **患者详情**:抽屉展示完整档案,年龄由出生日期实时计算 - **挂号登记**:选择患者 → 选科室 → 选医生 → 选日期,自动分配当日队列号 - **取消挂号**:待就诊状态可取消,填写取消原因 --- ### 4.5 module-triage · AI 智能分诊模块 **功能列表:** - **AI 分诊(核心)**:填写症状描述(支持关联已建档患者),调用 DeepSeek 大模型分析: - 返回优先级:普通(1) / 优先(2) / 紧急(3) / 危重(4),色带直观显示 - 推荐就诊科室 - 初步症状分析 - 就医建议 - **采纳操作**:护士确认后可标记「已采纳」,记录操作人 - **分诊历史**:可按优先级/关键词查询所有分诊记录 **Prompt 设计:** - 系统角色设定为急诊分诊护士 - 强制要求返回 JSON 格式,使用 `response_format: json_object` 确保结构化输出 - 输入信息:姓名、年龄、体温、症状描述、持续时长 --- ## 5 数据库设计 数据库名:`his_db`,字符集:`utf8mb4_unicode_ci` ### 表清单(共 20 张) | 模块 | 表名 | 说明 | |------|------|------| | 用户权限 | `sys_user` | 系统用户 | | 用户权限 | `sys_role` | 角色 | | 用户权限 | `sys_menu` | 菜单/权限 | | 用户权限 | `sys_user_role` | 用户-角色关联(物理删除) | | 用户权限 | `sys_role_menu` | 角色-菜单关联(物理删除) | | 排班 | `dept` | 科室(多模块共用) | | 排班 | `doctor` | 医生信息 | | 排班 | `shift` | 班次配置 | | 排班 | `schedule` | 排班记录 | | 设备 | `equipment_category` | 设备分类 | | 设备 | `equipment` | 设备台账 | | 设备 | `equipment_use_record` | 设备使用记录 | | 设备 | `equipment_maintenance` | 设备维修维护记录 | | 患者 | `patient` | 患者档案 | | 患者 | `registration` | 挂号记录 | | 患者 | `medical_record` | 病历记录(预留) | | 分诊 | `triage_record` | AI 分诊记录 | | 统计 | `stat_daily_summary` | 日统计汇总(预留) | | 统计 | `stat_report` | 统计报表(预留) | | 可视化 | `visual_chart_config` | 图表配置(预留) | ### 设计规范 - 所有业务表均包含:`id`(自增主键)、`create_time`、`update_time`、`is_deleted`(逻辑删除) - 使用**逻辑外键**,不建立物理外键约束,保证灵活性 - 关联中间表(`sys_user_role`、`sys_role_menu`)采用**物理删除**,避免唯一约束与逻辑删除冲突 --- ## 6 后端接口说明 所有接口统一前缀:`http://localhost:8080/api` ### 统一响应格式 ```json { "code": 200, "message": "操作成功", "data": { } } ``` | code | 含义 | |------|------| | 200 | 成功 | | 400 | 请求参数错误 | | 401 | 未登录或 Token 过期 | | 403 | 无权限 | | 404 | 资源不存在 | | 422 | 参数校验失败 | | 500 | 服务器内部错误 | ### 主要接口清单 #### 认证 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/user/login` | 登录,返回 JWT Token | | POST | `/user/logout` | 登出 | #### 用户管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/user/page` | 分页查询用户 | | POST | `/user` | 新建用户 | | PUT | `/user/status/{id}` | 修改用户状态 | | PUT | `/user/reset-password` | 重置密码 | | DELETE | `/user/{id}` | 删除用户 | #### 排班管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/dept/list` | 获取科室列表 | | GET | `/doctor/page` | 分页查询医生列表 | | GET | `/doctor/list` | 按科室获取医生列表(下拉用) | | POST | `/doctor/register` | **注册医生**(创建账号 + 档案) | | PUT | `/doctor/register` | 更新医生档案(不修改密码) | | DELETE | `/doctor/{id}` | 删除医生 | | GET | `/shift/list` | 获取班次列表 | | GET | `/schedule/page` | 分页查询排班 | | GET | `/schedule/week` | 获取周视图排班数据 | | GET | `/schedule/my` | **医生查看自己的排班**(需登录) | | POST | `/schedule` | 新增排班 | | POST | `/schedule/batch` | 批量排班 | | PUT | `/schedule/{id}/status` | 修改出诊状态(停诊/恢复) | | DELETE | `/schedule/{id}` | 删除排班 | #### 患者与分诊 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/patient/page` | 分页查询患者 | | POST | `/patient` | 新建患者 | | POST | `/registration` | 挂号 | | PUT | `/registration/{id}/cancel` | 取消挂号 | | POST | `/triage/analyze` | **AI 分诊**(核心接口) | | GET | `/triage/page` | 分诊记录列表 | | PUT | `/triage/{id}/adopt` | 采纳分诊结果 | #### 设备管理 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/equipment/page` | 分页查询设备 | | POST | `/equipment` | 新增设备 | | PUT | `/equipment/{id}/status` | 修改设备状态 | | GET | `/equipment/record/use/page` | 使用记录列表 | | POST | `/equipment/record/use` | 登记使用记录 | | GET | `/equipment/record/maintenance/page` | 维修记录列表 | | POST | `/equipment/record/maintenance` | 新增维修记录 | --- ## 7 项目结构 ``` his/ ├── his-server/ # 后端 Spring Boot 项目 │ ├── pom.xml │ └── src/main/ │ ├── java/com/neu/his/ │ │ ├── HisServerApplication.java │ │ ├── common/ │ │ │ ├── config/ # Spring配置(Security、MyBatisPlus、AppConfig、DataInitializer) │ │ │ ├── exception/ # 全局异常处理、BusinessException │ │ │ ├── result/ # 统一响应 Result、ResultCode │ │ │ ├── security/ # JWT Filter、JwtUtils │ │ │ └── service/ # DeepSeekService(AI分诊核心) │ │ └── module/ │ │ ├── user/ # 用户权限模块 │ │ │ ├── controller/ # AuthController、SysUserController、SysRoleController、SysMenuController │ │ │ ├── entity/ # SysUser、SysRole、SysMenu、SysUserRole、SysRoleMenu │ │ │ ├── mapper/ # Mapper 接口 │ │ │ ├── service/ # Service 接口 + Impl │ │ │ ├── dto/ # LoginDTO、UserCreateDTO │ │ │ └── vo/ # LoginVO、UserVO │ │ ├── schedule/ # 排班模块 │ │ │ ├── controller/ # DeptController、DoctorController、ShiftController、ScheduleController │ │ │ ├── entity/ # Dept、Doctor、Shift、Schedule │ │ │ ├── mapper/ # Mapper 接口 │ │ │ ├── service/ # Service 接口 + Impl │ │ │ ├── dto/ │ │ │ └── vo/ │ │ ├── equipment/ # 设备模块 │ │ │ ├── controller/ # EquipmentController、EquipmentCategoryController、EquipmentRecordController │ │ │ ├── entity/ # Equipment、EquipmentCategory、EquipmentUseRecord、EquipmentMaintenance │ │ │ ├── mapper/ │ │ │ ├── service/impl/ │ │ │ ├── dto/ │ │ │ └── vo/ │ │ └── patient/ # 患者+分诊模块 │ │ ├── controller/ # PatientController、RegistrationController、TriageController │ │ ├── entity/ # Patient、Registration、TriageRecord │ │ ├── mapper/ │ │ ├── service/ # Service 接口 + Impl │ │ ├── dto/ │ │ └── vo/ │ └── resources/ │ ├── application.yml # 应用配置 │ ├── his_init.sql # 数据库初始化脚本 │ └── mapper/ # MyBatis XML(按模块分目录) │ ├── user/ │ ├── schedule/ │ ├── equipment/ │ └── patient/ │ └── his-web/ # 前端 Vue 3 项目 ├── package.json ├── vite.config.js └── src/ ├── main.js # 应用入口 ├── api/ # 接口封装 │ ├── user.js │ ├── schedule.js │ ├── equipment.js │ └── patient.js ├── assets/styles/ # 全局样式(SCSS) ├── layout/ # 全局布局(Sidebar、Navbar) ├── router/index.js # 路由配置(含动态路由) ├── stores/user.js # Pinia 用户状态 ├── utils/request.js # Axios 封装(JWT注入、错误处理) └── views/ ├── Login.vue # 登录页 ├── dashboard/index.vue # 首页仪表盘 ├── user/ # 用户/角色/菜单管理 ├── schedule/ │ ├── DoctorList.vue # 医生管理(注册医生账号) │ ├── ScheduleList.vue # 排班管理(周日历 + 列表) │ ├── ShiftList.vue # 班次配置 │ └── MySchedule.vue # 我的排班(医生自查) ├── equipment/ # 设备管理 + 使用/维修记录 ├── patient/ # 患者管理 + 挂号 + AI分诊 ├── stat/ # 统计分析(预留) └── visual/ # 数据可视化(预留) ``` --- ## 8 环境准备与部署 ### 环境要求 | 工具 | 版本要求 | |------|---------| | JDK | 17+ | | Maven | 3.8+ | | MySQL | 8.0+ | | Node.js | 18+ | | npm | 9+ | ### 数据库初始化 ```sql -- 在 MySQL 中执行初始化脚本 source his-server/src/main/resources/his_init.sql ``` ### 后端启动 **1. 修改数据库密码**(`his-server/src/main/resources/application.yml`): ```yaml spring: datasource: password: 你的MySQL密码 ``` **2. 配置 DeepSeek API Key**(同上文件): ```yaml deepseek: api-key: sk-你的DeepSeek密钥 ``` > 在 [DeepSeek 控制台](https://platform.deepseek.com/api_keys) 申请免费 API Key **3. 编译并启动**: ```bash cd his-server mvn spring-boot:run # 后端服务运行在 http://localhost:8080/api ``` ### 前端启动 ```bash cd his-web npm install npm run dev # 前端运行在 http://localhost:5173 ``` --- ## 9 默认账号 系统启动后由 `DataInitializer` 自动完成初始化(幂等,重启不重复创建): ### 管理员账号 | 字段 | 值 | |------|----| | 用户名 | `admin` | | 密码 | `Admin@123` | | 角色 | 超级管理员(拥有全部功能权限) | > 首次登录后建议在「用户管理」中修改密码。 ### 医生账号 医生账号由管理员在 **排班管理 › 医生管理** 页面注册,注册时一步创建登录账号与医生档案: | 字段 | 说明 | |------|----| | 用户名 | 管理员注册时填写 | | 初始密码 | 注册时填写,留空则默认 `Doctor@123` | | 角色 | `ROLE_DOCTOR`(普通医生,仅可查看自己的排班) | ### 角色权限对比 | 角色 | 角色码 | 可访问功能 | |------|--------|-----------| | 超级管理员 | `ROLE_ADMIN` | 全部模块 | | 普通医生 | `ROLE_DOCTOR` | 登录后查看「我的排班」| --- ## 附:主要依赖版本 ```xml Spring Boot 3.5.x MyBatis-Plus 3.5.14 JJWT 0.12.6 MySQL Connector 8.x ``` ```json // 前端核心依赖版本 { "vue": "^3.5.x", "element-plus": "^2.14.x", "vite": "^8.x", "pinia": "^3.x", "vue-router": "^5.x", "axios": "^1.x", "echarts": "^6.x", "dayjs": "^1.11.x" } ``` --- --- ## 附:更新日志 ### v1.3.0(2026-06-29) **角色隔离 & UI 歧义消除** - `router/index.js`:为每条路由添加 `meta.roles` 权限标记(`ROLE_ADMIN` / `ROLE_DOCTOR` / 空=所有人) - 路由守卫新增角色拦截:越权访问自动跳转到角色默认首页,不再显示 404 - `Sidebar.vue`:侧边栏按当前登录角色实时过滤菜单项,父菜单无可见子项时整体隐藏 - `stores/user.js`:新增 `isDoctor` getter;登录信息(含角色)持久化到 `localStorage`,刷新页面后侧边栏菜单依然正确渲染 - `UserList.vue`:「新增用户」弹窗标题改为「新增管理/护士账号」,角色列表自动过滤掉 `ROLE_DOCTOR`,并显示提示引导至「医生管理」注册医生账号,消除职责歧义 **各角色可见菜单** | 菜单 | ROLE_ADMIN | ROLE_DOCTOR | |------|:---:|:---:| | 工作台 | ✓ | ✓ | | 权限管理(用户/角色/菜单) | ✓ | — | | 排班管理 › 医生管理 | ✓ | — | | 排班管理 › 排班管理 | ✓ | — | | 排班管理 › 班次配置 | ✓ | — | | 排班管理 › 我的排班 | — | ✓ | | 设备管理 | ✓ | — | | 患者分诊 | ✓ | — | | 统计报表 | ✓ | — | | 数据大屏 | ✓ | — | --- ### v1.2.0(2026-06-29) **医生注册 & 我的排班** - 新增 `POST /doctor/register` 接口:一步注册医生登录账号 + 医生档案,自动绑定 `ROLE_DOCTOR` 角色 - 新增 `PUT /doctor/register` 接口:更新医生档案(同步更新 `sys_user` 基本信息,不修改密码) - 新增 `GET /schedule/my` 接口:医生根据 JWT 查询自己的排班记录 - 新增前端页面 `DoctorList.vue`(医生管理,含注册/编辑弹窗) - 新增前端页面 `MySchedule.vue`(医生自查排班,含日期筛选与统计卡片) - `DataInitializer` 重构:每次启动自动检查并创建 `ROLE_DOCTOR` 角色(幂等) **患者档案 Bug 修复** - 修复 `PatientList.vue`(及 `Registration.vue`、`Triage.vue`)中 `const { data } = await api()` 二次解构导致列表为空的问题(Axios 拦截器已提取 `res.data`,无需再解构) - 修复患者详情抽屉年龄显示为空的问题:后端 `PatientServiceImpl.detail()` 改用 `Period.between()` 手动计算年龄 - `PatientVO` 补充缺失的 `remark`(备注)字段 --- *本文档由开发团队整理,如有疑问请联系项目负责人。*