ClassSchedule — 高校课表管理 App(前后端分离)
基于 HarmonyOS NEXT + Spring Boot 3.2 的课表管理系统,支持多教务系统爬虫导入、课表分享、实况窗上课提醒等功能。
类别
技术
说明
SDK
HarmonyOS NEXT SDK 6.1.0(23)
纯血鸿蒙
语言
ArkTS
TypeScript 超集,鸿蒙原生开发语言
UI 框架
ArkUI
声明式 UI,类似 SwiftUI/Compose
路由/弹窗
@kit.ArkUI
页面路由、Toast/Dialog
WebView
@kit.ArkWeb
教务系统 WebView 登录
持久化
@kit.ArkData
Preferences 本地存储
网络
@kit.NetworkKit
HTTP 请求
通知
@kit.NotificationKit
系统通知提醒
实况窗
@kit.LiveViewKit
锁屏/状态栏课程提醒
文件
@kit.CoreFileKit
文件选择与读写
账号
@kit.AccountKit
华为账号 OAuth 一键登录
构建
Hvigor
鸿蒙官方构建系统
IDE
DevEco Studio + CodeGenie + GLM-5
开发环境
类别
技术
说明
框架
Spring Boot 3.2.5
主框架
ORM
Spring Data JPA + Hibernate
自动建表 (ddl-auto=update)
数据库
MySQL 8.0
关系型数据库
认证
JJWT 0.12.5
HMAC-SHA JWT,7 天有效期
密码加密
Spring Security Crypto (BCrypt)
不可逆哈希
爬虫
HtmlUnit 3.11.0
纯 Java 无头浏览器
校验
Jakarta Bean Validation
请求参数校验
构建
Maven
依赖与打包管理
运行环境
Java 17
LTS 长期支持版本
IDE
IntelliJ IDEA + Claude Code + DeepSeek V4
开发环境
类别
方案
接口风格
RESTful API,统一 ApiResponse<T> 响应封装
认证方式
JWT Token(Authorization: Bearer <token>)
华为登录
OAuth 2.0 authorization_code 模式
API 文档
Swagger / Apifox 同步
┌─────────────────────────────────────────────────┐
│ HarmonyOS NEXT App │
│ ArkUI + ArkTS │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ 课表展示 │ │ 教务导入 │ │ 分享 + 提醒 │ │
│ │ ArkUI │ │ ArkWeb │ │ LiveViewKit │ │
│ └─────┬────┘ └────┬─────┘ └────────┬─────────┘ │
│ │ │ │ │
└────────┼───────────┼───────────────┼────────────┘
│ │ │
RESTful API JWT Auth Huawei OAuth
│ │ │
┌────────┼───────────┼───────────────┼────────────┐
│ ▼ ▼ ▼ │
│ Spring Boot 3.2 Server │
│ Port: 8081 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ Auth 拦截│ │ JPA 仓库 │ │ HtmlUnit 爬虫 │ │
│ │ JWT 解析 │ │ Hibernate│ │ 正方/强智/青果 │ │
│ └──────────┘ └────┬─────┘ └──────────────────┘ │
│ │ │
└────────────────────┼────────────────────────────┘
│
┌──────▼──────┐
│ MySQL 8 │
│ class_schedule│
└─────────────┘
src/main/java/com/classschedule/
├── ClassScheduleApplication.java # 启动入口
├── config/ # 配置层
│ ├── WebConfig.java # CORS + 拦截器注册
│ ├── AuthInterceptor.java # JWT 认证拦截器
│ ├── JwtUtil.java # JWT 生成与校验
│ └── GlobalExceptionHandler.java # 全局异常处理
├── controller/ # 控制器(9 个,26 个接口)
│ ├── AuthController.java # 登录/注册/华为 OAuth
│ ├── UserController.java # 用户信息
│ ├── CourseController.java # 课程 CRUD + 批量导入
│ ├── SemesterController.java # 学期管理
│ ├── TimeSlotController.java # 时间段管理
│ ├── JwcController.java # 教务系统导入
│ ├── ShareController.java # 课表分享
│ ├── SyncController.java # 数据同步
│ └── NotificationController.java # 上课提醒
├── service/ # 服务层(8 个)
├── repository/ # 数据访问层(6 个)
├── entity/ # 实体类(6 个)
├── dto/ # 数据传输对象(17 个)
└── parser/ # 教务系统解析器(6 个)
├── JwcParser.java # 解析器接口
├── BaseJwcParser.java # 抽象基类
├── ZhengfangV5Parser.java # 正方 V5(RSA 加密登录)
├── ZhengfangParser.java # 正方经典版
├── QiangzhiParser.java # 强智教务
└── QingguoParser.java # 青果教务
表名
实体
说明
t_user
User
用户表(支持密码登录 + 华为 openId 联合登录)
t_course
Course
课程表(星期、节次、周次、单双周)
t_semester
Semester
学期表(含当前学期标记)
t_time_slot
TimeSlot
时间段表(自定义节次时间)
t_share
Share
分享表(口令码 + 过期时间)
t_notification
Notification
提醒表(课前通知设置)
t_user :username, password(BCrypt), open_id(华为唯一标识), school_name, student_id, login_attempts(失败计数), locked_until(锁定到期), role
t_course :name, teacher, classroom, day_of_week(1-7), start_slot, end_slot, start_week, end_week, week_type(0=每周/1=单周/2=双周), color
t_share :code(8 位口令), course_ids(JSON 数组), expire_time(默认 7 天)
所有响应统一封装为 ApiResponse<T>:{"code": 200, "message": "success", "data": ...}
标注 ✅ 的接口需要 Authorization: Bearer <token> 请求头
方法
路径
认证
说明
POST
/api/user/login
—
用户名密码登录,5 次失败锁定 15 分钟
POST
/api/user/register
—
注册账号,自动创建默认学期和时间段
POST
/api/auth/huawei
—
华为账号 OAuth 登录/注册
方法
路径
认证
说明
GET
/api/user/info
✅
获取当前用户信息
PUT
/api/user/info
✅
更新用户信息(学校/院系/专业/电话/邮箱)
方法
路径
认证
说明
GET
/api/course/week?week=&semesterId=
✅
按周查询课表
POST
/api/course
✅
添加单门课程
PUT
/api/course/{id}
✅
修改课程(部分更新)
DELETE
/api/course/{id}
✅
删除课程
POST
/api/course/batch
✅
批量导入(JSON 列表或 CSV 文本)
CSV 批量导入格式 :
课程名,星期(1-7),开始节次,结束节次,周次范围,教室,老师
高等数学,1,1,2,1-16单,教102,张老师
方法
路径
认证
说明
GET
/api/semester/list
✅
学期列表(按日期倒序)
POST
/api/semester
✅
创建学期
PUT
/api/semester/{id}/current
✅
设为当前学期
DELETE
/api/semester/{id}
✅
删除学期及其课程
方法
路径
认证
说明
GET
/api/timeslot/list
✅
获取时间段列表
PUT
/api/timeslot
✅
批量替换时间段(全量更新)
方法
路径
认证
说明
POST
/api/jwc/import
✅
从教务系统导入课表
POST
/api/jwc/import/captcha?sessionId=&captcha=
—
提交验证码继续导入
支持两种导入方式:
Cookie 模式 :传递 cookies 字段,跳过登录直接解析
自动登录模式 :传递 username/password,由 HtmlUnit 模拟登录
验证码流程:登录需要验证码时,接口返回 needCaptcha=true + Base64 图片,客户端提交验证码后继续。
方法
路径
认证
说明
POST
/api/share/create
✅
创建分享(生成 8 位口令码)
GET
/api/share/{code}
—
查看分享的课表(任何人凭口令可看)
POST
/api/share/import
✅
将分享的课程导入到自己的学期
方法
路径
认证
说明
GET
/api/sync/status
✅
获取同步状态
GET
/api/sync/pull
✅
拉取全部数据(课程 + 时间段 + 学期)
方法
路径
认证
说明
POST
/api/notification/schedule
✅
创建课前提醒
GET
/api/notification/list
✅
提醒列表
DELETE
/api/notification/{id}
✅
取消提醒(软删除)
HarmonyOS App Spring Boot Server
│ │
│ POST /api/user/login │
│ {username, password} ──────→ BCrypt 校验
│ │ 生成 JWT(subject=userId,7 天有效)
│ ←────── {token, ...} │
│ │
│ 后续请求携带 Header: │
│ Authorization: Bearer <token> ──→ AuthInterceptor 解析 JWT
│ │ 查询 User 注入 request.currentUser
│ │ 接口层检查 currentUser != null
华为快捷登录:
│ 华为账号授权 │
│ ←── openId + authCode ─────→ POST /api/auth/huawei
│ │ 换取华为 access_token
│ │ openId 查找/创建用户 → 签发 JWT
│ ←────── {token, ...} │
账号安全 :同一账号连续 5 次密码错误锁定 15 分钟,登录成功后自动解锁。
系统
解析器
URL 特征
登录方式
正方 V5
ZhengfangV5Parser
jwglxt, zftal-ui
RSA 公钥加密 + Session
正方经典
ZhengfangParser
default2.aspx, xs_main.aspx
__VIEWSTATE 表单提交
强智
QiangzhiParser
jsxsd, /student/
标准表单 + 验证码
青果
QingguoParser
kingosoft, kingo
标准表单 + 验证码
JDK 17+
MySQL 8.0+
Maven 3.6+
CREATE DATABASE IF NOT EXISTS class_schedule DEFAULT CHARACTER SET utf8mb4;
编辑 src/main/resources/application.properties,修改数据库连接信息:
spring.datasource.url =jdbc:mysql://localhost:3306/class_schedule?...
spring.datasource.username =你的数据库用户名
spring.datasource.password =你的数据库密码
服务启动在 http://localhost:8081,JPA 会自动建表。
# 注册
curl -X POST http://localhost:8081/api/user/register \
-H " Content-Type: application/json" \
-d ' {"username":"test","password":"123456","nickname":"测试用户"}'
# 登录
curl -X POST http://localhost:8081/api/user/login \
-H " Content-Type: application/json" \
-d ' {"username":"test","password":"123456"}'
密码 BCrypt 加盐哈希存储,不可逆
JWT 令牌无状态认证,7 天自动过期
登录失败锁定机制(5 次 → 15 分钟)
所有数据操作校验归属权(userId 匹配)
分享口令 8 位随机码 + 过期时间控制
华为 OAuth 2.0 authorization_code 标准流程