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

173 lines
4.6 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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) => {
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
export class Auth {
// TODO: 等待所有获取用户信息修改完后删除
login = {
token: '',
userId: 0, // LMI_SN
username: '0',
travelAgencyId: 0, // VEI_SN
travelAgencyName: '',
telephone: '',
emailAddress: '',
cityId: 0,
timeout: false
}
}