Files
danyang-match/前端信息架构、路由与状态管理设计.md
T

2726 lines
32 KiB
Markdown
Raw Normal View History

2026-09-09 22:05:00 +08:00
# 丹阳公益婚恋服务平台
# V1.0 前端信息架构、路由与状态管理设计
版本:V1.0
适用范围:微信小程序用户端、公益红娘工作台、运营管理后台
目标:统一页面组织、路由规则、登录态、审核态、婚恋状态、缓存策略、消息未读、表单草稿与异常跳转逻辑
---
# 第一章 设计目标
本文件主要解决四类问题:
1. 用户从哪里进入、下一步去哪
2. 不同账号状态下可以访问哪些页面
3. 页面之间如何统一跳转
4. 前端状态、缓存、表单草稿和消息如何管理
V1.0必须避免:
- 页面之间互相乱跳
- 登录态丢失
- 审核中还能进入匹配页
- 已封禁用户仍能聊天
- 已成功牵手仍被持续推荐
- 用户填一半资料退出后全部丢失
- 消息未读数量不一致
- 页面各自维护一套用户状态
- 后台刷新页面后上下文丢失
核心原则:
> **路由由状态决定,页面不能自己猜状态。**
---
# 第二章 前端整体信息架构
前端分为三个独立应用域。
```text
丹阳公益婚恋服务平台
│
├── 微信小程序用户端
│
├── 公益红娘工作台
│
└── 运营管理后台
```
三个端共享:
- 用户基础数据定义
- 状态枚举
- 权限模型
- API规范
- Design Token
- 部分通用业务规则
但路由和状态容器独立。
---
# 第三章 用户端信息架构
用户端一级结构保持:
```text
首页
找对象
消息
活动
我的
```
底部Tab只对以下用户开放:
> 已登录 + 已实名 + 已完成资料 + 已审核通过 + 账号正常
其他状态用户不进入完整Tab体系。
---
# 第四章 用户端路由分层
建议将页面分成六类。
## 4.1 启动与身份类
```text
启动
登录
绑定手机号
实名认证说明
实名认证
```
---
## 4.2 新手资料类
```text
基础资料
生活资料
照片上传
婚恋态度
择偶条件
资料确认
```
---
## 4.3 审核状态类
```text
审核中
审核退回
账号受限
```
---
## 4.4 主业务类
```text
首页
找对象
用户详情
我的缘分
消息
聊天
活动
公益红娘
我的
```
---
## 4.5 设置与辅助类
```text
我的资料
我的择偶条件
婚恋状态
隐私设置
黑名单
系统通知
帮助中心
意见反馈
```
---
## 4.6 业务详情类
```text
活动详情
活动报名
活动签到
红娘服务详情
红娘推荐
举报
解除匹配
```
---
# 第五章 用户端路由命名建议
微信小程序目录建议:
```text
pages/
launch/
login/
phone/
verification-intro/
verification/
onboarding/
basic-profile/
lifestyle/
photos/
relationship-intent/
partner-preference/
review-submit/
review/
pending/
rejected/
home/
discover/
profile-detail/
match/
messages/
chat/
activities/
matchmaker/
mine/
settings/
profile/
partner-preference/
relationship-status/
privacy/
blacklist/
notifications/
help/
feedback/
safety/
report/
restricted/
activity/
detail/
apply/
checkin/
matchmaker/
apply/
progress/
recommendation/
```
---
# 第六章 用户端核心状态模型
前端必须维护一份统一用户状态。
建议:
```text
UserState
```
至少包含:
```text
isLoggedIn
hasPhone
isRealNameVerified
profileCompletionStatus
profileReviewStatus
accountStatus
relationshipStatus
recommendationEnabled
searchVisibility
matchmakerEnabled
activityRecommendationEnabled
```
---
# 第七章 profileCompletionStatus
建议枚举:
```text
not_started
in_progress
completed
```
含义:
## not_started
未开始填写资料。
## in_progress
已开始但未完成。
## completed
资料已经完成,可以提交审核。
---
# 第八章 profileReviewStatus
统一枚举:
```text
not_submitted
pending
approved
need_edit
rejected
```
含义:
```text
not_submitted = 尚未提交
pending = 审核中
approved = 已通过
need_edit = 需修改
rejected = 拒绝
```
---
# 第九章 accountStatus
建议:
```text
normal
reviewing_risk
limited
suspended
banned
closed
```
含义:
- normal:正常
- reviewing_risk:风险审核中
- limited:部分功能限制
- suspended:暂停
- banned:封禁
- closed:账户关闭/注销
---
# 第十章 relationshipStatus
婚恋状态统一定义:
```text
searching
getting_to_know
paused
matched_successfully
service_exited
```
分别对应:
```text
正在寻找
正在了解
暂停寻找
成功牵手
退出婚恋服务
```
---
# 第十一章 启动路由守卫
用户每次打开小程序,都先经过统一启动判断。
流程:
```text
启动
↓
检查本地Token
↓
Token存在?
├─ 否 → 登录页
└─ 是
↓
拉取当前用户状态
↓
根据状态决定首页
```
---
# 第十二章 全局路由判断顺序
建议严格按照以下优先级。
```text
1. 是否登录
2. 是否绑定手机号
3. 是否实名认证
4. 是否完成资料
5. 是否提交审核
6. 审核结果
7. 账号风险状态
8. 婚恋服务状态
9. 正常进入业务页
```
不要颠倒。
---
# 第十三章 启动页状态跳转表
| 状态 | 默认进入 |
|---|---|
| 未登录 | 登录页 |
| 已登录未绑定手机号 | 手机号绑定 |
| 已绑定未实名 | 实名认证说明 |
| 已实名资料未完成 | 上次未完成步骤 |
| 资料完成未提交 | 资料确认 |
| 审核中 | 审核中 |
| 需修改 | 审核退回 |
| 审核拒绝 | 审核退回/账号说明 |
| 风险审核中 | 账号受限 |
| 账号封禁 | 账号受限 |
| 审核通过正常用户 | 首页 |
---
# 第十四章 新手资料流程路由
资料填写步骤建议固定:
```text
step1 基础资料
↓
step2 生活资料
↓
step3 照片
↓
step4 婚恋态度
↓
step5 择偶条件
↓
资料确认
```
系统记录:
```text
onboardingCurrentStep
```
---
# 第十五章 新手流程断点续填
用户在任一步骤退出:
前端必须保存:
```text
当前步骤
已填写字段
本地草稿时间
服务端草稿状态
```
重新进入:
> 自动回到上次未完成步骤。
不要求用户重新开始。
---
# 第十六章 草稿保存策略
建议采用:
> 本地即时保存 + 服务端阶段性保存
---
## 16.1 本地保存
每次字段修改:
可采用轻量防抖后保存。
用于:
- 断网
- 临时退出
- 页面切换
---
## 16.2 服务端保存
用户点击:
> 下一步
时保存当前步骤。
这样即使换设备也可以继续。
---
# 第十七章 草稿冲突处理
如果:
```text
本地草稿更新时间 > 服务端草稿更新时间
```
优先本地。
如果:
```text
服务端更新时间 > 本地
```
优先服务端。
如差异较大:
可提示:
> 检测到较新的资料版本,已为你恢复。
V1不需要做复杂版本合并。
---
# 第十八章 Tab路由规则
底部五个Tab:
```text
/home
/discover
/messages
/activities
/mine
```
只能使用:
> switchTab
不能通过普通push形成多层Tab堆栈。
---
# 第十九章 Tab访问守卫
只有以下条件同时成立:
```text
isLoggedIn = true
isRealNameVerified = true
profileReviewStatus = approved
accountStatus = normal
```
才允许进入主Tab。
否则统一重定向。
---
# 第二十章 首页状态
首页主要依赖:
```text
recommendationList
recommendationCursor
todayViewedCount
dailyRecommendationLimit
relationshipStatus
recommendationEnabled
```
---
# 第二十一章 首页推荐状态机
建议:
```text
idle
loading
loaded
empty
finished
error
```
---
## idle
尚未请求。
## loading
正在加载。
## loaded
有候选人。
## empty
暂时无候选人。
## finished
今日推荐已浏览完。
## error
请求失败。
---
# 第二十二章 推荐卡片操作状态
单个推荐用户关系状态:
```text
neutral
liked
passed
mutual_match
blocked
```
页面只根据关系状态展示按钮。
---
# 第二十三章 喜欢操作逻辑
点击喜欢:
```text
检查登录
↓
检查审核状态
↓
检查自身婚恋状态
↓
检查对方状态
↓
调用喜欢接口
↓
返回关系状态
```
如果:
```text
mutual_match = false
```
Toast:
> 已表达喜欢。
如果:
```text
mutual_match = true
```
进入双向匹配成功页。
---
# 第二十四章 喜欢防重复
前端状态:
```text
likeSubmitting = true
```
提交过程中按钮不可重复点击。
后端仍需幂等。
---
# 第二十五章 不合适状态
点击:
> 不合适
状态立即:
```text
passed
```
然后切下一人。
失败时:
恢复原卡片状态并提示:
> 操作失败,请重试。
---
# 第二十六章 找对象状态
需要保存:
```text
discoverFilters
discoverSort
discoverPage
discoverScrollPosition
```
用户进入某个详情后返回:
> 尽可能恢复原列表位置。
避免重新回到顶部。
---
# 第二十七章 筛选条件状态
分两层:
```text
savedPreference
temporaryFilter
```
---
## savedPreference
用户“我的择偶条件”。
用于:
> 系统匹配。
---
## temporaryFilter
用户“找对象”当前临时筛选。
只影响当前浏览。
不能自动覆盖择偶条件。
---
# 第二十八章 筛选条件退出处理
用户修改临时筛选但未点击:
> 查看结果
直接返回:
> 不保存本次修改。
用户点击:
> 查看结果
才写入当前页面状态。
---
# 第二十九章 用户详情状态
页面需要:
```text
profileData
relationStatus
isBlocked
isReported
canChat
```
底部操作根据 relationStatus 自动改变。
---
# 第三十章 用户详情访问异常
如果对方:
- 被封禁
- 删除账号
- 暂停对外展示
- 已拉黑当前用户
显示:
> 该用户当前不可查看。
不要显示旧资料。
---
# 第三十一章 我的缘分状态
三个列表独立缓存:
```text
mutualList
likedByMeList
likedMeList
```
分别维护:
```text
loading
hasMore
cursor
```
---
# 第三十二章 消息模块状态
建议全局维护:
```text
chatUnreadCount
systemUnreadCount
totalUnreadCount
```
Bottom Tab的消息Badge取:
```text
totalUnreadCount
```
---
# 第三十三章 未读数单一来源
不能:
> 聊天页自己算一个
> Tab自己算一个
> 系统通知自己算一个
统一由全局消息状态维护。
---
# 第三十四章 消息未读同步
以下场景刷新:
- App启动
- 消息页进入
- 聊天消息收到
- 用户阅读聊天
- 系统通知已读
- 小程序重新回到前台
---
# 第三十五章 聊天会话状态
每个会话至少:
```text
conversationId
targetUserId
relationStatus
lastMessage
lastMessageAt
unreadCount
canSendMessage
```
---
# 第三十六章 canSendMessage逻辑
只有:
```text
relationStatus = mutual_match
AND
双方账号正常
AND
双方未拉黑
AND
匹配未解除
```
才能发送。
---
# 第三十七章 聊天输入草稿
每个conversation保存:
```text
chatDraft[conversationId]
```
用户切换页面后再回来:
> 恢复未发送文字。
---
# 第三十八章 聊天历史缓存
V1建议:
> 当前会话最近一部分消息内存缓存。
长期历史:
> 从服务端分页加载。
不要长期把大量聊天记录放本地Storage。
---
# 第三十九章 解除匹配后的状态更新
成功解除:
```text
relationStatus = unmatched
canSendMessage = false
```
同时:
- 聊天输入框禁用
- 聊天列表可转历史或隐藏
- 用户详情按钮恢复为不可聊天状态
---
# 第四十章 拉黑后的全局影响
拉黑成功后立即更新:
```text
blockedUsers
```
并从以下列表移除:
- 首页推荐
- 找对象
- 喜欢列表
- 聊天列表可见关系
- 红娘普通候选
不要等下次刷新。
---
# 第四十一章 举报状态
举报后不强制拉黑。
前端保存:
```text
reportedUserIds
```
主要用于:
> 防止重复误报提示。
但允许用户再次提交新的举报事项时由后端判断。
---
# 第四十二章 活动模块状态
全局/页面状态:
```text
activityList
myActivities
activityFilters
currentActivity
```
---
# 第四十三章 活动详情状态
包含:
```text
activityStatus
registrationStatus
checkinStatus
```
---
# 第四十四章 activityStatus
```text
draft
registration_open
registration_closed
ongoing
ended
cancelled
```
用户端只会看到已发布活动。
---
# 第四十五章 registrationStatus
```text
not_applied
pending
approved
rejected
cancelled
```
按钮根据状态自动变化。
---
# 第四十六章 活动报名按钮状态
| 状态 | 按钮 |
|---|---|
| 未报名 | 立即报名 |
| 审核中 | 报名审核中 |
| 已通过 | 报名成功 |
| 已拒绝 | 查看原因 |
| 已满 | 报名已满 |
| 已截止 | 报名已结束 |
---
# 第四十七章 活动签到状态
```text
not_checked_in
checked_in
```
只有:
```text
registrationStatus = approved
```
才显示签到码。
---
# 第四十八章 公益红娘状态
建议:
```text
matchmakerServiceList
currentService
matchmakerRecommendations
```
---
# 第四十九章 红娘服务状态枚举
```text
submitted
assigned
in_service
waiting_user
completed
cancelled
```
---
# 第五十章 红娘推荐状态
每条推荐:
```text
pending_view
viewed
liked
passed
mutual_match
expired
```
---
# 第五十一章 我的模块状态
建议用户主状态集中在:
```text
UserStore
```
包括:
```text
profile
verification
review
relationship
privacy
account
```
不让“我的”页面自行维护一份独立用户数据。
---
# 第五十二章 用户资料缓存
建议:
```text
currentUserProfile
```
缓存时间可较短。
以下操作成功后立即更新:
- 修改资料
- 修改择偶条件
- 修改婚恋状态
- 修改隐私
- 资料审核结果改变
---
# 第五十三章 婚恋状态全局影响
relationshipStatus变化必须立即影响:
```text
首页
推荐池
找对象曝光
系统推荐
消息提示
我的状态
红娘候选
```
---
# 第五十四章 searching状态
允许:
- 推荐
- 找对象
- 被别人看到
- 喜欢
- 红娘推荐
---
# 第五十五章 getting_to_know状态
根据:
```text
recommendationEnabled
```
决定是否继续推荐。
---
# 第五十六章 paused状态
默认:
```text
recommendationEnabled = false
searchVisibility = false
```
不能继续被系统推荐。
---
# 第五十七章 matched_successfully状态
默认:
```text
recommendationEnabled = false
searchVisibility = false
```
但:
> 已有聊天可保留。
---
# 第五十八章 service_exited状态
关闭婚恋核心入口。
用户仍可以:
- 查看账号
- 查看历史活动
- 修改隐私
- 帮助反馈
不能:
- 找对象
- 喜欢
- 被推荐
---
# 第五十九章 隐私状态
建议独立:
```text
PrivacySettings
```
包含:
```text
visibleInRecommendations
visibleInSearch
showOccupation
showLifestylePhotos
receiveActivityRecommendations
acceptMatchmakerRecommendations
```
---
# 第六十章 隐私修改策略
用户切换Switch:
V1建议:
> 立即保存。
失败:
恢复原状态。
不要让用户改很多项后还需要找到页面底部“保存”。
---
# 第六十一章 全局Store建议
小程序建议至少拆:
```text
AuthStore
UserStore
MatchStore
MessageStore
ActivityStore
MatchmakerStore
AppStore
```
---
# 第六十二章 AuthStore
负责:
```text
token
loginStatus
phoneBinding
sessionExpired
```
---
# 第六十三章 UserStore
负责:
```text
profile
verificationStatus
reviewStatus
accountStatus
relationshipStatus
privacySettings
profileCompletion
```
---
# 第六十四章 MatchStore
负责:
```text
todayRecommendations
discoverFilters
mutualMatches
likedByMe
likedMe
blockedUsers
```
---
# 第六十五章 MessageStore
负责:
```text
conversations
chatUnreadCount
systemUnreadCount
totalUnreadCount
```
---
# 第六十六章 ActivityStore
负责:
```text
activityList
myActivities
currentActivity
registrationStatus
```
---
# 第六十七章 MatchmakerStore
负责:
```text
services
currentService
recommendations
```
---
# 第六十八章 AppStore
负责:
```text
appConfig
networkStatus
appVersion
maintenanceStatus
featureFlags
```
---
# 第六十九章 状态管理原则
## 页面临时状态
放页面内部。
例如:
```text
当前弹窗是否打开
输入框当前值
当前Tab
```
---
## 跨页面业务状态
放Store。
例如:
```text
用户审核状态
未读消息
婚恋状态
```
---
## 服务端真实业务状态
最终以服务器为准。
Store只是前端缓存。
---
# 第七十章 本地Storage使用边界
适合保存:
```text
token
轻量用户状态
新手流程草稿
临时筛选
聊天输入草稿
已关闭的新手提示
```
不适合长期保存:
- 身份证完整信息
- 完整聊天历史
- 敏感审核资料
- 举报证据
- 后台敏感权限数据
---
# 第七十一章 Token存储
根据微信小程序实际认证方案执行。
原则:
- 不在页面参数传Token
- 不写入日志
- 不暴露在错误信息
- 过期统一处理
---
# 第七十二章 Session过期处理
接口返回统一未授权状态:
前端:
```text
清除失效会话
↓
保留安全的本地草稿
↓
跳登录
```
提示:
> 登录状态已过期,请重新登录。
重新登录后:
> 尽可能恢复之前业务入口。
---
# 第七十三章 路由回跳
登录前保存:
```text
redirectAfterLogin
```
但只允许白名单内部页面。
不能接受外部任意URL。
---
# 第七十四章 审核状态变化实时处理
例如用户正在“审核中”页面。
后台审核通过后:
用户重新进入前台或主动刷新:
> 自动更新状态。
然后显示:
> 资料已通过审核。
按钮:
> 开始寻找。
---
# 第七十五章 风控状态变化
如果用户使用过程中账号被限制:
下一次关键接口请求返回:
> ACCOUNT_LIMITED
前端立即:
```text
刷新UserStore
↓
关闭关键业务弹层
↓
跳账号受限页
```
不要继续允许交互。
---
# 第七十六章 Feature Flag
V1建议预留轻量功能开关。
例如:
```text
enableMatchmaker
enableActivities
enableImageChat
enableRiskKeywordWarning
```
但不要建设复杂远程配置平台。
用于以后灰度/临时关闭即可。
---
# 第七十七章 系统维护状态
AppStore:
```text
maintenanceStatus
```
如果维护:
显示统一页面:
> 平台正在维护,请稍后再试。
不进入业务页。
---
# 第七十八章 网络状态
前端监听:
```text
online
offline
weak_network
```
断网时:
- 已填写表单继续本地保存
- 提交操作提示网络异常
- 不直接清空当前页面
---
# 第七十九章 请求失败统一规范
业务请求错误分:
```text
network_error
unauthorized
forbidden
business_error
server_error
maintenance
```
页面不直接展示后端原始message。
通过统一错误映射输出用户可理解文案。
---
# 第八十章 API错误码建议前端映射
示例:
```text
AUTH_EXPIRED
PROFILE_NOT_APPROVED
ACCOUNT_LIMITED
TARGET_UNAVAILABLE
MATCH_REQUIRED
ACTIVITY_FULL
ACTIVITY_CLOSED
ALREADY_APPLIED
DUPLICATE_ACTION
```
---
# 第八十一章 PROFILE_NOT_APPROVED
统一处理:
> 当前资料尚未通过审核。
并跳:
> 审核状态页。
---
# 第八十二章 MATCH_REQUIRED
用户尝试访问聊天:
提示:
> 双方互相喜欢后才能开始聊天。
---
# 第八十三章 TARGET_UNAVAILABLE
对方已不可用:
> 该用户当前不可查看或联系。
返回上一页。
---
# 第八十四章 ACTIVITY_FULL
> 本次活动报名人数已满。
刷新活动状态。
---
# 第八十五章 数据刷新策略
建议:
## 启动时
刷新:
- 当前用户
- 未读数
- App配置
---
## 首页进入
刷新:
- 今日推荐摘要
---
## 消息进入
刷新:
- 会话列表
- 未读数
---
## 我的进入
刷新:
- 用户核心状态
---
# 第八十六章 页面缓存策略
适合保留:
- 找对象滚动位置
- 筛选条件
- 首页当前推荐位置
- 活动列表当前位置
不建议强缓存:
- 用户详情
- 风险状态
- 审核状态
这些应较新。
---
# 第八十七章 页面返回行为
例如:
```text
找对象
→ 用户详情
→ 返回
```
恢复:
- 原筛选条件
- 原列表
- 原滚动位置
---
# 第八十八章 Tab再次点击行为
再次点击当前Tab:
V1可以保持当前位置。
不强制:
> 自动滚到顶部。
以后如有需要再增加。
---
# 第八十九章 用户退出登录
点击退出:
二次确认。
成功:
```text
清除Token
清除用户敏感缓存
清除消息缓存
保留非敏感App设置
跳登录
```
---
# 第九十章 注销账户
与退出登录不同。
注销属于后端业务。
前端不可只清缓存。
必须走:
> 账号注销流程。
---
# 第九十一章 红娘端路由架构
建议:
```text
/login
/workbench
/service-requests
/service/:id
/candidates/:userId
/my-users
/follow-ups
```
---
# 第九十二章 红娘端权限守卫
进入任何业务路由前检查:
```text
isLoggedIn
role
organization
accountStatus
permission
```
---
# 第九十三章 红娘端状态容器
建议:
```text
AuthStore
OperatorStore
ServiceStore
UserSearchStore
AppStore
```
---
# 第九十四章 红娘工作台上下文
进入服务详情:
必须保存:
```text
serviceId
userId
assignedMatchmakerId
serviceStatus
```
刷新页面后重新从URL参数恢复。
不要只放内存。
---
# 第九十五章 红娘候选人筛选状态
保存:
```text
candidateFilters
candidateSort
candidatePage
```
从候选详情返回:
> 恢复原位置。
---
# 第九十六章 后台路由架构
建议:
```text
/login
/dashboard
/users
/users/:id
/reviews
/reviews/:id
/matches
/match-rules
/matchmaker-services
/matchmakers
/activities
/activities/new
/activities/:id
/activities/:id/registrations
/activities/:id/checkin
/reports
/reports/:id
/organizations
/operators
/roles
/analytics
/settings
```
---
# 第九十七章 后台路由权限
每个Route绑定:
```text
permissionCode
```
例如:
```text
/users/:id
→ user.view
```
```text
/reviews/:id
→ review.process
```
```text
/reports/:id
→ risk.report.view
```
---
# 第九十八章 前端权限不能代替后端权限
前端隐藏按钮只是:
> 用户体验。
真正权限必须由后端校验。
即使用户手动访问URL:
> 无权限仍拒绝。
---
# 第九十九章 后台菜单生成
建议根据:
```text
currentOperator.permissions
```
动态生成菜单。
用户无权限:
> 不显示对应一级菜单。
---
# 第一百章 后台刷新页恢复
由于PC后台用户会刷新浏览器:
所有核心详情页必须通过:
> URL参数重新获取数据。
不能依赖:
> 上一个页面传递的临时对象。
---
# 第一百零一章 后台筛选状态
列表筛选建议同步到URL Query。
例如:
```text
/reviews?status=pending&page=2
```
这样:
- 刷新不丢
- 返回不丢
- 可以复制内部链接
---
# 第一百零二章 小程序页面参数原则
只传:
```text
userId
activityId
serviceId
conversationId
```
不要在URL携带:
- 姓名
- 身份证
- 完整资料JSON
- 敏感业务状态
进入页面后再请求数据。
---
# 第一百零三章 全局事件机制
V1应避免大量EventBus。
跨模块变化优先:
> 更新Store。
例如:
用户拉黑:
```text
MatchStore更新
MessageStore更新
```
而不是发送十几个自定义事件。
---
# 第一百零四章 WebSocket/实时消息建议
如果聊天采用实时通信:
连接状态放:
```text
MessageStore.connectionStatus
```
状态:
```text
disconnected
connecting
connected
reconnecting
```
---
# 第一百零五章 实时消息断线
断线后:
自动重连。
重连成功:
根据:
```text
lastSyncCursor
```
补拉遗漏消息。
避免重复消息。
---
# 第一百零六章 消息去重
每条消息必须有:
```text
messageId
```
前端收到实时消息和补拉消息时:
以messageId去重。
---
# 第一百零七章 消息发送状态
本地消息:
```text
sending
sent
failed
```
发送失败:
显示:
> 发送失败,点击重试。
---
# 第一百零八章 时间状态
聊天、通知、跟进等时间:
统一由前端格式化。
例如:
今天:
> 10:32
昨天:
> 昨天
更早:
> 8月28日
后台:
> 2026-08-28 10:32
---
# 第一百零九章 本地时区
所有服务端时间建议统一标准存储。
前端展示:
> 用户当前本地时区。
V1主要服务丹阳,本地业务仍需避免服务端、数据库和前端各自混乱处理时间。
---
# 第一百一十章 页面Loading原则
首次加载:
> Skeleton。
局部更新:
> 局部Loading。
提交:
> Button Loading。
不要:
> 页面每次操作全部白屏重载。
---
# 第一百一十一章 乐观更新使用范围
适合:
- 喜欢
- 不合适
- 隐私Switch
但失败必须回滚。
---
# 第一百一十二章 不适合乐观更新
以下必须等待服务端确认:
- 实名认证
- 资料审核提交
- 活动报名
- 成功牵手确认
- 封禁
- 举报处理
---
# 第一百一十三章 表单状态结构
统一:
```text
values
errors
touched
dirty
submitting
```
避免每个表单页面自定义一套混乱逻辑。
---
# 第一百一十四章 表单离开提醒
首次资料填写:
> 自动保存,无需每次提醒。
后台复杂编辑:
如果有未保存修改,离开时:
> 你有未保存的修改,确定离开吗?
---
# 第一百一十五章 图片上传状态
每张图片:
```text
local
uploading
uploaded
failed
review_pending
```
---
# 第一百一十六章 图片草稿
用户选了图片但上传失败:
本地显示失败状态。
允许:
> 点击重试。
不要让用户重新选择所有图片。
---
# 第一百一十七章 审核后图片状态
一旦头像需要修改:
前端在我的资料中:
> 清晰标识该图片需修改。
不要整个资料页只显示“审核不通过”。
---
# 第一百一十八章 App配置
服务端可返回轻量配置:
```text
dailyRecommendationLimit
maxProfilePhotos
maxInterestTags
chatImageEnabled
activityEnabled
matchmakerEnabled
supportContact
```
避免关键运营参数硬编码。
---
# 第一百一十九章 配置读取失败
使用安全默认值。
不要因为配置接口失败导致:
> 整个小程序打不开。
---
# 第一百二十章 埋点状态
V1建议预留基础Analytics接口。
关键事件:
```text
login_success
verification_success
profile_submit
review_approved
recommendation_view
like_click
mutual_match
chat_started
matchmaker_apply
activity_apply
activity_checkin
relationship_success
```
---
# 第一百二十一章 埋点原则
不得上报:
- 身份证
- 聊天正文
- 完整手机号
- 私密照片
- 举报证据
只记录必要事件与匿名业务ID。
---
# 第一百二十二章 推荐核心漏斗
前端埋点对应:
```text
推荐曝光
↓
查看详情
↓
喜欢
↓
双向匹配
↓
开始聊天
```
用于后续判断:
> 哪一步用户流失。
---
# 第一百二十三章 用户主流程状态图
```text
未登录
↓
已登录
↓
已绑定手机号
↓
已实名
↓
资料填写中
↓
资料完成
↓
审核中
↓
审核通过
↓
正在寻找
↓
互相喜欢
↓
沟通
↓
正在了解
↓
成功牵手
```
---
# 第一百二十四章 状态不可逆与可逆
## 不可随意回退
```text
未实名 → 已实名
审核通过 → 未提交
```
不能前端自行改变。
---
## 可逆状态
```text
正在寻找 ↔ 暂停寻找
```
由业务规则控制。
---
# 第一百二十五章 状态变更单一入口
前端不能:
```text
UserStore.relationshipStatus = success
```
直接赋值。
必须通过:
```text
updateRelationshipStatus()
```
请求服务端后再更新Store。
---
# 第一百二十六章 推荐的前端状态更新模式
```text
Action
↓
API
↓
Server Result
↓
Store
↓
UI
```
简单、清晰。
---
# 第一百二十七章 不建议V1引入的复杂方案
V1不要为了“技术先进”引入:
- 复杂前端微服务
- 微前端
- Event Sourcing前端实现
- 大量全局事件总线
- GraphQL缓存系统
- 离线优先复杂同步
- 多套状态库共存
---
# 第一百二十八章 技术实现要求
无论最终采用:
- 原生微信小程序
- Taro
- uni-app
都必须保持:
> 一套清晰Store + 一套路由守卫 + 一套API层 + 一套错误处理。
---
# 第一百二十九章 推荐前端分层
```text
pages
↓
features
↓
stores
↓
services
↓
components
↓
theme
↓
utils
```
---
# 第一百三十章 services层
建议:
```text
services/
auth
user
profile
match
message
activity
matchmaker
safety
```
页面不直接调用底层request。
---
# 第一百三十一章 API统一请求层
统一处理:
- Token
- 超时
- 错误码
- 重试
- 日志脱敏
- Session失效
- 维护状态
---
# 第一百三十二章 推荐目录结构
```text
src/
pages/
components/
features/
stores/
services/
theme/
utils/
constants/
types/
```
后台和红娘端可采用类似分层。
---
# 第一百三十三章 constants目录
统一存放:
```text
routeNames
statusEnums
permissionCodes
storageKeys
businessLimits
```
不要把状态字符串散落页面。
---
# 第一百三十四章 types目录
统一:
```text
User
Profile
PartnerPreference
MatchRelation
Conversation
Activity
MatchmakerService
Report
```
---
# 第一百三十五章 路由验收标准
必须测试:
1. 未登录直接访问用户详情
2. 未实名直接访问首页
3. 审核中打开找对象
4. 封禁用户打开聊天
5. 已成功牵手进入首页
6. Token过期期间填写资料
7. 从聊天返回消息列表
8. 从用户详情返回找对象列表
每种都必须有明确结果。
---
# 第一百三十六章 状态验收标准
必须保证:
> 用户状态只有一个真实来源。
例如:
不能出现:
首页显示:
> 正在寻找
我的显示:
> 暂停寻找。
---
# 第一百三十七章 未读数验收
必须确保:
```text
Tab Badge
消息列表
系统通知
聊天详情
```
四处数据一致。
---
# 第一百三十八章 草稿验收
测试:
用户填写到:
> 资料3/5
直接关闭微信。
重新打开:
> 自动进入3/5,并保留已填内容。
---
# 第一百三十九章 弱网验收
弱网下:
- 按钮不能重复提交
- 图片上传失败可重试
- 已填写表单不丢
- 推荐加载失败有重试
- 聊天发送失败有明确状态
---
# 第一百四十章 权限验收
红娘和后台必须测试:
- 无权限菜单不显示
- 手动输入URL仍被拒绝
- 敏感信息默认脱敏
- 查看敏感字段留下日志
---
# 第一百四十一章 V1.0前端架构核心结论
用户端核心状态:
```text
登录状态
实名认证状态
资料完成状态
审核状态
账号状态
婚恋状态
隐私状态
匹配关系
消息未读
活动报名
红娘服务
```
这些状态必须统一管理。
页面只负责:
> 展示和用户交互。
页面不能自己创造业务真相。
---
# 第一百四十二章 最终设计原则
整个前端信息架构必须做到:
> 用户进入任何页面,都不会因为账号状态错误而走进不该走的流程。
> 用户退出再回来,不需要重复填写已经完成的内容。
> 后台改变用户审核或风险状态后,前端能够及时同步。
> 所有关键业务状态只有一份可信来源。
> 页面跳转始终可预测,不形成路由迷宫。
最终标准可以概括为一句:
> **状态决定权限,权限决定路由,路由承载任务,页面只负责把当前任务做好。**