feat(user): 改为动态查询 VIP 角色ID,避免写死角色ID
- RoleParam 类型新增 tenantId 字段,支持按租户过滤角色 - 新增 getCurrentTenantId 获取当前租户ID,支持登录态和默认租户回退 - 实现 getVipRoleId 函数,按 roleCode 与 tenantId 查询 VIP 角色ID - assignVipRole 中动态获取 VIP 角色ID,避免硬编码 - 添加用户角色时带上 tenantId,确保多租户角色绑定正确 - 移除写死的 VIP_ROLE_ID,改用动态查询结果,提高跨租户兼容性 - 补充引入 listRoles 和 TenantId,完善相关依赖引用
This commit is contained in:
31
.idea/workspace.xml
generated
31
.idea/workspace.xml
generated
@@ -4,9 +4,8 @@
|
|||||||
<option name="autoReloadType" value="SELECTIVE" />
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="2de94e4f-0587-4c9b-8bfd-e87e0ae95b81" name="更改" comment="feat(passport): 迁移并修复小程序支付页面访问 websopy API 问题 - 迁移 src/passport/pay 相关代码至当前项目,无需替换文件 - 新增环境变量 WEBSOPY_API_BASE_URL,提供 websopy API 基础地址 - 在 config/app.ts 导出 WebsopyBaseUrl,供代码引用 - 配置 env.d.ts 类型定义,消除 TypeScript 隐式 any 错误 - request 请求方法支持自定义 baseUrl 以调用不同接口地址 - passport/pay 页面调用订阅接口统一传入 WebsopyBaseUrl - 修正 tenantId 类型为 number,调整登录用户类型断言 - 确认编译成功,dist 目录生成对应文件及正确请求地址 - 说明 type-check 依赖库问题不影响正常构建和运行">
|
<list default="true" id="2de94e4f-0587-4c9b-8bfd-e87e0ae95b81" name="更改" comment="feat(passport): 优化支付成功后页面跳转逻辑 - 修改支付成功后的自动跳转目标,从已购产品页面改为我的页面 - 使用 switchTab 替代 navigateTo 保证在 tabBar 页顺利跳转 - 移除多余的跳转失败回退逻辑,简化跳转流程 - 调整跳转延迟时间为 1500 毫秒,提升用户体验">
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/src/passport/pay/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/passport/pay/index.tsx" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@@ -38,15 +37,17 @@
|
|||||||
"junie.onboarding.icon.badge.shown": "true",
|
"junie.onboarding.icon.badge.shown": "true",
|
||||||
"last_opened_file_path": "/Users/gxwebsoft/VUE/websopy-taro/src/passport",
|
"last_opened_file_path": "/Users/gxwebsoft/VUE/websopy-taro/src/passport",
|
||||||
"node.js.detected.package.eslint": "true",
|
"node.js.detected.package.eslint": "true",
|
||||||
|
"node.js.detected.package.stylelint": "true",
|
||||||
"node.js.detected.package.tslint": "true",
|
"node.js.detected.package.tslint": "true",
|
||||||
"node.js.selected.package.eslint": "(autodetect)",
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
|
"node.js.selected.package.stylelint": "/Users/gxwebsoft/VUE/websopy-taro/node_modules/stylelint",
|
||||||
"node.js.selected.package.tslint": "(autodetect)",
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
"nodejs_package_manager_path": "pnpm",
|
"nodejs_package_manager_path": "pnpm",
|
||||||
"npm.build:weapp.executor": "Run",
|
"npm.build:weapp.executor": "Run",
|
||||||
"npm.dev:weapp.executor": "Run",
|
"npm.dev:weapp.executor": "Run",
|
||||||
"settings.editor.selected.configurable": "preferences.pluginManager",
|
"settings.editor.selected.configurable": "preferences.pluginManager",
|
||||||
"to.speed.mode.migration.done": "true",
|
"to.speed.mode.migration.done": "true",
|
||||||
"ts.external.directory.path": "/Applications/WebStorm.app/Contents/plugins/javascript-plugin/jsLanguageServicesImpl/external",
|
"ts.external.directory.path": "/Users/gxwebsoft/VUE/websopy-taro/node_modules/typescript/lib",
|
||||||
"vue.rearranger.settings.migration": "true"
|
"vue.rearranger.settings.migration": "true"
|
||||||
}
|
}
|
||||||
}</component>
|
}</component>
|
||||||
@@ -115,15 +116,7 @@
|
|||||||
<workItem from="1784093204572" duration="6082000" />
|
<workItem from="1784093204572" duration="6082000" />
|
||||||
<workItem from="1784131049625" duration="2304000" />
|
<workItem from="1784131049625" duration="2304000" />
|
||||||
<workItem from="1784133736973" duration="4614000" />
|
<workItem from="1784133736973" duration="4614000" />
|
||||||
<workItem from="1784585070286" duration="1665000" />
|
<workItem from="1784585070286" duration="3047000" />
|
||||||
</task>
|
|
||||||
<task id="LOCAL-00007" summary="fix(passport): 优化登录确认成功后的页面跳转逻辑 - 延长登录确认成功提示的显示时间至2000毫秒 - 跳转到用户页面前先隐藏toast,避免影响跳转体验 - 增加switchTab成功和失败的日志打印 - 失败时提示用户手动返回页面 - 调整跳转延迟时间为1800毫秒,提升交互流畅度">
|
|
||||||
<option name="closed" value="true" />
|
|
||||||
<created>1775902053962</created>
|
|
||||||
<option name="number" value="00007" />
|
|
||||||
<option name="presentableId" value="LOCAL-00007" />
|
|
||||||
<option name="project" value="LOCAL" />
|
|
||||||
<updated>1775902053962</updated>
|
|
||||||
</task>
|
</task>
|
||||||
<task id="LOCAL-00008" summary="fix(passport): 修正邀请信息接口请求参数与请求头 - 将邀请令牌作为查询参数附加在请求URL中 - 移除请求体中的token字段传递 - 添加请求头TenantId,值为5 - 请求失败时在控制台打印错误信息以便调试 - 保持原有错误处理和加载状态设置逻辑不变">
|
<task id="LOCAL-00008" summary="fix(passport): 修正邀请信息接口请求参数与请求头 - 将邀请令牌作为查询参数附加在请求URL中 - 移除请求体中的token字段传递 - 添加请求头TenantId,值为5 - 请求失败时在控制台打印错误信息以便调试 - 保持原有错误处理和加载状态设置逻辑不变">
|
||||||
<option name="closed" value="true" />
|
<option name="closed" value="true" />
|
||||||
@@ -509,7 +502,15 @@
|
|||||||
<option name="project" value="LOCAL" />
|
<option name="project" value="LOCAL" />
|
||||||
<updated>1784136882898</updated>
|
<updated>1784136882898</updated>
|
||||||
</task>
|
</task>
|
||||||
<option name="localTasksCounter" value="56" />
|
<task id="LOCAL-00056" summary="feat(passport): 优化支付成功后页面跳转逻辑 - 修改支付成功后的自动跳转目标,从已购产品页面改为我的页面 - 使用 switchTab 替代 navigateTo 保证在 tabBar 页顺利跳转 - 移除多余的跳转失败回退逻辑,简化跳转流程 - 调整跳转延迟时间为 1500 毫秒,提升用户体验">
|
||||||
|
<option name="closed" value="true" />
|
||||||
|
<created>1784586922535</created>
|
||||||
|
<option name="number" value="00056" />
|
||||||
|
<option name="presentableId" value="LOCAL-00056" />
|
||||||
|
<option name="project" value="LOCAL" />
|
||||||
|
<updated>1784586922535</updated>
|
||||||
|
</task>
|
||||||
|
<option name="localTasksCounter" value="57" />
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
<component name="TypeScriptGeneratedFilesManager">
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
@@ -529,7 +530,6 @@
|
|||||||
<component name="VcsManagerConfiguration">
|
<component name="VcsManagerConfiguration">
|
||||||
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
|
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
|
||||||
<option name="CHECK_NEW_TODO" value="false" />
|
<option name="CHECK_NEW_TODO" value="false" />
|
||||||
<MESSAGE value="fix(passport): 添加邀请接受接口调试日志 - 在接受邀请请求前打印token和请求URL、参数 - 在请求响应后输出接口响应及返回数据 - 在调用失败时打印错误信息及异常日志 - 保持请求流程和状态管理不变,增强调试能力" />
|
|
||||||
<MESSAGE value="fix(passport): 优化邀请码接受失败的用户提示和处理 - 针对“用户不存在”、“用户创建失败”及“请先登录”提示,改为弹窗提示需登录 - 在弹窗中增加“去登录”按钮,点击后跳转到登录页面,并携带重定向token参数 - 其他错误仍使用原Toast提示方式展示错误信息 - 保留错误日志打印,便于排查异常情况" />
|
<MESSAGE value="fix(passport): 优化邀请码接受失败的用户提示和处理 - 针对“用户不存在”、“用户创建失败”及“请先登录”提示,改为弹窗提示需登录 - 在弹窗中增加“去登录”按钮,点击后跳转到登录页面,并携带重定向token参数 - 其他错误仍使用原Toast提示方式展示错误信息 - 保留错误日志打印,便于排查异常情况" />
|
||||||
<MESSAGE value="feat(passport-invite): 优化新用户扫码邀请加入流程 - 扫码进入邀请页面时保存邀请 token 到本地存储 - 新增登录状态检测,未登录用户点击快速加入时保存邀请信息并跳转登录页 - 登录成功后返回邀请页自动执行加入应用操作,提升用户体验 - 支持已登录用户直接加入应用,简化流程 - 增加清理 pending 邀请数据的方法,防止数据残留 - 监听页面显示事件,处理登录返回后自动操作 - 调整接口请求逻辑,确保携带最新的邀请和授权数据 - 更新项目配置,注册邀请页面路径信息" />
|
<MESSAGE value="feat(passport-invite): 优化新用户扫码邀请加入流程 - 扫码进入邀请页面时保存邀请 token 到本地存储 - 新增登录状态检测,未登录用户点击快速加入时保存邀请信息并跳转登录页 - 登录成功后返回邀请页自动执行加入应用操作,提升用户体验 - 支持已登录用户直接加入应用,简化流程 - 增加清理 pending 邀请数据的方法,防止数据残留 - 监听页面显示事件,处理登录返回后自动操作 - 调整接口请求逻辑,确保携带最新的邀请和授权数据 - 更新项目配置,注册邀请页面路径信息" />
|
||||||
<MESSAGE value="feat(passport): 重写登录与邀请加入流程,支持微信手机号一键登录 - 完全重写 passport/login.tsx,实现微信手机号一键登录功能 - 支持登录页面携带 redirect 参数,登录后自动跳转回原页面 - 登录成功后自动处理邀请加入应用,支持邀请关系绑定 - 重写 passport/invite/index.tsx,实现扫码邀请加入应用完整流程 - 支持调用 wx.login 获取 code,使用 loginByOpenId 判断注册状态 - 未注册用户自动跳转登录页完成微信手机号登录再加入应用 - 已登录用户直接执行加入应用操作,加入接口支持 Authorization 头 -" />
|
<MESSAGE value="feat(passport): 重写登录与邀请加入流程,支持微信手机号一键登录 - 完全重写 passport/login.tsx,实现微信手机号一键登录功能 - 支持登录页面携带 redirect 参数,登录后自动跳转回原页面 - 登录成功后自动处理邀请加入应用,支持邀请关系绑定 - 重写 passport/invite/index.tsx,实现扫码邀请加入应用完整流程 - 支持调用 wx.login 获取 code,使用 loginByOpenId 判断注册状态 - 未注册用户自动跳转登录页完成微信手机号登录再加入应用 - 已登录用户直接执行加入应用操作,加入接口支持 Authorization 头 -" />
|
||||||
@@ -554,7 +554,8 @@
|
|||||||
<MESSAGE value="feat(pay-bak): 新增小程序支付页面及相关配置 - 新增确认支付页面配置,设置导航栏标题和样式 - 实现小程序支付页完整组件逻辑,包括加载订单、发起JSAPI支付等 - 支持通过 scene 或 subscriptionNo 获取订单参数 - 完善支付流程接口请求及错误处理,支持自动登录和支付确认 - 增加支付成功、支付中、支付失败、取消等状态页面展示 - 支持支付成功后跳转已购产品页或用户页 - 提供取消支付返回逻辑和界面展示 - 细化支付金额显示和提示用户支付后可使用应用功能" />
|
<MESSAGE value="feat(pay-bak): 新增小程序支付页面及相关配置 - 新增确认支付页面配置,设置导航栏标题和样式 - 实现小程序支付页完整组件逻辑,包括加载订单、发起JSAPI支付等 - 支持通过 scene 或 subscriptionNo 获取订单参数 - 完善支付流程接口请求及错误处理,支持自动登录和支付确认 - 增加支付成功、支付中、支付失败、取消等状态页面展示 - 支持支付成功后跳转已购产品页或用户页 - 提供取消支付返回逻辑和界面展示 - 细化支付金额显示和提示用户支付后可使用应用功能" />
|
||||||
<MESSAGE value="feat(address): 新增收货地址与售后申请功能 - 新增地址编辑页面,支持地址智能识别、地图选点、地区选择和默认地址设置 - 实现地址列表页面,支持地址查看、删除、设为默认及选择返回结算页 - 新增售后申请页面,支持退款类型选择、商品选择、原因填写、图片上传和提交审核 - 修复 passport 分包配置,移除不存在分包并补充缺失声明,避免 Taro 编译报错 - 新增地址类型定义,增强前端地址数据结构类型安全 - 优化页面交互体验,完善表单校验及错误提示逻辑 - 统一代码格式与命名规范,保持代码风格一致性" />
|
<MESSAGE value="feat(address): 新增收货地址与售后申请功能 - 新增地址编辑页面,支持地址智能识别、地图选点、地区选择和默认地址设置 - 实现地址列表页面,支持地址查看、删除、设为默认及选择返回结算页 - 新增售后申请页面,支持退款类型选择、商品选择、原因填写、图片上传和提交审核 - 修复 passport 分包配置,移除不存在分包并补充缺失声明,避免 Taro 编译报错 - 新增地址类型定义,增强前端地址数据结构类型安全 - 优化页面交互体验,完善表单校验及错误提示逻辑 - 统一代码格式与命名规范,保持代码风格一致性" />
|
||||||
<MESSAGE value="feat(passport): 迁移并修复小程序支付页面访问 websopy API 问题 - 迁移 src/passport/pay 相关代码至当前项目,无需替换文件 - 新增环境变量 WEBSOPY_API_BASE_URL,提供 websopy API 基础地址 - 在 config/app.ts 导出 WebsopyBaseUrl,供代码引用 - 配置 env.d.ts 类型定义,消除 TypeScript 隐式 any 错误 - request 请求方法支持自定义 baseUrl 以调用不同接口地址 - passport/pay 页面调用订阅接口统一传入 WebsopyBaseUrl - 修正 tenantId 类型为 number,调整登录用户类型断言 - 确认编译成功,dist 目录生成对应文件及正确请求地址 - 说明 type-check 依赖库问题不影响正常构建和运行" />
|
<MESSAGE value="feat(passport): 迁移并修复小程序支付页面访问 websopy API 问题 - 迁移 src/passport/pay 相关代码至当前项目,无需替换文件 - 新增环境变量 WEBSOPY_API_BASE_URL,提供 websopy API 基础地址 - 在 config/app.ts 导出 WebsopyBaseUrl,供代码引用 - 配置 env.d.ts 类型定义,消除 TypeScript 隐式 any 错误 - request 请求方法支持自定义 baseUrl 以调用不同接口地址 - passport/pay 页面调用订阅接口统一传入 WebsopyBaseUrl - 修正 tenantId 类型为 number,调整登录用户类型断言 - 确认编译成功,dist 目录生成对应文件及正确请求地址 - 说明 type-check 依赖库问题不影响正常构建和运行" />
|
||||||
<option name="LAST_COMMIT_MESSAGE" value="feat(passport): 迁移并修复小程序支付页面访问 websopy API 问题 - 迁移 src/passport/pay 相关代码至当前项目,无需替换文件 - 新增环境变量 WEBSOPY_API_BASE_URL,提供 websopy API 基础地址 - 在 config/app.ts 导出 WebsopyBaseUrl,供代码引用 - 配置 env.d.ts 类型定义,消除 TypeScript 隐式 any 错误 - request 请求方法支持自定义 baseUrl 以调用不同接口地址 - passport/pay 页面调用订阅接口统一传入 WebsopyBaseUrl - 修正 tenantId 类型为 number,调整登录用户类型断言 - 确认编译成功,dist 目录生成对应文件及正确请求地址 - 说明 type-check 依赖库问题不影响正常构建和运行" />
|
<MESSAGE value="feat(passport): 优化支付成功后页面跳转逻辑 - 修改支付成功后的自动跳转目标,从已购产品页面改为我的页面 - 使用 switchTab 替代 navigateTo 保证在 tabBar 页顺利跳转 - 移除多余的跳转失败回退逻辑,简化跳转流程 - 调整跳转延迟时间为 1500 毫秒,提升用户体验" />
|
||||||
|
<option name="LAST_COMMIT_MESSAGE" value="feat(passport): 优化支付成功后页面跳转逻辑 - 修改支付成功后的自动跳转目标,从已购产品页面改为我的页面 - 使用 switchTab 替代 navigateTo 保证在 tabBar 页顺利跳转 - 移除多余的跳转失败回退逻辑,简化跳转流程 - 调整跳转延迟时间为 1500 毫秒,提升用户体验" />
|
||||||
<option name="NON_MODAL_COMMIT_POSTPONE_SLOW_CHECKS" value="false" />
|
<option name="NON_MODAL_COMMIT_POSTPONE_SLOW_CHECKS" value="false" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
9
.workbuddy/memory/2026-07-21.md
Normal file
9
.workbuddy/memory/2026-07-21.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# 2026-07-21
|
||||||
|
|
||||||
|
## VIP 角色绑定改为动态查询(去硬编码)
|
||||||
|
- 问题:`src/pages/user/vip-review/index.tsx` 中 `VIP_ROLE_ID = 2032` 写死,跨租户不适用。
|
||||||
|
- 改动:
|
||||||
|
- `src/api/system/role/model/index.ts`:给 `RoleParam` 增加 `tenantId?: number | string` 字段,支持按租户过滤角色。
|
||||||
|
- `vip-review/index.tsx`:新增 `getCurrentTenantId()`(取自 `Taro.getStorageSync('TenantId') || TenantId`)与 `getVipRoleId()`(调用 `listRoles({ roleCode:'vip', tenantId })` 动态获取 roleId);`assignVipRole` 改用动态 roleId,并在 `addUserRole` 时带上 `tenantId`。
|
||||||
|
- 导入补充:`listRoles` (from `@/api/system/role`)、`TenantId` (from `@/config/app`)。
|
||||||
|
- 约定:VIP 角色以 `roleCode='vip'` 标识,不再依赖固定 roleId。
|
||||||
@@ -24,4 +24,6 @@ export interface RoleParam extends PageParam {
|
|||||||
roleName?: string;
|
roleName?: string;
|
||||||
roleCode?: string;
|
roleCode?: string;
|
||||||
comments?: string;
|
comments?: string;
|
||||||
|
// 租户ID(多租户隔离:按租户查询角色)
|
||||||
|
tenantId?: number | string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import Taro, { useDidShow } from '@tarojs/taro'
|
|||||||
import { listShopDealerApply, updateShopDealerApply } from '@/api/shop/shopDealerApply'
|
import { listShopDealerApply, updateShopDealerApply } from '@/api/shop/shopDealerApply'
|
||||||
import type { ShopDealerApply } from '@/api/shop/shopDealerApply/model'
|
import type { ShopDealerApply } from '@/api/shop/shopDealerApply/model'
|
||||||
import { addUserRole, listUserRole } from '@/api/system/userRole'
|
import { addUserRole, listUserRole } from '@/api/system/userRole'
|
||||||
|
import { listRoles } from '@/api/system/role'
|
||||||
|
import { TenantId } from '@/config/app'
|
||||||
import { getMyClerk } from '@/api/shop/shopStoreUser'
|
import { getMyClerk } from '@/api/shop/shopStoreUser'
|
||||||
|
|
||||||
definePageConfig({
|
definePageConfig({
|
||||||
@@ -20,10 +22,25 @@ const TABS: { key: TabKey; label: string; status: number }[] = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
// VIP 角色信息(对应 system/role 表)
|
// VIP 角色信息(对应 system/role 表)
|
||||||
const VIP_ROLE_ID = 2032
|
// 角色 ID 不写死,按 roleCode + 当前租户ID 动态查询
|
||||||
const VIP_ROLE_CODE = 'vip'
|
const VIP_ROLE_CODE = 'vip'
|
||||||
const VIP_ROLE_NAME = 'VIP会员'
|
const VIP_ROLE_NAME = 'VIP会员'
|
||||||
|
|
||||||
|
// 获取当前租户 ID(登录时写入 storage,未登录时回退到默认租户)
|
||||||
|
function getCurrentTenantId(): number | string | undefined {
|
||||||
|
return Taro.getStorageSync('TenantId') || TenantId
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按 roleCode=vip + 当前租户ID 动态查询 VIP 角色,返回 roleId
|
||||||
|
*/
|
||||||
|
async function getVipRoleId(): Promise<number | undefined> {
|
||||||
|
const tenantId = getCurrentTenantId()
|
||||||
|
const roles = await listRoles({ roleCode: VIP_ROLE_CODE, tenantId })
|
||||||
|
const vip = (roles || []).find(r => r.roleCode === VIP_ROLE_CODE)
|
||||||
|
return vip?.roleId
|
||||||
|
}
|
||||||
|
|
||||||
// 格式化时间戳
|
// 格式化时间戳
|
||||||
function formatTime(time?: number | string): string {
|
function formatTime(time?: number | string): string {
|
||||||
if (!time) return '-'
|
if (!time) return '-'
|
||||||
@@ -56,15 +73,23 @@ function formatDateTime(date: Date): string {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 给用户添加 VIP 角色
|
* 给用户添加 VIP 角色
|
||||||
|
* 角色 ID 按 roleCode=vip + 当前租户ID 动态查询,避免写死;
|
||||||
* 先查询是否已有 VIP 角色,没有则新增,避免重复绑定
|
* 先查询是否已有 VIP 角色,没有则新增,避免重复绑定
|
||||||
*/
|
*/
|
||||||
async function assignVipRole(userId?: number): Promise<void> {
|
async function assignVipRole(userId?: number): Promise<void> {
|
||||||
if (!userId) return
|
if (!userId) return
|
||||||
|
|
||||||
|
// 动态查询当前租户下的 VIP 角色
|
||||||
|
const vipRoleId = await getVipRoleId()
|
||||||
|
if (!vipRoleId) {
|
||||||
|
Taro.showToast({ title: '未找到 VIP 角色配置', icon: 'none' })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 查询用户已有角色
|
// 查询用户已有角色
|
||||||
const userRoles = await listUserRole({ userId })
|
const userRoles = await listUserRole({ userId })
|
||||||
const hasVip = (userRoles || []).some(
|
const hasVip = (userRoles || []).some(
|
||||||
r => r.roleId === VIP_ROLE_ID || r.roleCode === VIP_ROLE_CODE
|
r => r.roleId === vipRoleId || r.roleCode === VIP_ROLE_CODE
|
||||||
)
|
)
|
||||||
|
|
||||||
if (hasVip) {
|
if (hasVip) {
|
||||||
@@ -75,9 +100,10 @@ async function assignVipRole(userId?: number): Promise<void> {
|
|||||||
// 新增 VIP 角色绑定
|
// 新增 VIP 角色绑定
|
||||||
await addUserRole({
|
await addUserRole({
|
||||||
userId,
|
userId,
|
||||||
roleId: VIP_ROLE_ID,
|
roleId: vipRoleId,
|
||||||
roleCode: VIP_ROLE_CODE,
|
roleCode: VIP_ROLE_CODE,
|
||||||
roleName: VIP_ROLE_NAME,
|
roleName: VIP_ROLE_NAME,
|
||||||
|
tenantId: getCurrentTenantId(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user