252 lines
7.2 KiB
TypeScript
252 lines
7.2 KiB
TypeScript
// 全局配置与常量
|
||
|
||
// 后端服务域名(不含 /api/v1 前缀、不含结尾斜杠)
|
||
export const BASE_URL = 'https://zt-closet-backend.lzcwy.cn'
|
||
|
||
// API 统一前缀
|
||
export const API_PREFIX = '/api/v1'
|
||
|
||
// 本地存储 key
|
||
export const STORAGE_KEYS = {
|
||
ACCESS_TOKEN: 'zt_closet_access_token',
|
||
REFRESH_TOKEN: 'zt_closet_refresh_token',
|
||
EXPIRE_TIME: 'zt_closet_expire_time',
|
||
USER_INFO: 'zt_closet_user_info',
|
||
UNREAD: 'zt_closet_unread',
|
||
OPEN_COLLECT: 'zt_open_collect',
|
||
OPEN_PROFILE_EDIT: 'zt_open_profile_edit',
|
||
// AI 推荐为异步任务:存 task_id,退出页面再进来可继续轮询结果
|
||
AI_TASK: 'zt_ai_recommend_task',
|
||
}
|
||
|
||
// 衣物图片处理状态
|
||
export enum ProcessStatus {
|
||
MATTING = 1, // 抠图中
|
||
CLASSIFYING = 2, // 分类中
|
||
QUEUED = 3, // 排队中
|
||
SUCCESS = 4, // 成功
|
||
FAILED = 5, // 失败
|
||
}
|
||
|
||
// 订单状态
|
||
export enum OrderStatus {
|
||
PENDING = 1, // 待支付
|
||
PAID = 2, // 已支付
|
||
CANCELLED = 3, // 已取消
|
||
EXPIRED = 4, // 已过期
|
||
REFUNDED = 5, // 已退款
|
||
}
|
||
|
||
// 额度类型
|
||
export enum QuotaType {
|
||
UPLOAD = 1, // 上传
|
||
AI = 2, // AI 推荐
|
||
OUTFIT_SHARE = 3, // 社区分享(搭配分享)
|
||
CLOSET_SHARE = 4, // 衣柜分享
|
||
}
|
||
|
||
// 会员类型(与后端 UserInfo.vip_type 对齐)
|
||
export enum VipType {
|
||
NONE = 1, // 非会员
|
||
MONTHLY = 2, // 月度会员
|
||
YEARLY = 3, // 年度会员
|
||
TRIAL = 4, // 体验会员(新用户注册赠送,固定有效期,不随续费延长)
|
||
}
|
||
|
||
// 会员标签映射:非会员不在资料区展示标签,故意不提供 NONE 的文案
|
||
export const VIP_TYPE_NAMES: Record<number, string> = {
|
||
[VipType.MONTHLY]: '月度会员',
|
||
[VipType.YEARLY]: '年度会员',
|
||
[VipType.TRIAL]: '体验会员',
|
||
}
|
||
|
||
// 通知类型
|
||
export enum MsgType {
|
||
LIKE = 1, // 点赞通知
|
||
ORDER = 2, // 订单通知
|
||
SYSTEM = 3, // 系统通知
|
||
}
|
||
|
||
// 穿搭来源
|
||
export enum OutfitSource {
|
||
USER = 1, // 用户创建
|
||
AI = 2, // AI 推荐
|
||
}
|
||
|
||
// 公开状态
|
||
export enum IsPublic {
|
||
PRIVATE = 1, // 不公开
|
||
PUBLIC = 2, // 公开
|
||
}
|
||
|
||
// 穿搭审核状态
|
||
export enum AuditStatus {
|
||
PENDING = 1, // 待审核
|
||
PASS = 2, // 审核通过
|
||
REJECT = 3, // 审核不通过
|
||
}
|
||
|
||
// 衣柜分享状态
|
||
export enum ShareStatus {
|
||
NORMAL = 1, // 正常
|
||
CANCELLED = 2, // 已取消
|
||
EXPIRED = 3, // 已过期
|
||
BANNED = 4, // 已封禁
|
||
}
|
||
|
||
// 分享类型
|
||
export enum ShareType {
|
||
PARTIAL = 1, // 部分衣物
|
||
FULL = 2, // 全量快照
|
||
}
|
||
|
||
// 商品类型
|
||
export enum GoodsType {
|
||
MEMBER = 1, // 会员包
|
||
UPLOAD = 2, // 上传包
|
||
AI = 3, // AI 推荐包
|
||
CLOSET_SHARE = 4, // 衣柜分享包
|
||
OUTFIT_SHARE = 5, // 搭配分享包
|
||
}
|
||
|
||
// 额度名称映射
|
||
export const QUOTA_NAMES: Record<number, string> = {
|
||
[QuotaType.UPLOAD]: '上传额度',
|
||
[QuotaType.AI]: 'AI 推荐额度',
|
||
[QuotaType.OUTFIT_SHARE]: '社区分享额度',
|
||
[QuotaType.CLOSET_SHARE]: '衣柜分享额度',
|
||
}
|
||
|
||
// 商品类型名称映射
|
||
export const GOODS_TYPE_NAMES: Record<number, string> = {
|
||
[GoodsType.MEMBER]: '会员',
|
||
[GoodsType.UPLOAD]: '上传',
|
||
[GoodsType.AI]: 'AI 推荐',
|
||
[GoodsType.CLOSET_SHARE]: '衣柜分享',
|
||
[GoodsType.OUTFIT_SHARE]: '搭配分享',
|
||
}
|
||
|
||
// 错误码统一文案(兜底,优先展示服务端 details[0])
|
||
export const ERROR_MESSAGES: Record<number, string> = {
|
||
// 通用
|
||
10000: '请求参数错误',
|
||
10001: '资源不存在',
|
||
10002: '请求方式错误',
|
||
10003: '操作过于频繁,请稍后重试',
|
||
// 鉴权 / 用户
|
||
11000: '请先登录',
|
||
11001: '登录状态已失效',
|
||
11002: '登录状态已过期',
|
||
11003: '登录失败,请重试',
|
||
11004: '请先登录',
|
||
12000: '无权限操作',
|
||
20000: '用户参数错误',
|
||
21000: '用户名或密码错误',
|
||
21001: '账号已被禁用',
|
||
21002: '微信登录失败,请重试',
|
||
21003: '微信登录凭证无效',
|
||
21004: '注册暂未开放',
|
||
22000: '用户不存在',
|
||
23000: '用户已存在',
|
||
23001: '邮箱已被注册',
|
||
// 上传
|
||
30000: '上传文件为空',
|
||
30001: '不支持的文件类型',
|
||
30002: '文件大小超过限制',
|
||
30004: '文件不存在',
|
||
30005: '文件不是公开的',
|
||
30006: '文件权限不足',
|
||
30007: '文件处理中',
|
||
39000: '文件保存失败',
|
||
39001: '图片抠图处理失败',
|
||
39002: '图片分类处理失败',
|
||
// 穿搭
|
||
40000: '穿搭不存在',
|
||
40001: '创建穿搭失败',
|
||
40002: '删除穿搭失败',
|
||
40003: '更新穿搭失败',
|
||
40004: '无权操作该穿搭',
|
||
// 衣物
|
||
50000: '衣物不存在',
|
||
50001: '该衣物已被搭配使用,无法删除',
|
||
50002: '创建衣物失败',
|
||
50003: '删除衣物失败',
|
||
50004: '更新衣物失败',
|
||
50005: '无权操作该衣物',
|
||
// 商品
|
||
60000: '商品不存在',
|
||
60001: '商品已下架',
|
||
// 订单 / 退款
|
||
70000: '订单不存在',
|
||
70001: '订单状态不正确',
|
||
70002: '订单已支付',
|
||
70003: '订单已取消',
|
||
70004: '订单已过期',
|
||
70005: '虚拟支付未开通',
|
||
70006: '商品尚未发布为虚拟支付道具',
|
||
70007: '虚拟支付订单不支持取消',
|
||
70008: 'iOS 虚拟支付最低 1 元',
|
||
70009: '订单真实性校验失败',
|
||
71000: '退款记录不存在',
|
||
71001: '当前状态不允许退款',
|
||
71002: '退款金额不合法',
|
||
71003: '退款申请失败',
|
||
71004: 'iOS 订单请通过 App Store 申请退款',
|
||
79000: '创建订单失败',
|
||
79001: '取消订单失败',
|
||
79002: '更新订单失败',
|
||
79003: '创建虚拟支付订单失败',
|
||
// 额度 / 会员
|
||
80000: '额度不足',
|
||
80001: '额度记录不存在',
|
||
80002: '广告激励已领取',
|
||
80003: '无效的激励类型',
|
||
80004: '广告激励未开启',
|
||
81000: '会员记录不存在',
|
||
81001: '会员已过期',
|
||
81002: '会员开通失败',
|
||
89000: '额度更新失败',
|
||
// 通知 / 分享 / 社区 / 星座 / AI
|
||
90000: '通知不存在',
|
||
90100: '分享不存在',
|
||
90101: '分享已过期',
|
||
90102: '分享已取消',
|
||
90103: '穿搭分享不存在',
|
||
90104: '穿搭分享已取消',
|
||
90200: '目标内容不存在',
|
||
90201: '点赞操作失败',
|
||
90202: '收藏操作失败',
|
||
90300: '运势生成中,请稍后重试',
|
||
90400: 'AI 推荐失败',
|
||
90401: 'AI 推荐次数已达上限',
|
||
90402: '生成任务不存在或已过期,请重新生成',
|
||
90403: 'AI 推荐正在生成中,请稍后查询结果',
|
||
// 服务端
|
||
19000: '服务繁忙,请稍后重试',
|
||
19001: '服务繁忙,请稍后重试',
|
||
19002: '服务繁忙,请稍后重试',
|
||
19003: '服务繁忙,请稍后重试',
|
||
19999: '服务繁忙,请稍后重试',
|
||
}
|
||
|
||
// ===== 日志配置 =====
|
||
// 注意:本文件保持零 import(纯常量),LogLevel 定义在此以避免 config→logger→config 循环依赖
|
||
|
||
// 日志级别:数值越大越严重,低于当前级别的日志不输出
|
||
export enum LogLevel {
|
||
DEBUG = 0,
|
||
INFO = 1,
|
||
WARN = 2,
|
||
ERROR = 3,
|
||
SILENT = 4, // 全部关闭
|
||
}
|
||
|
||
// 全局日志级别开关:
|
||
// null = 按运行环境自动判定(develop=DEBUG / trial=INFO / release=WARN)
|
||
// LogLevel.DEBUG = 手动写死,临时调级用(调试完记得改回 null)
|
||
export const LOG_LEVEL: LogLevel | null = null
|
||
|
||
// 是否写入微信实时日志(真机可在小程序后台「实时日志」查看线上问题)
|
||
// 仅 WARN 及以上写入,避免击穿实时日志配额
|
||
export const LOG_TO_REALTIME = true
|