import { makeAutoObservable, runInAction } from "mobx"; import { create } from 'zustand' import { appendRequestParams, fetchJSON, postForm } from '@/utils/request' import { HT_HOST } from "@/config" import { isNotEmpty, prepareUrl } from '@/utils/commons' import { loadPageSpy } from '@/pageSpy' import { useStorage } from '@/hooks/useStorage' const KEY_LOGIN_TOKEN = 'GH-STR:LOGIN_TOKEN' const KEY_TRAVEL_AGENCY_ID = 'GH-INT:TRAVEL_AGENCY_ID' const KEY_USER_ID = 'GH-INT:USER_ID' const useAuthStore = create((set, get) => ({ tokenInterval: null, loginStatus: 0, loginUser: { token: '', userId: 0, // LMI_SN username: '0', travelAgencyId: 0, // VEI_SN travelAgencyName: '', telephone: '', emailAddress: '', cityId: 0, timeout: false, permissionList: [], }, isPermitted: (perm) => { 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 { setStorage } = useStorage() const formData = new FormData() formData.append('username', usr) formData.append('Password', pwd) async function fetchLoginToken() { const postUrl = HT_HOST + '/service-CooperateSOA/Login' const json = await postForm(postUrl, formData) if (json.errcode == 0 && isNotEmpty(json.Result)) { return json.Result.token; } else { return 0; } } const loginToken = await fetchLoginToken() setStorage(KEY_LOGIN_TOKEN, loginToken) appendRequestParams('token', loginToken) const fetchUrl = prepareUrl(HT_HOST + '/service-CooperateSOA/GetLinkManInfo').build() return fetchJSON(fetchUrl) .then(json => { if (json.errcode == 0) { set(() => ({ loginUser: { token: loginToken, timeout: false, userId: json.Result.LMI_SN, username: json.Result.LoginName, travelAgencyId: json.Result.LMI_VEI_SN, travelAgencyName: json.Result.VName, telephone: json.Result.LkPhone, emailAddress: json.Result.LMI_listmail, cityId: json.Result.citysn, }, loginStatus: 302 })) setStorage(KEY_USER_ID, json.Result.LMI_SN) setStorage(KEY_TRAVEL_AGENCY_ID, json.Result.LMI_VEI_SN) // loadPageSpy(`${json.Result.VName}-${json.Result.LoginName}`) // this.startTokenInterval() } else { throw new Error(json.errmsg + ': ' + json.errcode) } }) }, logout: () => { const { clearStorage } = useStorage() clearStorage() set(() => ({ loginUser: { token: '', timeout: true }, loginStatus: 0 })) }, fetchUserDetail: () => { const { loginUser } = get() const fetchUrl = prepareUrl(HT_HOST + '/service-CooperateSOA/GetLinkManInfo') .append('token', loginUser.token) .build(); return fetchJSON(fetchUrl) .then(json => { if (json.errcode == 0) { set((state) => ({ loginUser: { ...state.loginUser, userId: json.Result.LMI_SN, username: json.Result.LoginName, travelAgencyId: json.Result.LMI_VEI_SN, travelAgencyName: json.Result.VName, telephone: json.Result.LkPhone, emailAddress: json.Result.LMI_listmail, cityId: json.Result.citysn, } })) // loadPageSpy(`${json.Result.VName}-${json.Result.LoginName}`) // this.startTokenInterval() return loginUser } else { throw new Error(json.errmsg + ': ' + json.errcode) } }); }, startTokenInterval: () => { const { loginUser } = get() async function fetchLastRequet() { const fetchUrl = prepareUrl(HT_HOST + '/service-CooperateSOA/GetLastReqDate') .append('token', loginUser.token) .build(); const json = await fetchJSON(fetchUrl) if (json.errcode == 0 && isNotEmpty(json.result)) { return json.result.LastReqDate; } else { return 0; } } async function checkTokenTimeout() { const lastRequest = await fetchLastRequet(); const lastReqDate = new Date(lastRequest); const now = new Date(); const diffTime = now.getTime() - lastReqDate.getTime(); const diffHours = diffTime/1000/60/60; if (diffHours > 4) { authStore.logout(); } } const interval = setInterval(() => checkTokenTimeout(), 1000*60*20) set(() => ({ tokenInterval: interval })) }, changeUserPassword: (password, newPassword) => { const { loginUser } = get() const formData = new FormData(); formData.append('UserID', loginUser.userId); formData.append('Password', password); formData.append('NewPassword', newPassword); formData.append('token', loginUser.token); 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 export class Auth { login = { token: '', userId: 0, // LMI_SN username: '0', travelAgencyId: 0, // VEI_SN travelAgencyName: '', telephone: '', emailAddress: '', cityId: 0, timeout: false } }