Files
xinlong-shop-taro/.workbuddy/memory/MEMORY.md
赵忠林 6dafbf47c9 fix(privacy): 修复微信隐私协议chooseImage报错问题
- 调整requiredPrivateInfos字段,仅保留位置类API白名单
- 在uploadFile中添加ensurePrivacyAuthorized预检逻辑,避免权限缺失导致失败
- 在app.tsx的useLaunch生命周期中注册Taro.onNeedPrivacyAuthorization回调,实现自定义协议弹窗交互
- 提示需在小程序管理后台配置“开发者收集你的相册/摄像头”声明,避免首次调用弹窗
- 警告requiredPrivateInfos不可添加非位置类API,防止app.json解析失败
- 说明直接调用Taro.chooseImage的页面需单独添加预检措施
2026-07-14 23:46:29 +08:00

5.0 KiB
Raw Blame History

项目长期记忆

项目概述

  • 项目名xinlong-shop-taroTaro 微信小程序商城)
  • 技术栈Taro + React + TypeScript + Tailwind CSS
  • 后端 API 前缀:/shop//api/
  • 门店店员身份判断:通过 getMyClerk() API (/shop/shop-store-user/my) 返回值判断
  • VIP/分销商申请记录表:ShopDealerApply,状态码 10待审核/20通过/30驳回

用户状态与禁用机制

  • 用户状态字段:User.status0 = 正常,1 = 禁用
  • 禁用接口:updateUserStatus(userId, status) → PUT /system/user/status
  • 禁用拦截工具:src/utils/auth.tsisUserDisabled(user)blockDisabledUser(user)
  • 拦截层级UserContext 启动异步校验 + refreshUser/syncFromStorage/loginUser 检查 + 登录 API 和登录页检查
  • 用户管理页:src/pages/store/users/index.tsx(门店中心入口,支持搜索/筛选/查看详情/禁用启用)

VIP 会员机制

  • 用户在 vip-upgrade 页面提交门店名称和地址申请
  • 门店店员在 vip-review 页面审核(通过/驳回)
  • VIP 会员特权:商品显示 dealerPrice 价格,下单使用该价格结算
  • VIP 状态判断:isVipMember() 从 localStorage 缓存读取,checkAndCacheVipStatus(userId) 异步更新

商品价格字段约定

  • product.price - 到手价(主价格)
  • product.salePrice - 市场价(划掉的)
  • product.dealerPrice - VIP 会员专享价
  • product.memberStorePrice - 会员价

关键文件位置

  • VIP 工具:src/utils/vip.ts
  • VIP Hooksrc/hooks/useVipStatus.ts
  • VIP 审核页:src/pages/user/vip-review/index.tsx
  • VIP 升级页:src/pages/user/vip-upgrade/index.tsx
  • 门店中心:src/pages/store/center/index.tsx
  • 购物车 APIsrc/api/shop/shopCart/index.ts(批量删除接口 /shop/shop-cart/batch 后端期望直接接收 ArrayList<Integer>[1,2,3],不要用 { ids } 包裹)
  • 购物车 Contextsrc/contexts/CartContext.tsx

订阅消息

  • 模板 IDsh1K9iK7vZjebUNFu6OsMsnsJxm4whThWGrhN7I4zVg(交易提醒)
  • 字段:订单号(character_string1)、商品名称(thing4)、联系人(thing10)、联系电话(phone_number7)、送货地址(thing8)
  • 场景说明:下单提醒
  • 新订单检测 Hooksrc/hooks/useNewOrderDetector.ts30秒轮询页面隐藏暂停

微信隐私协议(基础库 3.16.1+ 强制)

  • 报错特征:chooseImage:fail api scope is not declared in the privacy agreement + errno:112
  • 两处代码修复:
    1. 调用 Taro.chooseImage 前必须先 getPrivacySettingrequirePrivacyAuthorize 预检(封装在 src/api/system/file/index.tsensurePrivacyAuthorized() 里)
    2. src/app.tsxuseLaunch 中注册 Taro.onNeedPrivacyAuthorization 回调(用 showModal 自定义弹窗)
  • 一处手动配置:小程序管理后台 → 设置 → 第三方设置 → 用户隐私保护指引 → 添加「开发者收集你的相册/摄像头」声明
  • ⚠️ requiredPrivateInfos 字段只接受位置类 API 白名单chooseAddress/chooseLocation/choosePoi/getFuzzyLocation/getLocation/onLocationChange/startLocationUpdate/startLocationUpdateBackground不要加 chooseImage/chooseMedia 等非位置类,会导致 app.json 解析失败
  • 直接调 Taro.chooseImage 的页面:pages/order/evaluate/index.tsxpages/after-sale/apply/index.tsxpages/store/orders/index.tsx —— 这些页面绕过了 uploadFile,需要单独加 ensurePrivacyAuthorized 预检

分享 / 朋友圈能力2026-07-13 接入)

  • 统一封装:src/hooks/useShare.tsuseShare({title, path?, query?, imageUrl?, enableTimeline?, enableCopyUrl?}),一次注册 useShareAppMessage + useShareTimeline + 可选 onCopyUrl 复制链接;自动在 path/query 追加 inviter=${当前用户id} 做裂变归因;isTimelineSinglePage() 判断朋友圈单页模式 scene===1154
  • 海报组件:src/components/SharePoster/index.tsxCanvas 2D 绘制封面+标题+价格+小程序码,返回临时图路径作 imageUrl
  • 小程序码接口:src/api/share.ts generateShareCode(page, inviterId) 复用 generateMiniProgramCodescene 用 uid_${inviterId}page 透传但后端需读取转发才生效)
  • 裂变约定:分享链接 query 用 inviter,与 src/utils/invite.tsparseInviteParams 读取字段一致
  • 已接入页面:商品详情、积分商品、拼团、秒杀、活动、赛事(带 canvas 海报邀请下级、分销推广、升级VIP、分享赚佣金仅 enableShare + useShare无海报首页好友+朋友圈+复制链接三按钮全亮)
  • 注意tabBar 页也支持朋友圈分享(之前误判已纠正)——只要 config 开 enableShareTimeline + 定义 onShareTimeline 即显示按钮;"tabBar 不渲染"仅指朋友圈打开后的单页模式里底部 tabBar 不显示。朋友圈/复制链接开发者工具可能看不到入口,必须真机测试。复制链接是 Beta基础库 2.14.3+)。