Files
Neo-ZQYY/apps/miniprogram/miniprogram/pages/login/login.ts
Neo 6f8f12314f feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更:
- backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔
- admin-web: ETL 状态页、任务管理、调度配置、登录优化
- miniprogram: 看板页面、聊天集成、UI 组件、导航更新
- etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强
- tenant-admin: 项目初始化
- db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8)
- packages/shared: 枚举和工具函数更新
- tools: 数据库工具、报表生成、健康检查
- docs: PRD/架构/部署/合约文档更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 00:03:48 +08:00

136 lines
4.5 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.
/* AI_CHANGELOG
| 日期 | Prompt | 变更 |
|------|--------|------|
| 2026-03-23 | 角色路由+页面权限守卫 | 登录成功后保存 role、syncVisibleTabs、按角色跳转 getRoleHome |
| 2026-03-28 | 登录落地页修复 | 修复权限改造后 login.ts 未同步:改为请求 /me 获取 permissions用 syncPermissions + getPermissionHome 决定落地页 |
*/
import { request } from "../../utils/request"
import { API_BASE } from "../../utils/config"
import { syncPermissions, getPermissionHome } from "../../utils/auth-guard"
/** develop 环境使用 dev-login 跳过微信 code2Session */
const isDevMode = API_BASE.startsWith("http://127.0.0.1")
Page({
data: {
agreed: false,
loading: false,
/** 系统状态栏高度px用于自定义导航栏顶部偏移 */
statusBarHeight: 20,
},
onLoad() {
const windowInfo = wx.getWindowInfo()
this.setData({ statusBarHeight: windowInfo.statusBarHeight || 20 })
},
onAgreeChange() {
this.setData({ agreed: !this.data.agreed })
},
async onLogin() {
if (!this.data.agreed) {
wx.showToast({ title: "请先同意用户协议", icon: "none" })
return
}
if (this.data.loading) return
this.setData({ loading: true })
try {
let data: any
if (isDevMode) {
// 开发模式:直接调用 dev-login无需 wx.login
// 不传 status让后端保留用户当前状态首次创建默认 new
data = await request({
url: "/api/xcx/dev-login",
method: "POST",
data: { openid: "dev_test_openid" },
needAuth: false,
})
} else {
// 正式/体验:走微信 code2Session 流程
const loginRes = await new Promise<WechatMiniprogram.LoginSuccessCallbackResult>(
(resolve, reject) => {
wx.login({
success: resolve,
fail: reject,
})
},
)
data = await request({
url: "/api/xcx/login",
method: "POST",
data: { code: loginRes.code },
needAuth: false,
})
}
const app = getApp<IAppOption>()
app.globalData.token = data.accessToken
app.globalData.refreshToken = data.refreshToken
wx.setStorageSync("token", data.accessToken)
wx.setStorageSync("refreshToken", data.refreshToken)
// 持久化用户身份信息
// CHANGE 2026-03-23 | 角色路由:保存 role 并按角色跳转
// CHANGE 2026-03-23 | camelCase 修复:后端 CamelModel 序列化输出 camelCase
app.globalData.authUser = {
userId: data.userId,
status: data.userStatus,
role: data.role || undefined,
}
wx.setStorageSync("userId", data.userId)
wx.setStorageSync("userStatus", data.userStatus)
if (data.role) wx.setStorageSync("userRole", data.role)
// 根据 userStatus 路由
switch (data.userStatus) {
case "approved": {
// CHANGE 2026-03-28 | 权限码驱动跳转:登录接口不返回 permissions
// 需额外请求 /api/xcx/me 获取权限码,再决定落地页
let homePage = '/pages/my-profile/my-profile'
try {
const me = await request({ url: "/api/xcx/me", method: "GET", needAuth: true })
const permissions: string[] = me.permissions || []
syncPermissions(permissions)
homePage = getPermissionHome(permissions)
} catch {
// /me 失败时降级到个人页checkAuthStatus 后续会补偿
}
wx.reLaunch({ url: homePage })
break
}
case "pending":
wx.reLaunch({ url: "/pages/reviewing/reviewing" })
break
case "new":
// 全新用户,跳转申请页填表
wx.reLaunch({ url: "/pages/apply/apply" })
break
case "rejected":
wx.reLaunch({ url: "/pages/no-permission/no-permission" })
break
case "disabled":
wx.reLaunch({ url: "/pages/no-permission/no-permission" })
break
default:
wx.reLaunch({ url: "/pages/apply/apply" })
break
}
} catch (err: any) {
const msg =
err?.statusCode === 403
? "账号已被禁用"
: err?.statusCode === 401
? "登录凭证无效,请重试"
: "登录失败,请稍后重试"
wx.showToast({ title: msg, icon: "none" })
} finally {
this.setData({ loading: false })
}
},
})