You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
GHHub/src/stores/Auth.js

198 lines
5.5 KiB
JavaScript

import { makeAutoObservable, runInAction } from "mobx";
1 year ago
import { appendRequestParams, fetchJSON, postForm } from '@/utils/request';
import { HT_HOST } from "@/config";
import { isNotEmpty, prepareUrl } from '@/utils/commons';
import { loadPageSpy } from '@/pageSpy';
import { create } from 'zustand'
const KEY_LOGIN_TOKEN = 'KEY_LOGIN_TOKEN';
const KEY_TRAVEL_AGENCY_ID = 'KEY_TRAVEL_AGENCY_ID';
const KEY_USER_ID = 'KEY_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 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 token = await fetchLoginToken()
appendRequestParams('token', token)
const fetchUrl = prepareUrl(HT_HOST + '/service-CooperateSOA/GetLinkManInfo').build()
return fetchJSON(fetchUrl)
.then(json => {
if (json.errcode == 0) {
set(() => ({
loginUser: {
token: token,
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
}))
// loadPageSpy(`${json.Result.VName}-${json.Result.LoginName}`)
// this.startTokenInterval()
} else {
throw new Error(json.errmsg + ': ' + json.errcode)
}
})
},
logout: () => {
window.sessionStorage.clearSession()
set(() => ({
loginUser: {
timeout: true
}
}))
},
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
}
}