chore: establish V1.1 recovery baseline

This commit is contained in:
2026-09-09 22:05:00 +08:00
commit b46b48eb33
947 changed files with 155471 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
/**
* 业务数量参数(规范 §118 App 配置 + AGENTS.md 第 12 条"所有未确认数量参数配置化")
*
* 全部数量限制走配置,禁止页面层硬编码业务常量。
* 实际运行时由 services/appConfigService 从服务端拉取并覆盖默认值(规范 §118)。
* 配置接口失败时使用本文件的安全默认值(规范 §119)。
*/
exports.BUSINESS_LIMITS = {
// 推荐相关
DAILY_RECOMMENDATION_LIMIT: 6, // 每日推荐人数
RECOMMENDATION_PAGE_SIZE: 10, // 推荐分页大小
// 资料相关
MAX_PROFILE_PHOTOS: 6, // 生活照上限
MAX_INTEREST_TAGS: 8, // 兴趣标签上限(规范 §35 不超过 8 个)
MIN_INTRO_LENGTH: 20, // 自我介绍最小字数
MAX_INTRO_LENGTH: 500, // 自我介绍最大字数
MAX_REPORT_LENGTH: 500, // 举报说明最大字数
MAX_FEEDBACK_LENGTH: 500, // 意见反馈最大字数
// 聊天相关
CHAT_IMAGE_ENABLED: false, // V1 默认关闭图片聊天(规范 §76 Feature Flag)
CHAT_MESSAGE_MAX_LENGTH: 1000,
CHAT_HISTORY_PAGE_SIZE: 30, // 聊天历史分页
// 功能开关(规范 §76)
ACTIVITY_ENABLED: true,
MATCHMAKER_ENABLED: true,
ENABLE_RISK_KEYWORD_WARNING: true,
// 后台分页(规范 §82)
PAGE_SIZE_DEFAULT: 20,
PAGE_SIZE_OPTIONS: [20, 50],
// 时长(ms)
TOAST_DURATION: 1500, // 规范 §56:1.5~2 秒
BUTTON_PRESS_FEEDBACK: 120, // 按钮按压反馈时长
// 网络请求
REQUEST_TIMEOUT_MS: 15000,
REQUEST_RETRY_COUNT: 1,
// 联系方式
SUPPORT_CONTACT: '',
};
/**
* 用服务端返回的配置覆盖默认值(规范 §118)
* @param {Partial<typeof exports.BUSINESS_LIMITS>} overrides 服务端配置
* @returns {typeof exports.BUSINESS_LIMITS} 合并后的配置
*/
exports.mergeAppConfig = (overrides) => {
if (!overrides || typeof overrides !== 'object') return exports.BUSINESS_LIMITS;
return { ...exports.BUSINESS_LIMITS, ...overrides };
};
+63
View File
@@ -0,0 +1,63 @@
/**
* 常量聚合入口(规范 §133 constants 目录)
*
* 统一存放 routeNames / statusEnums / permissionCodes / storageKeys / businessLimits,
* 不让状态字符串散落页面。
*/
const routeNames = require('./routeNames');
const statusEnums = require('./statusEnums');
const permissionCodes = require('./permissionCodes');
const storageKeys = require('./storageKeys');
const businessLimits = require('./businessLimits');
module.exports = {
// 路由
ROUTE: routeNames,
TAB: routeNames.TAB,
AUTH: routeNames.AUTH,
ONBOARDING: routeNames.ONBOARDING,
ONBOARDING_STEPS: routeNames.ONBOARDING_STEPS,
REVIEW: routeNames.REVIEW,
MAIN: routeNames.MAIN,
SETTINGS: routeNames.SETTINGS,
DETAIL: routeNames.DETAIL,
OPERATOR: routeNames.OPERATOR,
buildPath: routeNames.buildPath,
to: routeNames.to,
// 状态枚举
PROFILE_COMPLETION: statusEnums.PROFILE_COMPLETION,
PROFILE_REVIEW: statusEnums.PROFILE_REVIEW,
ACCOUNT_STATUS: statusEnums.ACCOUNT_STATUS,
RELATIONSHIP_STATUS: statusEnums.RELATIONSHIP_STATUS,
RELATION_STATUS: statusEnums.RELATION_STATUS,
RECOMMENDATION_STATE: statusEnums.RECOMMENDATION_STATE,
ACTIVITY_STATUS: statusEnums.ACTIVITY_STATUS,
REGISTRATION_STATUS: statusEnums.REGISTRATION_STATUS,
CHECKIN_STATUS: statusEnums.CHECKIN_STATUS,
MATCHMAKER_SERVICE_STATUS: statusEnums.MATCHMAKER_SERVICE_STATUS,
MATCHMAKER_RECOMMENDATION_STATUS: statusEnums.MATCHMAKER_RECOMMENDATION_STATUS,
CHAT_CONNECTION: statusEnums.CHAT_CONNECTION,
MESSAGE_SEND_STATUS: statusEnums.MESSAGE_SEND_STATUS,
PHOTO_STATUS: statusEnums.PHOTO_STATUS,
CHAT_BUBBLE_TYPE: statusEnums.CHAT_BUBBLE_TYPE,
REQUEST_ERROR: statusEnums.REQUEST_ERROR,
BUSINESS_ERROR_CODE: statusEnums.BUSINESS_ERROR_CODE,
STATUS_BADGE: statusEnums.STATUS_BADGE,
DANGER_ACTION: statusEnums.DANGER_ACTION,
mapErrorMessage: statusEnums.mapErrorMessage,
// 权限
USER_PERMISSION: permissionCodes.USER_PERMISSION,
ADMIN_PERMISSION: permissionCodes.ADMIN_PERMISSION,
hasPermission: permissionCodes.hasPermission,
hasAnyPermission: permissionCodes.hasAnyPermission,
// 存储
STORAGE_KEYS: storageKeys.STORAGE_KEYS,
// 业务限制
BUSINESS_LIMITS: businessLimits.BUSINESS_LIMITS,
mergeAppConfig: businessLimits.mergeAppConfig,
};
+78
View File
@@ -0,0 +1,78 @@
/**
* 权限码常量(规范 §98-99 前端权限不能代替后端权限)
*
* 前端隐藏按钮只是用户体验,真正权限由后端校验。
* 即使用户手动访问 URL,无权限仍拒绝。
* 用户端小程序本身权限较少,主要场景:是否可发消息、是否可申请红娘、是否可报名活动。
*/
// 用户端功能权限码(用于前端按钮显隐与路由守卫)
exports.USER_PERMISSION = {
CAN_VIEW_DISCOVER: 'can_view_discover', // 进入找对象
CAN_RECEIVE_RECOMMENDATIONS: 'can_receive_recommendations', // 被系统推荐
CAN_LIKE: 'can_like', // 表达喜欢
CAN_CHAT: 'can_chat', // 发起聊天(需 mutual_match)
CAN_APPLY_ACTIVITY: 'can_apply_activity', // 报名活动
CAN_APPLY_MATCHMAKER: 'can_apply_matchmaker', // 申请红娘
CAN_REPORT: 'can_report', // 提交举报
CAN_VIEW_SENSITIVE_OWN: 'can_view_sensitive_own', // 查看本人敏感字段
};
// 后台/红娘端权限码(预留,规范 §93、§97)
// 后台路由绑定 permissionCode,按 currentOperator.permissions 动态生成菜单
exports.ADMIN_PERMISSION = {
// 用户与审核
USER_VIEW: 'user.view',
USER_REVIEW: 'user.review',
USER_SENSITIVE_VIEW: 'user.sensitive.view',
USER_BAN: 'user.ban',
// 匹配
MATCH_RULE_EDIT: 'match.rule.edit',
// 红娘
MATCHMAKER_SERVICE: 'matchmaker.service',
MATCHMAKER_ASSIGN: 'matchmaker.assign',
// 活动
ACTIVITY_VIEW: 'activity.view',
ACTIVITY_CREATE: 'activity.create',
ACTIVITY_EDIT: 'activity.edit',
ACTIVITY_REVIEW: 'activity.review',
ACTIVITY_CHECKIN: 'activity.checkin',
// 风控
RISK_REPORT_VIEW: 'risk.report.view',
RISK_REPORT_PROCESS: 'risk.report.process',
// 组织与权限
ORG_MANAGE: 'org.manage',
ROLE_MANAGE: 'role.manage',
OPERATOR_MANAGE: 'operator.manage',
// 系统
ANALYTICS_VIEW: 'analytics.view',
SETTING_MANAGE: 'setting.manage',
};
/**
* 判断当前权限列表是否包含指定权限码
* @param {string[]} permissions 当前用户/操作员权限列表
* @param {string} code 权限码
* @returns {boolean}
*/
exports.hasPermission = (permissions, code) => {
if (!Array.isArray(permissions) || !code) return false;
return permissions.indexOf(code) >= 0;
};
/**
* 判断当前权限列表是否包含任意一个权限码
* @param {string[]} permissions
* @param {string[]} codes
* @returns {boolean}
*/
exports.hasAnyPermission = (permissions, codes) => {
if (!Array.isArray(permissions) || !Array.isArray(codes)) return false;
return codes.some((c) => permissions.indexOf(c) >= 0);
};
+131
View File
@@ -0,0 +1,131 @@
/**
* 路由名称常量(规范 §5 用户端路由命名 + §18 Tab 路由)
*
* 所有页面跳转必须使用本常量,禁止散落字符串。
* 带参数的页面只传 id(userId/activityId/serviceId/conversationId),
* 不在 URL 携带姓名、身份证、完整资料 JSON、敏感业务状态。
*/
// ============ Tab 路由(只能 switchTab) ============
exports.TAB = {
HOME: '/pages/index/index',
DISCOVER: '/pages/discover/discover',
MESSAGES: '/pages/messages/messages',
ACTIVITIES: '/pages/activity/activity',
MINE: '/pages/mine/mine',
};
// ============ 启动与身份类(规范 §4.1) ============
exports.AUTH = {
LOGIN: '/pages/login/login',
BIND_PHONE: '/pages/bind-phone/bind-phone',
VERIFICATION: '/pages/verification/verification',
};
// ============ 新手资料类(规范 §4.2,5 步固定顺序) ============
exports.ONBOARDING = {
PROFILE_BASIC: '/pages/profile-basic/profile-basic',
PROFILE_LIFESTYLE: '/pages/profile-lifestyle/profile-lifestyle',
PROFILE_PHOTOS: '/pages/profile-photos/profile-photos',
PROFILE_INTENT: '/pages/profile-intent/profile-intent',
PROFILE_PREFERENCE: '/pages/profile-preference/profile-preference',
PROFILE_CONFIRM: '/pages/profile-confirm/profile-confirm',
// 资料编辑入口(非首次填写)
PROFILE_INTRO: '/pages/profile-intro/profile-intro',
PROFILE_INTERESTS: '/pages/profile-interests/profile-interests',
};
// 首次资料填写步骤顺序(规范 §14)
exports.ONBOARDING_STEPS = [
exports.ONBOARDING.PROFILE_BASIC,
exports.ONBOARDING.PROFILE_LIFESTYLE,
exports.ONBOARDING.PROFILE_PHOTOS,
exports.ONBOARDING.PROFILE_INTENT,
exports.ONBOARDING.PROFILE_PREFERENCE,
];
// ============ 审核状态类(规范 §4.3) ============
exports.REVIEW = {
PENDING: '/pages/review-pending/review-pending',
REJECTED: '/pages/review-rejected/review-rejected',
ACCOUNT_STATUS: '/pages/account-status/account-status',
ACCOUNT_STATUS_PAGE: '/pages/account-status-page/account-status-page',
APPEAL: '/pages/appeal/appeal',
};
// ============ 主业务类(规范 §4.4) ============
exports.MAIN = {
HOME: '/pages/index/index',
DISCOVER: '/pages/discover/discover',
PROFILE_DETAIL: '/pages/profile-detail/profile-detail',
FATE_CENTER: '/pages/fate-center/fate-center',
MESSAGES: '/pages/messages/messages',
CHAT: '/pages/chat/chat',
ACTIVITIES: '/pages/activity/activity',
MATCHMAKER: '/pages/matchmaker/matchmaker',
MINE: '/pages/mine/mine',
};
// ============ 设置与辅助类(规范 §4.5) ============
exports.SETTINGS = {
SETTINGS: '/pages/settings/settings',
PRIVACY: '/pages/privacy-settings/privacy-settings',
BLACKLIST: '/pages/blacklist/blacklist',
NOTIFICATIONS: '/pages/notifications/notifications',
HELP_CENTER: '/pages/help-center/help-center',
ABOUT: '/pages/about/about',
RELATIONSHIP_STATUS: '/pages/relationship-status/relationship-status',
ACCOUNT_LOGOUT: '/pages/account-logout/account-logout',
MY_REPORTS: '/pages/my-reports/my-reports',
};
// ============ 业务详情类(规范 §4.6) ============
exports.DETAIL = {
PROFILE_DETAIL: '/pages/profile-detail/profile-detail',
ACTIVITY_DETAIL: '/pages/activity-detail/activity-detail',
ACTIVITY_REGISTER: '/pages/activity-register/activity-register',
CHECKIN: '/pages/checkin/checkin',
ACTIVITY_FEEDBACK: '/pages/activity-feedback/activity-feedback',
ACTIVITY_MATCHES: '/pages/activity-matches/activity-matches',
MY_ACTIVITIES: '/pages/my-activities/my-activities',
MATCHMAKER_APPLY: '/pages/matchmaker-apply/matchmaker-apply',
MATCHMAKER_PROGRESS: '/pages/matchmaker-progress/matchmaker-progress',
REPORT: '/pages/report/report',
LIKERS: '/pages/likers/likers',
};
// ============ 工作人员/红娘端(规范 §4.7) ============
exports.OPERATOR = {
LOGIN: '/pages/matchmaker-login/matchmaker-login',
WORKBENCH: '/pages/matchmaker-workbench/matchmaker-workbench',
};
// ============ 带参路由快捷构造(仅 id 类参数,规范 §6) ============
// 用法:ROUTE.to.detail(userId) → /pages/profile-detail/profile-detail?id=xxx
exports.to = {
detail: (userId) => exports.buildPath(exports.DETAIL.PROFILE_DETAIL, { id: userId }),
activityDetail: (activityId) => exports.buildPath(exports.DETAIL.ACTIVITY_DETAIL, { id: activityId }),
chat: (conversationId) => exports.buildPath(exports.MAIN.CHAT, { id: conversationId }),
report: (userId) => exports.buildPath(exports.DETAIL.REPORT, { id: userId }),
matchmakerProgress: (serviceId) => exports.buildPath(exports.DETAIL.MATCHMAKER_PROGRESS, { id: serviceId }),
appeal: (type, actionId) => {
const params = { type };
if (actionId) params.actionId = actionId;
return exports.buildPath(exports.REVIEW.APPEAL, params);
},
};
/**
* 构造带参路由(只允许传 id 类参数)
* @param {string} path 路由常量
* @param {Record<string, string|number>} params 参数对象(仅 id 类)
* @returns {string} 完整路径
*/
exports.buildPath = (path, params = {}) => {
const entries = Object.entries(params);
if (entries.length === 0) return path;
const query = entries
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
.join('&');
return `${path}?${query}`;
};
+215
View File
@@ -0,0 +1,215 @@
/**
* 状态枚举常量(规范 §7-10, §22, §44-50, §66, §107)
*
* 全平台状态字符串统一在此定义,禁止页面散落魔法字符串。
* 状态决定权限,权限决定路由,路由承载任务。
*/
// ============ 资料完成状态(规范 §7) ============
exports.PROFILE_COMPLETION = {
NOT_STARTED: 'not_started',
IN_PROGRESS: 'in_progress',
COMPLETED: 'completed',
};
// ============ 资料审核状态(规范 §8) ============
exports.PROFILE_REVIEW = {
NOT_SUBMITTED: 'not_submitted',
PENDING: 'pending',
APPROVED: 'approved',
NEED_EDIT: 'need_edit',
REJECTED: 'rejected',
};
// ============ 账号状态(规范 §9) ============
exports.ACCOUNT_STATUS = {
NORMAL: 'normal',
REVIEWING_RISK: 'reviewing_risk',
LIMITED: 'limited',
SUSPENDED: 'suspended',
BANNED: 'banned',
CLOSED: 'closed',
};
// ============ 婚恋服务状态(规范 §10) ============
exports.RELATIONSHIP_STATUS = {
SEARCHING: 'searching', // 正在寻找
GETTING_TO_KNOW: 'getting_to_know', // 正在了解
PAUSED: 'paused', // 暂停寻找
MATCHED_SUCCESSFULLY: 'matched_successfully', // 成功牵手
SERVICE_EXITED: 'service_exited', // 退出婚恋服务
};
// ============ 推荐卡关系状态(规范 §22) ============
exports.RELATION_STATUS = {
NEUTRAL: 'neutral',
LIKED: 'liked',
PASSED: 'passed',
MUTUAL_MATCH: 'mutual_match',
BLOCKED: 'blocked',
UNMATCHED: 'unmatched',
};
// ============ 推荐列表加载状态(规范 §21) ============
exports.RECOMMENDATION_STATE = {
IDLE: 'idle',
LOADING: 'loading',
LOADED: 'loaded',
EMPTY: 'empty',
FINISHED: 'finished',
ERROR: 'error',
};
// ============ 活动状态(规范 §44) ============
exports.ACTIVITY_STATUS = {
DRAFT: 'draft',
REGISTRATION_OPEN: 'registration_open',
REGISTRATION_CLOSED: 'registration_closed',
ONGOING: 'ongoing',
ENDED: 'ended',
CANCELLED: 'cancelled',
};
// ============ 活动报名状态(规范 §45) ============
exports.REGISTRATION_STATUS = {
NOT_APPLIED: 'not_applied',
PENDING: 'pending',
APPROVED: 'approved',
REJECTED: 'rejected',
CANCELLED: 'cancelled',
};
// ============ 活动签到状态(规范 §47) ============
exports.CHECKIN_STATUS = {
NOT_CHECKED_IN: 'not_checked_in',
CHECKED_IN: 'checked_in',
};
// ============ 红娘服务状态(规范 §49) ============
exports.MATCHMAKER_SERVICE_STATUS = {
SUBMITTED: 'submitted',
ASSIGNED: 'assigned',
IN_SERVICE: 'in_service',
WAITING_USER: 'waiting_user',
COMPLETED: 'completed',
CANCELLED: 'cancelled',
};
// ============ 红娘推荐状态(规范 §50) ============
exports.MATCHMAKER_RECOMMENDATION_STATUS = {
PENDING_VIEW: 'pending_view',
VIEWED: 'viewed',
LIKED: 'liked',
PASSED: 'passed',
MUTUAL_MATCH: 'mutual_match',
EXPIRED: 'expired',
};
// ============ 聊天连接状态(规范 §104) ============
exports.CHAT_CONNECTION = {
DISCONNECTED: 'disconnected',
CONNECTING: 'connecting',
CONNECTED: 'connected',
RECONNECTING: 'reconnecting',
};
// ============ 消息发送状态(规范 §107) ============
exports.MESSAGE_SEND_STATUS = {
SENDING: 'sending',
SENT: 'sent',
FAILED: 'failed',
};
// ============ 图片状态(规范 §115) ============
exports.PHOTO_STATUS = {
LOCAL: 'local',
UPLOADING: 'uploading',
UPLOADED: 'uploaded',
FAILED: 'failed',
REVIEW_PENDING: 'review_pending',
};
// ============ 聊天气泡类型(规范 §62) ============
exports.CHAT_BUBBLE_TYPE = {
SELF: 'self',
OTHER: 'other',
SYSTEM: 'system',
};
// ============ 请求错误分类(规范 §79) ============
exports.REQUEST_ERROR = {
NETWORK_ERROR: 'network_error',
UNAUTHORIZED: 'unauthorized',
FORBIDDEN: 'forbidden',
BUSINESS_ERROR: 'business_error',
SERVER_ERROR: 'server_error',
MAINTENANCE: 'maintenance',
RATE_LIMITED: 'rate_limited',
};
// ============ 业务错误码 → 用户可理解文案(规范 §80-84) ============
exports.BUSINESS_ERROR_CODE = {
AUTH_EXPIRED: 'AUTH_EXPIRED',
PROFILE_NOT_APPROVED: 'PROFILE_NOT_APPROVED',
ACCOUNT_LIMITED: 'ACCOUNT_LIMITED',
TARGET_UNAVAILABLE: 'TARGET_UNAVAILABLE',
MATCH_REQUIRED: 'MATCH_REQUIRED',
ACTIVITY_FULL: 'ACTIVITY_FULL',
ACTIVITY_CLOSED: 'ACTIVITY_CLOSED',
ALREADY_APPLIED: 'ALREADY_APPLIED',
DUPLICATE_ACTION: 'DUPLICATE_ACTION',
};
// ============ 用户可理解文案映射 ============
exports.ERROR_USER_MESSAGE = {
[exports.REQUEST_ERROR.NETWORK_ERROR]: '网络好像有点问题,请检查网络后重试',
[exports.REQUEST_ERROR.UNAUTHORIZED]: '登录状态已过期,请重新登录',
[exports.REQUEST_ERROR.FORBIDDEN]: '无权限访问该功能',
[exports.REQUEST_ERROR.BUSINESS_ERROR]: '操作失败,请稍后重试',
[exports.REQUEST_ERROR.SERVER_ERROR]: '服务暂时不可用,请稍后再试',
[exports.REQUEST_ERROR.MAINTENANCE]: '平台正在维护,请稍后再试',
[exports.REQUEST_ERROR.RATE_LIMITED]: '请求过于频繁,请稍后重试',
[exports.BUSINESS_ERROR_CODE.AUTH_EXPIRED]: '登录状态已过期,请重新登录',
[exports.BUSINESS_ERROR_CODE.PROFILE_NOT_APPROVED]: '当前资料尚未通过审核',
[exports.BUSINESS_ERROR_CODE.ACCOUNT_LIMITED]: '账号已被限制,详情请查看账号状态',
[exports.BUSINESS_ERROR_CODE.TARGET_UNAVAILABLE]: '该用户当前不可查看或联系',
[exports.BUSINESS_ERROR_CODE.MATCH_REQUIRED]: '双方互相喜欢后才能开始聊天',
[exports.BUSINESS_ERROR_CODE.ACTIVITY_FULL]: '本次活动报名人数已满',
[exports.BUSINESS_ERROR_CODE.ACTIVITY_CLOSED]: '本次活动报名已结束',
[exports.BUSINESS_ERROR_CODE.ALREADY_APPLIED]: '你已经提交过申请',
[exports.BUSINESS_ERROR_CODE.DUPLICATE_ACTION]: '操作已提交,请勿重复',
};
/**
* 将后端错误码/请求错误分类映射为用户可理解文案
* @param {string} code 错误码
* @param {string} [fallback] 后端原始 message(作为兜底)
* @returns {string} 用户可理解文案
*/
exports.mapErrorMessage = (code, fallback) => {
return exports.ERROR_USER_MESSAGE[code] || fallback || '操作失败,请稍后重试';
};
// ============ 状态徽章文案映射(StatusBadge 组件复用) ============
exports.STATUS_BADGE = {
VERIFIED: { label: '已实名', kind: 'success' },
REVIEWED: { label: '已审核', kind: 'success' },
REVIEWING: { label: '审核中', kind: 'warning' },
NEED_EDIT: { label: '需修改', kind: 'warning' },
SUCCESS: { label: '已完成', kind: 'success' },
PENDING: { label: '待处理', kind: 'warning' },
DANGER: { label: '高风险', kind: 'danger' },
DISABLED: { label: '已停用', kind: 'disabled' },
SERVICE: { label: '服务中', kind: 'info' },
};
// ============ 危险操作类型(Dialog/ConfirmDangerDialog 复用) ============
exports.DANGER_ACTION = {
BLOCK: 'block',
UNBLOCK: 'unblock',
UNMATCH: 'unmatch',
PAUSE: 'pause',
SUCCESS_MATCH: 'success_match',
LOGOUT: 'logout',
CLOSE_ACCOUNT: 'close_account',
};
+38
View File
@@ -0,0 +1,38 @@
/**
* 本地存储 Key 常量(规范 §70 本地 Storage 使用边界)
*
* 适合保存:token / 轻量用户状态 / 新手流程草稿 / 临时筛选 / 聊天输入草稿 / 已关闭的新手提示
* 不得长期保存:身份证完整信息 / 完整聊天历史 / 敏感审核资料 / 举报证据 / 后台敏感权限数据
*/
exports.STORAGE_KEYS = {
// 认证态
ACCESS_TOKEN: 'accessToken',
REFRESH_TOKEN: 'refreshToken',
USER_ID: 'userId',
IS_LOGGED_IN: 'isLoggedIn',
// 用户轻量状态(规范 §52,缓存时间较短)
CURRENT_USER_PROFILE: 'currentUserProfile',
USER_STATUS_SNAPSHOT: 'userStatusSnapshot',
// 新手资料草稿(规范 §15-17,本地即时保存 + 服务端阶段性保存)
ONBOARDING_DRAFT: 'onboardingDraft',
ONBOARDING_CURRENT_STEP: 'onboardingCurrentStep',
// 找对象列表缓存(规范 §86,可保留滚动位置)
DISCOVER_FILTERS: 'discoverFilters',
DISCOVER_SCROLL_POSITION: 'discoverScrollPosition',
// 聊天输入草稿(规范 §37,按 conversationId 索引)
CHAT_DRAFT: 'chatDraft',
// 消息未读(规范 §34-33,单一来源由 Store 维护,此处仅冷启动兜底)
TOTAL_UNREAD_COUNT: 'totalUnreadCount',
// 新手提示关闭标记(规范 §70)
CLOSED_NEWBIE_TIPS: 'closedNewbieTips',
// Feature Flag 缓存(规范 §76)
FEATURE_FLAGS: 'featureFlags',
};