面向北大信管系博士生、岗位导师、教务管理员的全流程线上化岗位与奖学金管理平台,实现岗位发布、申请、审核、工作量认定、奖学金核算与发放一站式管理,替代传统人工对接模式,提升管理效率与数据规范性。
专为北京大学信息管理系打造的博士生岗位奖学金业务闭环管理系统。 以数字化、流程化、标准化为核心,解决传统线下沟通效率低、信息滞后、统计繁琐、数据不规范等问题,支撑院系规模化、精细化的博士岗位与奖学金管理工作。
- 博士生:2017级及以后符合条件的全日制学术型博士
- 岗位负责人(导师/教师):助教、助研岗位发布与审核主体
- 系统管理员:教务/院系管理人员,负责全局配置与数据监管
- 博士生:岗位查询、一键申请、工作量提交、奖学金查看与导出
- 导师:岗位发布、申请审核、工作量认定、奖学金设置
- 管理员:用户管理、岗位监管、奖学金批量核算、数据统计与日志审计
- 信息传递依赖人工沟通,滞后、易遗漏、易出错
- 申请与审核流程线下流转,效率低、可追溯性差
- 工作量与奖学金依赖人工统计,数据易混乱、核算成本高
- 缺乏统一平台,权限不清、档案不规范、决策缺少数据支撑
- 身份认证与个人信息管理
- 公开岗位浏览、筛选与在线申请
- 申请状态实时跟踪与撤回
- 工作量提交、修改与进度查看
- 奖学金明细查询、数据导出与历史记录
- 个人操作日志与安全记录
- 岗位创建、草稿编辑、发布与关闭
- 学生申请批量审核、材料查看与反馈
- 工作量审核、评分与备注
- 岗位学生奖学金规则配置
- 个人发布岗位与审核记录管理
- 用户账号管理(启用/冻结)
- 全平台岗位统一监管
- 奖学金自动计算、手动调整、批量发放确认
- 数据导出(奖学金、日志)
- 系统操作全链路日志审计与追溯
- 业务闭环:从岗位→申请→审核→工作量→奖学金→发放,全流程线上化
- 权限清晰:三角色隔离,权责明确,数据安全可控
- 流程规范:固定状态流转,减少人为操作偏差
- 数据可管:结构化存储,支持筛选、统计、导出,便于管理与复盘
- 校园适配:严格匹配北大信管系博士生岗位政策与资格要求
- 体验轻量化:界面简洁、重点突出、操作路径短,降低师生使用成本
- 目前为校内本地化部署,暂未开放公网访问
- 部分辅助数据表保留,实际业务中暂未启用
- 无消息推送与提醒机制
- 增加邮件/系统消息通知
- 支持岗位与奖学金数据可视化 dashboard
- 与校园统一身份认证对接
- 支持批量导入导出与自动化对账
- 启动本地服务后访问系统首页
- 按角色登录:学生 / 教师 / 管理员
- 学生:浏览岗位 → 申请 → 提交工作量 → 查询奖学金
- 教师:发布岗位 → 审核申请 → 认定工作量 → 设置奖学金
- 管理员:管理用户 → 监管岗位 → 核算与发放奖学金
本项目是一个基于 Flask 的博士生岗位奖学金管理系统,用于管理博士生岗位申请、奖学金发放、工作量审核等业务流程。系统采用前后端不分离架构,后端使用 Flask 提供 API 接口和页面渲染,前端使用原生 HTML/CSS/JavaScript。
- 后端框架:Flask(Python Web 框架)
- 数据库:MySQL(本地数据库)
- 认证方式:JWT(JSON Web Token)
- 运行方式:单进程 Flask 开发服务器
- 架构模式:MVC 模式,使用蓝图(Blueprint)组织路由
系统支持三种用户角色:
- 学生端:岗位申请、奖学金查询、工作量提交 已有用户名:B8888889 密码:weitong2018
- 教师端:岗位发布、申请审核、工作量审核、奖学金设置 已有用户名T009 密码:weitong2018
- 管理员端:用户管理、岗位管理、奖学金管理、系统配置、操作日志 已有用户名(硬编码,未存入数据库):admin001;密码:Admin@123456
- Python 3.x
- Flask:Web 框架
项目依赖的主要 Python 包如下(建议使用 pip install 安装):
| 包名 | 用途 | 版本要求 |
|---|---|---|
Flask |
Web 框架核心 | - |
Flask-SQLAlchemy |
ORM 数据库操作 | - |
Flask-JWT-Extended |
JWT 身份认证 | - |
Flask-CORS |
跨域资源共享 | - |
PyMySQL |
MySQL 数据库驱动 | - |
bcrypt |
密码加密 | - |
openpyxl |
Excel 文件处理 | - |
pandas |
数据处理与导出 | - |
PyJWT |
JWT 令牌生成与验证 | - |
werkzeug |
文件上传工具(Flask 内置) | - |
DBSgroupWork/
├── api/ # API 路由模块
│ ├── __init__.py
│ ├── auth.py # 认证相关接口(登录)
│ ├── student.py # 学生端接口
│ ├── teacher.py # 教师端接口
│ └── admin.py # 管理员端接口
├── db/ # 数据库模块
│ ├── __init__.py
│ └── db_connection.py # 数据库连接配置
├── database/ # 数据库文件
│ └── database_export.sql # 数据库初始化 SQL 文件
├── templates/ # HTML 模板文件
│ ├── index.html # 登录页
│ ├── register_student.html # 学生注册页
│ ├── register_teacher.html # 教师注册页
│ ├── student/ # 学生端页面
│ │ ├── dashboard.html
│ │ ├── positions.html
│ │ ├── position-detail.html
│ │ ├── applications.html
│ │ ├── application-detail.html
│ │ ├── profile.html
│ │ ├── scholarships.html
│ │ └── workload.html
│ ├── teacher/ # 教师端页面
│ │ ├── dashboard.html
│ │ ├── positions.html
│ │ ├── position-detail.html
│ │ ├── publish.html
│ │ ├── applications.html
│ │ ├── application-detail.html
│ │ ├── workload-review.html
│ │ ├── workload-detail.html
│ │ ├── history.html
│ │ └── profile.html
│ └── admin/ # 管理员端页面
│ ├── dashboard.html
│ ├── user-management.html
│ ├── position-management.html
│ ├── scholarship-management.html
│ └── system-config.html
├── static/ # 静态资源文件
│ ├── common.css # 公共样式
│ ├── common.js # 公共脚本
│ └── pku_logo.png # 校徽图片
├── uploads/ # 文件上传目录
│ └── application/ # 申请附件存储
├── utils/ # 工具函数模块,本项目暂未用到
├── app.py # Flask 应用主入口
└── README.md # 项目说明文档
api/:所有 API 接口路由,按角色分为学生、教师、管理员三个蓝图db/:数据库连接配置,使用 PyMySQL 和 SQLAlchemydatabase/:数据库初始化 SQL 文件templates/:HTML 模板,按角色组织子目录static/:CSS、JavaScript、图片等静态资源uploads/:用户上传的文件存储目录utils/:通用工具函数,暂无内容
| 方法 | URL | 功能说明 |
|---|---|---|
| POST | /api/auth/auth/login |
用户登录(学生/教师/管理员) |
| 方法 | URL | 功能说明 |
|---|---|---|
| POST | /api/student/auth/student/register |
学生注册 |
| GET | /api/student/profile |
获取学生个人信息 |
| PUT | /api/student/profile |
更新学生个人信息 |
| GET | /api/student/positions |
获取岗位列表 |
| GET | /api/student/positions/<position_id> |
获取岗位详情 |
| POST | /api/student/applications |
提交岗位申请 |
| GET | /api/student/applications |
获取申请列表 |
| GET | /api/student/applications/<application_id> |
获取申请详情 |
| PUT | /api/student/applications/<application_id>/cancel |
取消申请 |
| GET | /api/student/applications/overview |
获取申请概览 |
| GET | /api/student/logs/login |
获取登录日志 |
| POST | /api/student/workload |
提交工作量 |
| GET | /api/student/workload |
获取工作量列表 |
| PUT | /api/student/workload/<workload_id> |
更新工作量 |
| GET | /api/student/scholarships |
获取奖学金列表 |
| GET | /api/student/scholarships/<scholarship_id> |
获取奖学金详情 |
| POST | /api/student/scholarships/export |
导出奖学金数据 |
| POST | /api/student/upload |
上传文件 |
| 方法 | URL | 功能说明 |
|---|---|---|
| POST | /api/teacher/auth/teacher/register |
教师注册 |
| GET | /api/teacher/profile |
获取教师个人信息 |
| PUT | /api/teacher/profile |
更新教师个人信息 |
| POST | /api/teacher/positions |
创建岗位 |
| GET | /api/teacher/positions |
获取岗位列表 |
| PUT | /api/teacher/positions/<position_id> |
更新岗位信息 |
| POST | /api/teacher/positions/<position_id>/publish |
发布岗位 |
| POST | /api/teacher/positions/<position_id>/close |
关闭岗位 |
| GET | /api/teacher/students/<student_id>/details |
获取学生详情 |
| GET | /api/teacher/applications/<application_id> |
获取申请详情 |
| GET | /api/teacher/applications |
获取申请列表 |
| PUT | /api/teacher/applications/batch-review |
批量审核申请 |
| GET | /api/teacher/workload |
获取工作量列表 |
| PUT | /api/teacher/workload/<workload_id>/review |
审核工作量 |
| POST | /api/teacher/scholarships/set |
设置奖学金 |
| 方法 | URL | 功能说明 |
|---|---|---|
| GET | /api/admin/users |
获取用户列表 |
| GET | /api/admin/users/<user_id> |
获取用户详情 |
| PUT | /api/admin/users/<user_id>/status |
更新用户状态 |
| POST | /api/admin/teachers |
创建教师账号 |
| POST | /api/admin/scholarships/calculate |
计算奖学金 |
| PUT | /api/admin/scholarships/manual |
手动设置奖学金 |
| PUT | /api/admin/scholarships/<scholarship_id>/publish |
发布奖学金 |
| PUT | /api/admin/scholarships/batch-publish |
批量发布奖学金 |
| GET/POST | /api/admin/scholarships/export |
导出奖学金数据 |
| GET | /api/admin/positions |
获取岗位列表 |
| GET | /api/admin/positions/<position_id> |
获取岗位详情 |
| POST | /api/admin/positions/<position_id>/publish |
发布岗位 |
| PUT | /api/admin/positions/<position_id> |
更新岗位信息 |
| POST | /api/admin/positions/<position_id>/close |
关闭岗位 |
| GET | /api/admin/scholarships |
获取奖学金列表 |
| GET | /api/admin/logs |
获取操作日志 |
| GET | /api/admin/logs/export |
导出操作日志 |
| GET | /api/admin/config |
获取系统配置 |
| PUT | /api/admin/config |
更新系统配置 |
注意:所有需要认证的接口均需在请求头中携带 JWT Token:
Authorization: Bearer <token>
- 登录页:
http://127.0.0.1:5000/
| 页面 | URL |
|---|---|
| 学生注册 | http://127.0.0.1:5000/register/student |
| 学生仪表盘 | http://127.0.0.1:5000/student/dashboard |
| 岗位列表 | http://127.0.0.1:5000/student/positions |
| 岗位详情 | http://127.0.0.1:5000/student/position-detail |
| 我的申请 | http://127.0.0.1:5000/student/applications |
| 申请详情 | http://127.0.0.1:5000/student/application-detail |
| 个人资料 | http://127.0.0.1:5000/student/profile |
| 奖学金查询 | http://127.0.0.1:5000/student/scholarships |
| 工作量管理 | http://127.0.0.1:5000/student/workload |
| 页面 | URL |
|---|---|
| 教师注册 | http://127.0.0.1:5000/register/teacher |
| 教师仪表盘 | http://127.0.0.1:5000/teacher/dashboard |
| 岗位管理 | http://127.0.0.1:5000/teacher/positions |
| 岗位详情 | http://127.0.0.1:5000/teacher/position-detail |
| 发布岗位 | http://127.0.0.1:5000/teacher/publish |
| 申请审核 | http://127.0.0.1:5000/teacher/applications |
| 申请详情 | http://127.0.0.1:5000/teacher/application-detail |
| 工作量审核 | http://127.0.0.1:5000/teacher/workload-review |
| 工作量详情 | http://127.0.0.1:5000/teacher/workload-detail |
| 历史记录 | http://127.0.0.1:5000/teacher/history |
| 个人资料 | http://127.0.0.1:5000/teacher/profile |
| 页面 | URL |
|---|---|
| 管理员仪表盘 | http://127.0.0.1:5000/admin/dashboard |
| 用户管理 | http://127.0.0.1:5000/admin/user-management |
| 岗位管理 | http://127.0.0.1:5000/admin/position-management |
| 奖学金管理 | http://127.0.0.1:5000/admin/scholarship-management |
| 系统配置 | http://127.0.0.1:5000/admin/system-config |
重要提示:本项目目前仅支持本地运行,需要在本地 MySQL 数据库中初始化数据库。
- 位置:
database/database_export.sql - 用途:包含完整的数据库表结构定义和初始数据
- 数据库名:
phd_scholarship_system
-
确保 MySQL 服务已启动
-
登录 MySQL:
mysql -u root -p
-
创建数据库(如果不存在):
CREATE DATABASE IF NOT EXISTS phd_scholarship_system CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-
导入 SQL 文件:
mysql -u root -p phd_scholarship_system < database/database_export.sql或在 MySQL 命令行中:
USE phd_scholarship_system; SOURCE database/database_export.sql;
-
验证导入:
SHOW TABLES;
数据库连接配置在两个文件中:
-
app.py(第 20-23 行):password = "526819wysycyA@" encoded_password = quote(password) app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://root:{encoded_password}@127.0.0.1:3306/phd_scholarship_system"
-
db/db_connection.py(第 22-33 行):return { 'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'password': 'zc20050629', 'database': 'phd_scholarship_system', ... }
- 用户名:默认为
root,需与你的 MySQL 用户名一致 - 密码:需修改为你的 MySQL 密码
- 修改
app.py第 20 行的password变量 - 修改
db/db_connection.py第 28 行的password字段
- 修改
- 主机:
127.0.0.1(本地) - 端口:
3306(MySQL 默认端口) - 数据库名:
phd_scholarship_system
注意:两个文件中的密码配置必须保持一致,否则会导致数据库连接失败。
-
安装依赖:
pip install Flask Flask-SQLAlchemy Flask-JWT-Extended Flask-CORS PyMySQL bcrypt openpyxl pandas PyJWT
-
配置数据库:
- 修改
app.py和db/db_connection.py中的数据库连接信息 - 确保 MySQL 服务已启动
- 导入
database/database_export.sql初始化数据库
- 修改
-
启动应用:
python app.py
-
访问系统:
- 打开浏览器访问:
http://127.0.0.1:5000
- 打开浏览器访问:
- 默认端口:
5000 - 主机地址:
127.0.0.1(仅本地访问) - 如需修改,编辑
app.py第 187 行:app.run(debug=True, host='127.0.0.1', port=5000)
- 密钥:
app.py第 30 行JWT_SECRET_KEY(生产环境需修改) - 过期时间:24 小时(86400 秒)
- Token 位置:请求头
Authorization: Bearer <token>
- 当前配置允许所有跨域请求(
CORS(app)) - 生产环境建议限制允许的源
- 上传目录:
uploads/application/ - 访问路径:
/uploads/<filename> - 确保
uploads/目录存在且有写权限
- 默认管理员账号:
admin001 - 默认密码:
Admin@123456 - 配置位置:
api/auth.py第 10-12 行
-
数据库连接失败:
- 检查 MySQL 服务是否启动
- 确认用户名、密码、数据库名配置正确
- 确认两个配置文件中的密码一致
-
端口被占用:
- 修改
app.py中的端口号 - 或关闭占用 5000 端口的进程
- 修改
-
导入错误:
- 确认所有依赖包已安装
- 检查 Python 版本(建议 3.7+)
-
文件上传失败:
- 检查
uploads/目录是否存在 - 确认目录有写权限
- 检查
-
JWT Token 无效:
- 检查 Token 是否过期(24 小时)
- 确认请求头格式正确:
Authorization: Bearer <token>
最后更新:2025年12月24日