116 lines
3.1 KiB
JavaScript
116 lines
3.1 KiB
JavaScript
import { ref } from 'vue'
|
|
import { formatUserMessage } from '../utils/tongjiHelpers.js'
|
|
|
|
/** 登录 / 就诊卡门禁(index 与 more 共用) */
|
|
export function useTongjiAuth(proxy) {
|
|
const authChecking = ref(false)
|
|
let gateRedirected = false
|
|
let authSessionPromise = null
|
|
|
|
function hasAuthToken() {
|
|
return !!String(uni.getStorageSync('token') || '').trim()
|
|
}
|
|
|
|
function clearAuthStorage() {
|
|
uni.removeStorageSync('token')
|
|
authSessionPromise = null
|
|
}
|
|
|
|
function wxLoginGetCode() {
|
|
return new Promise((resolve, reject) => {
|
|
uni.login({
|
|
provider: 'weixin',
|
|
success: (res) => {
|
|
if (res && res.code) resolve(res.code)
|
|
else reject(new Error('微信登录未返回 code'))
|
|
},
|
|
fail: reject
|
|
})
|
|
})
|
|
}
|
|
|
|
async function mnpLoginWithCode(code) {
|
|
const res = await proxy.apiUrl({
|
|
url: '/api/login/mnpLogin',
|
|
method: 'POST',
|
|
data: { code }
|
|
}, false)
|
|
if (res && res.code === 1 && res.data && res.data.token) {
|
|
uni.setStorageSync('token', res.data.token)
|
|
uni.setStorageSync('userData', res.data)
|
|
return res.data
|
|
}
|
|
clearAuthStorage()
|
|
throw new Error(formatUserMessage(res?.msg, '登录失败'))
|
|
}
|
|
|
|
async function doWxLogin() {
|
|
const code = await wxLoginGetCode()
|
|
await mnpLoginWithCode(code)
|
|
return hasAuthToken()
|
|
}
|
|
|
|
async function verifyOrLogin() {
|
|
if (!hasAuthToken()) {
|
|
return doWxLogin()
|
|
}
|
|
try {
|
|
const res = await proxy.apiUrl({ url: '/api/user/info', method: 'POST' }, false)
|
|
if (res && res.code === 1 && res.data) {
|
|
uni.setStorageSync('userData', res.data)
|
|
return true
|
|
}
|
|
} catch (e) {
|
|
/* 网络异常走重新登录 */
|
|
}
|
|
clearAuthStorage()
|
|
try {
|
|
return await doWxLogin()
|
|
} catch (e2) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
async function ensureLoggedIn() {
|
|
if (authSessionPromise) {
|
|
return authSessionPromise
|
|
}
|
|
authSessionPromise = verifyOrLogin()
|
|
.then((ok) => {
|
|
if (!ok) authSessionPromise = null
|
|
return !!ok
|
|
})
|
|
.catch(() => {
|
|
authSessionPromise = null
|
|
return false
|
|
})
|
|
return authSessionPromise
|
|
}
|
|
|
|
function redirectToCardEntry(returnPath) {
|
|
if (gateRedirected) return
|
|
gateRedirected = true
|
|
const returnUrl = encodeURIComponent(returnPath || '/tongji/pages/index')
|
|
uni.redirectTo({
|
|
url: `/pages/Card/edit_card?add=1&returnUrl=${returnUrl}`
|
|
})
|
|
}
|
|
|
|
function resetGateRedirect() {
|
|
gateRedirected = false
|
|
}
|
|
|
|
function isGateRedirected() {
|
|
return gateRedirected
|
|
}
|
|
|
|
return {
|
|
authChecking,
|
|
hasAuthToken,
|
|
ensureLoggedIn,
|
|
redirectToCardEntry,
|
|
resetGateRedirect,
|
|
isGateRedirected
|
|
}
|
|
}
|