Skip to content

lorien123/harmonyos-class-schedule

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

ClassSchedule — 高校课表管理 App(前后端分离)

基于 HarmonyOS NEXT + Spring Boot 3.2 的课表管理系统,支持多教务系统爬虫导入、课表分享、实况窗上课提醒等功能。


技术栈总览

前端(HarmonyOS NEXT)

类别 技术 说明
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)

类别 技术 说明
框架 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_userusername, password(BCrypt), open_id(华为唯一标识), school_name, student_id, login_attempts(失败计数), locked_until(锁定到期), role

t_coursename, teacher, classroom, day_of_week(1-7), start_slot, end_slot, start_week, end_week, week_type(0=每周/1=单周/2=双周), color

t_sharecode(8 位口令), course_ids(JSON 数组), expire_time(默认 7 天)


API 接口文档

所有响应统一封装为 ApiResponse<T>{"code": 200, "message": "success", "data": ...}

标注 ✅ 的接口需要 Authorization: Bearer <token> 请求头

认证模块 — /api

方法 路径 认证 说明
POST /api/user/login 用户名密码登录,5 次失败锁定 15 分钟
POST /api/user/register 注册账号,自动创建默认学期和时间段
POST /api/auth/huawei 华为账号 OAuth 登录/注册

用户模块 — /api/user

方法 路径 认证 说明
GET /api/user/info 获取当前用户信息
PUT /api/user/info 更新用户信息(学校/院系/专业/电话/邮箱)

课程模块 — /api/course

方法 路径 认证 说明
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,张老师

学期模块 — /api/semester

方法 路径 认证 说明
GET /api/semester/list 学期列表(按日期倒序)
POST /api/semester 创建学期
PUT /api/semester/{id}/current 设为当前学期
DELETE /api/semester/{id} 删除学期及其课程

时间段模块 — /api/timeslot

方法 路径 认证 说明
GET /api/timeslot/list 获取时间段列表
PUT /api/timeslot 批量替换时间段(全量更新)

教务系统导入 — /api/jwc

方法 路径 认证 说明
POST /api/jwc/import 从教务系统导入课表
POST /api/jwc/import/captcha?sessionId=&captcha= 提交验证码继续导入

支持两种导入方式:

  • Cookie 模式:传递 cookies 字段,跳过登录直接解析
  • 自动登录模式:传递 username/password,由 HtmlUnit 模拟登录

验证码流程:登录需要验证码时,接口返回 needCaptcha=true + Base64 图片,客户端提交验证码后继续。

分享模块 — /api/share

方法 路径 认证 说明
POST /api/share/create 创建分享(生成 8 位口令码)
GET /api/share/{code} 查看分享的课表(任何人凭口令可看)
POST /api/share/import 将分享的课程导入到自己的学期

数据同步 — /api/sync

方法 路径 认证 说明
GET /api/sync/status 获取同步状态
GET /api/sync/pull 拉取全部数据(课程 + 时间段 + 学期)

上课提醒 — /api/notification

方法 路径 认证 说明
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+

1. 创建数据库

CREATE DATABASE IF NOT EXISTS class_schedule DEFAULT CHARACTER SET utf8mb4;

2. 修改配置

编辑 src/main/resources/application.properties,修改数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/class_schedule?...
spring.datasource.username=你的数据库用户名
spring.datasource.password=你的数据库密码

3. 启动

mvn spring-boot:run

服务启动在 http://localhost:8081,JPA 会自动建表。

4. 测试

# 注册
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 标准流程

Releases

Packages

Contributors

Languages