# 第4章 养老院管理系统的系统设计

## 4.1 系统功能设计

本系统面向管理员、护工和家属三类用户角色，各角色拥有不同的功能权限。管理员作为系统的最高权限角色，负责系统的全面运营管理，包括运营概览、账号管理、长者档案管理、排班管理、账单管理、反馈处理和通知公告管理七大功能模块。护工作为一线服务角色，拥有工作台、我的排班、护理记录、健康监测、交班记录和通知中心六大功能模块。家属作为信息查看角色，拥有家属首页、亲人档案、每日动态、健康记录、账单支付、服务反馈和通知中心七大功能模块。

管理员功能结构图如图4.1所示。

![管理员功能结构图](diagrams/admin_func_structure.png)

图4.1 管理员功能结构图

护工功能结构图如图4.2所示。

![护工功能结构图](diagrams/nurse_func_structure.png)

图4.2 护工功能结构图

家属功能结构图如图4.3所示。

![家属功能结构图](diagrams/family_func_structure.png)

图4.3 家属功能结构图

## 4.2 类图

本系统的数据模型采用关系型数据库设计，共包含11个数据实体，各实体之间通过外键关联形成完整的数据关系网络。系统类图采用IE Crow's Foot标记法展示各实体的属性和实体间的关系。核心实体包括用户表（sys_user）、长者表（elder）、家属长者关联表（family_elder）、排班表（schedule）、护理记录表（care_record）、健康记录表（health_record）、交班记录表（handover）、通知表（notice）、反馈表（feedback）、账单表（bill）和缴费记录表（payment_record）。

主要的实体关系包括：用户（护工角色）与排班、护理记录、健康记录、交班记录之间为一对多关系；用户（家属角色）与长者之间通过家属长者关联表形成多对多关系；长者与护理记录、健康记录、账单、反馈之间为一对多关系；账单与缴费记录之间为一对多关系；用户（管理员角色）与通知之间为一对多关系。系统类图如图4.4所示。

![系统类图](diagrams/class_diagram.png)

图4.4 系统类图

## 4.3 序列图

### 4.3.1 用户登录序列图

用户登录过程涉及用户、系统前台、后台系统和数据库四个参与者之间的交互。具体步骤如下：

（1）用户在浏览器中打开系统登录页面。

（2）用户输入用户名和密码，点击登录按钮。

（3）系统前台将登录请求发送至后台系统的认证接口（POST /api/auth/login）。

（4）后台系统接收请求后，向数据库查询该用户名对应的用户信息。

（5）数据库返回查询结果。

（6）后台系统使用BCrypt算法验证用户输入的密码与数据库中存储的加密密码是否匹配。

（7）验证通过后，后台系统调用Sa-Token框架生成UUID格式的Token。

（8）后台系统将Token、用户角色和用户信息返回给系统前台。

（9）系统前台将Token和角色信息存储到浏览器的localStorage中。

（10）系统前台根据用户角色自动跳转到对应的功能首页。

用户登录序列图如图4.5所示。

![用户登录序列图](diagrams/sequence_login.png)

图4.5 用户登录序列图

### 4.3.2 护工添加护理记录序列图

护工添加护理记录过程涉及护工、系统前台、后台系统和数据库四个参与者之间的交互。具体步骤如下：

（1）护工在系统中进入护理记录页面。

（2）系统前台向后台系统请求长者列表数据。

（3）后台系统从数据库查询长者信息并返回。

（4）系统前台展示长者列表供护工选择。

（5）护工选择目标长者，填写护理内容，可选择上传附件。

（6）系统前台将护理记录数据提交至后台系统（POST /api/nurse/care-records）。

（7）后台系统自动关联当前登录护工的ID，设置记录时间，将数据插入数据库。

（8）数据库返回插入结果。

（9）后台系统将创建成功的响应返回给系统前台。

（10）系统前台显示添加成功提示，并刷新护理记录列表。

护工添加护理记录序列图如图4.6所示。

![护工添加护理记录序列图](diagrams/sequence_care_record.png)

