154 lines
6.1 KiB
Markdown
154 lines
6.1 KiB
Markdown
# 衡准 · 考试信息管理系统
|
||
|
||
一个完整可运行的分级权限考试信息管理系统,使用 Node.js 后端;本地开发采用 SQLite,生产环境支持 MySQL 8.4。
|
||
|
||
## 已实现功能
|
||
|
||
### 公开服务首页
|
||
|
||
- 通知公告首页展示与详情阅读
|
||
- 已发布考试、报名时间、考试时间和科目展示
|
||
- 考试服务办理流程说明
|
||
- 考生注册与双角色登录入口
|
||
|
||
### 考生中心
|
||
|
||
- 考生自主注册、登录和实名资料维护
|
||
- 资料审核状态与管理员审核意见
|
||
- 查看开放考试并自主选择多个报考科目
|
||
- 查看报名、缴费和审核状态
|
||
- 准考证生成状态、开放时间与下载
|
||
- 已发布成绩查询
|
||
- 通知公告中心
|
||
|
||
### 管理后台
|
||
|
||
- 超级、校级、班级三级管理员,同一级支持多个账号
|
||
- 超级管理员管理全局事务,并可监督、修改、退回全部审批流程
|
||
- 校级管理员只管理本校考生和报名流程,并提交本校考点、考场档案变更
|
||
- 班级管理员只读查看本班考生、成绩和报名状态
|
||
- 考生信息修改、考试报名、考点考场变更使用可配置的多步骤审批流程
|
||
- 当前处理人可将流程转交给同范围的同级管理员
|
||
- 自定义报名号生成规则,可组合年份、学校代码、性别、固定值和流水号
|
||
- 按考试、学校筛选,批量为已审核且缺号的报名记录生成报名号
|
||
- 结构化考点与考场档案,包含代码、负责人、应急电话、开放时间、交通、楼栋、楼层、容量、座位区间、类型和状态
|
||
- 考点新增及考点/考场修改先形成申请快照,审批通过后才整体更新正式档案
|
||
- 考务指标与审计日志
|
||
- 考生资料审核、通过或退回修改
|
||
- 考试报名及科目审核
|
||
- 创建考试、配置报名/考试/准考证时间与多个科目
|
||
- 通知发布、草稿、撤回及首页置顶
|
||
- 为审核通过的报名生成准考证号、考点、考场和座位
|
||
- 单科成绩录入、等级计算与发布控制
|
||
- 管理员与考生接口权限隔离
|
||
|
||
### 系统能力
|
||
|
||
- PBKDF2 加盐密码哈希
|
||
- HttpOnly、SameSite 登录 Cookie
|
||
- 服务端角色权限校验
|
||
- SQLite / MySQL 8.4 双数据库持久化
|
||
- 规范关系模型、外键、唯一约束和业务索引
|
||
- 业务写入与审计日志使用原子事务提交
|
||
- 关键管理操作审计日志
|
||
- 组织、学校、班级三级数据范围在服务端强制过滤
|
||
- 审批实例、当前责任人、转交和监督操作全程留痕
|
||
- 桌面端与移动端响应式布局
|
||
- 零第三方运行时依赖
|
||
|
||
## 运行
|
||
|
||
需要 Node.js 22.5 或更高版本(SQLite 使用 Node.js 内置驱动)。
|
||
|
||
```powershell
|
||
npm install
|
||
npm start
|
||
```
|
||
|
||
打开 <http://127.0.0.1:4173>。
|
||
|
||
本地开发无需额外配置,首次运行会自动创建 `data/exam.sqlite` 和完整关系型数据库结构。当前处于开发阶段,不兼容旧版 JSON/单表数据库;已有关系型数据库会在启动时自动升级到 v3,补充分级权限、报名号、结构化考场和变更审批结构。
|
||
|
||
## 数据库配置
|
||
|
||
应用根据 `DATABASE_CLIENT` 使用不同数据库。未设置时,开发/测试环境默认 `sqlite`,`NODE_ENV=production` 默认 `mysql`。
|
||
|
||
### 本地 SQLite
|
||
|
||
```powershell
|
||
$env:DATABASE_CLIENT = 'sqlite'
|
||
$env:SQLITE_PATH = './data/exam.sqlite'
|
||
npm start
|
||
```
|
||
|
||
`SQLITE_PATH` 可省略,默认路径就是 `./data/exam.sqlite`。
|
||
|
||
### 生产 MySQL 8.4
|
||
|
||
先在 MySQL 8.4 中创建数据库和最小权限账号:
|
||
|
||
```sql
|
||
CREATE DATABASE exam_information CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
|
||
CREATE USER 'exam_app'@'%' IDENTIFIED BY 'replace-with-a-strong-password';
|
||
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON exam_information.* TO 'exam_app'@'%';
|
||
```
|
||
|
||
启动应用时设置连接信息,应用会自动创建以下关系表并初始化演示数据:
|
||
|
||
- `schools`、`school_classes`、`users`、`candidate_profiles`
|
||
- `exams`、`exam_subjects`
|
||
- `registrations`、`registration_subjects`、`admit_cards`
|
||
- `results`、`notices`、`audit_logs`
|
||
- `test_centers`、`test_rooms`、`center_change_requests`、`center_change_rooms`
|
||
- `number_rules`、`number_rule_segments`
|
||
- `workflow_definitions`、`workflow_steps`、`workflow_instances`、`workflow_actions`
|
||
- `organization`、`schema_metadata`
|
||
|
||
所有关联均有外键约束,账号、证件号、考试代码、报名关系、准考证号和单科成绩均有对应唯一约束。
|
||
|
||
```powershell
|
||
$env:NODE_ENV = 'production'
|
||
$env:DATABASE_CLIENT = 'mysql'
|
||
$env:MYSQL_HOST = '127.0.0.1'
|
||
$env:MYSQL_PORT = '3306'
|
||
$env:MYSQL_USER = 'exam_app'
|
||
$env:MYSQL_PASSWORD = 'replace-with-a-strong-password'
|
||
$env:MYSQL_DATABASE = 'exam_information'
|
||
$env:HOST = '0.0.0.0'
|
||
npm start
|
||
```
|
||
|
||
也可以只设置标准连接地址 `DATABASE_URL=mysql://user:password@host:3306/database`。完整模板见 `.env.example`;项目不会自动加载 `.env` 文件,部署平台应将这些值作为进程环境变量注入。
|
||
|
||
## 演示账号
|
||
|
||
| 角色 | 账号 | 密码 |
|
||
| --- | --- | --- |
|
||
| 超级管理员 | `admin` | `Admin123!` |
|
||
| 超级管理员(监督演示) | `supervisor` | `Admin123!` |
|
||
| 校级管理员 | `school_admin` | `School123!` |
|
||
| 同校校级管理员(转交演示) | `school_admin_2` | `School123!` |
|
||
| 班级管理员 | `class_admin` | `Class123!` |
|
||
| 考生 | `13800138000` | `Candidate123!` |
|
||
|
||
## 自动化测试
|
||
|
||
```powershell
|
||
npm test
|
||
```
|
||
|
||
测试使用独立临时 SQLite 数据库,覆盖三级管理员数据范围、两级审批、同级转交、超级管理员监督退回、报名号规则与筛选批量生成、结构化考点考场及变更审批、班级只读、多科目报名、准考证和成绩完整流程。
|
||
|
||
## 项目结构
|
||
|
||
```text
|
||
index.html 页面入口
|
||
styles.css 公共首页、考生端、管理端响应式样式
|
||
app.js 前端路由、状态和业务交互
|
||
server.mjs HTTP 服务、认证、权限与全部业务 API
|
||
database.mjs 分表结构、SQLite / MySQL 适配与事务仓储
|
||
tests/system.test.mjs 端到端系统测试
|
||
data/exam.sqlite 本地运行后生成的 SQLite 数据库
|
||
.env.example 开发与生产环境变量模板
|
||
```
|