Files
Neo-ZQYY/apps/miniprogram - 副本/miniprogram/pages/dev-tools/dev-tools.ts

183 lines
6.3 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.
/**
* 开发调试面板页面
*
* 功能:
* - 展示当前用户上下文(角色、权限、绑定、门店)
* - 一键切换角色(后端真实修改 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<IAppOption>()
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)
},
})