199 lines
8.0 KiB
Markdown
199 lines
8.0 KiB
Markdown
# 学生管理系统 — 业务设计文档
|
||
|
||
## 1. 业务背景
|
||
|
||
本系统服务于教育培训机构的日常教务运营,解决以下核心业务问题:
|
||
- **学生信息管理**:统一管理学员档案,支持按班级、顾问老师查询
|
||
- **教学过程跟踪**:记录各阶段考核成绩,分析学习效果
|
||
- **就业数据沉淀**:追踪毕业生去向,统计就业率和薪资水平
|
||
- **班级师资配置**:管理班主任、授课老师、助教老师的协作关系
|
||
|
||
---
|
||
|
||
## 2. 用户角色
|
||
|
||
| 角色 | 说明 | 主要操作 |
|
||
|------|------|----------|
|
||
| 教务管理员 | 系统最高权限,负责全局数据维护 | 全部 CRUD、统计查看 |
|
||
| 班主任 | 负责班级管理 | 查看/编辑本班学生、班级信息 |
|
||
| 授课老师 | 负责成绩录入 | 录入/修改学生成绩 |
|
||
| 顾问老师 | 负责学生职业规划 | 查看所带学生信息、就业状态 |
|
||
| 就业专员 | 负责就业数据维护 | 录入/更新就业记录 |
|
||
|
||
> 当前阶段为内部工具,暂未实现角色权限控制;V2.0 规划接入 OAuth2 + RBAC。
|
||
|
||
---
|
||
|
||
## 3. 业务流程
|
||
|
||
### 3.1 学生入班流程
|
||
|
||
```
|
||
[创建教师] → [创建班级并分配师资] → [录入学生信息并绑定班级]
|
||
│ │ │
|
||
└──── 教师编号唯一 ──┘ └── 学号唯一,班级必填
|
||
```
|
||
|
||
**规则**:
|
||
- 新建学生时,`class_id` 必须指向已存在的未删除班级
|
||
- `advisor_id`(顾问老师)可选,必须指向有效教师
|
||
- 学生编号(`num`)全局唯一
|
||
|
||
### 3.2 成绩录入流程
|
||
|
||
```
|
||
[选择学生] → [填写考核序次(num)] → [录入分数]
|
||
│
|
||
└── 同一学生同一考核序次不可重复录入(业务约束)
|
||
```
|
||
|
||
**规则**:
|
||
- 成绩 `score` 保留两位小数(DECIMAL(10,2))
|
||
- 考核序次(如"第一次考核"、"期中")由业务方定义,系统不做枚举约束
|
||
- 支持按学生 ID 或考核序次模糊查询
|
||
|
||
### 3.3 就业登记流程
|
||
|
||
```
|
||
[开放就业通道] → [登记就业公司信息] → [下发 Offer] → [记录薪资]
|
||
│ │ │
|
||
employment_open employment_company offer_received
|
||
_time _time time
|
||
```
|
||
|
||
**规则**:
|
||
- 一个学生只能有一条有效就业记录(`sid` 唯一约束)
|
||
- `employment_open_time` 和 `offer_recived_time` 可为空(流程进行中)
|
||
- 平均签约周期 = `offer_recived_time - employment_open_time`(天数)
|
||
|
||
### 3.4 统计查询流程
|
||
|
||
```
|
||
[请求统计数据] → [按班级/考核序次过滤] → [聚合计算] → [返回统计结果]
|
||
```
|
||
|
||
| 统计类型 | 维度 | 指标 |
|
||
|----------|------|------|
|
||
| 班级人数统计 | 按班级 | 总人数、男生数、女生数 |
|
||
| 成绩统计 | 按考核序次+班级 | 平均分、最高分、最低分、参考人数 |
|
||
| 就业统计 | 按班级 | 已就业人数、就业率、平均薪资、平均签约周期 |
|
||
|
||
---
|
||
|
||
## 4. 核心业务实体关系
|
||
|
||
```
|
||
┌──────────┐ 1:N ┌──────────┐ 1:N ┌──────────┐
|
||
│ Teacher │◄───────────►│ Class │◄───────────►│ Student │
|
||
│ 教师 │ 班主任/授课 │ 班级 │ 所属班级 │ 学生 │
|
||
│ │ 助教老师 │ │ │ │
|
||
└────┬─────┘ └────┬─────┘ └────┬─────┘
|
||
│ │ │
|
||
│ 1:N │ 1:1 │ 1:N
|
||
▼ ▼ ▼
|
||
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||
│ Score │ │Employment│◄──────────►│ Student │
|
||
│ 成绩 │ │ 就业 │ 一对一 │ │
|
||
└──────────┘ └──────────┘ └──────────┘
|
||
```
|
||
|
||
### 关联说明
|
||
- **Teacher ↔ Class**:一对多(一个老师可担任多个班级的班主任/授课老师/助教)
|
||
- **Class ↔ Student**:一对多(一个班级有多个学生)
|
||
- **Student ↔ Score**:一对多(一个学生有多次考核成绩)
|
||
- **Student ↔ Employment**:一对一(一个学生只有一条有效就业记录)
|
||
- **Teacher ↔ Student**:多对一(一个顾问老师带多个学生)
|
||
|
||
---
|
||
|
||
## 5. 业务规则与约束
|
||
|
||
### 5.1 唯一性约束
|
||
| 字段 | 表 | 规则 |
|
||
|------|-----|------|
|
||
| `num` | teachers | 教师编号全局唯一 |
|
||
| `num` | classes | 班级编号全局唯一 |
|
||
| `num` | students | 学生编号全局唯一 |
|
||
| (sid, num) | scores | 同一学生同一考核序次只允许一条记录 |
|
||
| `sid` | employment | 一名学生只允许一条就业记录 |
|
||
|
||
### 5.2 外键约束(业务层校验)
|
||
| 字段 | 引用表 | 级联策略 |
|
||
|------|--------|----------|
|
||
| `students.class_id` | `classes.id` | 删除班级时限制(restrict),更新级联 |
|
||
| `students.advisor_id` | `teachers.id` | 删除教师时置空,更新级联 |
|
||
| `classes.head_teacher_id` | `teachers.id` | 同左 |
|
||
| `scores.sid` | `students.id` | 删除学生时级联删除成绩 |
|
||
| `employment.sid` | `students.id` | 删除学生时级联删除就业记录 |
|
||
|
||
### 5.3 软删除规则
|
||
- 所有表均支持软删除(`is_deleted = true` + `delete_time` 记录时间)
|
||
- 所有查询默认过滤 `is_deleted = false`
|
||
- 软删除不影响关联数据(成绩/就业随学生级联删除)
|
||
|
||
---
|
||
|
||
## 6. 统计业务逻辑详细说明
|
||
|
||
### 6.1 班级人数统计(`GET /api/stats/classes`)
|
||
```
|
||
SELECT class_id, class_name, COUNT(*) as total,
|
||
SUM(CASE WHEN sex=1 THEN 1 ELSE 0 END) as male_count,
|
||
SUM(CASE WHEN sex=2 THEN 1 ELSE 0 END) as female_count
|
||
FROM students s JOIN classes c ON s.class_id = c.id
|
||
WHERE s.is_deleted=0 AND c.is_deleted=0
|
||
GROUP BY s.class_id, c.name
|
||
```
|
||
|
||
### 6.2 成绩统计(`GET /api/stats/scores?class_id=&score_num=`)
|
||
```
|
||
SELECT score_num, class_id, AVG(score), MAX(score), MIN(score), COUNT(*)
|
||
FROM scores sc JOIN students s ON sc.sid = s.id
|
||
WHERE s.is_deleted=0 AND sc.is_deleted=0
|
||
GROUP BY score_num, class_id
|
||
[可选过滤 class_id / score_num]
|
||
```
|
||
|
||
### 6.3 就业统计(`GET /api/stats/employment?class_id=`)
|
||
```
|
||
SELECT e.class_id, c.name,
|
||
COUNT(e.id) as employed_count,
|
||
COUNT(s.id) as total_count,
|
||
AVG(e.employment_salary) as avg_salary
|
||
FROM employment e
|
||
JOIN classes c ON e.class_id = c.id
|
||
JOIN students s ON e.sid = s.id
|
||
WHERE e.is_deleted=0 AND s.is_deleted=0 AND c.is_deleted=0
|
||
GROUP BY e.class_id, c.name
|
||
[可选过滤 class_id]
|
||
|
||
-- 额外计算:平均签约周期(天数)
|
||
AVG(JULIANDAY(offer_recived_time) - JULIANDAY(employment_open_time))
|
||
WHERE employment_open_time IS NOT NULL AND offer_recived_time IS NOT NULL
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 数据字典(待 V2.0 实现)
|
||
|
||
以下字段当前以字符串或整数存储,建议 V2.0 升级为字典表管理:
|
||
|
||
| 字段 | 当前存储 | 建议字典类型 | 候选值 |
|
||
|------|----------|-------------|--------|
|
||
| `sex` | TINYINT (0/1/2) | dict_type=sex | 0:未知, 1:男, 2:女 |
|
||
| `education` | VARCHAR | dict_type=education | bachelor:本科, master:硕士, phd:博士 |
|
||
| `coach_area` | VARCHAR | dict_type=coach_area | app:应用, project:项目, algorithm:算法 |
|
||
| `college` | VARCHAR | dict_type=college | 院校代码 → 名称映射 |
|
||
| `specialty` | VARCHAR | dict_type=specialty | 专业代码 → 名称映射 |
|
||
|
||
---
|
||
|
||
## 8. 分期业务规划
|
||
|
||
| 阶段 | 业务目标 | 功能范围 |
|
||
|------|----------|----------|
|
||
| V1.0(当前)| 基础数据管理 | 五模块 CRUD + 三类统计 |
|
||
| V2.0 | 数据治理与权限 | 字典表、用户认证、部门/顾问模块、数据源配置 |
|
||
| V3.0 | 智能分析 | AI 知识库接入、自然语言查询、预测分析 |
|
||
| V4.0 | 多租户 SaaS | 租户隔离、多机构支持、API 开放平台 |
|