提交图

99 次代码提交

作者 SHA1 备注 提交日期
xcbyy
f56bbe76d7 fix(api): 收藏状态接口不再把 401 吞成 500
- /api/favorites/check 的 catch 改为透传 err.status/err.code(未登录返回 401 + 40010/40100,而非 500)

- 线上日志确认根因:未携带用户 token 时 resolveSecureUserId 抛 401 被包装成 500

- 新增 favorites-status-code.spec.ts(105 套件/703 用例全绿);冒烟 3/3
2026-10-21 10:52:13 +08:00
xcbyy
720cb97877 feat(voice): 大神语音介绍真实落地(录制/上传/试听)
- DB: companions.voice_intro_url;仓储 updateCompanionVoice;详情与 /api/expert/me 返回 voiceIntroUrl/voiceDuration
- 后端: POST /api/companions/:id/voice(音频白名单 mp3/m4a/aac/wav/ogg、5MB、≤60s、限流、仅本人或管理员)
- 小程序: api.uploadVoiceIntro(uni.uploadFile + 用户令牌);工作台新增「语音介绍」卡片(录制/重录/试听,60s mp3);详情页改为 uni.createInnerAudioContext 真实播放,卸载销毁
- 修复 uploadImage 未携带用户令牌(生产 fail-closed 后会导致上传失败)
- 新增 voice-intro.spec.ts(104 套件/701 用例全绿);冒烟 7/7
2026-10-20 18:25:11 +08:00
xcbyy
d06bf11740 security: 危险兜底默认关闭(secure by default)——修复 NODE_ENV 未设导致的身份伪造/沙箱支付/隐私泄露
根因:线上 NODE_ENV 未设为 production 时,以下"开发兜底"全部自动生效:
- resolveSecureUserId 信任客户端声明的 userId → 任意用户身份伪造
- ALLOW_SANDBOX_PAY = ... || !IS_PRODUCTION → 无真实收款即可推进订单(资损)
- GET /api/users/:id 按"本人"返回余额/佣金/手机号 → 隐私泄露

修复(兜底改为必须显式开启):
- 新增 ALLOW_INSECURE_DEV_AUTH(默认 false);resolveSecureUserId 改为 `if (IS_PRODUCTION || !ALLOW_INSECURE_DEV_AUTH) 401`
- ALLOW_SANDBOX_PAY 改为仅 `process.env.ALLOW_SANDBOX_PAY === '1'`
- assertCompanionActor 与用户资料"本人视角"兜底加 ALLOW_INSECURE_DEV_AUTH 限制
- /api/health 新增 mode 与 sandboxPayAllowed;启动自检打印两个危险开关并告警
- 文档补充危险开关说明(生产禁止开启)

验证:本地模拟 NODE_ENV 未设 → 通知/订单/下单 均 401、用户资料不泄露隐私、沙箱支付关闭;
开启 ALLOW_INSECURE_DEV_AUTH=1 后联调能力保留;production 模式行为一致。(冒烟 13/13)
新增 secure-default-auth.spec.ts(103 套件/696 用例全绿)
2026-10-20 16:35:04 +08:00
xcbyy
e09f072f55 security: /api/health 暴露运行模式与沙箱支付开关(便于发现生产跑成 development)
- health 新增 mode(production/development) 与 sandboxPayAllowed
- 便于部署自检:非 production 时身份校验放宽且允许沙箱支付,属资损级配置风险
- 新增 runtime-mode-selfcheck.spec.ts(102 套件/691 用例全绿)
2026-10-20 16:04:09 +08:00
xcbyy
f3ea26d161 feat(admin): 方案A—消息铃铛接真实待办聚合 + 清理空壳接口与空卡片
【消息铃铛(真实数据)】
- POST /api/message/list 改为待办聚合:待接单订单/待审核大神/待审核提现/待处理举报/待仲裁工单(复用 getDashboardTodos + 新增 pendingOrdersCount)
- POST /api/message/read 持久化已读:新表 admin_message_reads 记录"已读时的数量",待办数量增加会重新变未读
- 两个接口均加 requireAdmin(待办数量属运营数据,不再匿名可见)

