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

69 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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'
}