图4.6 护工添加护理记录序列图

## 4.4 活动图

### 4.4.1 用户登录活动图

用户登录过程可分为以下几步：

（1）用户在登录页面输入用户名和密码。

（2）系统前台将登录信息提交至后台系统。

（3）后台系统向数据库查询用户数据。

（4）数据库返回查询结果，后台系统判断用户是否存在以及密码是否正确。

（5）若验证失败，系统返回错误提示，用户需重新输入。

（6）若验证成功，后台系统生成Token并返回给前台。

（7）前台存储Token信息，跳转至对应角色的系统首页。

用户登录活动图如图4.7所示。

![用户登录活动图](diagrams/activity_login.png)

图4.7 用户登录活动图

### 4.4.2 管理员处理反馈活动图

管理员处理反馈过程可分为以下几步：

（1）管理员登录系统，进入反馈处理页面。

（2）系统前台向后台系统请求所有反馈数据。

（3）后台系统从数据库查询反馈列表并返回。

（4）管理员查看反馈列表，选择需要处理的反馈。

（5）管理员填写回复内容，更新反馈状态。

（6）系统前台将回复信息提交至后台系统。

（7）后台系统更新数据库中的反馈记录。

（8）系统提示回复成功，反馈列表自动刷新。

管理员处理反馈活动图如图4.8所示。

![管理员处理反馈活动图](diagrams/activity_feedback.png)

图4.8 管理员处理反馈活动图

## 4.5 数据库设计

### 4.5.1 概念设计

概念设计阶段采用E-R图（实体-关系图）描述系统的数据模型。本系统共包含11个实体，以下列举8个核心实体的属性图。

（1）用户实体

用户实体包含用户ID（主码）、用户名、密码、姓名、电话、角色和状态等属性。用户实体属性图如图4.9所示。

![用户实体属性图](diagrams/entity_user.png)

图4.9 用户实体属性图

（2）长者实体

长者实体包含长者ID（主码）、姓名、性别、身份证号、出生日期、房间号、入住日期、护理等级、状态和备注等属性。长者实体属性图如图4.10所示。

![长者实体属性图](diagrams/entity_elder.png)

图4.10 长者实体属性图

（3）排班实体

排班实体包含排班ID（主码）、护工ID、日期、班次和任务等属性。排班实体属性图如图4.11所示。

![排班实体属性图](diagrams/entity_schedule.png)

图4.11 排班实体属性图

（4）护理记录实体

护理记录实体包含记录ID（主码）、长者ID、护工ID、内容、附件和记录时间等属性。护理记录实体属性图如图4.12所示。

![护理记录实体属性图](diagrams/entity_care_record.png)

图4.12 护理记录实体属性图

（5）健康记录实体

健康记录实体包含记录ID（主码）、长者ID、护工ID、体温、收缩压、舒张压、心率、备注和记录时间等属性。健康记录实体属性图如图4.13所示。

![健康记录实体属性图](diagrams/entity_health_record.png)

图4.13 健康记录实体属性图

（6）账单实体

账单实体包含账单ID（主码）、长者ID、月份、床位费、护理费、餐饮费、其他费用、总计和状态等属性。账单实体属性图如图4.14所示。

![账单实体属性图](diagrams/entity_bill.png)

图4.14 账单实体属性图

（7）反馈实体

反馈实体包含反馈ID（主码）、家属ID、长者ID、类型、内容、评分、状态和回复等属性。反馈实体属性图如图4.15所示。

![反馈实体属性图](diagrams/entity_feedback.png)

图4.15 反馈实体属性图

（8）通知实体

通知实体包含通知ID（主码）、标题、内容、目标角色、目标用户ID和创建者ID等属性。通知实体属性图如图4.16所示。

![通知实体属性图](diagrams/entity_notice.png)

图4.16 通知实体属性图

系统总体E-R图展示了各实体之间的关联关系，如图4.17所示。

![系统E-R图](diagrams/er_diagram.png)

图4.17 系统E-R图

### 4.5.2 逻辑设计