【删除空壳/死接口(前端已无调用方)】
- /api/user/save-info、/api/chat/list、/api/user/my-team/list、/api/user/latest-activity、/api/user/my-project/list

【后台页面清理】
- 「用户与个人中心 → 管理员资料」移除 我的项目/最近动态/我的团队/站内通知 四张空卡(保留真实的管理员资料头部)
- 删除对应 4 个组件;api/user-center.ts 移除 queryMyProjectList/queryMyTeamList/queryLatestActivity/saveUserInfo;api/message.ts 移除 queryChatList

【验证】
- 新增 admin-todo-bell.spec.ts;更新 admin-demo-data-cleanup.spec.ts
- 全量 101 套件 / 690 用例全绿;冒烟 8/8(未登录50008、待办数量、已读、新增后重新未读)
- 后台 pnpm build 通过
2026-10-20 15:52:04 +08:00
xcbyy
05815b4708 feat(ui): 余下两页接入主题 + 清理后台模板 demo(1+2)
【1. 主题补全】
- pwuniapp/pages/expert/workspace.vue(大神工作台):根节点加 theme class,66 处深色硬编码改为全局主题变量(bg-primary/surface/surface-elevated/text-*/border-subtle/color-brand(-gradient))
- pwuniapp/pages/activity/my-ticket.vue(我的门票):同样接入主题;条码/二维码区域保持黑白(可扫描,不做主题化)
- 两页 onShow 刷新 currentThemeKey,切换主题回到页面即时生效

【2. 后台模板 demo 清理】
- 删除模板路由模块:form / list / profile / result / visualization(原本 hideInMenu 不可见)
- 删除对应 views 目录、api(form/list/profile/visualization/dashboard)、dashboard/monitor
- 删除 src/mock 与全部 views/**/mock.ts,并移除 main.ts 的 `import './mock'`
- 可见工作台移除:content-chart(调用不存在的 /api/content-data)、popular-content(写死假活动数据);分类占比卡片改为整行
- 同步清理 zh-CN/en-US locale 中对应导入与展开

