批量优化
This commit is contained in:
1 parent
e3db229f41
commit
aa92ca40a2
79 files changed
+7495
-1104
No files matched your search
+79
-2
@@ -13,9 +13,10 @@ export function login(data) {
|
||||
}
|
||||
|
||||
/* ==================== 统一认证中心(UAC) ====================
|
||||
* APP 不走浏览器跳转,直接用密码直连模式:
|
||||
* APP / 小程序不走浏览器跳转,直接用密码直连模式:
|
||||
* POST /auth/login 拿 access + refresh,多企业时再调 switch-tenant。
|
||||
* 开关:VITE_AUTH_MODE=sso 时启用(见 utils/auth.js 的 isSSOEnabled)
|
||||
* 开关:默认即为统一认证,VITE_AUTH_MODE=legacy 时回退旧直登
|
||||
* (见 utils/auth.js 的 isSSOEnabled)
|
||||
* ============================================================ */
|
||||
|
||||
/** 统一认证:账号密码登录 */
|
||||
@@ -36,6 +37,82 @@ export function switchTenant(data) {
|
||||
})
|
||||
}
|
||||
|
||||
/** 统一认证:拉取当前登录用户(userinfo,返回扁平结构无 code 包装) */
|
||||
export function fetchUserInfo() {
|
||||
return request({
|
||||
url: '/auth/userinfo',
|
||||
method: 'GET',
|
||||
silent: true
|
||||
})
|
||||
}
|
||||
|
||||
/** 统一认证:登录人机验证配置(极验 captcha_id 等) */
|
||||
export function getAuthVerifyConfig(params = {}) {
|
||||
return request({
|
||||
url: '/auth/verify-config',
|
||||
method: 'GET',
|
||||
data: params,
|
||||
silent: true,
|
||||
timeout: 8000
|
||||
})
|
||||
}
|
||||
|
||||
/** 统一认证:单点登出(吊销会话与令牌) */
|
||||
export function logoutUAC() {
|
||||
return request({
|
||||
url: '/auth/logout',
|
||||
method: 'POST',
|
||||
silent: true,
|
||||
timeout: 5000
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请「移动端免登录票据」:用当前登录态换一个一次性票据,
|
||||
* Web 端拿它换自己的令牌,实现移动端打开 Web 功能页时不二次登录。
|
||||
* 票据一次性、60 秒有效。
|
||||
*/
|
||||
export function createAppTicket(clientId = 'yz-backend') {
|
||||
return request({
|
||||
url: '/auth/app-ticket',
|
||||
method: 'POST',
|
||||
data: { client_id: clientId },
|
||||
silent: true,
|
||||
timeout: 8000
|
||||
})
|
||||
}
|
||||
|
||||
/* ==================== 微信小程序一键登录 ====================
|
||||
* 仅小程序端可用:uni.login 拿 code + getPhoneNumber 拿动态 code,
|
||||
* 由服务端换取 openid / 手机号并定位统一身份,签发同一套 UAC 令牌。
|
||||
* ============================================================ */
|
||||
|
||||
/** 小程序登录是否已开通(未开通时前端隐藏一键登录入口) */
|
||||
export function getMiniappLoginConfig() {
|
||||
return request({
|
||||
url: '/auth/wechat/miniapp/config',
|
||||
method: 'GET',
|
||||
silent: true,
|
||||
timeout: 8000
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 小程序一键登录
|
||||
* @param {{ code: string, phoneCode?: string }} params code=uni.login 的 code;phoneCode=getPhoneNumber 的动态 code
|
||||
*/
|
||||
export function loginByMiniapp({ code, phoneCode = '' } = {}) {
|
||||
return request({
|
||||
url: '/auth/wechat/miniapp/login',
|
||||
method: 'POST',
|
||||
data: {
|
||||
client_id: 'yz-miniapp',
|
||||
code,
|
||||
phone_code: phoneCode
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 统一认证:刷新访问令牌 */
|
||||
export function refreshTokenUAC(data) {
|
||||
return request({
|
||||
|
||||
@@ -59,3 +59,57 @@ export function resolveBaseURL() {
|
||||
export function getBaseURL() {
|
||||
return resolveBaseURL()
|
||||
}
|
||||
|
||||
/**
|
||||
* 租户 Web 端(管理后台)地址。
|
||||
*
|
||||
* 移动端作为 ERP/OA/CRM/CMS 的聚合入口,绝大多数业务功能仍在 Web 端实现,
|
||||
* 端上通过 webview 容器打开对应页面。Web 端已统一认证:首次打开会跳
|
||||
* /auth/login 登录页,在 webview 内登录一次后会话保持。
|
||||
*
|
||||
* 可用环境变量 VITE_WEB_CONSOLE_BASE 覆盖(本地联调指向开发域名)。
|
||||
*/
|
||||
export function getWebConsoleBase() {
|
||||
let base = ''
|
||||
try {
|
||||
base =
|
||||
(typeof import.meta !== 'undefined' &&
|
||||
import.meta.env &&
|
||||
import.meta.env.VITE_WEB_CONSOLE_BASE) ||
|
||||
''
|
||||
} catch (e) {
|
||||
base = ''
|
||||
}
|
||||
if (!base || base === 'undefined' || base === 'null') {
|
||||
base = 'https://back.yunzer.cn'
|
||||
}
|
||||
return String(base).replace(/\/$/, '')
|
||||
}
|
||||
|
||||
/**
|
||||
* 由菜单 path 拼出 Web 端深链。
|
||||
* Web 端是 hash 路由(createWebHashHistory),因此形如 https://back.yunzer.cn/#/apps/crm/clue
|
||||
*/
|
||||
export function resolveWebConsoleURL(path) {
|
||||
const p = String(path || '').trim()
|
||||
if (!p) return ''
|
||||
return `${getWebConsoleBase()}/#${p.startsWith('/') ? p : `/${p}`}`
|
||||
}
|
||||
|
||||
/**
|
||||
* 拼出「移动端免登录」深链。
|
||||
*
|
||||
* Web 端只认自己 localStorage 里的令牌,移动端登录态传不过去,
|
||||
* 直接跳业务路径会再次弹出统一登录页。因此先跳 /app-login 兑换页,
|
||||
* 由它用票据换发 Web 端令牌后再回跳到 redirect 指定的业务页。
|
||||
*
|
||||
* @param {string} path 菜单 path,如 /apps/oa/dashboard
|
||||
* @param {string} ticket 一次性票据(由 /auth/app-ticket 签发)
|
||||
*/
|
||||
export function resolveWebSSOURL(path, ticket) {
|
||||
const p = String(path || '').trim()
|
||||
if (!p) return ''
|
||||
const target = p.startsWith('/') ? p : `/${p}`
|
||||
if (!ticket) return resolveWebConsoleURL(target)
|
||||
return `${getWebConsoleBase()}/#/app-login?ticket=${encodeURIComponent(ticket)}&redirect=${encodeURIComponent(target)}`
|
||||
}
|
||||
@@ -121,7 +121,11 @@ export function request(options = {}) {
|
||||
if (status < 200 || status >= 300) {
|
||||
const msg = body.msg || `请求失败(${status})`
|
||||
if (!silent) uni.showToast({ title: msg, icon: 'none' })
|
||||
reject(new Error(msg))
|
||||
const err = new Error(msg)
|
||||
// 保留响应体:登录等接口用 reason 等字段做差异化引导
|
||||
err.code = typeof body.code !== 'undefined' ? body.code : status
|
||||
err.response = body
|
||||
reject(err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* 移动端「工作台」接口
|
||||
*
|
||||
* /app/home 一次返回首屏所需的全部数据(应用模块卡片 + 可见菜单 + KPI),
|
||||
* 避免移动端首屏多次往返。
|
||||
*/
|
||||
import { request } from '@/api/request.js'
|
||||
|
||||
/**
|
||||
* 内存缓存:nav.vue 与 dashboard 都会拉同一份数据,
|
||||
* 30 秒内复用,避免切页反复请求。登出/切换企业时由 clearHomeCache 失效。
|
||||
*/
|
||||
const CACHE_TTL = 30 * 1000
|
||||
let cache = null
|
||||
let cacheAt = 0
|
||||
|
||||
/** 工作台聚合数据:{ user, modules, menus, stats } */
|
||||
export async function fetchHome(force = false) {
|
||||
if (!force && cache && Date.now() - cacheAt < CACHE_TTL) return cache
|
||||
const data = await request({
|
||||
url: '/app/home',
|
||||
method: 'GET',
|
||||
silent: true,
|
||||
timeout: 15000
|
||||
})
|
||||
cache = data
|
||||
cacheAt = Date.now()
|
||||
return data
|
||||
}
|
||||
|
||||
/** 登出 / 切换企业后调用,避免脏数据留在内存缓存里 */
|
||||
export function clearHomeCache() {
|
||||
cache = null
|
||||
cacheAt = 0
|
||||
}
|
||||
Reference in new issue
Block a user