feat: ui update

This commit is contained in:
2026-09-15 16:01:59 +08:00
parent 1a11816839
commit 26c392d612
89 changed files with 10377 additions and 4861 deletions
+59 -7
View File
@@ -111,46 +111,98 @@ export const GOODS_TYPE_NAMES: Record<number, string> = {
// 错误码统一文案(兜底,优先展示服务端 details[0])
export const ERROR_MESSAGES: Record<number, string> = {
80000: '额度不足',
80001: '额度记录不存在',
90401: 'AI 推荐次数已达上限',
90400: 'AI 推荐失败',
90300: '运势生成中,请稍后重试',
// 通用
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: '无权操作该衣物',
40000: '穿搭不存在',
40004: '无权操作该穿搭',
// 商品
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 推荐次数已达上限',
// 服务端
19000: '服务繁忙,请稍后重试',
19001: '服务繁忙,请稍后重试',
19002: '服务繁忙,请稍后重试',
+40
View File
@@ -0,0 +1,40 @@
import { logger } from './logger'
/**
* 导航滚动收缩共享 handler。
*
* v2 导航形态:进入页面是内容区的衬线大标题,向下滚动后收缩为居中玻璃小标题。
* 页面侧只接入一行(scroll-view 用 bindscroll,页面级滚动用 onPageScroll):
* Page({ onNavScroll: navScroll }) // <scroll-view bindscroll="onNavScroll">
* Page({ onPageScroll: navPageScroll }) // 页面级滚动
*
* 性能:只在跨越阈值时 setData 一次,绝不逐帧更新。
*/
// 日志模块名
const LOG = 'nav'
// 滚动超过该距离(px)即切换为玻璃小标题态
export const NAV_THRESHOLD = 24
function apply(ctx: any, scrollTop: number): void {
if (!ctx || !ctx.data) return
const next = scrollTop > NAV_THRESHOLD
if (next === !!ctx.data.navScrolled) return
// 仅在首次进入玻璃态时打点,避免滚动过程刷屏
if (next && !ctx.__navLogged) {
ctx.__navLogged = true
logger.debug(LOG, '导航进入玻璃态, scrollTop=', scrollTop)
}
ctx.setData({ navScrolled: next })
}
/** scroll-view 的 bindscroll 处理器 */
export function navScroll(this: any, e: { detail?: { scrollTop?: number } }): void {
apply(this, (e && e.detail && e.detail.scrollTop) || 0)
}
/** 页面级滚动的 onPageScroll 处理器 */
export function navPageScroll(this: any, e: { scrollTop?: number }): void {
apply(this, (e && e.scrollTop) || 0)
}