【验证】
- 后台 `pnpm build` 通过,产物显著减小(chart 分块 1026KB→576KB)
- 新增 theme-and-admin-cleanup.spec.ts;更新 dashboard-reality.spec.ts
- 全量 100 套件 / 685 用例全绿
2026-10-20 15:01:50 +08:00
xcbyy
dde3cce562 fix(ui): 下单页背景/卡片/文字跟随全局主题(修复暖色主题下仍是深色底)
- create.vue 原先把整套深色配色写死,仅局部有 .theme-warm 覆盖 → 暖色主题下页面底色/卡片仍是深色
- 统一改用全局主题变量:容器 var(--bg-primary)、卡片 var(--bg-surface)、次级面 var(--bg-surface-elevated)、文字 --text-primary/secondary/muted、描边 --border-subtle、品牌 --color-brand(-gradient)、底部支付栏 --bg-surface-glass
- 替换 15 处深色时代的中性半透明白(rgba(255,255,255,0.03~0.1))为对应主题变量,暖色下不再白上白
- 主按钮渐变改用 var(--color-brand-gradient),暖色下自动变为橙色渐变
- theme-consistency.spec.ts 增加下单页断言(99 套件/682 用例全绿)
2026-10-20 14:00:27 +08:00
xcbyy
4119bfc303 fix(ui): 优化大神详情页底部操作栏布局(不再挤压换行)
- 左侧「私聊/收藏/举报」独立成 bar-actions 组:固定 76rpx 宽、flex-shrink:0、文案 nowrap,杜绝被价格块挤压换行
- 价格块改为右对齐两行展示:小字标签「当前选定」+ 金额(独立 ¥ 符号,大号加粗),不再与标签挤在一行
- 「立即预约」按钮 flex-shrink:0 + min-width 220rpx,胶囊圆角(999rpx),保证任何机型都可点且不被压缩
- 未认证大神的提示改为独立的 guest-tip(右对齐、单行)
- 底部栏高度改为 min-height+内边距并保留安全区;暖色主题同步补充 summary-sym/guest-tip 配色
- 新增回归护栏 detail-bottom-bar.spec.ts(99 套件/681 用例全绿)
2026-10-19 16:00:37 +08:00
xcbyy
d5c50aabe6 fix(order): 修复大神无服务包时下单页崩溃(Cannot read properties of null reading 'title')
- 起因:上一批移除"系统自动生成演示服务包"后,未配置服务包的大神返回空列表,下单页模板直接取 selectedService.title 触发空指针
- 下单页新增 serviceView 安全视图(computed 带兜底对象),模板统一改用 serviceView.title/price/unit,杜绝解引用 null
- 无服务包时按大神基础时薪兜底生成"<品类>基础陪伴服务",保证仍可下单(价格仍由服务端档案价二次校验)
- 详情页取 services[0] 前先判空,并新增"暂未配置服务项目"空态提示
- 新增回归护栏 null-service-guard.spec.ts(98 套件/677 用例全绿)
2026-10-19 15:51:23 +08:00
xcbyy
a1e3a137b6 fix(ui): 修复优惠券页/消息页导航栏位置偏高(标题与返回按钮应贴胶囊行)
- 原因:初版用 padding-top=safe-header-gap + 44px 内容行,把标题推到状态栏下方,顶部留白过大
- 改为与其它页面一致的规范:导航栏总高=var(--safe-header-gap),内容行 position:absolute;bottom:0;height:var(--capsule-height) 贴底对齐胶囊;标题绝对居中(translateX(-50%))
- 页面根改为 height:100vh + flex 纵向布局,列表用 flex:1 撑满剩余空间(tab-bar/滚动区不再按 100vh 硬算)
- 返回按钮对齐既有规范(64rpx 圆形底 + 38rpx 图标)
- 回归 97 套件/674 用例全绿(theme-consistency.spec.ts 增加导航规范断言)
2026-10-19 15:42:18 +08:00
xcbyy
ae569d0ca6 fix(ui): 优惠券页/消息页主题配色跟随全局主题切换
- coupons.vue / notifications.vue 由写死深色改为复用全局 CSS 变量(--bg-primary/--bg-surface/--color-brand-gradient/--text-*/--border-subtle/--nav-bg),随 theme-warm(暖阳晨曦)与默认冷光暗夜自动适配
- 大神工作台新增的服务包表单样式同步复用主题变量
- 新增回归护栏 theme-consistency.spec.ts(97 套件/673 用例全绿)
2026-10-19 15:27:04 +08:00
xcbyy
b70a24327b chore(ops): /api/health 增加 build 与 features 能力清单,便于部署自检
- 线上小程序请求新接口 404 时,可先 curl /api/health 确认线上构建版本与已包含能力
- features 覆盖:用户令牌/后台口令闸门/安全头/限流/5xx脱敏/令牌吊销/通知中心/服务包自助/优惠券/大神搜索
- 回归 96 套件/669 用例全绿
2026-10-19 15:16:32 +08:00
xcbyy
d0d31d0380 feat(search): 大神关键词搜索走服务端(昵称/品类/段位/标签)
- 仓储 getCompanions(keyword?):参数化 LIKE 搜索 name/track/rank_name/tags 及 id 精确匹配
- 接口 /api/companions 支持 ?keyword=(长度截断 40)
- 小程序 api.js getCompanions(keyword) 带 encodeURIComponent;首页监听 searchKeyword 防抖 350ms 走服务端搜索,搜索态以服务端结果为准(含空结果不展示陈旧数据)
- 回归 95 套件/668 用例全绿;冒烟 4/4(昵称/品类命中、无匹配空数组、无关键词向后兼容)
2026-10-19 15:10:11 +08:00
xcbyy
6576c9e4be feat(coupon): 优惠券中心(领取)+ 我的券 + 下单核销/回退
- 新表 user_coupons(快照面额/门槛/类目/有效期)+ orders.user_coupon_id
- 仓储:getCouponsWithClaimed/claimCoupon/getUserCoupons/resolveUserCoupon/consumeUserCoupon/releaseUserCouponByOrder
- 接口:POST /api/marketing/coupons/:id/claim(同券仅一次、受总量限制)、GET /api/marketing/my-coupons(自动标记过期)、券中心带 claimed 标识
- 下单:createOrder 支持 userCouponId(校验归属/门槛/类目/有效期,服务端算抵扣,与订单同事务占用)
- 回退:买家取消/大神拒单/超时退款/仲裁退款 均把券退回为 UNUSED
- 小程序:新增 pages/user/coupons(券中心+我的券)、个人中心入口(可用张数)、下单改为选择"我的券"并传 userCouponId
- 回归 94 套件/666 用例全绿;冒烟 9/9(领取/重复领取409/不存在404/下单抵扣100-10=90/取消回退)
2026-10-19 15:05:56 +08:00
xcbyy
500aac306e feat(expert): 大神服务包自助维护(新增/编辑/删除/上下架)+ 去掉演示服务包
- 后端:新增 POST/PUT/DELETE /api/companions/:id/services[...](仅本人大神或管理员),含名称/单价区间(平台定价规范)/长度/内容安全/每人20个上限校验
- 仓储:createExpertService/updateExpertService/deleteExpertService/countExpertServices/getCompanionByUserId;移除"首次读取自动生成 3 个演示服务包",并在建表后一次性清理历史演示数据
- 新增 GET /api/expert/me:工作台按登录用户解析真实大神档案(不再固定演示 id 101)
- 小程序:api.js 增加 getMyExpertProfile/createExpertService/updateExpertService/deleteExpertService;工作台新增「新增服务」入口、每项「编辑/删除」按钮与服务包表单弹窗,收益/服务统计改用真实大神 id
- 新增回归护栏 expert-service-crud.spec.ts(93 套件/662 用例全绿);冒烟 9/9(含跨大神越权 403、低价 400)
2026-10-19 14:46:05 +08:00
xcbyy
ca7f849b14 feat(notify): 新增站内消息通知中心(订阅消息兜底)+ 清理后台伪造数据
- 新表 user_notifications + 仓储方法(创建/列表/未读数/标记已读)
- 用户接口 GET /api/notifications、POST /api/notifications/read(生产需登录)
- 关键节点落库:订单开始服务/接单/拒单/申请完成/完成结算/提现到账/报名成功/退款受理
- 小程序新增「消息通知」页(pages/user/notifications) + 个人中心入口与未读角标;api.js 增加 getNotifications/markNotificationsRead
- 清理后台伪造数据:/api/user/certification 改空态、/api/user/my-project/list 改空数组、/api/user/info 去掉编造邮箱/电话/网址
- 更新 pages 数量断言(26→27);新增回归护栏 notification-center.spec.ts(92 套件/658 用例全绿);冒烟 9/9
2026-10-19 14:31:11 +08:00
xcbyy
12bbf4fc6b security: 后台登录态可吊销(令牌版本号) + 清理未使用的 prisma 依赖(依赖漏洞 46→0)
- admin token 载荷新增 ver 版本号,与当前版本不一致即失效;版本持久化到 platform_configs,重启/多实例(30s同步)均生效
- 新增 POST /api/admin/session/revoke-all(requireAdmin):一键吊销全部后台登录态;后台右上角新增入口
- 令牌有效期改为可配置 ADMIN_TOKEN_TTL_HOURS(默认由 7 天收紧到 24 小时)
- 移除 server 未使用的 @prisma/client / prisma(server/src 零引用),pnpm 移除 331 个包;pnpm audit --prod 由 46 个漏洞降为 0
- 新增回归护栏 admin-token-revocation.spec.ts(91 套件/653 用例全绿);冒烟 6/6
2026-10-19 14:08:58 +08:00
xcbyy
25d8474877 security: 新增全局限流 + 5xx 错误脱敏 + 兜底错误处理
- 内存级限流器(令牌桶):/api 全局 600/分;写接口单独限流(发帖10、评论20、组局申请20、举报5、上传30、下单20、支付30、充值/提现10、浏览1次/3秒);超限 429+Retry-After
- 5xx 统一脱敏:内部错误仅记服务端日志,对外返回“服务器内部错误”,不再回传 SQL/堆栈/内部原因
- 新增兜底错误处理中间件,避免 Express 默认 HTML 堆栈外泄
- 更新 upload 断言;新增回归护栏 ratelimit-5xx.spec.ts(90 套件/648 用例全绿);冒烟 7/7
- 文档补充限流与错误脱敏说明
2026-10-19 13:50:51 +08:00
xcbyy
a61051fa96 security: 修复公开配置接口泄露密钥(map_location_config/security_words)
- /api/system/configs 无需登录,此前原样下发 map_location_config(腾讯位置服务 SecretKey)与 security_words(风控词库)
- getPlatformConfigs 改为:排除 security_words/map_location_config,并递归剔除 secret/private/apiv3/token/pem/cert/mchid 等敏感字段
- wechat_pay_config 仍仅返回脱敏字段(mode/appId/mchIdConfigured)
- 新增回归护栏 public-config-privacy.spec.ts(89 套件/644 用例全绿);冒烟 5/5
2026-10-19 13:39:04 +08:00
xcbyy
699d2bd951 security: 后台默认口令生产 fail-closed(修复 admin/admin 可登录的高危漏洞)
- 生产环境未配置 ADMIN_PASSWORD(或仍为 admin/admin123)时,后台登录直接 503 拒绝
- 启动自检新增两条告警:未配有效 ADMIN_PASSWORD、非 production 身份校验放宽
- 部署文档补充 ADMIN_PASSWORD/ADMIN_USERNAME 必配说明
- 新增回归护栏 admin-credential-hardening.spec.ts(88 套件/642 用例全绿);冒烟 5/5
2026-10-19 13:36:36 +08:00
xcbyy
b88442af28 fix(subscribe): 修复小程序授权"未获得提醒授权"——避免授权弹窗与公告弹窗重叠
- openNotice 改为串行:先请求订阅授权,等授权弹窗关闭后再展示平台公告(此前两原生弹窗重叠会取消授权,回调全 reject)
- 授权结果区分展示:成功显示已开启项数;未同意提示可在微信设置中重新允许;接口报错显示 errCode
- requestSubscribeAll 单次最多取前3个模板(微信限制),并返回 resultMap 便于排查
- 回归 87 套件/639 用例全绿
2026-10-19 11:36:12 +08:00
xcbyy
c17afd20d5 feat(admin): 模板列表支持「一键按标题填入槽位」,避免手抄长模板ID出错
- 列表每行新增「填入」按钮,按标题(订单/提现/活动报名/核销)自动写入对应槽位
- 顶部新增「一键按标题填入槽位」,批量填入后提示保存落库
- 回归 87 套件/639 用例全绿
2026-10-19 11:27:12 +08:00
xcbyy
c58449ddae fix(subscribe): 模板ID按微信字符集规范化,根治「看起来一样却比对不上/40037」
- 新增 normalizeTemplateId:仅保留 [A-Za-z0-9_-],剔除零宽空格(U+200B)等 trim() 无法清除的不可见字符
- 模板比对、真实下发(notifyBySubscribe)、测试推送、下发小程序的模板ID统一走规范化
- 后台保存 message_template_rules 时落库前规范化,避免脏值再次进入
- 回归 87 套件/638 用例全绿;冒烟 5/5 验证:脏值落库被清洗、下发值无不可见字符
2026-10-19 11:18:12 +08:00
xcbyy
eb592dc1b9 fix(admin): 模板ID匹配改由后端裁决并 trim,修复"ID明明一致却报不属于该小程序"的误报
- 拉取模板列表接口在后端统一 trim 后比对,返回 mismatched 结论(含两侧空白差异场景)
- 后台改为直接展示后端结论,避免前端字符串比对误报
- 回归 87 套件/637 用例全绿
2026-10-19 11:06:47 +08:00
xcbyy
b77827522f fix(config): 占位凭证清理改为一次性(标记位保护),避免误清管理员填写的真实 AppID
- 历史占位 appId/appSecret 的清理由"每次启动执行"改为"仅首启执行一次",写入 wechat_pay_placeholder_cleaned 标记
- 此后即使管理员填写的 AppID 恰好等于旧占位值(本账真实 AppID),重启也不会被再次清空
- 「拉取小程序模板列表」缺凭证时错误提示改为可操作指引(指明填写位置)
- 回归 87 套件/636 用例全绿;冒烟 5/5 验证 Phase A 首启清理、Phase B 重启保留
2026-10-19 11:00:23 +08:00
xcbyy
01823a1db4 security: 移除硬编码微信小程序 appId/appSecret,改为只读配置+缺失即失败
- 后端不再兜底内置 appId/appSecret,缺失时 jscode2session/手机号/支付/内容审核等接口明确拒绝(fail-closed)
- 建表种子改为空值;启动自愈由「写入占位值」改为「清空历史占位值」,杜绝误用非本小程序 appId(40037 根因)
- 后台/引导文案去除具体 AppID;文档补充 WX_APP_ID/WX_APP_SECRET 说明
- 新增回归护栏 wechat-appid-config-hardening.spec.ts(87 套件/636 用例全绿);HTTP 冒烟 4/4 验证缺失即失败
2026-10-19 10:33:31 +08:00
xcbyy
584e526bca feat(subscribe): 新增拉取小程序真实模板列表诊断(定位40037)
- 新增 GET /api/admin/message/templates:调用 wxaapi/newtmpl/gettemplate 返回当前 appId(脱敏) 下真实模板列表,并标出后台已填但不在列表中的ID

