正方教务系统完整解决方案 - 微信小程序 + 后端 API
项目简介
这是一个完整的正方教务系统第三方解决方案,包含微信小程序前端和 Python 后端 API 服务。该项目为学生提供便捷的教务管理服务,支持课表查询、成绩管理、选课系统等核心功能。
⚠️ 重要说明:本项目为第三方开发的非官方 API,仅供学习交流使用。
🔗 前端项目: ZFJW-miniprogram
🔗 后端项目: ZFJW-backend
项目架构
整体架构图
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ │ │ │ │ │
│ 微信小程序端 │◄──►│ 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 部署
- 📊 数据处理: 智能的数据解析和统计
详细功能介绍
📅 智能课表系统
前端实现:
// 课表周视图组件
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:
@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 自动计算
- 成绩统计图表
- 学分统计展示
后端处理:
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
🔐 安全认证机制
前端实现:
// 登录管理器
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);
}
}
后端验证:
@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. 克隆后端项目
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. 构建镜像
docker build -t zfjw-backend .
# 2. 运行容器
docker run -d -p 5000:5000 --name zfjw-backend zfjw-backend
# 3. 查看日志
docker logs -f zfjw-backend
生产环境部署
# 使用 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. 克隆前端项目
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. 配置服务器域名
# 在微信小程序后台添加 request 合法域名
# https://your-api-domain.com
# 2. 上传代码
# 使用微信开发者工具上传代码
# 提交审核并发布
学校配置
添加新学校支持
- 获取学校教务系统信息
# 访问学校教务系统,获取以下信息:
# - 教务系统 URL
# - 登录接口路径
# - 验证码接口
# - 页面编码格式
- 创建学校配置文件
{
"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"
}
}
- 测试配置
# 创建测试脚本
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: 登录失败怎么办?
A: 检查以下几点:
1. 学号密码是否正确
2. 验证码是否正确输入
3. 学校教务系统是否正常运行
4. 网络连接是否稳定
5. 后端服务是否正常启动
Q: 验证码识别不准确?
A: 验证码识别问题:
1. 刷新验证码重新输入
2. 检查验证码图片是否清晰
3. 确认输入的验证码字符正确
4. 如果持续失败,可能需要手动输入
🔧 技术问题
Q: 后端 API 启动失败?
# 检查 Python 版本
python --version # 需要 3.7+
# 检查依赖安装
pip list | grep Flask
# 检查端口占用
netstat -an | grep 5000
lsof -i :5000 # Linux/Mac
# 查看详细错误日志
python app.py --debug
Q: 小程序无法连接后端?
// 检查 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: 数据不显示或显示错误?
A: 数据问题排查:
1. 检查登录状态是否有效
2. 确认学期时间设置正确
3. 查看控制台错误日志
4. 验证后端 API 返回数据
5. 清除缓存重新获取数据
安全与隐私
🔒 数据安全措施
-
前端安全
- 敏感数据本地加密存储
- 不上传个人信息到第三方服务器
- 支持随时清除本地数据
- 使用 HTTPS 加密通信
-
后端安全
- 不存储用户密码
- Session 超时自动清理
- 请求频率限制
- 输入数据验证和过滤
-
通信安全
- API 接口使用 HTTPS
- 数据传输加密
- 防止中间人攻击
- 会话令牌管理
🛡️ 隐私保护承诺
✅ 不收集用户个人隐私信息
✅ 不进行用户行为跟踪分析
✅ 数据仅用于教务查询功能
✅ 支持用户随时删除数据
✅ 遵循最小数据收集原则
✅ 本地存储优先原则
贡献指南
🤝 参与贡献
我们欢迎所有形式的贡献!
贡献类型:
- 🐛 Bug 修复
- ✨ 新功能开发
- 📝 文档完善
- 🏫 学校配置添加
- 🧪 测试用例编写
- 🎨 UI/UX 改进
贡献流程:
- Fork 项目到个人账号
- 创建功能分支
git checkout -b feature/amazing-feature
- 提交更改
git commit -m 'Add amazing feature'
- 推送分支
git push origin feature/amazing-feature
- 创建 Pull Request
📋 开发规范
代码规范:
# 前端 TypeScript
npm run lint # 代码检查
npm run format # 代码格式化
# 后端 Python
pip install black flake8
black . # 代码格式化
flake8 . # 代码检查
提交规范:
feat: 新功能
fix: 修复bug
docs: 文档更新
style: 代码格式调整
refactor: 重构代码
test: 测试相关
chore: 其他修改
社区与支持
💬 交流渠道
📧 联系方式
- 开发者: @drfccv
- 邮箱: 27123587802@qq.com
- 用途: 学习交流、问题反馈、功能建议
免责声明
⚠️ 重要提醒:
1. 本项目为第三方开发的非官方工具
2. 仅供学习交流和个人使用
3. 请勿用于商业用途或违法活动
4. 使用本项目造成的任何后果由使用者承担
5. 开发者不对数据准确性承担责任
6. 请遵守学校相关规定和法律法规
开源协议
本项目采用 MIT License 开源协议。
致谢
感谢所有贡献者和用户的支持!
- 感谢微信小程序平台提供的开发环境
- 感谢 Flask 框架的优秀设计
- 感谢开源社区的无私奉献
- 感谢所有提供学校配置的同学
⭐ 如果这个项目对你有帮助,请给我们一个 Star!
Made with ❤️ by drfccv | 最后更新: 2024-12-08