/** * 开发调试面板页面 * * 功能: * - 展示当前用户上下文(角色、权限、绑定、门店) * - 一键切换角色(后端真实修改 user_site_roles + 重签 token) * - 一键切换用户状态(后端真实修改 users.status + 重签 token) * - 页面跳转列表(点击跳转到任意已注册页面) */ import { request } from "../../utils/request" // 页面列表分三段:正在迁移、已完成、未完成 const MIGRATING_PAGES = [ { path: "pages/board-finance/board-finance", name: "财务看板" }, ] const DONE_PAGES = [ { path: "pages/no-permission/no-permission", name: "无权限" }, { path: "pages/login/login", name: "登录" }, { path: "pages/apply/apply", name: "申请" }, { path: "pages/reviewing/reviewing", name: "审核中" }, { path: "pages/board-coach/board-coach", name: "助教看板" }, { path: "pages/board-customer/board-customer", name: "客户看板" }, ] const TODO_PAGES = [ { path: "pages/task-list/task-list", name: "任务列表" }, { path: "pages/my-profile/my-profile", name: "个人中心" }, { path: "pages/task-detail/task-detail", name: "任务详情" }, { path: "pages/task-detail-callback/task-detail-callback", name: "任务-回访" }, { path: "pages/task-detail-priority/task-detail-priority", name: "任务-优先级" }, { path: "pages/task-detail-relationship/task-detail-relationship", name: "任务-关系" }, { path: "pages/notes/notes", name: "备忘录" }, { path: "pages/performance/performance", name: "业绩总览" }, { path: "pages/performance-records/performance-records", name: "业绩明细" }, { path: "pages/customer-detail/customer-detail", name: "客户详情" }, { path: "pages/customer-service-records/customer-service-records", name: "客户服务记录" }, { path: "pages/coach-detail/coach-detail", name: "助教详情" }, { path: "pages/chat/chat", name: "AI 对话" }, { path: "pages/chat-history/chat-history", name: "对话历史" }, { path: "pages/index/index", name: "首页" }, { path: "pages/mvp/mvp", name: "MVP" }, { path: "pages/logs/logs", name: "日志" }, ] const ROLE_LIST = [ { code: "coach", name: "助教" }, { code: "staff", name: "员工" }, { code: "site_admin", name: "店铺管理员" }, { code: "tenant_admin", name: "租户管理员" }, ] const STATUS_LIST = ["new", "pending", "approved", "rejected", "disabled"] Page({ data: { ctx: null as any, loading: true, pages: [] as typeof TODO_PAGES, migratingPages: MIGRATING_PAGES, donePages: DONE_PAGES, todoPages: TODO_PAGES, roles: ROLE_LIST, statuses: STATUS_LIST, currentRole: "", rolesText: "-", permissionsText: "-", bindingText: "-", message: "", messageType: "", }, onShow() { this.loadContext() }, /** 加载当前用户调试上下文 */ async loadContext() { // 没有 token 时不发请求,避免 401 → 刷新 → 跳转的无限循环 const token = wx.getStorageSync("token") if (!token) { this.setData({ loading: false }) this.showMsg("未登录,请先通过 dev-login 获取 token", "error") return } this.setData({ loading: true, message: "" }) try { const ctx = await request({ url: "/api/xcx/dev-context", method: "GET" }) const rolesText = ctx.roles?.length ? ctx.roles.join(", ") : "-" const permissionsText = ctx.permissions?.length ? ctx.permissions.join(", ") : "-" let bindingText = "-" if (ctx.binding) { const b = ctx.binding bindingText = `${b.binding_type} (助教:${b.assistant_id || '-'} 员工:${b.staff_id || '-'})` } // 当前角色取第一个(通常只有一个) const currentRole = ctx.roles?.length ? ctx.roles[0] : "" this.setData({ ctx, rolesText, permissionsText, bindingText, currentRole, loading: false }) } catch (err: any) { this.setData({ loading: false }) // 401 说明 token 无效或是受限令牌,不触发重试 const detail = err?.data?.detail || "网络错误" this.showMsg("获取上下文失败: " + detail, "error") } }, /** 切换角色 */ async switchRole(e: any) { const code = e.currentTarget.dataset.code if (code === this.data.currentRole) return wx.showLoading({ title: "切换中..." }) try { const res = await request({ url: "/api/xcx/dev-switch-role", method: "POST", data: { role_code: code }, }) // 保存新 token this.saveTokens(res) this.showMsg(`已切换为 ${code}`, "success") // 重新加载上下文 this.loadContext() } catch (err: any) { this.showMsg("切换角色失败: " + (err?.data?.detail || "网络错误"), "error") } finally { wx.hideLoading() } }, /** 切换用户状态 */ async switchStatus(e: any) { const status = e.currentTarget.dataset.status if (status === this.data.ctx?.status) return wx.showLoading({ title: "切换中..." }) try { const res = await request({ url: "/api/xcx/dev-switch-status", method: "POST", data: { status }, }) // 保存新 token this.saveTokens(res) this.showMsg(`状态已切换为 ${status}`, "success") this.loadContext() } catch (err: any) { this.showMsg("切换状态失败: " + (err?.data?.detail || "网络错误"), "error") } finally { wx.hideLoading() } }, /** 跳转到指定页面 */ goPage(e: any) { const url = "/" + e.currentTarget.dataset.url // 使用 reLaunch 确保能跳转到任意页面(包括 tabBar 页面) wx.reLaunch({ url }) }, /** 保存后端返回的新 token */ saveTokens(res: any) { if (res.access_token && res.refresh_token) { const app = getApp() app.globalData.token = res.access_token app.globalData.refreshToken = res.refresh_token wx.setStorageSync("token", res.access_token) wx.setStorageSync("refreshToken", res.refresh_token) if (res.user_id) { wx.setStorageSync("userId", res.user_id) } if (res.user_status) { wx.setStorageSync("userStatus", res.user_status) } } }, /** 显示操作提示 */ showMsg(msg: string, type: "success" | "error") { this.setData({ message: msg, messageType: type }) setTimeout(() => this.setData({ message: "" }), 3000) }, })