这篇文章距离最后更新已过239 天,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
正方教务系统完整解决方案 - 微信小程序 + 后端 API

项目简介
这是一个完整的正方教务系统第三方解决方案,包含微信小程序前端和 Python 后端 API 服务。该项目为学生提供便捷的教务管理服务,支持课表查询、成绩管理、选课系统等核心功能。
⚠️ 重要说明:本项目为第三方开发的非官方 API,仅供学习交流使用。
🔗 前端项目: ZFJW-miniprogram
🔗 后端项目: ZFJW-backend
项目架构
整体架构图
1 2 3 4 5 6 7 8 9 | ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ │ │ │ │ 微信小程序端 │◄──►│ Python 后端 API │◄──►│ 正方教务系统 │ │ │ │ │ │ │ │ - TypeScript 100% │ │ - Python 99.6% │ │ - 各高校教务系统 │ │ - 本地数据缓存 │ │ - Flask 框架 │ │ - 第三方接口调用 │ │ - 隐私保护设计 │ │ - RESTful API │ │ - 数据获取与解析 │ │ │ │ │ │ │ └─────────────────────┘ └─────────────────────┘ └─────────────────────┘ |
技术栈对比
| 组件 |
前端小程序 |
后端 API |
| 语言 |
TypeScript (100%) |
Python (99.6%) |
| 框架 |
微信小程序原生 |
Flask 2.0+ |
| 特性 |
本地缓存、隐私保护 |
RESTful API、多校支持 |
| 部署 |
微信小程序平台 |
独立服务器/Docker |
核心功能
🎯 完整功能矩阵
| 功能模块 |
前端实现 |
后端支持 |
状态 |
| 用户认证 |
✅ 登录界面、密码管理 |
✅ 验证码登录、Session 管理 |
已完成 |
| 个人信息 |
✅ 信息展示、资料管理 |
✅ 学生信息查询 |
已完成 |
| 智能课表 |
✅ 周视图、手势滑动 |
✅ 课表查询 |
已完成 |
| 成绩管理 |
✅ 多学期查询、GPA 计算 |
✅ 成绩统计分析 |
已完成 |
| 考试安排 |
✅ 考试时间展示 |
✅ 考试信息查询 |
已完成 |
| 选课系统 |
✅ 已选课程显示 |
🚧 选课操作开发中 |
部分完成 |
| 教学评价 |
✅ 一键评教功能 |
✅ 评价数据处理 |
已完成 |
| 通知公告 |
✅ 通知展示 |
✅ 消息推送 |
已完成 |
| 空教室查询 |
🚧 界面开发中 |
🚧 查询接口开发中 |
计划中 |
🔥 核心特性
前端特性
- 🎨 现代化界面: 简洁美观的用户界面设计
- 📱 响应式布局: 适配不同屏幕尺寸
- 💾 智能缓存: 离线数据查看,减少网络请求
- 🔒 隐私保护: 数据本地存储,不上传云端
- ⚡ 流畅体验: 手势操作,快速响应
后端特性
- 🚀 高性能: 基于 Flask 的轻量级架构
- 🏫 多校支持: 灵活的学校配置系统
- 🔐 安全可靠: 完善的认证和会话管理
- 🐳 容器化: 支持 Docker 部署
- 📊 数据处理: 智能的数据解析和统计
详细功能介绍
📅 智能课表系统
前端实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 课表周视图组件 interface ScheduleWeekView { currentWeek: number; scheduleData: CourseInfo[]; weekDays: string[]; timeSlots: TimeSlot[]; } // 手势滑动切换周次 const handleSwipeChange = (e: any) => { const { current } = e.detail; setCurrentWeek(current + 1); loadScheduleData(current + 1); }; |
后端 API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @app.route('/api/schedule', methods=['GET']) def get_schedule(): """获取课表数据""" week = request.args.get('week', 1) try: schedule_data = zfn_api.get_schedule(week) return jsonify({ 'code': 200, 'data': schedule_data, 'message': 'success' }) except Exception as e: return jsonify({ 'code': 500, 'message': str(e) }) |
📊 成绩管理系统
前端功能:
- 多学期成绩查询
- GPA 自动计算
- 成绩统计图表
- 学分统计展示
后端处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def calculate_gpa(grades_data): """计算 GPA""" total_credits = 0 total_grade_points = 0 for grade in grades_data: credit = float(grade.get('credit', 0)) score = float(grade.get('score', 0)) grade_point = score_to_gpa(score) total_credits += credit total_grade_points += credit * grade_point return total_grade_points / total_credits if total_credits > 0 else 0 |
🔐 安全认证机制
前端实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // 登录管理器 class LoginManager { private static instance: LoginManager; // 登录验证 async login(username: string, password: string, captcha: string) { const loginData = { username, password: this.encryptPassword(password), captcha }; const response = await api.post('/login', loginData); if (response.code === 200) { this.saveLoginInfo(response.data); return true; } return false; } // 密码加密 private encryptPassword(password: string): string { // 实现密码加密逻辑 return btoa(password); } } |
后端验证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | @app.route('/api/login', methods=['POST']) def login(): """用户登录验证""" data = request.get_json() username = data.get('username') password = data.get('password') captcha = data.get('captcha') try: # 验证登录信息 login_result = zfn_api.login(username, password, captcha) if login_result['success']: # 创建会话 session['user_id'] = username session['login_time'] = datetime.now() return jsonify({ 'code': 200, 'data': login_result['data'], 'message': '登录成功' }) else: return jsonify({ 'code': 401, 'message': login_result['message'] }) except Exception as e: return jsonify({ 'code': 500, 'message': f'登录失败: {str(e)}' }) |
部署指南
🖥️ 后端部署
本地开发环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 1. 克隆后端项目 git clone https://github.com/drfccv/ZFJW-backend.git cd ZFJW-backend # 2. 创建虚拟环境 python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows # 3. 安装依赖 pip install -r requirements.txt # 4. 配置学校信息 cp school_config.example.json school_config.json # 编辑 school_config.json 添加你的学校配置 # 5. 启动服务 python app.py |
Docker 部署
1 2 3 4 5 6 7 8 | # 1. 构建镜像 docker build -t zfjw-backend . # 2. 运行容器 docker run -d -p 5000:5000 --name zfjw-backend zfjw-backend # 3. 查看日志 docker logs -f zfjw-backend |
生产环境部署
1 2 3 4 5 6 7 | # 使用 Gunicorn 部署 pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5000 app:app # 或使用 uWSGI pip install uwsgi uwsgi --http :5000 --module app:app --processes 4 |
📱 前端部署
开发环境
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 1. 克隆前端项目 git clone https://github.com/drfccv/ZFJW-miniprogram.git cd ZFJW-miniprogram # 2. 安装依赖 npm install # 3. 配置后端 API 地址 # 修改 utils/config.ts 中的 API_BASE_URL # 4. 微信开发者工具 # 使用微信开发者工具打开项目目录 # 开启"不校验合法域名"选项 |
生产环境
1 2 3 4 5 6 7 | # 1. 配置服务器域名 # 在微信小程序后台添加 request 合法域名 # https://your-api-domain.com # 2. 上传代码 # 使用微信开发者工具上传代码 # 提交审核并发布 |
学校配置
添加新学校支持
- 获取学校教务系统信息
1 2 3 4 5 | # 访问学校教务系统,获取以下信息: # - 教务系统 URL # - 登录接口路径 # - 验证码接口 # - 页面编码格式 |
- 创建学校配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "school_code": "your_school", "school_name": "你的学校名称", "base_url": "http://jwxt.your-school.edu.cn", "login_url": "/jsxsd/xk/LoginToXk", "captcha_url": "/jsxsd/verifycode.servlet", "encoding": "gbk", "timeout": 30, "headers": { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1" } } |
- 测试配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 创建测试脚本 import requests from school_config import load_school_config config = load_school_config('your_school') session = requests.Session() # 测试登录 response = session.post( config['base_url'] + config['login_url'], data={ 'userAccount': 'test_username', 'userPassword': 'test_password', 'RANDOMCODE': 'test_captcha' }, headers=config['headers'] ) print(f"登录测试结果: {response.status_code}") |
常见问题与解决方案
❓ 登录相关问题
Q: 登录失败怎么办?
1 2 3 4 5 6 | A: 检查以下几点: 1. 学号密码是否正确 2. 验证码是否正确输入 3. 学校教务系统是否正常运行 4. 网络连接是否稳定 5. 后端服务是否正常启动 |
Q: 验证码识别不准确?
1 2 3 4 5 | A: 验证码识别问题: 1. 刷新验证码重新输入 2. 检查验证码图片是否清晰 3. 确认输入的验证码字符正确 4. 如果持续失败,可能需要手动输入 |
🔧 技术问题
Q: 后端 API 启动失败?
1 2 3 4 5 6 7 8 9 10 11 12 | # 检查 Python 版本 python --version # 需要 3.7+ # 检查依赖安装 pip list | grep Flask # 检查端口占用 netstat -an | grep 5000 lsof -i :5000 # Linux/Mac # 查看详细错误日志 python app.py --debug |
Q: 小程序无法连接后端?
1 2 3 4 5 6 7 8 9 10 11 12 13 | // 检查 API 地址配置 const API_BASE_URL = 'https://your-api-domain.com'; // 检查网络请求 wx.request({ url: API_BASE_URL + '/api/health', success: (res) => { console.log('API 连接正常:', res.data); }, fail: (err) => { console.error('API 连接失败:', err); } }); |
Q: 数据不显示或显示错误?
1 2 3 4 5 6 | A: 数据问题排查: 1. 检查登录状态是否有效 2. 确认学期时间设置正确 3. 查看控制台错误日志 4. 验证后端 API 返回数据 5. 清除缓存重新获取数据 |
安全与隐私
🔒 数据安全措施
-
前端安全
- 敏感数据本地加密存储
- 不上传个人信息到第三方服务器
- 支持随时清除本地数据
- 使用 HTTPS 加密通信
-
后端安全
- 不存储用户密码
- Session 超时自动清理
- 请求频率限制
- 输入数据验证和过滤
-
通信安全
- API 接口使用 HTTPS
- 数据传输加密
- 防止中间人攻击
- 会话令牌管理
🛡️ 隐私保护承诺
1 2 3 4 5 6 | ✅ 不收集用户个人隐私信息 ✅ 不进行用户行为跟踪分析 ✅ 数据仅用于教务查询功能 ✅ 支持用户随时删除数据 ✅ 遵循最小数据收集原则 ✅ 本地存储优先原则 |
贡献指南
🤝 参与贡献
我们欢迎所有形式的贡献!
贡献类型:
- 🐛 Bug 修复
- ✨ 新功能开发
- 📝 文档完善
- 🏫 学校配置添加
- 🧪 测试用例编写
- 🎨 UI/UX 改进
贡献流程:
- Fork 项目到个人账号
- 创建功能分支
git checkout -b feature/amazing-feature
- 提交更改
git commit -m 'Add amazing feature'
- 推送分支
git push origin feature/amazing-feature
- 创建 Pull Request
📋 开发规范
代码规范:
1 2 3 4 5 6 7 8 | # 前端 TypeScript npm run lint # 代码检查 npm run format # 代码格式化 # 后端 Python pip install black flake8 black . # 代码格式化 flake8 . # 代码检查 |
提交规范:
1 2 3 4 5 6 7 | feat: 新功能 fix: 修复bug docs: 文档更新 style: 代码格式调整 refactor: 重构代码 test: 测试相关 chore: 其他修改 |
社区与支持
💬 交流渠道
- GitHub Issues: 问题反馈
- GitHub Discussions: 讨论交流
- QQ 群: 2713587802(学习交流)
📧 联系方式
免责声明
1 2 3 4 5 6 7 8 | ⚠️ 重要提醒: 1. 本项目为第三方开发的非官方工具 2. 仅供学习交流和个人使用 3. 请勿用于商业用途或违法活动 4. 使用本项目造成的任何后果由使用者承担 5. 开发者不对数据准确性承担责任 6. 请遵守学校相关规定和法律法规 |
开源协议
本项目采用 MIT License 开源协议。
致谢
感谢所有贡献者和用户的支持!
- 感谢微信小程序平台提供的开发环境
- 感谢 Flask 框架的优秀设计
- 感谢开源社区的无私奉献
- 感谢所有提供学校配置的同学
⭐ 如果这个项目对你有帮助,请给我们一个 Star!
Made with ❤️ by drfccv | 最后更新: 2024-12-08
大佬可以加一个全校课表查询嘛,班级课表不同的
寒假考虑优化∠( ᐛ 」∠)_