import { create } from 'zustand' import { appendRequestParams, fetchJSON, postForm } from '@/utils/request' import { HT_HOST } from "@/config" import { loadPageSpy } from '@/pageSpy' import { usingStorage } from '@/hooks/usingStorage' import { devtools } from 'zustand/middleware' import { obervseLifecycle } from '@/utils/lifecycle' const KEY_LOGIN_TOKEN = 'G-STR:LOGIN_TOKEN' const KEY_TRAVEL_AGENCY_ID = 'G-INT:TRAVEL_AGENCY_ID' const KEY_USER_ID = 'G-INT:USER_ID' const KEY_USER_DETAIL = 'G-JSON:USER_DETAIL' const WILDCARD_TOKEN = '*' export const fetchLoginToken = async (username, password) => { const formData = new FormData() formData.append('username', username) formData.append('Password', password) const { errcode, Result } = await postForm( `${HT_HOST}/service-CooperateSOA/Login`, formData) return errcode !== 0 ? {} : Result } export const fetchUserDetail = async (loginToken) => { const { errcode, Result } = await fetchJSON( `${HT_HOST}/service-CooperateSOA/GetLinkManInfo`, { token: loginToken}) return errcode !== 0 ? {} : Result } export const fetchPermissionListByUserId = async (userId) => { const { errcode, result } = await fetchJSON( `${HT_HOST}/service-CooperateSOA/get_account_permission_list`, { wu_id: userId}) return errcode !== 0 ? {} : result } async function fetchLastRequet() { const { errcode, result } = await fetchJSON(`${HT_HOST}/service-CooperateSOA/GetLastReqDate`) return errcode !== 0 ? {} : result } const useAuthStore = create(obervseLifecycle((set, get) => ({ onAuth: () => { const { startTokenInterval, loadUserPermission } = get() const { userId } = usingStorage() loadUserPermission(userId) startTokenInterval() }, tokenInterval: null, tokenTimeout: false, loginStatus: 0, permissionList: [], isPermitted: (perm) => { const { permissionList } = get() // 测试权限使用: // if (perm === '/account/management') return false // if (perm === '/account/role/new') return false // return true // 以上是 Hardcode 判断 // 以下是权限列表从数据库读取后使用的方法 return permissionList.some((value) => { if (value.indexOf(WILDCARD_TOKEN) > -1) { return true } if (value === perm) { return true } return false }) }, validateUserPassword: async (usr, pwd) => { const { startTokenInterval, loadUserPermission } = get() const { setStorage } = usingStorage() const { token: loginToken, WU_ID: userId } = await fetchLoginToken(usr, pwd) const userDetail = await fetchUserDetail(loginToken) await loadUserPermission(userId) set(() => ({ tokenTimeout: false, loginStatus: 302 })) setStorage(KEY_LOGIN_TOKEN, loginToken) setStorage(KEY_USER_ID, userId)//userDetail.LMI_SN) setStorage(KEY_TRAVEL_AGENCY_ID, userDetail.LMI_VEI_SN) appendRequestParams('token', loginToken) // loadPageSpy(`${json.Result.VName}-${json.Result.LoginName}`) startTokenInterval() }, loadUserPermission: async(userId) => { const permissionResult = await fetchPermissionListByUserId(userId) set(() => ({ permissionList: permissionResult.map(p => p.res_pattern) })) }, logout: () => { const { tokenInterval } = get() const { clearStorage } = usingStorage() clearStorage() clearInterval(tokenInterval) set(() => ({ loginStatus: 0, tokenInterval: null, tokenTimeout: true })) }, startTokenInterval: () => { const { loginTimeout } = get() async function checkTokenTimeout() { const { LastReqDate } = await fetchLastRequet() const lastReqDate = new Date(LastReqDate) const now = new Date() const diffTime = now.getTime() - lastReqDate.getTime() const diffHours = diffTime/1000/60/60 if (diffHours > 1) { loginTimeout() } } const interval = setInterval(() => checkTokenTimeout(), 1000*60*20) set(() => ({ tokenInterval: interval })) }, loginTimeout: () => { const { tokenInterval } = get() const { clearStorage } = usingStorage() clearStorage() clearInterval(tokenInterval) set(() => ({ tokenTimeout: true })) }, changeUserPassword: (password, newPassword) => { const { userId } = usingStorage() const formData = new FormData(); formData.append('UserID', userId); formData.append('Password', password); formData.append('NewPassword', newPassword); const postUrl = HT_HOST + '/service-CooperateSOA/SetPassword'; return postForm(postUrl, formData) .then(json => { if (json.errcode == 0) { return json; } else { throw new Error(json.errmsg + ': ' + json.errcode); } }); }, }))) export default useAuthStore