- 测试推送 diagnostics 增加 appIdMasked,便于核对 appId

- 后台新增「拉取小程序模板列表(核对ID)」按钮与不匹配高亮提示

- 文档补充 40037 排查步骤;回归 86 套件/632 用例全绿
2026-10-19 10:26:10 +08:00
xcbyy
cacc478d71 fix(subscribe): 订阅消息未下发原因可见 + 小程序真实授权
- 后台测试推送:未就绪返回 mode=SIMULATED 明确原因 + 配置自检(模板ID/openid/appId/appSecret/总开关),不再把模拟显示为成功

- 占位符 tmpl_xxx 视为未配置(测试推送与订阅模板接口均过滤),微信错误码中文化(43101/47003/40037/40001 等)

- 小程序「平台消息与通知」点击时真实调用 wx.requestSubscribeMessage 并回显授权状态,标签不再恒为已开启

- 管理端拦截器错误提示改用 message;文档补订阅消息排查顺序;新增回归护栏(86 套件/631 用例全绿)
2026-10-19 10:02:57 +08:00
xcbyy
0aed11cb01 security: CORS 收敛为白名单 + 基础安全响应头 + 隐藏技术栈
- CORS 默认仅同源可用,跨域需显式配置 CORS_ORIGINS(非生产默认放行 localhost:5173)

