Files
inchstep/docs/前端架构文档.md
2026-06-25 08:39:47 +08:00

17 KiB
Raw Permalink Blame History

寸进(InchStep)前端架构文档

文档版本:v1.0
Web 端:Next.js + TypeScript + App Router
移动端 AppReact Native
微信小程序:原生 / Taro
管理后台:React + TypeScript
更新日期:2026-06-24


目录

  1. 文档概述
  2. 三端架构总览
  3. Web 端架构(Next.js
  4. 移动端 App 架构(React Native
  5. 微信小程序架构
  6. 管理后台架构
  7. 共享层设计
  8. 页面路由设计
  9. 状态管理规范

1. 文档概述

本文档定义寸进平台前端三端(Web / App / 小程序)和管理后台的架构设计、页面路由、组件规范和状态管理策略。三端功能对齐、同步上线,通过 shared/ 层共享类型定义与常量。


2. 三端架构总览

┌──────────────────────────────────────────────────────────────────┐ │ shared/ 层 │ │ ┌──────────────────┐ ┌──────────────────┐ ┌───────────────┐ │ │ │ types/ │ │ constants/ │ │ utils/ │ │ │ │ TypeScript 类型 │ │ 分类/积分/成就 │ │ 日期格式化 │ │ │ │ 接口定义 │ │ 分页/隐私级别 │ │ 校验函数 │ │ │ └──────────────────┘ └──────────────────┘ └───────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ ▼ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ ┌─────────────────────┐ │ Web 端 │ │ 移动端 App │ │ 微信小程序 │ │ Next.js │ │ React Native │ │ 原生 / Taro │ │ │ │ │ │ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌──────────────┐ │ │ │ App Router │ │ │ │ 导航 │ │ │ │ 页面路由 │ │ │ │ 页面路由 │ │ │ │ TabBar │ │ │ │ TabBar │ │ │ └────────────┘ │ │ └────────────┘ │ │ └──────────────┘ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌──────────────┐ │ │ │ 组件 │ │ │ │ 组件 │ │ │ │ 自定义组件 │ │ │ │ CheckInCard │ │ │ │ CheckInCard│ │ │ │ 打卡卡片 │ │ │ │ 图表/排行 │ │ │ │ 图表/排行 │ │ │ │ 排行榜 │ │ │ └────────────┘ │ │ └────────────┘ │ │ └──────────────┘ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌──────────────┐ │ │ │ 服务层 │ │ │ │ 服务层 │ │ │ │ API Client │ │ │ │ API Client │ │ │ │ API Client │ │ │ │ 请求封装 │ │ │ └────────────┘ │ │ └────────────┘ │ │ └──────────────┘ │ └──────────────────┘ └──────────────────┘ └─────────────────────┘ │ │ │ └────────────────────────┼────────────────────────┘ │ HTTP REST ▼ ┌──────────────────┐ │ 后端 API 服务 │ │ Go + Gin │ └──────────────────┘


3. Web 端架构(Next.js

3.1 目录结构

web/ ├── src/ │ ├── app/ # Next.js App Router 页面 │ │ ├── layout.tsx # 根布局 │ │ ├── page.tsx # 首页(待打卡列表) │ │ ├── login/ # 登录页 │ │ ├── checkin/ │ │ │ ├── [id]/ # 打卡项详情 │ │ │ ├── create/ # 创建打卡项 │ │ │ └── calendar/ # 日历视图 │ │ ├── social/ │ │ │ ├── feed/ # 动态广场 │ │ │ ├── friends/ # 好友列表 │ │ │ └── groups/[id]/ # 小组详情 │ │ ├── profile/ # 个人主页 │ │ ├── leaderboard/ # 排行榜 │ │ └── achievements/ # 成就墙 │ ├── components/ # 共享 UI 组件 │ │ ├── CheckInCard.tsx # 打卡卡片 │ │ ├── CalendarView.tsx # 日历视图 │ │ ├── StreakBadge.tsx # 连续天数徽标 │ │ ├── PointDisplay.tsx # 积分展示 │ │ ├── FeedCard.tsx # 动态卡片 │ │ ├── LeaderBoard.tsx # 排行榜 │ │ ├── CategoryIcon.tsx # 分类图标 │ │ └── Layout/ │ │ ├── NavBar.tsx # 导航栏 │ │ └── TabBar.tsx # 底部 Tab │ ├── services/ # API 客户端 │ │ ├── api.ts # 通用请求封装(fetch/Axios │ │ ├── auth.ts # 认证相关 │ │ ├── checkin.ts # 打卡相关 │ │ └── social.ts # 社交相关 │ └── utils/ # 工具函数 │ ├── date.ts # 日期格式化(moment/dayjs │ └── storage.ts # localStorage 封装 ├── __tests__/ └── package.json

3.2 路由设计

路径 页面 说明
/ 首页 今日待打卡列表 + 快捷打卡
/login 登录页 手机号登录/注册
/checkin/[id] 打卡项详情 日历视图 + 统计
/checkin/create 创建打卡项 表单
/social/feed 动态广场 Feed 流
/social/friends 好友列表
/social/groups/[id] 小组详情 成员看板
/profile 个人主页 成长档案
/leaderboard 排行榜 周榜/月榜
/achievements 成就墙 徽章网格

3.3 渲染策略

页面 策略 说明
登录页 CSR 客户端渲染
首页 CSR + SWR 客户端渲染,SWR 缓存
打卡详情 CSR 需认证
动态广场 CSR + ISR SSR 首屏,ISR 增量更新
个人主页 CSR 需认证

4. 移动端 App 架构(React Native

4.1 目录结构

mobile/ ├── src/ │ ├── modules/ # 功能模块 │ │ ├── auth/ # 登录/注册 │ │ ├── checkin/ # 打卡模块 │ │ │ ├── screens/ # 页面 │ │ │ ├── components/ # 模块专属组件 │ │ │ └── hooks/ # 自定义 Hooks │ │ ├── social/ # 社交模块 │ │ ├── profile/ # 个人中心 │ │ ├── leaderboard/ # 排行榜 │ │ └── achievements/ # 成就墙 │ ├── components/ # 全局共享组件 │ │ ├── CheckInCard.tsx │ │ ├── CalendarView.tsx │ │ └── ... │ ├── navigation/ # 导航配置 │ │ ├── RootNavigator.tsx # 根导航 │ │ ├── TabNavigator.tsx # 底部 Tab │ │ └── types.ts # 导航类型 │ ├── services/ # API 客户端 │ │ ├── api.ts # Axios 封装 │ │ └── ... │ └── utils/ # 工具函数 ├── android/ ├── ios/ ├── __tests__/ └── package.json

4.2 导航结构

RootNavigator (Stack) ├── LoginScreen (未登录时展示) └── MainTab (已登录) ├── Tab: 首页 → HomeStack │ ├── HomeScreen (待打卡列表) │ ├── CheckInDetailScreen │ └── CheckInCreateScreen ├── Tab: 社交 → SocialStack │ ├── FeedScreen (动态广场) │ ├── FriendListScreen │ └── GroupDetailScreen ├── Tab: 排行榜 → LeaderboardScreen ├── Tab: 成就 → AchievementScreen └── Tab: 我的 → ProfileStack ├── ProfileScreen ├── SettingsScreen └── AchievementWallScreen

4.3 平台特性

特性 实现方式
推送通知 Firebase Cloud Messaging (FCM) / APNs
本地通知 react-native-push-notification
图片选择 react-native-image-picker
存储 AsyncStorage
状态管理 React Context / Zustand
日期处理 dayjs(与 Web 一致)

5. 微信小程序架构

5.1 目录结构

miniapp/ ├── pages/ │ ├── index/ # 首页(待打卡列表) │ ├── checkin/ │ │ ├── detail/ # 打卡项详情 │ │ └── create/ # 创建打卡项 │ ├── social/ │ │ ├── feed/ # 动态广场 │ │ └── friends/ # 好友列表 │ ├── profile/ # 个人主页 │ └── leaderboard/ # 排行榜 ├── components/ # 自定义组件 │ ├── checkin-card/ # 打卡卡片组件 │ ├── calendar-view/ # 日历组件 │ └── nav-bar/ # 导航栏 ├── services/ # API 客户端 │ └── api.js # wx.request 封装 ├── utils/ # 工具函数 ├── app.json # 小程序全局配置 ├── app.js # 小程序入口 └── project.config.json # 项目配置

5.2 TabBar 配置

json { "tabBar": { "list": [ { "pagePath": "pages/index/index", "text": "打卡", "iconPath": "..." }, { "pagePath": "pages/social/feed/index", "text": "广场", "iconPath": "..." }, { "pagePath": "pages/profile/index", "text": "我的", "iconPath": "..." } ] } }

5.3 小程序限制与适配

限制 应对方案
包体积 ≤ 2MB 使用分包加载:pages 按模块分包
无原生导航动画 使用 wx.navigateTo 标准动画
登录态管理 wx.login + 后端自定义登录态
图片上传 wx.uploadFile + CDN 直传

6. 管理后台架构

6.1 目录结构

admin/ ├── src/ │ ├── pages/ # 页面 │ │ ├── Dashboard.tsx # 数据概览 │ │ ├── Users.tsx # 用户管理 │ │ ├── Posts.tsx # 动态审核 │ │ ├── Reports.tsx # 数据统计 │ │ └── Settings.tsx # 系统设置 │ ├── components/ # 通用组件 │ │ ├── Table.tsx │ │ ├── SearchBar.tsx │ │ └── StatCard.tsx │ ├── services/ # API 客户端 │ └── utils/ ├── __tests__/ └── package.json

6.2 功能页面

页面 功能
数据概览 DAU、打卡量、注册量趋势
用户管理 用户列表、搜索、禁用
动态审核 内容审核、违规处理
数据统计 模块分布、活跃度分析
系统设置 推送配置、公告管理

7. 共享层设计

7.1 类型定义(shared/types/index.ts

` ypescript // 用户 interface IUser { id, phone?, nickname?, avatar?, bio?, motto?, privacy, points, createdAt }

// 打卡 interface ICheckInItem { id, userId, name, icon?, category, dailyGoal?, cycleType, privacy, status, createdAt } interface ICheckInRecord { id, itemId, userId, checkDate, status, note?, images? } type CheckInCategory = 'study' | 'health' | 'habit' | 'hobby' | 'goal' type CycleType = 'daily' | 'weekly' | 'every_other_day' | 'custom' type ItemStatus = 'active' | 'paused' | 'archived' | 'deleted' type RecordStatus = 'normal' | 'makeup' type PrivacyLevel = 1 | 2 | 3

// 社交 interface IGroup { id, name, cover?, intro?, type, maxMember } interface ApiResponse { code: number, message: string, data?: T } `

7.2 常量定义(shared/constants/index.ts

` ypescript // 打卡分类 CHECKIN_CATEGORIES = { study: '学习成长', health: '健康生活', habit: '习惯自律', hobby: '兴趣爱好', goal: '目标任务' }

// 积分规则 POINTS = { CHECKIN: 1, STREAK_7: 5, STREAK_30: 20, GOAL_COMPLETE: 10, POST_SHARE: 2, COMMENT: 1, INVITE_USER: 15 }

// 成就列表 ACHIEVEMENTS = [{ id: 'first_checkin', name: '初露锋芒', rarity: 'bronze' }, ...]

// 分页 PAGE_SIZE = 20

// 隐私标签 PRIVACY_LABEL = { 1: '公开', 2: '仅好友可见', 3: '仅自己可见' } `

7.3 共享方式

共享方式
Web 端 TypeScript 路径别名:@shared/types
移动端 App 通过 npm link 或 monorepopnpm workspace)引用
微信小程序 手动复制类型文件(纯类型定义无运行时依赖)
管理后台 与 Web 端同仓库,直接引用

8. 页面路由设计

8.1 全局导航结构

` 未登录 ├── 登录页(手机号登录/注册) └── 关于页

已登录(底部 TabBar) ├── 首页 Tab │ ├── 待打卡列表(今日项 + 快捷打卡) │ ├── 打卡项详情(日历 + 统计 + 编辑) │ ├── 创建打卡项(表单) │ └── 日历视图(按月切换 + 筛选) │ ├── 社交 Tab │ ├── 动态广场(Feed 流) │ ├── 好友列表(搜索 + 添加) │ └── 小组详情(看板 + 成员) │ ├── 排行榜 Tab │ ├── 好友榜 │ ├── 全平台榜 │ └── 小组榜 │ ├── 成就 Tab │ ├── 成就墙(网格展示) │ └── 成就详情 │ └── 我的 Tab ├── 个人主页(成长档案) ├── 设置(隐私/通知/账号) └── 关于 `

8.2 页面数据依赖

页面 需要的数据 API 调用
首页 今日打卡项列表、连续天数 GET /checkin/items, GET /checkin/streak/:id
打卡详情 打卡项信息、月度记录 GET /checkin/items/:id, GET /checkin/records
动态广场 公开动态列表 GET /social/feed
个人主页 用户信息、统计数据 GET /users/profile, GET /checkin/stats/monthly
排行榜 排名数据 GET /leaderboard/*(规划中)
成就墙 所有成就、用户成就 GET /achievements, GET /achievements/mine

9. 状态管理规范

9.1 推荐方案

状态管理 说明
Web 端 React Context + SWR SWR 管理服务端状态,Context 管理 UI 状态
移动端 App Zustand 轻量级、无 boilerplate
微信小程序 全局 Data 小程序原生状态管理
管理后台 React Context 简单全局状态

9.2 认证状态

` ypescript // 三端统一的认证状态 interface AuthState { token: string | null user: IUser | null isAuthenticated: boolean }

// 登录流程

  1. 检查 localStorage / AsyncStorage 中是否有 Token
  2. 有 Token → 设置到请求头 → 获取用户信息
  3. 无 Token → 跳转登录页
  4. 登录成功 → 保存 Token → 更新状态
  5. Token 过期 → 清除 Token → 跳转登录页 `

附录:三端差异对照

功能 Web 端 移动端 App 微信小程序
导航 Next.js Router React Navigation wx.navigateTo
HTTP 请求 fetch / Axios Axios wx.request
本地存储 localStorage AsyncStorage wx.setStorageSync
推送 Browser Notification FCM / APNs 订阅消息
支付 支付宝/微信支付 内购 微信支付
图片 next/image react-native-image-picker wx.chooseImage