将E-R图中的实体关系转换为关系模式，具体如下：

（1）用户表：（用户ID，用户名，密码，姓名，电话，角色，状态，创建时间，更新时间）

（2）长者表：（长者ID，姓名，性别，身份证号，出生日期，房间号，入住日期，护理等级，状态，备注）

（3）家属长者关联表：（关联ID，家属ID，长者ID，关系，创建时间）。外键：家属ID引用用户表，长者ID引用长者表。

（4）排班表：（排班ID，护工ID，日期，班次，任务，创建时间，更新时间）。外键：护工ID引用用户表。

（5）护理记录表：（记录ID，长者ID，护工ID，内容，附件URL，记录时间，创建时间）。外键：长者ID引用长者表，护工ID引用用户表。

（6）健康记录表：（记录ID，长者ID，护工ID，体温，收缩压，舒张压，心率，备注，记录时间，创建时间）。外键：长者ID引用长者表，护工ID引用用户表。

（7）交班记录表：（记录ID，护工ID，日期，内容，创建时间）。外键：护工ID引用用户表。

（8）通知表：（通知ID，标题，内容，目标角色，目标用户ID，创建者ID，创建时间）。外键：创建者ID引用用户表。

（9）反馈表：（反馈ID，家属ID，长者ID，类型，内容，评分，状态，回复，创建时间，更新时间）。外键：家属ID引用用户表，长者ID引用长者表。

（10）账单表：（账单ID，长者ID，月份，床位费，护理费，餐饮费，其他费用，总计，状态，创建时间，支付时间）。外键：长者ID引用长者表。

（11）缴费记录表：（记录ID，账单ID，家属ID，金额，支付方式，支付时间）。外键：账单ID引用账单表，家属ID引用用户表。

### 4.5.3 物理设计

系统根据MySQL数据库数据存储的特性设计数据库关系表，以下列举主要的物理表结构。

表4.1 用户表（sys_user表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 用户ID | BIGINT | - | 主键，自增 |
| username | 用户名 | VARCHAR | 50 | 非空，唯一 |
| password | 密码 | VARCHAR | 100 | 非空 |
| name | 姓名 | VARCHAR | 50 | 非空 |
| phone | 电话 | VARCHAR | 30 | - |
| role | 角色 | VARCHAR | 20 | 非空 |
| status | 状态 | TINYINT | - | 非空，默认1 |
| created_at | 创建时间 | DATETIME | - | 默认当前时间 |
| updated_at | 更新时间 | DATETIME | - | 自动更新 |

表4.2 长者表（elder表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 长者ID | BIGINT | - | 主键，自增 |
| name | 姓名 | VARCHAR | 50 | 非空 |
| gender | 性别 | VARCHAR | 10 | - |
| id_card | 身份证号 | VARCHAR | 30 | 非空，唯一 |
| birthday | 出生日期 | DATE | - | - |
| room_no | 房间号 | VARCHAR | 20 | - |
| check_in_date | 入住日期 | DATE | - | - |
| care_level | 护理等级 | VARCHAR | 20 | - |
| status | 状态 | VARCHAR | 20 | - |
| remark | 备注 | VARCHAR | 200 | - |

表4.3 护理记录表（care_record表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 记录ID | BIGINT | - | 主键，自增 |
| elder_id | 长者ID | BIGINT | - | 非空 |
| nurse_id | 护工ID | BIGINT | - | 非空 |
| content | 护理内容 | VARCHAR | 500 | - |
| attachment_url | 附件URL | VARCHAR | 200 | - |
| record_time | 记录时间 | DATETIME | - | - |
| created_at | 创建时间 | DATETIME | - | 默认当前时间 |

表4.4 健康记录表（health_record表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 记录ID | BIGINT | - | 主键，自增 |
| elder_id | 长者ID | BIGINT | - | 非空 |
| nurse_id | 护工ID | BIGINT | - | 非空 |
| temperature | 体温 | DECIMAL | 4,1 | - |
| bp_systolic | 收缩压 | INT | - | - |
| bp_diastolic | 舒张压 | INT | - | - |
| heart_rate | 心率 | INT | - | - |
| note | 备注 | VARCHAR | 200 | - |
| record_time | 记录时间 | DATETIME | - | - |
| created_at | 创建时间 | DATETIME | - | 默认当前时间 |