- 新增安全响应头:X-Content-Type-Options / X-Frame-Options / Referrer-Policy / X-XSS-Protection / Permissions-Policy;生产附加 HSTS

- 关闭 X-Powered-By,设置 trust proxy

- 文档补充 CORS_ORIGINS;新增回归护栏 cors-security-headers.spec.ts(85 套件/627 用例全绿)
2026-10-19 09:31:44 +08:00
xcbyy
cbf77a7252 perf(db): 高频查询补索引 + 大列表加合理上限(避免全表下发)
- 启动建表后幂等补索引:orders/finance_records/users/reports/companions/payment_intents/payment_refunds 等高频查询列

- 管理端订单/财务流水/用户列表 LIMIT 500,友圈/评价列表 LIMIT 200,防止无界查询

- expert_services 懒建表后补 expert_id 索引

- 新增回归护栏 list-pagination-index.spec.ts(84 套件/625 用例全绿)
2026-10-19 09:28:02 +08:00
xcbyy
d665cd6976 feat(order): 订单超时自动流转改为后台定时任务
- 新增 startOrderTimeoutScheduler:默认每 60s 扫描(ORDER_TIMEOUT_SCAN_MS 可配,DISABLE_ORDER_TIMEOUT_SCAN=1 可禁用),带防重入与 unref

