教务系统管教学数据,学生系统管住校与学工数据。两套后台独立建站、独立存库;微信小程序合成一个入口,按角色分功能。下面以功能模块和关系图为主,说明怎么拆、怎么连。
教务系统已承担排课、成绩、课堂考勤;其学生档案不开放在线改档。学生管理系统独立建站、独立数据库,承担学工可维护的档案及住校、通行、家校等模块。小程序合为一个入口,后台与数据必须分开。
教学域 · 已有站点
学工 / 住校域 · 新建站点
下图是功能规划的总关系:小程序只做入口;教务与学生系统按域提供功能;闸机和摄像头只挂在学生系统上。箭头表示功能依赖或数据方向,不是页面跳转。
分组是规划结构,不是五个独立产品。学生档案是主数据,其余模块都挂在学号上。教务侧已有模块不在学生系统里重做,只读调用。
| 功能组 | 模块 | 主数据 | 依赖 | 入口 |
|---|---|---|---|---|
| 主数据 | 学生信息管理、备注 | 学号、班级、联系方式、内部备注 | 与教务按学号同步 | PC;小程序「我的」 |
| 住校 | 宿舍管理、报修、查寝 | 楼栋/房间/床位、工单、查寝批次 | 依赖学生档案;查寝读取请假与摄像头结果 | PC 调配;小程序办理/标注 |
| 通行 | 人脸录入、闸机、无感签到 | 人脸档案、设备、进出/识别事件 | 依赖学生档案;设备网关统一接入 | 小程序录入;设备现场;PC 审核与监控 |
| 日常事务 | 请假、班级/个人评分 | 假单、评分流水 | 请假结果回写教务考勤,并影响查寝、闸机离校 | 小程序;PC 汇总 |
| 家校与展示 | 家校、班级相册、PC 统计 | 家长绑定、相册、聚合指标 | 读通行事件、请假、查寝、评分,不另造名单 | 家长端;班主任发布;PC 大屏 |
下图只画学生系统内部。实线是主数据引用,虚线是状态联动(例如假已批,则查寝自动记请假、闸机允许离校)。
| 源模块 | 动作 | 影响模块 |
|---|---|---|
| 学生信息 | 转班、退学、改联系方式 | 宿舍名单、人脸下发范围、家校绑定、回写教务花名册 |
| 人脸 | 审核通过 / 撤销 | 闸机与摄像头权限名单 |
| 请假 | 班主任批准(离校假) | 教务课堂考勤、查寝默认请假、闸机放行离校、家校通知 |
| 闸机 / 摄像头 | 写入进出或进楼事件 | PC 在校统计、家校到校提醒、查寝对照 |
| 宿舍 | 调宿、退宿 | 报修位置、查寝房间名单、摄像头楼栋权限 |
小程序一个,底栏两套。家长第三套身份,不与教师共用登录。下图是功能对角色的可见性,不是操作说明书。
教师登录仍走教务账号,再换学生系统教师令牌。学生、家长只持学生系统令牌。小程序内:点「课表 / 点名」请求教务;点「查寝 / 报修 / 人脸」请求学生系统。
| 信息 | 权威系统 | 学生系统能否改 |
|---|---|---|
| 学号 | 入学生成,全校唯一 | 不能。改学号等于换人 |
| 姓名、班级、在籍 | 学生系统维护,回写教务 | 可以。教务后台不提供改档页 |
| 课表、成绩、课堂点名 | 教务 | 只显示,不另存权威副本 |
| 宿舍、人脸、报修、查寝、评分、相册、家长 | 学生系统 | 可以 |
| 生活请假 | 学生系统审批 | 可以;批准后通知教务考勤 |
| 手机号、家长电话 | 学生系统 | 可以;按规则回写教务备查 |
教务已经是 ASP.NET Core 8 + SQL Server,微信小程序也已经同时连学生端接口(默认 5001)和教务接口(默认 5002)。学生管理系统沿用同一技术栈:独立站点、独立数据库 StudentSystem,小程序继续用现有 AppID,按角色切换页面和接口。
| 层 | 选型 | 原因 |
|---|---|---|
| 后端 | ASP.NET Core 8,分层 API / BLL / DAL / Model,Dapper | 与教务同一套,运维和人员技能连续 |
| 数据库 | SQL Server,库名 StudentSystem,按租户 tenant_id 隔离 | 与现网教务一致;两库可同机也可分机 |
| 认证 | 各自签发 JWT;教师用「教务令牌换学生系统教师令牌」 | 不把两套密钥揉成一把,权限边界清楚 |
| PC 管理端 | 学生系统独立静态站点(与教务 wwwroot 模式相同)+ ECharts | 不把学工页面做进教务菜单,避免权限缠在一起 |
| 小程序 | 现有原生微信小程序扩展页面,config.js 继续配 STUDENT_API / EDU_API | 已经能按角色切底栏,直接加生活模块 |
| 文件 | 人脸、报修图、相册先落本地磁盘,按租户分目录;量大再上对象存储 | 人脸图不走公网直链,接口鉴权后输出 |
| 消息 | 微信订阅消息 + 服务端发件箱重试 | 到校、请假结果、报修完工通知家长和老师 |
微信小程序(同一 AppID)
├─ 学生登录 POST {STUDENT_API}/auth/login → 学生 JWT
├─ 教师登录 POST {EDU_API}/auth/login → 教务 JWT
├─ 教师换票 POST {STUDENT_API}/auth/from-edu → 学生系统教师 JWT
├─ 家长登录 POST {STUDENT_API}/auth/wx-parent → 家长 JWT(openid 绑学号)
│
├─ 课表/成绩/课堂点名/教学材料/教师测评 → EDU_API 或经学生系统只读代理
└─ 宿舍/报修/人脸/请假/查寝/评分/相册 → STUDENT_API
学生系统 ──同步──▶ 教务 POST /api/student/sync (已有,请求头 X-Sync-Key)
学生系统 ──通知──▶ 教务请假/考勤写入接口
教务只读 API ──拉取──▶ 学生系统(班级、课表、成绩,避免再跨库直连)
当前学生端部分模块(考勤、教学材料、质量考评)是直接查 EduSystem_DB。这样短期能出功能,但把两套系统焊在同一台库上,独立部署和权限都做不干净。目标形态:
| 表 | 作用 | 关键字段 |
|---|---|---|
| stu_student | 学生主档 | student_code(业务主键)、姓名、班级、手机、家长电话、在籍状态、同步版本号 |
| stu_note | 内部备注 | student_id、作者、可见范围、内容、时间 |
| dorm_building / room / bed / occupancy | 宿舍与入住 | 楼栋、房间、床号、入住/退宿时间,一床同时仅一人 |
| repair_ticket | 报修工单 | 位置、故障、照片、状态机:待接单→处理中→完成/关闭 |
| face_profile / face_push_log | 人脸与下发 | 照片路径、审核状态、特征版本、下发到哪些 device_id、成功/失败 |
| device / device_event | 闸机与摄像头 | 设备类型、位置、心跳;事件:时间、方向、学号、成功、离线序号 |
| leave_request | 生活请假 | 时段、类型、审批链、是否离校、是否已通知教务考勤 |
| dorm_check / dorm_check_item | 查寝 | 日期、查寝人;每人:在寝/未归/请假 + 摄像头对照结果 |
| score_record | 班级或个人评分 | 对象(人/班)、分值、项目、原因、记录人、可追溯 |
| parent_bind / album_photo | 家校与相册 | openid、孩子学号、审核关系;照片、班级、是否对家长可见 |
| sync_outbox | 同步发件箱 | 目标系统、载荷、重试次数、下次发送时间。保证教务短暂故障也不丢 |
学号是两边唯一业务键。同步分三条通道,都走 HTTPS,服务账号鉴权,不允许小程序直调同步接口。
| 方向 | 用途 | 实现 |
|---|---|---|
| 学生系统 → 教务 | 档案 upsert(姓名、班级、电话等) | 复用已有 POST /api/student/sync + X-Sync-Key;生产改为密钥 + IP 白名单。空值不覆盖。学号不可变。 |
| 学生系统 → 教务 | 生活假批准后写入课堂考勤 | 发件箱投递教务请假接口;教务侧按学号+日期写请假,避免再记缺勤。 |
| 教务 → 学生系统 | 班级、课表、成绩、课堂出勤只读 | 教务提供只读 API;学生系统定时拉或小程序按需读。学生系统不二次存储成绩为权威副本。 |
# 档案回写(已有能力上收口字段) POST /api/student/sync X-Sync-Key: *** { "tenantId": 2, "items": [ { "studentCode": "PZ20260101", "studentName": "…", "className": "…", "phone": "…" } ] } # 设备回传(学生系统新增,闸机/摄像头共用) POST /api/device/v1/events Authorization: Bearer {device_token} { "deviceId": "GATE-01", "type": "face_pass", // 或 camera_seen "direction": "in", "occurredAt": "2026-09-01T07:12:03+08:00", "personNo": "PZ20260101", "success": true, "offlineSeq": 1288 }
闸机和摄像头品牌不同、接口不同。学生系统只实现一个设备网关:
人脸下发流程:审核通过 → 写入 face_push_log → 后台任务按楼栋/校门分组推送 → 失败重试 → 仍失败则工单给管理员。学生退学或退宿,先收回闸机权限,再改在籍状态。
| 角色 | 数据范围 | 可写 |
|---|---|---|
| 学生 | 本人 | 请假、报修、人脸提交、相册投稿。不能改学号、不能看内部备注 |
| 任课教师 | 所任课班级(教务) | 课堂点名(教务)。无查寝权限除非兼班主任 |
| 班主任 | 所带行政班 | 生活假审批、评分、备注、查寝、人脸审核 |
| 宿管 | 所负责楼栋 | 床位、报修、本楼查寝。不碰课表成绩 |
| 家长 | 已绑定子女 | 只读动态;请假知情确认(若学校开启) |
| 学工管理员 | 本校租户 | 档案、同步任务、设备、全校统计 |
所有写操作记审计日志(谁、何时、对哪条、改前改后)。人脸照片接口必须带令牌,禁止把存储路径暴露成公开 URL。
今日在校:校门当日最后一次成功记录为“进”且未有对应“出”,再扣已批准的离校假。未归:查寝批次里状态为未归,或宿舍摄像头在规定时点后无进楼记录且无请假。报修、闸机失败按工单状态和事件 success=false 聚合。大屏 30 秒轮询即可,不必上消息总线。
软件先把身份、宿舍、请假和同步跑通。闸机、摄像头接上后,已审核人脸从同一张表下发,不必重新采集。
StudentSystem 库与 PC 后台;stu_student / 宿舍 / 请假 / 备注;教务 sync 回写与只读课表;小程序学生生活页、教师换票与审批。停止学生系统跨库写教务。
手机录入与审核队列;设备网关 + 第一家闸机适配;报修状态机;人工查寝;家长绑定与订阅消息。
摄像头适配接入同一事件表;班级/个人评分;相册审核;PC 今日概览与设备心跳;发件箱与失败告警打磨。
| 期次 | 可以认定做完的标志 |
|---|---|
| 一 | 学生系统改班级或电话后,教务花名册一致;老师学生同一个小程序、底栏不同;请假批准后课堂考勤不再记缺勤。 |
| 二 | 手机录脸、教师审核后闸机可过;断网补传不重复;家长能收到孩子进校提醒;宿管能关报修单。 |
| 三 | 宿舍摄像头记录能对上查寝名单;PC 能看出哪台设备掉线;相册和评分有完整操作记录。 |