18 KiB
寸进(InchStep)系统设计说明书
文档版本:v1.0
更新日期:2026-06-24
对应后端:Go + Gin + GORM | 前端:Next.js / React Native / 微信小程序
状态:正式初稿
目录
- 文档概述
- 系统架构
- 技术选型与版本
- 模块设计
- 安全设计
- 性能设计
- 错误处理规范
- 日志与监控
1. 文档概述
1.1 文档目的
本文档是寸进(InchStep)综合成长打卡平台的技术设计说明书,面向后端、前端、测试、运维工程师,提供系统架构、模块划分、关键技术决策的详细说明。
1.2 适用范围
覆盖寸进平台 v1.0 全部功能模块的技术设计,包括:
- 后端 API 服务的架构与模块设计
- 前端三端(Web / App / 小程序)的架构要点
- 数据库设计与数据流
- 安全、性能、监控等横切关注点
1.3 参考文档
| 文档 | 说明 |
|---|---|
| 寸进_InchStep_详细需求说明书.md | 产品需求与功能规格 |
| docs/API设计文档.md | API 接口详细定义 |
| docs/数据库设计文档.md | 数据库详细设计 |
| docs/前端架构文档.md | 前端三端架构设计 |
| AGENTS.md | 仓库编码规范与指南 |
2. 系统架构
2.1 架构总览
┌─────────────────────────────────────────────────────────────┐ │ 用户层 │ │ PC/移动浏览器 iOS/Android App 微信小程序 │ └──────────────────────┬──────────────────────────────────────┘ │ ┌──────────────────────▼──────────────────────────────────────┐ │ 前端层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Web 端 │ │ App 端 │ │ 小程序 │ │ 管理后台 │ │ │ │ Next.js │ │ RN │ │ 原生/Taro│ │ React │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ └──────────────┼─────────────┼──────────────┘ │ │ │ shared/ │ │ │ 类型定义 / 常量 / 工具函数 │ └──────────────────────┬──────────────────────────────────────┘ │ HTTP REST (JSON) ▼ ┌──────────────────────────────────────────────────────────────┐ │ API 网关层 │ │ Nginx 反向代理 / 负载均衡 / 限流 │ └──────────────────────┬──────────────────────────────────────┘ │ ┌──────────────────────▼──────────────────────────────────────┐ │ 后端服务层(Go + Gin) │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 中间件 │ │ │ │ JWT 认证 │ CORS │ 错误处理 │ 统一响应 │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ 路由层 │ │ 处理器 │ │ 服务层 │ │ 模型层 │ │ 配置层 │ │ │ │ router │ │handler │ │service │ │ model │ │ config │ │ │ └────────┘ └───┬────┘ └───┬────┘ └───┬────┘ └────────┘ │ │ │ │ │ │ │ └──────────┼───────────┘ │ │ │ │ └────────────────────────────┼────────────────────────────────┘ │ ┌──────────────────┼──────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌──────────────────┐ │ MySQL 8.0 │ │ Redis 7 │ │ S3 对象存储 │ │ 主数据库 │ │ 缓存/会话 │ │ 图片/视频 │ │ GORM ORM │ │ 排行榜 │ │ 资源文件 │ └───────────────┘ └───────────────┘ └──────────────────┘
2.2 架构风格
- 前后端分离:前端三端(Web / App / 小程序)通过 RESTful API 与后端通信
- 后端单体应用:v1.0 采用单体架构,按业务划分为 service 层,便于未来拆分为微服务
- 共享代码层:shared/ 目录存放 TypeScript 类型定义、常量和工具函数,三端复用
2.3 关键技术决策
| 决策 | 选择 | 理由 |
|---|---|---|
| 后端语言 | Go 1.22 | 高性能、静态类型、编译部署简单、并发模型优秀 |
| Web 框架 | Gin | Go 生态最流行的 HTTP 框架,性能优异,中间件丰富 |
| ORM | GORM | 功能完善、自动迁移、与 Prisma 映射直观 |
| 数据库 | MySQL 8.0 | 成熟稳定、文档丰富、utf8mb4 完整支持中文 |
| 缓存 | Redis 7 | 连续天数缓存、排行榜、会话管理 |
| 认证 | JWT (golang-jwt/v5) | 无状态、多端共享、7 天有效期 |
| 密码哈希 | bcrypt (cost=12) | 安全强度高,Go 标准库支持 |
| 前端 Web | Next.js + App Router | SSR / SSG 支持、良好的 SEO、React 生态 |
| 移动端 | React Native | 跨平台、与 Web 共享业务逻辑 |
| 小程序 | 原生 / Taro | 微信生态,按需选择 |
3. 技术选型与版本
3.1 后端依赖
| 包名 | 用途 | 版本 |
|---|---|---|
| github.com/gin-gonic/gin | HTTP 框架 | v1.10+ |
| gorm.io/gorm | ORM | v1.25+ |
| gorm.io/driver/mysql | MySQL 驱动 | v1.5+ |
| github.com/golang-jwt/jwt/v5 | JWT 认证 | v5.2+ |
| github.com/joho/godotenv | .env 加载 | v1.5+ |
| golang.org/x/crypto | bcrypt 密码哈希 | v0.23+ |
| github.com/go-playground/validator/v10 | 请求校验 | v10.20+ |
| github.com/gin-contrib/cors | 跨域 | v1.7+ |
| github.com/stretchr/testify | 测试断言 | v1.9+ |
3.2 开发环境
| 工具 | 版本要求 |
|---|---|
| Go | 1.22+ |
| MySQL | 8.0+ |
| Redis | 7.x |
| Docker | 24.x + Docker Compose |
| Node.js | 18+(前端构建) |
4. 模块设计
4.1 模块总览
server/internal/ ├── config/ 配置加载 —— 从环境变量 + .env 读取 ├── database/ 数据库初始化 —— GORM 连接 + AutoMigrate ├── models/ 数据模型 —— Go struct,映射到 9 张表 ├── middleware/ 中间件 —— JWT 认证 / CORS / 错误处理 ├── services/ 核心业务服务 │ ├── user_service.go 用户模块 │ ├── checkin_service.go 打卡模块 │ ├── points_service.go 积分与成就模块 │ └── social_service.go 社交模块 ├── handlers/ HTTP 处理器 │ ├── user_handler.go │ ├── checkin_handler.go │ └── social_handler.go └── router/ 路由注册——统一管理所有 API 路由
4.2 用户模块(User)
职责:用户注册/登录、个人资料管理、账号注销
服务接口:
| 方法 | 说明 |
|---|---|
| RegisterByPhone(phone) | 手机号注册 |
| GetByPhone(phone) | 手机号查找用户 |
| GetByID(id) | 按 ID 获取用户 |
| UpdateProfile(id, updates) | 更新资料(昵称/头像/签名/隐私) |
| DeleteAccount(id) | 注销账号(清除敏感信息) |
隐私级别:1=公开、2=仅好友可见、3=仅自己可见
账号注销流程:
- 用户发起注销请求
- 服务端清除手机号、昵称、头像等敏感字段
- 保留用户 ID 和关联的打卡记录(用于统计)
- 返回注销成功
4.3 打卡模块(CheckIn)
核心数据流:
用户创建打卡项 → 每日打卡 → 生成打卡记录 → 计算连续天数 → 发放积分 → 检查成就
打卡项状态机:
创建 │ ▼ ┌────────┐ 暂停 ┌────────┐ 恢复 ┌────────┐ │ active │───────→│ paused │───────→│ active │ └───┬────┘ └────────┘ └────┬───┘ │ 归档 │ 归档 ▼ ▼ ┌──────────┐ 软删除 ┌──────────┐ │ archived │─────────────→│ deleted │ └──────────┘ └──────────┘
连续天数算法(时区感知):
- 获取指定打卡项的所有记录,按日期降序排列
- 检查最近一次打卡是否在 48 小时内
- 从最近一天开始向前遍历,相邻日期差为 24 小时则累加
- 遇到断签(日期差 > 24 小时)则停止
- 以 Asia/Shanghai 时区计算,非 UTC
补卡规则:
- 仅允许补签最近 7 天的缺失记录
- 每月前 3 次免费
- 超出部分消耗 5 积分/次
- 补卡记录标记为 makeup 状态
4.4 积分与成就模块(Points)
积分系统:
| 事件 | 积分值 | 限制 |
|---|---|---|
| 每日打卡 | +1 | 每日每项 1 次 |
| 连续 7 天 | +5 | 达到时一次性 |
| 连续 30 天 | +20 | 达到时一次性 |
| 目标完成 | +10 | — |
| 分享动态 | +2 | 每日上限 3 次 |
| 评论 | +1 | 每日上限 5 次 |
| 邀请注册 | +15 | 每月上限 5 人 |
成就系统:
- 10 个预定义成就徽章,3 种稀有度(铜/银/金)
- 成就初始化在服务启动时通过 InitAchievements() 执行
- 用户达成条件后调用 UnlockAchievement() 解锁
- 解锁后发送系统通知
4.5 社交模块(Social)
好友关系模型:双向确认机制
请求方 → 发送请求 → 待对方接受 → 建立双向好友 → 可选拒绝
动态广场:
- 动态发布时 privacy=1(公开)才会出现在广场
- 默认按时间倒序排列
- Likes 和 Comments 字段用计数器实现(减少 JOIN)
小组模型:
- 创建者自动成为管理员
- 支持公开加入和私密审核(v1.0 简化处理)
- 小组有成员人数上限(默认 50 人)
5. 安全设计
5.1 认证机制
| 机制 | 实现 |
|---|---|
| 令牌 | JWT (HS256),7 天有效期 |
| 密码存储 | bcrypt,cost=12 |
| 令牌传递 | HTTP Header: Authorization: Bearer |
| 公开路由 | 仅 /api/auth/* 和 /health 免认证 |
5.2 数据安全
| 安全措施 | 说明 |
|---|---|
| 隐私数据保护 | 服务层根据 privacy 字段过滤查询 |
| 环境变量 | 敏感信息(数据库、JWT 密钥)通过环境变量注入 |
| .env 禁止提交 | .env* 在 .gitignore 中,仅提交 .env.example |
| 账号注销 | 清除手机号等个人敏感信息 |
5.3 API 安全
| 措施 | 说明 |
|---|---|
| 统一认证中间件 | 所有非公开路由默认需认证 |
| 请求校验 | 使用 ShouldBindJSON + validator 标签 |
| 统一响应格式 | ApiResponse{Code, Message, Data} |
| CORS | 允许跨域请求,生产环境限制来源 |
6. 性能设计
6.1 性能目标
| 指标 | 目标 |
|---|---|
| API 响应时间(P95) | ≤ 200ms |
| 打卡操作端到端 | ≤ 500ms |
| 日历视图加载 | ≤ 800ms |
| 首页加载 | ≤ 1s |
| 并发支持 | 1000 QPS |
6.2 缓存策略
| 数据 | 缓存位置 | 策略 |
|---|---|---|
| 连续天数 | Redis | 打卡时更新,失效时从 DB 重建 |
| 排行榜 | Redis Sorted Set | 定时计算后写入 |
| JWT 黑名单 | Redis | TTL 与 Token 有效期一致 |
6.3 数据库优化
| 策略 | 说明 |
|---|---|
| 索引 | user_id、item_id、check_date 建索引 |
| 分页 | 动态广场使用 Offset + Limit |
| 连接池 | GORM 默认连接池,生产环境调整最大连接数 |
| 查询优化 | 避免 N+1,使用 Preload 预加载关联 |
7. 错误处理规范
7.1 统一响应格式
json { "code": 0, "message": "ok", "data": { ... } }
7.2 错误码规范
| HTTP 状态 | code | 说明 |
|---|---|---|
| 200 | 0 | 成功 |
| 400 | 400 | 请求参数错误 |
| 401 | 401 | 未认证或令牌无效 |
| 404 | 404 | 资源不存在 |
| 409 | 409 | 资源冲突(如手机号已注册) |
| 500 | 500 | 服务器内部错误 |
7.3 错误处理流程
请求 → 中间件检查认证 → 处理器校验参数 → 服务层执行业务逻辑 ↓ ┌────────┐ │ 成功? │ └───┬────┘ │ ┌───────────────────┼───────────────────┐ ▼ ▼ ▼ Success(c, data) Error(c, status, msg) c.Error(err)
8. 日志与监控
8.1 日志规范
| 级别 | 使用场景 |
|---|---|
| INFO | 请求开始/结束、用户注册、打卡成功 |
| WARN | 参数校验失败、补卡近上限、查询慢 |
| ERROR | 数据库异常、JWT 解析失败、panic |
8.2 Health Check
- 路由:GET /health
- 返回:{"status": "ok"}
- 可用于 Kubernetes Liveness/Readiness Probe
8.3 监控指标(规划中)
| 指标 | 说明 |
|---|---|
| QPS | 每秒请求数 |
| P50/P95/P99 | 响应时间分布 |
| 错误率 | 5xx 占比 |
| 数据库连接数 | 活跃连接数 |
| Redis 命中率 | 缓存命中率 |
附录 A:项目结构总览
F:\myProject\InchStep\ ├── docs/ # 设计文档 │ ├── 寸进_InchStep_详细需求说明书.md │ ├── 系统设计说明书.md # 本文件 │ ├── API设计文档.md │ └── 数据库设计文档.md ├── server/ # 后端 API(Go + Gin + GORM) │ ├── cmd/api/main.go # 入口 │ ├── internal/ │ │ ├── config/ # 配置加载 │ │ ├── database/ # 数据库初始化 │ │ ├── models/ # 数据模型(9 张表) │ │ ├── middleware/ # JWT / CORS / 错误处理 │ │ ├── services/ # 4 个核心服务 │ │ ├── handlers/ # HTTP 处理器 │ │ └── router/ # 路由注册 │ ├── go.mod / go.sum │ ├── Dockerfile │ └── .env.example ├── shared/ # 三端共享代码 ├── web/ # Web 端(Next.js) ├── mobile/ # 移动端 App(React Native) ├── miniapp/ # 微信小程序 ├── admin/ # 管理后台(React) ├── docker/docker-compose.yml # Docker 编排 └── scripts/ # 项目工具脚本
附录 B:版本规划
| 版本 | 后端重点 | 前端重点 |
|---|---|---|
| v1.0 MVP | 用户 + 打卡 + 基础统计 API | 三端同步上线,打卡核心流程 |
| v1.1 | 社交 API(好友/动态/排行榜) | 动态广场、排行榜 UI |
| v1.2 | 小组 API、对战 API | 小组详情、对战界面 |
| v1.3 | 成就系统、月度报告 | 成就墙、报告页面 |