表4.5 账单表（bill表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 账单ID | BIGINT | - | 主键，自增 |
| elder_id | 长者ID | BIGINT | - | 非空 |
| month | 月份 | VARCHAR | 7 | 非空 |
| bed_fee | 床位费 | DECIMAL | 10,2 | - |
| care_fee | 护理费 | DECIMAL | 10,2 | - |
| meal_fee | 餐饮费 | DECIMAL | 10,2 | - |
| other_fee | 其他费用 | DECIMAL | 10,2 | - |
| total | 总计 | DECIMAL | 10,2 | - |
| status | 状态 | VARCHAR | 20 | - |
| created_at | 创建时间 | DATETIME | - | 默认当前时间 |
| paid_at | 支付时间 | DATETIME | - | - |

表4.6 排班表（schedule表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 排班ID | BIGINT | - | 主键，自增 |
| nurse_id | 护工ID | BIGINT | - | 非空 |
| date | 日期 | DATE | - | 非空 |
| shift | 班次 | VARCHAR | 20 | - |
| task | 任务 | VARCHAR | 200 | - |
| created_at | 创建时间 | DATETIME | - | 默认当前时间 |
| updated_at | 更新时间 | DATETIME | - | 自动更新 |

表4.7 反馈表（feedback表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 反馈ID | BIGINT | - | 主键，自增 |
| family_id | 家属ID | BIGINT | - | 非空 |
| elder_id | 长者ID | BIGINT | - | 非空 |
| type | 类型 | VARCHAR | 20 | - |
| content | 内容 | VARCHAR | 500 | - |
| rating | 评分 | INT | - | - |
| status | 状态 | VARCHAR | 20 | - |
| reply | 回复 | VARCHAR | 500 | - |
| created_at | 创建时间 | DATETIME | - | 默认当前时间 |
| updated_at | 更新时间 | DATETIME | - | 自动更新 |

表4.8 通知表（notice表）

| 字段名称 | 字段意义 | 数据类型 | 长度 | 完整性约束 |
|----------|----------|----------|------|-----------|
| id | 通知ID | BIGINT | - | 主键，自增 |
| title | 标题 | VARCHAR | 100 | 非空 |
| content | 内容 | VARCHAR | 1000 | - |
| target_role | 目标角色 | VARCHAR | 20 | - |
| target_user_id | 目标用户ID | BIGINT | - | - |
| created_by | 创建者ID | BIGINT | - | - |
| created_at | 创建时间 | DATETIME | - | 默认当前时间 |

## 4.6 图形界面设计

### 4.6.1 长者档案管理界面设计

管理员的长者档案管理界面采用经典的管理后台布局，左侧为导航菜单，右侧为主内容区域。主内容区域顶部设有"添加长者"操作按钮，下方为长者信息数据表格，表格列包括姓名、性别、身份证号、房间号、护理等级、状态和操作列。操作列提供编辑和删除按钮。点击添加或编辑按钮时，弹出表单对话框供用户输入或修改长者信息。长者档案管理界面设计图如图4.18所示。

![长者档案管理界面设计图](diagrams/ui_wireframe_elder.png)

图4.18 长者档案管理界面设计图

### 4.6.2 健康监测界面设计

护工的健康监测界面同样采用左侧导航、右侧内容的布局。主内容区域上方为数据录入表单，包含长者选择下拉框、体温输入框、收缩压输入框、舒张压输入框、心率输入框、备注输入框和记录时间选择器，以及提交按钮。表单下方为健康记录数据表格，展示已录入的历史健康监测数据。健康监测界面设计图如图4.19所示。

![健康监测界面设计图](diagrams/ui_wireframe_health.png)

图4.19 健康监测界面设计图
