一套面向学习通签到场景的三端协同系统:
Web 管理端+Go 后端+Android 原生壳
学不通 2.0 是一个围绕课程签到管理与执行的工具型项目,核心能力包括:
- 学习通账号登录与鉴权
- 课程同步与监控课程选择
- 签到活动聚合展示(按课程分组)
- 多人代签与状态跟踪
- 多签到类型支持(普通 / 二维码 / 手势 / 位置 / 签到码)
- 管理员白名单维护(单条添加、批量导入、删除)
- 多账号本地切换
Web:主业务 UI,负责课程配置、活动查看、签到执行、白名单管理Server:鉴权、课程与活动数据聚合、签到执行、权限控制Android:WebView 容器 + 原生相机桥接,提升扫码体验与机型兼容性
- 普通签到:直接执行
- 手势 / 签到码:输入
sign_code执行 - 位置签到:选择预设地点后提交经纬度与地点描述
- 二维码签到:扫码后自动解析
enc/c并并发执行
- 执行前先调用
/api/sign/check过滤已签用户 - 对待签用户并发调用
/api/sign/execute - 内置失败重试与进度可视化,支持中断
permission = 1:普通用户permission = 2:管理员- 管理端白名单接口仅管理员可访问
- React 19 + TypeScript
- Vite 8
- TailwindCSS 4
- Zustand(本地多账号状态管理)
- Axios(统一请求/鉴权拦截)
- Framer Motion(动效)
- html5-qrcode(浏览器扫码)
- Go 1.25
- Gin
- GORM
- PostgreSQL
- JWT 鉴权
- YAML 配置加载
- Kotlin + Jetpack Compose
- WebView 容器化
- CameraX + ML Kit(原生扫码)
- JavaScript Bridge(原生相机与 Web 页面通信)
flowchart LR
U["用户"] --> W["Web 前端 (React)"]
U --> A["Android App (WebView + CameraX)"]
W --> S["Go Server (Gin)"]
A --> S
S --> D["PostgreSQL"]
S --> X["学习通相关接口"]
XBT2.0
├── Web/ # React 前端
│ ├── src/pages/ # 业务页面(登录、课程、签到、白名单、账号管理、扫码)
│ ├── src/components/ # 组件(签到输入、下拉刷新、路由保护等)
│ ├── src/store/ # Zustand 状态(账号/Token)
│ └── config.yaml # 前端配置(API、位置预设)
├── Server/ # Go 后端
│ ├── cmd/server/ # 入口
│ ├── internal/ # 业务逻辑(handler/service/middleware/...)
│ ├── config.yaml # 后端配置
│ ├── init.sql # PostgreSQL 初始化脚本
│ └── API.md # 接口文档
├── Android/ # Android 原生壳
└── README.md
- Node.js 20+
- Go 1.25+
- PostgreSQL 14+(项目脚本按 PostgreSQL 18+ 编写,低版本一般也可用)
- Android Studio(如需构建移动端)
# 示例:创建数据库后执行
psql -U <user> -d <dbname> -f Server/init.sqlcd Server
go mod download
go run ./cmd/server默认监听:http://localhost:3030
健康检查:
curl http://localhost:3030/api/healthcd Web
npm install
npm run dev默认地址:http://localhost:5173
开发模式下,Vite 已将 /api 代理到 http://localhost:3030。
cd Android
./gradlew assembleDebugAndroid 壳默认目标地址来自 Android/app/src/main/res/values/strings.xml 中的 target_url。
关键字段:
app_env:运行环境标识(dev/development-> Gindebug,prod/production-> Ginrelease,test/testing-> Gintest)http_addr:服务监听地址(默认:3030)jwt_secret:JWT 签名密钥(生产必须修改)credential_secret:账号凭据加密密钥(生产必须修改)postgres_dsn:PostgreSQL 连接串activity_list_limit:每门课返回活动上限(默认5)allow_insecure_tls:是否允许不安全 TLS(生产建议关闭)
关键字段:
api.base_url:默认/apiapi.timeout:请求超时sign.location_presets:位置签到预设点(名称 / 经纬度 / 描述)
- 用户通过手机号/密码登录(
/api/auth/login) - 同步课程(
/api/courses/sync) - 选择需要监控的课程(
/api/courses/selection) - 首页拉取签到活动(
/api/sign/activities) - 进入活动详情,勾选代签同学
- 执行签到前检查状态(
/api/sign/check) - 并发执行签到(
/api/sign/execute)
完整接口说明见:
接口前缀:/api
统一返回结构:
{
"code": 0,
"message": "ok",
"data": {}
}核心表(详见 Server/init.sql):
users:用户与加密凭据whitelists:白名单(普通/管理员)courses:课程基础信息user_courses:用户-课程关系与选课状态sign_activities:活动缓存sign_records:签到记录
- 本项目包含账号登录、课程与签到数据处理能力,部署前请确认符合法律法规与学校/平台使用规范。
- 仓库中的示例配置(如密钥、DSN)仅用于开发演示,生产环境务必替换。
- 建议使用 HTTPS、最小权限数据库账号、独立密钥管理和访问审计。
- 检查后端是否运行在
:3030 - 检查
Web/vite.config.ts代理配置 - 若为生产环境,确认网关将
/api正确转发到后端
- 白名单非空时,仅白名单用户可登录
- 白名单为空时,首次登录用户会自动成为管理员
- Web 端会走
html5-qrcode - Android 壳可借助 CameraX + ML Kit + 原生桥接增强稳定性
- 提交前执行:
# Web
cd Web && npm run lint && npm run build
# Server
cd Server && go test ./...本项目仅用于技术研究与学习交流,请勿用于任何违反平台规则、学校管理规定或法律法规的场景。使用者需自行承担相应责任。