# CSharp **Repository Path**: GChenjiayu/csharp ## Basic Information - **Project Name**: CSharp - **Description**: CSharp:专注于C#编程语言的开源项目,提供丰富的代码示例、工具和库,帮助开发者高效开发高质量的应用程序。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-15 - **Last Updated**: 2026-04-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 学生选修课系统 基于 `C# / ASP.NET Core Web API + MySQL + Vue 3` 的前后端分离项目,面向高校学生选修课场景,支持管理员、学生、教师三类角色。 本项目已实现账号登录、学生注册、管理员基础数据维护、学生选课与退课、课表查询、教师查看授课班次与学生名单、管理员重置账号密码、教师修改本人登录密码等核心功能,可直接用于课程设计演示。 ## 快速索引 - 项目简介:见“`1. 项目简介`” - 快速启动:见“`8. 快速启动`” - 演示账号:见“`9. 演示账号与初始密码`” - 迁移说明:见“`8.2 启动后端`”中的迁移命令小节 - 常见问题:见“`14. 常见问题`” ## 常用命令速查 后端启动: ```powershell dotnet run --project .\src\StudentCourseSelection.Api\StudentCourseSelection.Api.csproj --urls http://localhost:5000 ``` 前端启动: ```powershell cd .\frontend\student-course-ui npm install npm run dev ``` 仅执行数据库迁移: ```powershell dotnet run --project .\src\StudentCourseSelection.Api\StudentCourseSelection.Api.csproj -- --migrate-only ``` 查看迁移: ```powershell .\dotnet-ef.cmd migrations list ``` 新增迁移: ```powershell .\dotnet-ef.cmd migrations add MigrationName -o Persistence\Migrations ``` 执行迁移: ```powershell .\dotnet-ef.cmd database update ``` ## 1. 项目简介 系统采用前后端分离架构: - 前端:`Vue 3 + Vite + Pinia + Element Plus` - 后端:`ASP.NET Core Web API` - 数据访问:`Entity Framework Core + MySQL` - 身份认证:`JWT` 其中,题目要求中的 “基于 C# 的系统”,主要体现在后端服务、业务逻辑、数据访问、权限校验和接口实现均由 `C#` 编写完成;前端使用 `Vue 3` 负责页面展示与交互。 ## 2. 角色与功能 ### 管理员 - 登录系统 - 查看系统概览 - 管理学生信息 - 管理教师信息 - 管理课程信息 - 管理学期信息 - 管理开课班次 - 重置学生账号密码 - 重置教师账号密码 ### 学生 - 注册账号 - 登录系统 - 查看可选课程 - 提交选课 - 退选课程 - 查看我的选课 - 查看我的课表 ### 教师 - 登录系统 - 查看我的授课班次 - 查看班次学生名单 - 修改本人登录密码 - 首次登录时接收初始密码修改提醒 ## 3. 技术架构 ### 后端分层 后端采用四层结构,便于课程设计答辩说明: - `StudentCourseSelection.Domain` - 实体、枚举、核心领域模型 - `StudentCourseSelection.Application` - DTO、接口定义、服务抽象 - `StudentCourseSelection.Infrastructure` - 数据库上下文、服务实现、JWT、密码处理、种子数据 - `StudentCourseSelection.Api` - 控制器、接口入口、认证授权、程序启动配置 ### 前端结构 前端采用 Vue 单页应用: - `src/views/auth` - 登录页、注册页 - `src/views/admin` - 管理员业务页面 - `src/views/student` - 学生业务页面 - `src/views/teacher` - 教师业务页面 - `src/layout` - 系统主布局、导航、公共弹窗 - `src/api` - 请求封装 - `src/router` - 路由与角色权限控制 - `src/utils` - 密码校验、学号校验、CSV 导出等工具 ## 4. 项目目录 ```text 学生选修课系统 ├─ frontend │ └─ student-course-ui │ ├─ src │ │ ├─ api │ │ ├─ layout │ │ ├─ router │ │ ├─ stores │ │ ├─ utils │ │ └─ views ├─ src │ ├─ StudentCourseSelection.Api │ ├─ StudentCourseSelection.Application │ ├─ StudentCourseSelection.Domain │ └─ StudentCourseSelection.Infrastructure ├─ tests └─ StudentCourseSelection.sln ``` 关键文件: - 后端启动入口:`src/StudentCourseSelection.Api/Program.cs` - 后端配置文件:`src/StudentCourseSelection.Api/appsettings.json` - 本地开发配置示例:`src/StudentCourseSelection.Api/appsettings.Local.example.json` - 数据种子文件:`src/StudentCourseSelection.Infrastructure/Seed/DbSeeder.cs` - 前端路由:`frontend/student-course-ui/src/router/index.ts` ## 5. 当前已实现的业务特性 ### 认证与账号 - JWT 登录认证 - 学生注册 - 教师修改本人密码 - 教师首次登录修改初始密码提醒 - 管理员重置学生密码为初始密码 - 管理员重置教师密码为初始密码 ### 学生端 - 查看当前开放选课的课程班次 - 选课、退课 - 查看个人选课记录 - 查看个人课表 - 导出课程、选课记录、课表 CSV ### 教师端 - 查看我的授课班次 - 查看班次学生名单 - 导出班次与学生名单 CSV ### 管理员端 - 学生、教师、课程、学期、开课班次的增删改查 - 表格筛选、排序、分页、空状态展示 - 学生与教师数据导出 - 初始化密码展示与账号重置 ### 数据库与迁移 - 基于 EF Core 的完整数据库迁移体系 - 应用启动时自动执行迁移 - 支持仓库内 `.\dotnet-ef.cmd` 命令统一执行 `list / add / update / remove` - 支持仅执行迁移而不启动 Web 服务 - 兼容旧版 `EnsureCreated` 初始化数据库的基线升级 - 当前已验证的正式迁移: - `20260315000100_InitialCreate` - `20260316061755_AlignEfModelSnapshot` ### 表单与界面规则 - 学号必须为 `12` 位数字 - 性别使用中文选项 - 注册页支持较丰富的院系、专业、班级选项 - 密码至少 `8` 位,且必须同时包含字母和数字 - 教师修改密码弹窗内含强度检测与动态提示 ## 6. 核心业务规则 系统在选课流程中已实现以下约束: - 仅允许在学期选课开放时间内选课或退课 - 同一学生不能重复选择同一班次 - 同一学期不能重复选择同一门课程 - 课程时间冲突时禁止选课 - 班次容量满额后禁止继续选课 - 开课班次存在有效选课记录时,不允许直接修改或删除 - 一个时间点仅保留一个激活学期 这些规则主要位于: - `src/StudentCourseSelection.Infrastructure/Services/StudentService.cs` - `src/StudentCourseSelection.Infrastructure/Services/AdminManagementService.cs` ## 7. 运行环境 建议环境: - `.NET 8 SDK` - `Node.js 18+` - `npm` - `MySQL 8.0` 本地开发建议单独创建 `appsettings.Local.json`,不要把真实数据库账号密码提交到仓库。 推荐做法: - 复制 `src/StudentCourseSelection.Api/appsettings.Local.example.json` - 重命名为 `src/StudentCourseSelection.Api/appsettings.Local.json` - 按自己的 MySQL 环境修改连接字符串和 JWT 密钥 示例数据库配置如下: - 地址:`localhost:3306` - 数据库名:`student_course_selection` - 用户名:`your_db_user` - 密码:`your_db_password` 对应连接字符串位于: - `src/StudentCourseSelection.Api/appsettings.Local.json` 示例配置内容: ```json "DefaultConnection": "Server=localhost;Port=3306;Database=student_course_selection;User=your_db_user;Password=your_db_password;SslMode=None;" ``` 数据库版本配置: ```json "Database": { "ServerVersion": "8.0.36" } ``` ## 8. 快速启动 ### 8.1 准备数据库 先确保本机 MySQL 服务已启动。 如数据库尚未创建,可先执行: ```sql CREATE DATABASE student_course_selection CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` ### 8.2 启动后端 在项目根目录执行: ```powershell dotnet build StudentCourseSelection.sln -v minimal dotnet run --project .\src\StudentCourseSelection.Api\StudentCourseSelection.Api.csproj --urls http://localhost:5000 ``` 后端默认地址: - `http://localhost:5000` 健康检查接口: - `GET http://localhost:5000/api/system/status` 说明: - 后端启动时会先自动创建数据库(如不存在) - 然后自动执行 EF Core 迁移 - 最后再写入种子数据 如果只想执行数据库迁移,不启动 Web 服务,可执行: ```powershell dotnet run --project .\src\StudentCourseSelection.Api\StudentCourseSelection.Api.csproj -- --migrate-only ``` 如果需要新增迁移、查看迁移或手动执行迁移,请使用仓库内包装命令。 推荐入口: ```powershell .\dotnet-ef.cmd ``` 常用命令: ```powershell .\dotnet-ef.cmd migrations list .\dotnet-ef.cmd migrations add MigrationName -o Persistence\Migrations .\dotnet-ef.cmd database update ``` 查看当前迁移: ```powershell .\dotnet-ef.cmd migrations list ``` 新增迁移: ```powershell .\dotnet-ef.cmd migrations add AddCourseTag -o Persistence\Migrations ``` 执行到最新迁移: ```powershell .\dotnet-ef.cmd database update ``` 验证 MySQL 中已执行的迁移历史: ```powershell mysql -h localhost -P 3306 -u your_db_user -p -D student_course_selection -e "SELECT MigrationId, ProductVersion FROM __EFMigrationsHistory ORDER BY MigrationId;" ``` 当前已验证的迁移历史: ```text 20260315000100_InitialCreate 20260316061755_AlignEfModelSnapshot ``` 说明: - 不要直接调用 `scripts\Invoke-DotnetEf.ps1` 传 `-o`、`-c`、`--force` 等 EF 参数,Windows PowerShell 会先解析这些参数 - `.\dotnet-ef.cmd` 已处理本机离线环境下的 SDK overlay、设计时元数据拼装和本地 NuGet 缓存 probing path - 当前机器需要单线程构建以规避并行构建假失败,包装命令内部已经处理 - 如果看到 `The Entity Framework tools version '8.0.0' is older than that of the runtime '8.0.13'.` 提示,可暂时忽略;本项目已实测 `migrations list / add / update / remove` 全部可用 - 本 README 已包含迁移闭环说明,后续以本文件为准 ### 8.3 启动前端 进入前端目录执行: ```powershell cd .\frontend\student-course-ui npm install npm run dev ``` 前端默认地址: - `http://localhost:5173` 说明: - 前端开发环境已通过 Vite 代理 `/api` 到 `http://localhost:5000` - 前后端都启动后,可直接在浏览器访问前端页面 ## 9. 演示账号与初始密码 ### 系统默认演示账号 - 管理员:`admin / admin123` - 学生:`student / student123` - 教师:`teacher / 123456` - 教师:`teacher2 / 123456` - 教师:`teacher3 / 123456` - 教师:`teacher4 / 123456` - 教师:`teacher5 / 123456` ### 管理员创建或重置后的初始密码 - 学生初始密码:`123456` - 教师初始密码:`123456` 说明: - 管理员新增学生/教师时,系统会自动设置初始密码 `123456` - 管理员执行密码重置后,也会恢复为 `123456` - 教师账号如果仍在使用初始密码,登录后会收到明显的修改提醒 ## 10. 种子数据说明 系统启动时会自动写入演示数据,包括: - 院系 - 专业 - 班级 - 学生 - 教师 - 课程 - 当前激活学期 - 多个可选开课班次 示例内容包括: - 示例学生:`李同学` - 示例学号:`202200000001` - 示例课程:数据库原理、软件体系结构、Java 程序设计、人工智能导论等 - 示例班次:`DB-01`、`ARCH-01`、`JAVA-01`、`AI-01` 等 对应文件: - `src/StudentCourseSelection.Infrastructure/Seed/DbSeeder.cs` 迁移相关文件: - `src/StudentCourseSelection.Infrastructure/Persistence/ApplicationDbContextFactory.cs` - `src/StudentCourseSelection.Infrastructure/Persistence/ApplicationDbContextInitializer.cs` - `src/StudentCourseSelection.Infrastructure/Persistence/Migrations` - `scripts/Invoke-DotnetEf.ps1` - `dotnet-ef.cmd` 当前正式迁移: - `20260315000100_InitialCreate` - `20260316061755_AlignEfModelSnapshot` ## 11. 核心接口概览 ### 系统接口 - `GET /api/system/status` ### 认证接口 - `POST /api/auth/login` - `GET /api/auth/student-registration-options` - `POST /api/auth/register/student` - `GET /api/auth/me` - `POST /api/auth/change-password` ### 学生接口 - `GET /api/student/courses/available` - `GET /api/student/enrollments` - `POST /api/student/enrollments` - `DELETE /api/student/enrollments/{courseSectionId}` - `GET /api/student/schedule` ### 教师接口 - `GET /api/teacher/course-sections` - `GET /api/teacher/course-sections/{sectionId}/students` ### 管理员接口 - `GET /api/admin/overview` - `GET /api/admin/students` - `GET /api/admin/teachers` - `GET /api/admin/courses` - `GET /api/admin/semesters` - `GET /api/admin/course-sections` - `GET /api/admin/person-editor-options` - `GET /api/admin/section-editor-options` - `POST /api/admin/students` - `PUT /api/admin/students/{id}` - `DELETE /api/admin/students/{id}` - `POST /api/admin/students/{id}/reset-password` - `POST /api/admin/teachers` - `PUT /api/admin/teachers/{id}` - `DELETE /api/admin/teachers/{id}` - `POST /api/admin/teachers/{id}/reset-password` - `POST /api/admin/courses` - `PUT /api/admin/courses/{id}` - `DELETE /api/admin/courses/{id}` - `POST /api/admin/semesters` - `PUT /api/admin/semesters/{id}` - `DELETE /api/admin/semesters/{id}` - `POST /api/admin/course-sections` - `PUT /api/admin/course-sections/{id}` - `DELETE /api/admin/course-sections/{id}` 控制器文件: - `src/StudentCourseSelection.Api/Controllers/AuthController.cs` - `src/StudentCourseSelection.Api/Controllers/StudentController.cs` - `src/StudentCourseSelection.Api/Controllers/TeacherController.cs` - `src/StudentCourseSelection.Api/Controllers/AdminController.cs` ## 12. 前端页面概览 ### 公共页面 - 登录页 - 注册页 - 系统首页 ### 管理员页面 - 系统概览 - 学生管理 - 教师管理 - 课程管理 - 学期管理 - 开课管理 ### 学生页面 - 可选课程 - 我的选课 - 我的课表 ### 教师页面 - 我的授课 - 班次学生名单 路由文件: - `frontend/student-course-ui/src/router/index.ts` ## 13. 答辩时建议重点说明 如果用于课程设计答辩,建议重点讲这几部分: 1. 前后端分离 - Vue 负责页面交互,C# Web API 负责业务逻辑和数据处理。 2. 分层架构 - Domain、Application、Infrastructure、Api 职责清晰,便于维护和扩展。 3. 权限控制 - 使用 JWT 完成登录认证,并按管理员、学生、教师角色控制页面和接口访问。 4. 业务规则 - 选课过程中考虑了开放时间、重复选课、课程冲突、容量限制等真实场景。 5. 安全设计 - 管理员可重置密码,教师支持自助改密,初始密码登录时会收到提醒。 ## 14. 常见问题 ### 前端能打开,但接口报 500 优先检查: - MySQL 是否已启动 - `3306` 端口是否可用 - 数据库是否存在 - 后端是否运行在 `5000` 端口 - `appsettings.Local.json` 中连接字符串是否正确 ### 后端启动失败 优先检查: - 本机是否已安装 `.NET 8 SDK` - MySQL 服务是否已启动 - 你在 `appsettings.Local.json` 中填写的数据库账号是否可正常连接本地数据库 ### 旧数据库切到迁移体系后如何兼容 当前项目已加入旧库基线兼容逻辑: - 如果数据库原先是通过 `EnsureCreated` 创建的 - 且业务表已存在但 `__EFMigrationsHistory` 不存在 - 系统会先补写首个迁移记录,再继续走后续迁移 这样可以避免直接切换到 `Migrate()` 时,因为旧表已存在而报错。 当前还额外补了一条 `AlignEfModelSnapshot` 迁移,用于把早期手工快照对齐到标准 EF 脚手架状态。完成这一步后,后续再执行 `migrations add` 会生成干净的增量迁移。 ### 页面没有数据 优先检查: - 后端是否正在运行 - 数据种子是否初始化成功 - 当前账号角色是否具有访问权限 ## 15. 后续可扩展方向 - 增加 Swagger 接口文档 - 增加更完整的操作日志 - 支持 Excel 导入导出 - 增加更多统计报表 - 增加单元测试与集成测试 - 支持更细粒度的权限配置 --- 当前 `README.md` 已按项目现状整理,可直接作为项目说明、答辩材料基础稿或交付文档首页使用。