feat(store): 新增门店中心及VIP会员升级功能

- 个人信息页新增门店名称和门店地址展示,支持异步加载与只读显示
- 用户信息卡片整体改为绿色渐变背景,添加光晕和白色边框样式
- 新增升级VIP会员入口,突出展示并添加推荐标签
- 新建VIP会员升级页面,包含门店信息表单和VIP权益预览
- 提交升级申请调用新增api,支持状态检测表单只读
- 门店中心页面重构,简化订单管理,新增功能卡片及VIP审核入口
- 页面加载校验店员身份,非店员拒绝访问并提示
- 购物相关页面和组件全面支持VIP会员价格优先显示dealerPrice
- 新增ShopDealerApply模型门店相关字段,丰富会员申请数据记录
This commit is contained in:
2026-07-04 10:26:47 +08:00
parent 2deaaffe13
commit 994695c405
19 changed files with 1744 additions and 632 deletions

68
src/utils/vip.ts Normal file
View File

@@ -0,0 +1,68 @@
import Taro from '@tarojs/taro'
import { listShopDealerApply } from '@/api/shop/shopDealerApply'
const VIP_STORAGE_KEY = 'is_vip_member'
/**
* 从本地缓存读取 VIP 状态
*/
export function getVipStatusFromCache(): boolean {
return Taro.getStorageSync(VIP_STORAGE_KEY) === true
}
/**
* 写入 VIP 状态到本地缓存
*/
export function setVipStatus(isVip: boolean) {
Taro.setStorageSync(VIP_STORAGE_KEY, isVip)
}
/**
* 同步检查 VIP 状态(从缓存读取,无网络请求)
* 用于价格展示等需要即时判断的场景
*/
export function isVipMember(): boolean {
return getVipStatusFromCache()
}
/**
* 异步检查 VIP 状态并更新缓存
* 通过查询 ShopDealerApply 记录判断applyStatus === 20 表示已通过)
* @param userId 用户ID
*/
export async function checkAndCacheVipStatus(userId?: number): Promise<boolean> {
if (!userId) {
// 尝试从 storage 获取 userId
const uid = Taro.getStorageSync('UserId')
if (!uid) {
setVipStatus(false)
return false
}
userId = uid
}
try {
const list = await listShopDealerApply({ userId })
const approved = (list || []).some(item => item.applyStatus === 20)
setVipStatus(approved)
return approved
} catch {
// 请求失败时保持原缓存值
return getVipStatusFromCache()
}
}
/**
* 获取商品对当前用户的实际购买价格
* VIP 会员返回 dealerPrice普通用户返回 price
*/
export function getDisplayPrice(product: {
dealerPrice?: string
price?: string
salePrice?: string
}): string {
if (isVipMember() && product.dealerPrice) {
return product.dealerPrice
}
return product.price || product.salePrice || '0'
}