import { validateCredentials } from './validate-credentials.js' import { buildEncryptedLoginBody } from './login-rsa.js' import { post } from './request.js' export { validateCredentials } const TOKEN_KEY = 'zkxw_mobile_token' const REFRESH_TOKEN_KEY = 'zkxw_mobile_refresh_token' const USER_KEY = 'zkxw_mobile_user' export function getToken() { try { return uni.getStorageSync(TOKEN_KEY) || '' } catch (e) { return '' } } export function getRefreshToken() { try { return uni.getStorageSync(REFRESH_TOKEN_KEY) || '' } catch (e) { return '' } } export function isLoggedIn() { return !!getToken() } export function getUser() { try { const raw = uni.getStorageSync(USER_KEY) return raw ? JSON.parse(raw) : null } catch (e) { return null } } export function clearSession() { try { uni.removeStorageSync(TOKEN_KEY) uni.removeStorageSync(REFRESH_TOKEN_KEY) uni.removeStorageSync(USER_KEY) } catch (e) { /* ignore */ } } function saveSession({ token, refreshToken, userInfo }) { uni.setStorageSync(TOKEN_KEY, token || '') uni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken || '') uni.setStorageSync(USER_KEY, JSON.stringify(userInfo || null)) } /** * 可选:清除历史 mock_ 前缀假会话,避免误判已登录。 */ export function clearLegacyMockSessionIfNeeded() { const token = getToken() if (typeof token === 'string' && token.indexOf('mock_') === 0) { clearSession() } } /** * 真实账号密码登录。 * @param {{ username: string, password: string }} params */ export async function passwordLogin({ username, password }) { const v = validateCredentials(username, password) if (!v.ok) { const err = new Error(v.message) err.code = v.code throw err } const body = await buildEncryptedLoginBody( (username || '').trim(), password || '' ) const data = await post('/web/auth/login', body) if (!data || !data.token) { throw new Error('登录失败') } saveSession({ token: data.token, refreshToken: data.refreshToken, userInfo: data.userInfo }) // 密码登录成功后静默绑定微信(失败不影响登录) bindWechatQuietly() return data } /** * 微信授权登录(openid 优先;未绑定需 phoneCode)。 */ export async function wechatLogin({ loginCode, phoneCode }) { const payload = { loginCode } if (phoneCode) { payload.phoneCode = phoneCode } const data = await post('/mini/auth/wechat-login', payload) if (!data || !data.token) { throw new Error('登录失败') } saveSession({ token: data.token, refreshToken: data.refreshToken, userInfo: data.userInfo }) return data } /** * 已登录态下用 wx.login code 绑定 openid;失败静默。 */ export async function bindWechatQuietly() { try { const loginRes = await new Promise((resolve, reject) => { uni.login({ provider: 'weixin', success: resolve, fail: reject }) }) const loginCode = loginRes && loginRes.code if (!loginCode) return const token = getToken() if (!token) return await post( '/mini/auth/wechat-bind', { loginCode }, { Authorization: 'Bearer ' + token } ) } catch (e) { console.warn('wechat bind skipped', e && e.message) } }