feat(store): 新增门店中心及VIP会员升级功能
- 个人信息页新增门店名称和门店地址展示,支持异步加载与只读显示 - 用户信息卡片整体改为绿色渐变背景,添加光晕和白色边框样式 - 新增升级VIP会员入口,突出展示并添加推荐标签 - 新建VIP会员升级页面,包含门店信息表单和VIP权益预览 - 提交升级申请调用新增api,支持状态检测表单只读 - 门店中心页面重构,简化订单管理,新增功能卡片及VIP审核入口 - 页面加载校验店员身份,非店员拒绝访问并提示 - 购物相关页面和组件全面支持VIP会员价格优先显示dealerPrice - 新增ShopDealerApply模型门店相关字段,丰富会员申请数据记录
This commit is contained in:
@@ -6,3 +6,26 @@
|
||||
- 角色以蓝色圆角徽章形式展示在昵称下方,与会员等级徽章并排
|
||||
- 支持多角色展示(flex-wrap),支持下拉刷新同步更新
|
||||
- 登录/退出/API失败等边界情况均已处理
|
||||
|
||||
## 个人信息页新增门店名称和门店地址展示
|
||||
- 在 `src/pages/user/profile.tsx` 中新增两个只读字段:门店名称、门店地址
|
||||
- 通过 `getMyStore()` API (`GET /shop/shop-store/my-store`) 获取当前用户关联的门店信息
|
||||
- 在页面挂载时(user 可用后)异步加载,无门店关联时显示"暂无"
|
||||
- 门店名称存储到 `sys_user.merchantName`,门店地址存储到 `sys_user.address`
|
||||
- 门店地址改为普通 Input 手输(与门店名称一致)
|
||||
|
||||
## 用户信息卡片绿色渐变背景
|
||||
- user.tsx 用户信息卡片改为绿色渐变背景 (#15803d → #22c55e → #4ade80)
|
||||
- 添加装饰光晕效果,头像加白色边框,文字全部白色
|
||||
- 徽章、数据概览、骨架屏颜色均适配绿色主题
|
||||
|
||||
## 新增升级VIP会员功能
|
||||
- 在 user.tsx 功能菜单中"我的钱包"上方新增"升级VIP会员"入口
|
||||
- 入口使用金色渐变背景 + "推荐"红色标签,与普通菜单明显区分
|
||||
- 新建 `src/pages/user/vip-upgrade/index.tsx` 页面
|
||||
- 页面含绿色渐变顶部、提示卡片、门店名称+门店地址表单、VIP权益预览
|
||||
- 保存时调用 `addShopDealerApply` API 提交到 `shop_dealer_apply` 表
|
||||
- `ShopDealerApply` model 新增 `merchantName` 和 `address` 字段
|
||||
- 提交时设置 `applyType: 10`(需后台审核)、`applyStatus: 10`(待审核)
|
||||
- 页面加载时检查已有申请记录:待审核/已通过时表单只读,隐藏提交按钮,显示状态提示
|
||||
- 已在 `app.config.ts` 中注册页面路由
|
||||
|
||||
76
.workbuddy/memory/2026-07-04.md
Normal file
76
.workbuddy/memory/2026-07-04.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# 2026-07-04 工作日志
|
||||
|
||||
## VIP会员审核功能开发
|
||||
|
||||
### 功能概述
|
||||
为 xinlong-shop-taro 小程序新增了 VIP 会员审核功能,包含以下三个核心模块:
|
||||
|
||||
### 1. VIP会员审核菜单入口(user.tsx)
|
||||
- 在"门店中心"下方添加了"VIP会员审核"菜单项
|
||||
- 仅门店店员身份显示(与门店中心相同的 `storeInfo` 判断条件)
|
||||
- 点击跳转到 `/pages/user/vip-review/index`
|
||||
- 同时在页面加载、useDidShow、下拉刷新时调用 `checkAndCacheVipStatus` 更新当前用户的 VIP 状态缓存
|
||||
|
||||
### 2. VIP会员审核页面(vip-review/index.tsx)
|
||||
- 新建页面 `src/pages/user/vip-review/index.tsx`
|
||||
- 页面进入时验证当前用户是否为店员(通过 `getMyClerk()`)
|
||||
- 三个 Tab:待审核(applyStatus=10)、已通过(20)、已驳回(30)
|
||||
- 展示申请人的门店名称、门店地址、申请时间
|
||||
- 店员可"通过"(设 applyStatus=20)或"驳回"(设 applyStatus=30,附带驳回原因)
|
||||
- 使用 `updateShopDealerApply` API 进行审核操作
|
||||
- 与 vip-upgrade/index.tsx 配套:用户提交申请 → 店员实地考察 → 审核通过/驳回
|
||||
|
||||
### 3. VIP会员价格特权(dealerPrice)
|
||||
- 创建了 VIP 状态工具 `src/utils/vip.ts`:
|
||||
- `isVipMember()` - 同步从缓存读取 VIP 状态
|
||||
- `checkAndCacheVipStatus(userId)` - 异步检查并缓存(查询 ShopDealerApply applyStatus=20)
|
||||
- `getDisplayPrice(product)` - 获取商品对当前用户的实际价格
|
||||
- 创建了 `src/hooks/useVipStatus.ts` Hook
|
||||
- 修改了以下页面/组件支持 VIP 显示 dealerPrice:
|
||||
- `ProductCard` - 商品列表卡片价格
|
||||
- `product-detail.tsx` - 商品详情页价格 + 立即购买传参
|
||||
- `SkuSelector` - SKU 选择弹窗价格 + 确认时 fakeSku 价格
|
||||
- `cart.tsx` - 购物车商品价格 + 推荐商品价格
|
||||
- `CartContext.tsx` - `calcPrice` 计算总价时使用 dealerPrice
|
||||
- `checkout.tsx` - 结算页金额计算 + 单价显示
|
||||
|
||||
### 4. 路由注册
|
||||
- 在 `app.config.ts` 中注册了 `pages/user/vip-review/index`
|
||||
|
||||
### 5. VIP升级页字段来源修正
|
||||
- 修改 `vip-upgrade/index.tsx`
|
||||
- 门店名称和门店地址不再从 `user` 对象读取,统一从 `shop-dealer-apply` 表最新记录读取
|
||||
- 待审核(10) 和 已通过(20) 时只读展示;已驳回(30) 时允许编辑并重新提交
|
||||
- TypeScript 类型检查通过
|
||||
|
||||
### 6. 审核通过时添加 VIP 角色
|
||||
- 在 `vip-review/index.tsx` 中新增了 `assignVipRole` 辅助函数
|
||||
- 审核通过(applyStatus=20)后,自动调用 `addUserRole` 给申请人添加 `VIP会员` 角色(roleId=2032, roleCode=vip)
|
||||
- 先调用 `listUserRole({ userId })` 检查用户是否已有 VIP 角色,避免重复绑定
|
||||
- TypeScript 类型检查通过
|
||||
|
||||
### 7. 门店中心改造为仪表盘
|
||||
- 将 `store/center/index.tsx` 从订单管理页改造为功能入口仪表盘
|
||||
- 新建 `store/orders/index.tsx`,将原订单管理逻辑完整搬入
|
||||
- VIP会员审核入口从 `user.tsx` 独立菜单移除,统一放入门店中心仪表盘
|
||||
- 门店中心仪表盘功能卡片支持扩展(FEATURE_CARDS 数组,新增只需加一项)
|
||||
- VIP会员审核卡片显示待审核数量角标(红底白字)
|
||||
- TypeScript 类型检查通过
|
||||
|
||||
### 8. 门店中心顶部显示店员头像和门店名称
|
||||
- 修改 `store/center/index.tsx` 顶部信息区
|
||||
- 左侧显示圆形店员头像(读取 `storeInfo.avatar`),无头像时显示默认 👤 图标
|
||||
- 右侧显示门店名称(`storeInfo.storeName`)和店员姓名 + 手机号(`storeInfo.name`、`storeInfo.phone`)
|
||||
- TypeScript 类型检查通过
|
||||
|
||||
### 涉及文件(补充)
|
||||
- 修改:`src/pages/store/center/index.tsx`
|
||||
|
||||
### 9. 商品详情页价格下方 0 值隐藏
|
||||
- 修改 `product-detail.tsx` 价格区域
|
||||
- 给 `dealerPrice`、`salePrice`、`memberStorePrice` 增加 `Number(value) > 0` 判断
|
||||
- 0 或无效值时不再渲染,避免价格下方出现单独的 "0"
|
||||
- TypeScript 类型检查通过
|
||||
|
||||
### 涉及文件(补充)
|
||||
- 修改:`src/pages/shop/product-detail.tsx`
|
||||
27
.workbuddy/memory/MEMORY.md
Normal file
27
.workbuddy/memory/MEMORY.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# 项目长期记忆
|
||||
|
||||
## 项目概述
|
||||
- 项目名:xinlong-shop-taro(Taro 微信小程序商城)
|
||||
- 技术栈:Taro + React + TypeScript + Tailwind CSS
|
||||
- 后端 API 前缀:`/shop/`、`/api/`
|
||||
- 门店店员身份判断:通过 `getMyClerk()` API (`/shop/shop-store-user/my`) 返回值判断
|
||||
- VIP/分销商申请记录表:`ShopDealerApply`,状态码 10待审核/20通过/30驳回
|
||||
|
||||
## 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 Hook:`src/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`
|
||||
Reference in New Issue
Block a user