- 启动时自动开启;移除订单查询接口里的被动扫描,避免每次请求触发

- 文档补充定时扫描环境变量;新增回归护栏 order-timeout-scheduler.spec.ts(83 套件/622 用例全绿)
2026-10-19 09:22:52 +08:00
xcbyy
85e00e296f fix(companion): 去除合成虚拟大神的假评分/价格/服务(改为诚实档案)
- getCompanionById 对非真实大神档案不再虚构 rating/orderCount/price/voice/服务包,状态为休息中、审核未申请,并返回 isCompanion=false

- 小程序大神详情页对非大神档案隐藏服务与预约入口,显示'该用户尚未认证为大神';移除页面假默认值

- 新增回归护栏 companion-profile-honesty.spec.ts(82 套件/619 用例全绿)
2026-10-19 09:19:15 +08:00
xcbyy
f1f8952e97 chore(admin): 清理后台静态演示数据(我的团队/最新动态/通知中心返回空)
- /api/user/my-team/list 不再返回硬编码团队成员,改为空数组

- /api/user/latest-activity 不再返回硬编码动态,改为空数组

- /api/message/list 不再返回硬编码站内消息,改为空数组

- 新增回归护栏 admin-demo-data-cleanup.spec.ts(81 套件/617 用例全绿)
2026-10-19 09:08:21 +08:00
xcbyy
029c6189a7 feat(mini): 下单/提现/报名前补订阅消息授权(提升微信服务通知到达率)
- 新增 common/subscribe.js:页面预加载模板ID + 点击动作中同步请求授权(避免 await 丢失手势上下文)

