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' 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' 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 } async function fetchLastRequet() { const { errcode, result } = await fetchJSON(`${HT_HOST}/service-CooperateSOA/GetLastReqDate`) return errcode !== 0 ? {} : result } const useAuthStore = create((set, get) => ({ tokenInterval: null, tokenTimeout: false, loginStatus: 0, loginUser: { token: '', telephone: '', emailAddress: '', cityId: 0, permissionList: [], }, isPermitted: (perm) => { // 测试权限使用: // if (perm === '/account/management') return false // if (perm === '/account/role/new') return false return true // 以上是 Hardcode 判断 // 以下是权限列表从数据库读取后使用的方法 // return this.permissionList.some((value, key, arry) => { // if (value.indexOf(WILDCARD_TOKEN) > -1) { // return true // } // if (value === perm) { // return true // } // return false // }) }, validateUserPassword: async (usr, pwd) => { const { startTokenInterval } = get() const { setStorage } = usingStorage() const { token: loginToken } = await fetchLoginToken(usr, pwd) const userDetail = await fetchUserDetail(loginToken) set(() => ({ loginUser: { telephone: userDetail.LkPhone, emailAddress: userDetail.LMI_listmail, cityId: userDetail.citysn, }, tokenTimeout: false, loginStatus: 302 })) setStorage(KEY_LOGIN_TOKEN, loginToken) setStorage(KEY_USER_ID, userDetail.LMI_SN) setStorage(KEY_TRAVEL_AGENCY_ID, userDetail.LMI_VEI_SN) setStorage(KEY_USER_DETAIL, {username: userDetail.LoginName, travelAgencyName: userDetail.VName}) appendRequestParams('token', loginToken) // loadPageSpy(`${json.Result.VName}-${json.Result.LoginName}`) startTokenInterval() }, logout: () => { const { tokenInterval } = get() const { clearStorage } = usingStorage() clearStorage() clearInterval(tokenInterval) set(() => ({ loginUser: { }, 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 > 4) { loginTimeout() } } const interval = setInterval(() => checkTokenTimeout(), 1000*60*20) set(() => ({ tokenInterval: interval })) }, loginTimeout: () => { const { tokenInterval } = get() // TODO: 这里没有清理 token,刷新后可以正常使用系统 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