面向普通高校教学管理、学业服务与校园生活的一体化综合服务平台。
+ + + +> 生产路径采用 ASP.NET Core + Vue 3;`web-react` 是并行迁移中的验证项目,尚未替代 `web`。详见 [前端迁移说明](#项目结构)。 + +## 快速导航 + +| 想做什么 | 从这里开始 | +| --- | --- | +| 在本机开发 | [热更新模式](#本地开发热更新模式) | +| 快速体验单服务应用 | [单服务模式](#本地开发单服务模式) | +| 部署到生产环境 | [MySQL 8.4 生产部署](#mysql-84-生产部署) | +| 使用 Docker / Compose | [跨平台发布与 Docker](#跨平台发布与-docker) | +| 构建 Android App 或 OTA 包 | [Capacitor Android App](#capacitor-android-app) | +| 编写受信任 SDK 插件 | [插件 SDK 文档](docs/plugin-sdk.md) | + +## 项目概览 + +| 层级 | 技术与职责 | +| --- | --- | +| 服务端 | ASP.NET Core 10、EF Core 10、ASP.NET Core Identity;承担认证、授权、数据范围和业务约束 | +| Web | Vue 3、TypeScript、Vite、Element Plus;提供管理端与师生服务界面 | +| 移动端 | PWA 与 Capacitor Android;支持扫码、定位签到及可回滚的前端 OTA | +| 数据与基础设施 | 开发环境 SQLite;生产环境 MySQL 8.4,可选 Redis、RabbitMQ 与 ClickHouse | +| 发布 | systemd、Docker Compose,以及 `linux/amd64` / `linux/arm64` 容器镜像 | + +## 核心能力 学校名称、平台全称、简称、定位语和介绍统一配置在 `src/Jiaowu.Api/appsettings.json` 的 `Branding` 节。其他学校部署时只需修改这一处并重新 构建前端;浏览器标题、登录页、PWA、Capacitor 应用、Swagger、课表与成绩分析导出等 品牌信息会同步更新。程序集名、数据库标识和 App 包名属于兼容性标识,不随展示名称变化。 -官方电子凭证支持学生自助申请和教务代签,由服务端生成成绩单与学籍状态证明 PDF,并提供唯一凭证编号、二维码公开验真、下载记录、失效和重签;生产部署应通过 `OfficialDocuments__PublicBaseUrl` 配置二维码使用的最终 HTTPS 根地址。 +| 领域 | 已覆盖能力 | +| --- | --- | +| 教学运行 | 基础数据、师生档案、课程库、培养方案、教学任务、排课课表、选课、成绩、考试与考场 | +| 学业全周期 | 学籍异动、毕业审核、学位授予、离校办理、电子凭证与公开验真 | +| 移动与提醒 | PWA 安装、Android 原生扫码/定位签到、iCalendar 订阅、App OTA 更新、桌面组件与快捷入口 | +| 平台治理 | 角色与数据范围、操作审计、归档、缓存、后台任务、监控、插件与单点登录 | + +### 教学与学业服务 当前已实现系统登录与角色权限、基础数据、用户管理、教师档案、学生档案、课程库、培养方案、教学任务、排课课表、学生选课、成绩管理、考试考场、学籍异动、毕业审核、学位授予、毕业离校和首页统计。人员及课程列表支持组合筛选、服务端分页和完整增删改查;培养方案支持课程模块、专业年级版本、复制新版本、发布与旧版本归档,已发布版本可继续维护名称、学分说明和课程结构,适用专业、入学年级及版本号保持锁定;教学任务支持学期课程开设、多教师、合班、容量校验、发布与结课,公共课由校级教务负责、专业必修/专业选修/实践课下放课程所属学院管理,并支持教师按学期申报授课科目、学院审核授课资格、公共课按若干行政班合并教学班,以及在审核通过的教师池中随机均衡分配后批量生成草稿;排课支持学期作息维护、单双周与周次节次、课程可用时间、校区/教学楼/指定教室约束、不占用教室课程、教室容量、教师/行政班/教室冲突校验、自动生成、手工微调和版本化发布;教师和学生可启用个人教学日历订阅,将固定课程、考试/监考、补考及灵活课程提醒同步到支持 iCalendar 的客户端,并可重置或停用订阅地址;选课支持批次时间窗、投放范围、容量与学分上限、重复课程与课表冲突校验、退课截止时间、满员候补、顺位查询、退课后资格复核与自动递补,以及正式名单和候补队列管理;成绩管理支持分项比例、批量录入、特殊考试状态、自动总评与绩点、教师提交、学院审核、校级发布和学生成绩单;考试管理支持考试计划、场次、考场容量、监考教师、考生名单以及考场/监考/学生时间冲突校验;学籍异动支持休学、复学、退学申请,辅导员、学院、学校三级顺序审核,学生撤回,以及最终审批后自动同步学籍状态;毕业审核按入学年级匹配已发布培养方案,以正式成绩计算总学分、必修通过和未解决不及格课程,支持学院范围查看、人工复核、校级锁定发布和学生结果查询;学位授予以已发布毕业资格为来源,按正式成绩加权平均绩点生成规则结论,支持学院人工复核、校级发布锁定和学生结果查询;毕业离校支持自定义事项与责任部门,按校级、学院、辅导员角色分工办理,强制数据范围校验,学生进度查询,以及必办事项全部完成后的批次锁定。 课程库支持下载标准模板后批量导入 `.xlsx`,按课程编码新增或更新,并在整批校验失败时不写入任何课程;授课资格既支持教师申报后审核,也支持学院在本院教师范围内直接分配;学生可在“我的培养方案”中查看本人适用的已发布方案,并按已完成、在读、重修中、未通过、待完成和未修读状态核对课程与学分进度。 +### 安全、权限与扩展 + 权限采用后端强制校验的角色与数据范围模型。多角色账号按 `All > College > Class > Self` 取最高数据范围:校级角色可访问全校数据,院系管理员限定本学院,辅导员通过稳定的账号 ID 绑定所带行政班,教师和学生限定本人及当前教学关系;前端菜单和路由限制仅作为交互辅助,不替代 API 授权。 系统提供统一插件平台。`SuperAdmin` 可以从“组织与权限 → 插件中心”启用或停用内置业务插件;状态变更同时作用于菜单、前端路由和对应后端 API,停用不会删除插件已有数据。插件只控制业务能力是否开放,原接口的角色与数据范围校验仍然有效。生产环境升级后需先执行数据库迁移,再启动新版本服务。 @@ -21,6 +65,32 @@ 人员档案与登录账号分开维护。新增或 Excel 导入学生、教师档案时不会自动创建账号,也不会在修改档案时同步账号。学生首次使用时可以在登录页进入“自助激活”,填写姓名、学号、学院、专业、年级和行政班;全部匹配在籍档案后自行设置密码,系统才创建 Identity 登录账号并关联学生角色。`AspNetUsers` 作为 ASP.NET Core Identity 的内部安全存储,负责密码哈希、登录锁定、角色和令牌。 +官方电子凭证支持学生自助申请和教务代签,由服务端生成成绩单与学籍状态证明 PDF,并提供唯一凭证编号、二维码公开验真、下载记录、失效和重签;生产部署应通过 `OfficialDocuments__PublicBaseUrl` 配置二维码使用的最终 HTTPS 根地址。 + +## 项目结构 + +```text +├─ src/ ASP.NET Core API、领域服务与插件抽象 +├─ tests/ 后端自动化测试 +├─ web/ 当前生产前端(Vue 3) +├─ web-react/ React 并行迁移与验证,不作为当前生产入口 +├─ packages/CaptchaKit/ CAPTCHA 子模块 +├─ deploy/ systemd 等部署资源 +├─ docs/ SDK 与设计文档 +└─ .gitea/workflows/ 发布、打包及多架构镜像工作流 +``` + +## 运行要求 + +| 场景 | 必需环境 | +| --- | --- | +| 本地开发 | .NET SDK 10、Node.js 24、npm;默认使用 SQLite,无须先安装 MySQL | +| 生产部署 | ASP.NET Core Runtime 10、MySQL 8.4;建议配置 HTTPS 反向代理 | +| 可选能力 | Redis(缓存与多实例会话)、RabbitMQ(后台任务)、ClickHouse(分析读模型) | +| Android 构建 | Android Studio、Android SDK;详见下方 Capacitor 指引 | + +> `packages/CaptchaKit` 是 Git 子模块。首次克隆后请执行:`git submodule update --init --recursive packages/CaptchaKit`。 + ## 本地开发:热更新模式 本地开发固定使用 SQLite。首次启动会自动创建空的 @@ -695,15 +765,22 @@ MySQL 时仍应使用前文的 `SslMode=VerifyFull` 和 CA,并拆分具备 DDL Docker 镜像不包含 `.env`、数据库密码或 JWT 密钥。应用容器以非 root 用户运行并监听 8080 端口;生产环境仍应由反向代理负责 HTTPS、访问日志和请求大小限制。 -## 验证 +## 验证与质量检查 + +提交前可按与发布工作流一致的顺序执行以下检查。`npm ci` 使用锁定依赖;后端测试使用 Release 配置。 ```powershell -dotnet test Jiaowu.slnx -npm --prefix web run build +Set-Location web +npm ci +npm run build +npm audit --audit-level=moderate + +Set-Location .. +dotnet test Jiaowu.slnx --configuration Release +git diff --check ``` - -## 人员、课程、学期与成绩归档 +## 归档策略 人员和课程列表默认显示未归档记录,可切换“已归档”或清空筛选查看全部;成绩管理提供同样的归档筛选。学期管理保留当前和历史学期展示,并可按归档状态筛选。各页面均提供单条、批量归档及恢复,提交前展示阻断事项和处理入口,归档或恢复原因必填,每批最多 100 条。批量请求逐项重新校验和提交,显示每条记录的处理结果。 @@ -717,3 +794,7 @@ npm --prefix web run build 统一接口为 `POST /api/archives/{kind}/preview`、`POST /api/archives/{kind}/apply` 和 `GET /api/archives/{kind}/{id}/history?page=1`,其中 `kind` 为 `teachers`、`students`、`courses`、`terms`、`grades`。原学期归档接口继续可用并复用同一校验流程。历史日志按每页 20 条读取,旧归档记录不会伪造操作日志。 数据库新增 `20260905093721_UnifiedArchiving` MySQL 迁移;SQLite 开发库由 `DevelopmentSqliteMigrator` 补齐字段和归档日志表,已有记录默认未归档,已有学期归档状态保留。部署时应按现有数据库升级流程应用迁移。 + +## 许可证 + +本项目采用 [GNU General Public License v3.0](LICENSE)(GPL-3.0)发布。使用、修改或再分发本项目时,请遵守该许可证的条款。