chore: establish V1.1 recovery baseline
This commit is contained in:
@@ -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 };
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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);
|
||||
};
|
||||
@@ -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}`;
|
||||
};
|
||||
@@ -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',
|
||||
};
|
||||
@@ -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',
|
||||
};
|
||||
Reference in New Issue
Block a user