feat: 实现基础设施层
axios 请求封装及七个业务模块 API,Pinia 状态管理(auth/system/models/tools),Mock 适配器与数据,以及流式对话、轮询、倒计时组合式函数。
This commit is contained in:
45
frontend/src/stores/auth.ts
Normal file
45
frontend/src/stores/auth.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
import { login as loginApi } from '@/api/modules/system'
|
||||
import { SESSION_TIMEOUT } from '@/constants'
|
||||
|
||||
/**
|
||||
* 认证 store
|
||||
* 沿用原项目 localStorage 的登录时间戳 + 5 分钟会话超时机制
|
||||
*/
|
||||
export const useAuthStore = defineStore('auth', () => {
|
||||
const username = ref<string>(localStorage.getItem('username') || '')
|
||||
const loginTime = ref<number>(parseInt(localStorage.getItem('loginTime') || '0', 10) || 0)
|
||||
|
||||
const isLoggedIn = computed(() => {
|
||||
if (!loginTime.value) return false
|
||||
return Date.now() - loginTime.value < SESSION_TIMEOUT
|
||||
})
|
||||
|
||||
/** 登录 */
|
||||
async function login(user: string, password: string) {
|
||||
await loginApi(user, password)
|
||||
username.value = user
|
||||
loginTime.value = Date.now()
|
||||
localStorage.setItem('username', user)
|
||||
localStorage.setItem('loginTime', String(loginTime.value))
|
||||
}
|
||||
|
||||
/** 续期会话(活跃时刷新) */
|
||||
function refresh() {
|
||||
if (isLoggedIn.value) {
|
||||
loginTime.value = Date.now()
|
||||
localStorage.setItem('loginTime', String(loginTime.value))
|
||||
}
|
||||
}
|
||||
|
||||
/** 退出 */
|
||||
function logout() {
|
||||
username.value = ''
|
||||
loginTime.value = 0
|
||||
localStorage.removeItem('username')
|
||||
localStorage.removeItem('loginTime')
|
||||
}
|
||||
|
||||
return { username, loginTime, isLoggedIn, login, refresh, logout }
|
||||
})
|
||||
Reference in New Issue
Block a user