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 } }