|
|
import { create } from 'zustand'
|
|
|
import { devtools } from 'zustand/middleware'
|
|
|
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 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`, { lmi_sn: userId})
|
|
|
return errcode !== 0 ? {} : result
|
|
|
}
|
|
|
|
|
|
const initialState = {
|
|
|
loginStatus: 0,
|
|
|
defaltRoute: '',
|
|
|
currentUser: {
|
|
|
username: '',
|
|
|
realname: '',
|
|
|
rolesName: '',
|
|
|
emailAddress: '',
|
|
|
travelAgencyName: '',
|
|
|
},
|
|
|
permissionList: []
|
|
|
}
|
|
|
|
|
|
const useAuthStore = create(devtools((set, get) => ({
|
|
|
|
|
|
...initialState,
|
|
|
|
|
|
initAuth: async () => {
|
|
|
const { loadUserPermission } = get()
|
|
|
const { setStorage, loginToken } = usingStorage()
|
|
|
|
|
|
// Dev 模式使用 localStorage,会有 token 失效情况,需要手动删除
|
|
|
// Prod 环境没有该问题
|
|
|
const userJson = await fetchUserDetail(loginToken)
|
|
|
|
|
|
appendRequestParams('token', loginToken)
|
|
|
appendRequestParams('lmi_sn', userJson.LMI_SN)
|
|
|
|
|
|
setStorage(KEY_USER_ID, userJson.LMI_SN)
|
|
|
setStorage(KEY_TRAVEL_AGENCY_ID, userJson.LMI_VEI_SN)
|
|
|
|
|
|
await loadUserPermission(userJson.LMI_SN)
|
|
|
|
|
|
set(() => ({
|
|
|
currentUser: {
|
|
|
username: userJson.LoginName,
|
|
|
realname: userJson.real_name,
|
|
|
rolesName: userJson.roles_name,
|
|
|
emailAddress: userJson.LMI_listmail,
|
|
|
travelAgencyName: userJson.VName,
|
|
|
}
|
|
|
}))
|
|
|
|
|
|
loadPageSpy(`${userJson.real_name}-${userJson.VName}`)
|
|
|
},
|
|
|
|
|
|
authenticate: async (usr, pwd) => {
|
|
|
const { initAuth } = get()
|
|
|
const { setStorage } = usingStorage()
|
|
|
|
|
|
const { token: loginToken } = await fetchLoginToken(usr, pwd)
|
|
|
|
|
|
setStorage(KEY_LOGIN_TOKEN, loginToken)
|
|
|
|
|
|
await initAuth()
|
|
|
|
|
|
set(() => ({
|
|
|
loginStatus: 302
|
|
|
}))
|
|
|
},
|
|
|
|
|
|
loadUserPermission: async(userId) => {
|
|
|
let deaultPage = '/'
|
|
|
const permissionResult = await fetchPermissionListByUserId(userId)
|
|
|
const pageList = permissionResult.filter(p => {
|
|
|
return p.res_category === 'page'
|
|
|
})
|
|
|
if (pageList.length > 0) {
|
|
|
const resPattern = pageList[0].res_pattern
|
|
|
const splitResult = resPattern.split('=')
|
|
|
if (splitResult.length > 1)
|
|
|
deaultPage = splitResult[1]
|
|
|
}
|
|
|
|
|
|
set(() => ({
|
|
|
defaultRoute: deaultPage,
|
|
|
permissionList: permissionResult.map(p => p.res_pattern)
|
|
|
}))
|
|
|
},
|
|
|
|
|
|
logout: () => {
|
|
|
const { currentUser } = get()
|
|
|
const { clearStorage } = usingStorage()
|
|
|
clearStorage()
|
|
|
set(() => ({
|
|
|
...initialState,
|
|
|
currentUser: {
|
|
|
username: currentUser.username
|
|
|
}
|
|
|
}))
|
|
|
},
|
|
|
|
|
|
// TODO: 迁移到 Account.js
|
|
|
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)
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
|
|
|
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) == 0) {
|
|
|
return true
|
|
|
}
|
|
|
if (value === perm) {
|
|
|
return true
|
|
|
}
|
|
|
return false
|
|
|
})
|
|
|
},
|
|
|
|
|
|
// 根据某项数据来判断是否有权限
|
|
|
//
|
|
|
// INSERT INTO [dbo].[auth_resource] ([res_name] ,[res_pattern], [res_category])
|
|
|
// VALUES ('审核CH直销产品', '[125, 375]', 'data')
|
|
|
//
|
|
|
// const PERM_PRODUCTS_AUDIT_CH = '[125, 375]'
|
|
|
isAllowed: (perm, data) => {
|
|
|
return true
|
|
|
},
|
|
|
|
|
|
}), { name: 'authStore' }))
|
|
|
|
|
|
export default useAuthStore
|