- 下单支付前请求订单状态/核销码模板;提现前请求到账模板;组局报名确认后请求报名模板

- 自动过滤 tmpl_ 占位模板;授权失败不阻塞业务

- 新增回归护栏 subscribe-authorization.spec.ts(80 套件/615 用例全绿)
2026-10-19 09:01:36 +08:00
xcbyy
1ff4da290a feat(data): 新增历史数据归属订正脚本(默认 dry-run,--apply 写库)
- companions.user_id:按昵称唯一匹配用户回填(避免重复占用)

- finance_records.user_id:按充值/提现/订单/对手方规则回填,无法唯一确定则保留不填

- 默认仅预览,幂等可重复执行;新增 npm 脚本 backfill:ownership 与回归护栏

- 文档补充订正说明(79 套件/611 用例全绿)
2026-10-19 08:58:24 +08:00
xcbyy
c90b0bd44e fix(order): 抢单收紧为仅「待接单」可抢,抢单池同步过滤
- claimOrder 状态闸门改为严格只允许 待接单(含 CAS 条件 status='待接单'),杜绝抢已在履约/已服务/已核销的订单

- getOrdersPool 仅返回未认领的 待接单 订单

- 种子数据新增一笔待接单订单用于演示抢单

- 更新/新增回归护栏 claim-status-gate.spec.ts(78 套件/608 用例全绿)
2026-10-19 08:54:28 +08:00
xcbyy
8edffbefa2 feat(pay): 接入微信支付V3原路退款(按支付渠道分流 + 幂等 + 退款回调)
- 新增微信退款客户端 createRefund/queryRefundByOutRefundNo(/v3/refund/domestic/refunds)

