Python全栈项目--校园智能课表管理系统
项目简介校园课程安排具有明显的高频使用场景学生需要查看每天课程、教师、教室和周次教师或班委需要维护课程变更课程相关的作业、实验、考试提醒也需要统一记录。本文实现一个可运行的校园智能课表管理系统覆盖用户注册登录、Token 鉴权、课程 CRUD、课表看板、关键词检索和课程提醒。项目采用前后端分离架构后端使用 FastAPI 提供 REST APISQLite 保存用户、课程和提醒数据前端使用 Vue 3 与 Vite 构建交互页面。它不是单纯的算法演示而是一个包含认证、数据库、接口、页面和部署步骤的完整 Python 全栈项目。技术栈后端Python 3、FastAPI、Pydantic、SQLite、Uvicorn前端Vue 3、Vite、Composition API、Fetch API认证PBKDF2 密码哈希、HMAC 签名 Token、Bearer 鉴权数据存储SQLite 本地数据库项目交付Markdown 文档、README、可运行源码、zip 压缩包系统架构浏览器 Vue 3 页面 │ HTTP/JSON Bearer Token ▼ FastAPI REST 服务 ├─ auth.py密码哈希、Token 签发与校验 ├─ crud.py用户、课程、提醒业务逻辑 ├─ schemas.py请求响应数据结构 └─ database.pySQLite 初始化与连接 ▼ SQLite 数据库 schedule.db整体流程如下用户在前端注册或登录。后端校验密码签发 Token。前端将 Token 保存到 localStorage。课程和提醒接口请求时自动携带 Token。后端依赖函数解析 Token 并限制用户只能操作自己的课程数据。功能模块1. 用户认证模块用户注册创建账号并保存哈希后的密码。用户登录校验用户名和密码。登录态保持前端保存 Token 和用户信息。退出登录清理本地 Token。接口鉴权课程、提醒等核心接口必须登录后访问。2. 课程管理模块新增课程课程名、教师、教室、星期、节次、周次、颜色。查询课程按星期和节次排序展示。搜索课程支持按课程名、教师、教室关键词检索。编辑课程修改课程安排。删除课程删除自己的课程记录。3. 智能课表看板前端按星期一到星期日分列展示课程卡片不同课程可设置不同颜色便于快速区分课程密度和上课时间。4. 课程提醒模块用户可为某门课程创建提醒例如“周三 08:00 提交实验报告”“第 12 周复习考试重点”。提醒与课程和用户绑定。数据库/数据模型设计系统使用 SQLite启动 FastAPI 时自动创建数据库表。users 表字段类型说明idINTEGER用户主键usernameTEXT唯一用户名password_hashTEXTPBKDF2 哈希密码roleTEXTstudent/teachercreated_atTEXT创建时间courses 表字段类型说明idINTEGER课程主键nameTEXT课程名称teacherTEXT任课教师classroomTEXT上课教室weekdayINTEGER星期 1-7start_sectionINTEGER开始节次end_sectionINTEGER结束节次week_rangeTEXT周次范围colorTEXT前端显示颜色owner_idINTEGER所属用户schedule_notes 表字段类型说明idINTEGER提醒主键course_idINTEGER关联课程contentTEXT提醒内容remind_atTEXT提醒时间描述owner_idINTEGER所属用户后端接口设计方法路径是否鉴权说明GET/api/health否健康检查POST/api/auth/register否注册并返回 TokenPOST/api/auth/login否登录并返回 TokenGET/api/me是获取当前用户GET/api/courses是查询课程支持 keywordPOST/api/courses是创建课程PUT/api/courses/{course_id}是更新课程DELETE/api/courses/{course_id}是删除课程GET/api/notes是查询提醒POST/api/notes是创建提醒前端页面设计前端使用 Vue 3Vite实现单页应用核心页面包含登录/注册卡片根据 authMode 切换表单。顶部状态栏显示当前登录用户、搜索框和退出按钮。课程编辑表单新增或编辑课程。周课表区域星期一到星期日的课程列。提醒管理区域选择课程并添加提醒。前端 API 封装在src/api.js中所有需要鉴权的请求会自动携带保存的 Token。核心代码讲解1. SQLite 初始化backend/app/database.py中的init_db()负责创建用户、课程和提醒表。这样项目首次运行时无需额外执行 SQL 脚本。definit_db():withget_connection()asconn:conn.execute( CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, role TEXT NOT NULL DEFAULT student, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ) )conn.commit()2. 密码哈希与 Token项目没有明文保存密码而是使用 PBKDF2 生成带盐哈希。登录成功后通过 HMAC 签名生成 Token。defhash_password(password:str)-str:saltos.urandom(16)digesthashlib.pbkdf2_hmac(sha256,password.encode(),salt,120000)returnbase64.b64encode(salt).decode()$base64.b64encode(digest).decode()3. 鉴权依赖FastAPI 的Depends可以很方便地给接口增加鉴权保护。课程接口通过get_current_user获取当前用户并使用owner_id做数据隔离。defget_current_user(authorization:strHeader(default)):ifnotauthorization.startswith(Bearer ):raiseHTTPException(status_code401,detail请先登录)payloaddecode_token(authorization.removeprefix(Bearer ).strip())usercrud.get_user_by_id(int(payload[sub]))ifnotuser:raiseHTTPException(status_code401,detail用户不存在)returnuser4. 课程 CRUDcrud.py中的create_course将课程和当前用户绑定避免不同用户互相看到或修改对方课表。defcreate_course(owner_id:int,data:schemas.CourseCreate):withget_connection()asconn:curconn.execute( INSERT INTO courses(name, teacher, classroom, weekday, start_section, end_section, week_range, color, owner_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ,(data.name,data.teacher,data.classroom,data.weekday,data.start_section,data.end_section,data.week_range,data.color,owner_id),)conn.commit()returnget_course(owner_id,cur.lastrowid)5. Vue 登录态处理src/api.js统一封装请求逻辑若存在 Token 就自动写入请求头。exportasyncfunctionrequest(path,options{}){constheaders{Content-Type:application/json,...(options.headers||{})}consttokengetToken()if(token)headers.AuthorizationBearer${token}constresawaitfetch(${API_BASE}${path},{...options,headers})constdataawaitres.json().catch(()({}))if(!res.ok)thrownewError(data.detail||请求失败)returndata}部署与运行步骤1. 运行后端cdproject/backend python3-mvenv .venvsource.venv/bin/activate pipinstall-rrequirements.txt uvicorn app.main:app--reload--host0.0.0.0--port8000后端默认地址为http://127.0.0.1:8000。2. 运行前端cdproject/frontendnpminstallnpmrun devVite 默认地址通常为http://127.0.0.1:5173。前端默认请求http://127.0.0.1:8000如需调整可设置VITE_API_BASE。3. 使用流程访问前端页面。注册学生或教师账号。新增课程并查看周课表。搜索课程或编辑课程。创建课程提醒。点击退出登录清除登录状态。项目总结本文完成了一个贴近校园真实场景的 Python 全栈项目。后端使用 FastAPI 提供清晰的 REST APISQLite 降低部署门槛Vue 3 Vite 提供良好的前端开发体验。项目同时覆盖认证鉴权、密码安全、数据隔离、课程管理、提醒管理和前后端联调适合作为课程设计、毕业设计原型和全栈开发入门实践。项目代码下载链接