- 新增退款桥接模块与 payment_refunds 幂等退款记录表

- 订单退款按渠道分流:微信支付原路退回微信;余额支付退回钱包余额;微信退款失败(502)不回退余额,防重复退款

- 覆盖拒单/买家取消/仲裁全额与部分/超时自动退款;新增 /api/pay/wechat/refund-notify 回调

- 后台新增退款回调地址配置;文档补充退款验收说明

- 新增回归护栏 wechat-refund.spec.ts(77 套件/605 用例全绿)
2026-10-19 08:47:08 +08:00
xcbyy
e719de59a2 feat(mini): 平台规范与服务协议页面化(页内切换,替代弹窗)
- 个人中心'平台规范与服务协议'点击直接进入 /pages/common/protocol(不再 showActionSheet 选择)

- 协议页新增页内切换:用户服务协议 / 隐私保护指引(含暖阳主题适配)

- 新增回归护栏 protocol-page.spec.ts(76 套件/601 用例全绿)
2026-10-17 18:04:33 +08:00
xcbyy
2599dce315 feat(security): 三端闭环加固 + 微信提现打款/订阅消息落地
后端: 身份与归属鉴权收口; 资金安全(结算闸门/支付防篡改/报名费真实扣款/赠金/结算唯一入账/提现打款); 数据泄露与隐私; 登录与密钥安全(默认密钥闸门/登录限流); 可观测性; 启动自检.

微信: 商家转账到零钱提现打款闭环(含回调/查单/失败退回佣金); 订阅消息真实下发闭环与后台模板字段对齐.

后台: 财务/微信支付配置读取失败锁定; 看板/待办/走势去假数据; 打款与测试推送文案修正.

小程序: 请求层错误透传与登录过期提示; 多页失败反馈与乐观回滚; 帮助中心FAQ页面化.

测试: 新增 40+ 回归护栏与真实 MySQL 冒烟(75 套件/599 用例全绿).
2026-10-17 18:00:09 +08:00
xcbyy
78117bb4e1 feat: security hardening, wechat pay v3 platform cert integration, companion certification revocation, and audit closed-loop 2026-10-16 17:38:17 +08:00
xcbyy
3bf38db8b6 feat(order): complete 7.1 order full lifecycle state transitions, 15m/30m/48h auto-timeouts, expert reject/apply-complete, and partial refund arbitration 2026-10-14 15:52:56 +08:00
xcbyy
a14f27d641 feat(spec-3): complete section 3.1/3.2/3.3 activity verify settlement, role_flags, and distribution_relations 2026-10-14 11:41:03 +08:00
xcbyy
51c19d6063 feat(closed-loop): complete end-to-end closed loops across miniapp, backend, and admin 2026-10-14 10:13:50 +08:00
xcbyy
010edc130f fix: 完善全系统业务闭环(大神入驻联动用户角色、服务评价人工下架监管、友圈搭子上车审核与抽屉) 2026-10-13 18:04:27 +08:00
xcbyy
173835dc4e fix(business-loop): complete arbitration balance refund, withdrawal rejection compensation, admin activity takedown, and companion violation alerts 2026-10-13 17:18:11 +08:00
xcbyy
9e2c19088b fix(report): optimize wechat toast length limit and add admin violation reports management center 2026-10-13 17:08:25 +08:00
xcbyy
56e672219e fix(modal): resolve premature modal closing caused by unsupported click.self in wechat miniprogram 2026-10-13 16:54:55 +08:00
xcbyy
d08acc052a feat(community): combine marquee scroll with detail modal for pinned notice 2026-10-13 16:35:35 +08:00
xcbyy
859b224d65 feat(expert): adapt expert detail page to dual-theme system with theme-warm support 2026-10-13 16:08:48 +08:00
xcbyy
1853e653fb fix(core): comprehensive fix for state loss across activity, ticket, workspace, favorites and community 2026-10-13 16:01:19 +08:00