refactor: 优化认证系统和组件类型安全性

- 新增 safeLocalStorage 工具函数增强本地存储安全性
- 简化认证流程,重构用户数据结构和 token 管理
- 修复多个模块的 TypeScript 类型错误和导入问题
- 优化状态管理,重构各模块 store 结构
- 清理冗余代码,移除未使用的组件和函数
- 改进错误处理和边界情况处理
- 更新配置文件以支持最新的类型检查

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-13 14:52:52 +08:00
parent dfc29ce01f
commit 68d9d97142
29 changed files with 1122 additions and 3001 deletions

View File

@@ -1,675 +1,129 @@
import { create } from 'zustand'
import {
Tenant,
User,
SystemParameter,
SystemLog,
Message
} from '@api/modules/config'
import { configApi } from '@api'
import { QueryRequest } from '@api/types'
import { create } from 'zustand';
interface ConfigState {
// 租户数据
tenantList: Tenant[]
selectedTenant: Tenant | null
tenantLoading: boolean
tenantPagination: {
page: number
pageSize: number
total: number
}
// 用户数据
userList: User[]
selectedUser: User | null
userLoading: boolean
userPagination: {
page: number
pageSize: number
total: number
}
// 系统参数数据
parameterList: SystemParameter[]
selectedParameter: SystemParameter | null
parameterLoading: boolean
parameterPagination: {
page: number
pageSize: number
total: number
}
// 系统日志数据
logList: SystemLog[]
logLoading: boolean
logPagination: {
page: number
pageSize: number
total: number
}
// 消息数据
messageList: Message[]
selectedMessage: Message | null
messageLoading: boolean
messagePagination: {
page: number
pageSize: number
total: number
}
unreadCount: number
// 系统指标数据
systemMetrics: {
totalUsers: number
activeUsers: number
totalTenants: number
activeTenants: number
systemUptime: number
cpuUsage: number
memoryUsage: number
diskUsage: number
databaseConnections: number
} | null
systemHealth: {
status: 'healthy' | 'warning' | 'critical'
services: Array<{
name: string
status: 'up' | 'down'
responseTime: number
lastCheck: string
}>
issues: Array<{
type: 'error' | 'warning'
message: string
timestamp: string
}>
} | null
// 租户接口
export interface Tenant {
id: string;
name: string;
code: string;
description?: string | null;
status: 'active' | 'inactive' | 'suspended';
contact_email?: string | null;
contact_phone?: string | null;
max_users?: number | null;
created_at: string;
updated_at: string;
}
interface ConfigActions {
// 租户操作
fetchTenantList: (params?: QueryRequest) => Promise<void>
fetchTenantDetail: (id: string) => Promise<void>
createTenant: (data: Omit<Tenant, 'id' | 'createdAt' | 'updatedAt' | 'currentUsers'>) => Promise<void>
updateTenant: (id: string, data: Partial<Tenant>) => Promise<void>
deleteTenant: (id: string) => Promise<void>
suspendTenant: (id: string) => Promise<void>
activateTenant: (id: string) => Promise<void>
setSelectedTenant: (tenant: Tenant | null) => void
// 用户操作
fetchUserList: (params?: QueryRequest) => Promise<void>
fetchUserDetail: (id: string) => Promise<void>
createUser: (data: Omit<User, 'id' | 'createdAt' | 'updatedAt' | 'lastLoginAt'>) => Promise<void>
updateUser: (id: string, data: Partial<User>) => Promise<void>
deleteUser: (id: string) => Promise<void>
resetPassword: (id: string, newPassword: string) => Promise<void>
lockUser: (id: string) => Promise<void>
unlockUser: (id: string) => Promise<void>
setSelectedUser: (user: User | null) => void
// 系统参数操作
fetchParameterList: (params?: QueryRequest) => Promise<void>
fetchParameterDetail: (id: string) => Promise<void>
createParameter: (data: Omit<SystemParameter, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
updateParameter: (id: string, data: Partial<SystemParameter>) => Promise<void>
deleteParameter: (id: string) => Promise<void>
getParametersByCategory: (category: string) => Promise<void>
setSelectedParameter: (parameter: SystemParameter | null) => void
// 系统监控操作
fetchSystemLogs: (params?: QueryRequest & { level?: string; category?: string }) => Promise<void>
fetchSystemMetrics: () => Promise<void>
fetchSystemHealth: () => Promise<void>
// 消息操作
fetchMessageList: (params?: QueryRequest) => Promise<void>
fetchMessageDetail: (id: string) => Promise<void>
createMessage: (data: Omit<Message, 'id' | 'createdAt' | 'readAt' | 'status'>) => Promise<void>
markMessageAsRead: (id: string) => Promise<void>
archiveMessage: (id: string) => Promise<void>
deleteMessage: (id: string) => Promise<void>
getUnreadCount: () => Promise<void>
setSelectedMessage: (message: Message | null) => void
// 用户接口
export interface User {
id: string;
username: string;
email: string;
full_name?: string | null;
phone?: string | null;
role: string;
status: 'active' | 'inactive' | 'suspended';
tenant_id: string;
last_login_at?: string | null;
created_at: string;
updated_at: string;
}
export const useConfigStore = create<ConfigState & ConfigActions>((set, get) => ({
// 初始状态
tenantList: [],
selectedTenant: null,
tenantLoading: false,
tenantPagination: {
page: 1,
pageSize: 10,
total: 0
// 系统参数接口
export interface SystemParameter {
id: string;
key: string;
value: string;
description?: string | null;
category: string;
data_type: 'string' | 'number' | 'boolean' | 'json';
is_system: boolean;
created_at: string;
updated_at: string;
}
// Config state interface
export interface ConfigState {
tenants: Tenant[];
currentTenant: Tenant | null;
users: User[];
currentUser: User | null;
systemParameters: SystemParameter[];
currentParameter: SystemParameter | null;
// Actions
setTenants: (tenants: Tenant[]) => void;
setCurrentTenant: (tenant: Tenant | null) => void;
setUsers: (users: User[]) => void;
setCurrentUser: (user: User | null) => void;
setSystemParameters: (parameters: SystemParameter[]) => void;
setCurrentParameter: (parameter: SystemParameter | null) => void;
// Getters
getTenants: () => Tenant[];
getCurrentTenant: () => Tenant | null;
getUsers: () => User[];
getCurrentUser: () => User | null;
getSystemParameters: () => SystemParameter[];
getCurrentParameter: () => SystemParameter | null;
}
// Create Config store
export const useConfigStore = create<ConfigState>((set, get) => ({
tenants: [],
currentTenant: null,
users: [],
currentUser: null,
systemParameters: [],
currentParameter: null,
setTenants: (tenants: Tenant[]) => {
set({ tenants });
},
userList: [],
selectedUser: null,
userLoading: false,
userPagination: {
page: 1,
pageSize: 10,
total: 0
setCurrentTenant: (tenant: Tenant | null) => {
set({ currentTenant: tenant });
},
parameterList: [],
selectedParameter: null,
parameterLoading: false,
parameterPagination: {
page: 1,
pageSize: 10,
total: 0
setUsers: (users: User[]) => {
set({ users });
},
logList: [],
logLoading: false,
logPagination: {
page: 1,
pageSize: 10,
total: 0
setCurrentUser: (user: User | null) => {
set({ currentUser: user });
},
messageList: [],
selectedMessage: null,
messageLoading: false,
messagePagination: {
page: 1,
pageSize: 10,
total: 0
},
unreadCount: 0,
systemMetrics: null,
systemHealth: null,
// 租户操作
fetchTenantList: async (params) => {
try {
set({ tenantLoading: true })
const response = await configApi.getTenantList({
page: params?.page || 1,
pageSize: params?.pageSize || 10,
...params
})
set({
tenantList: response.data.items,
tenantPagination: {
page: response.data.page,
pageSize: response.data.pageSize,
total: response.data.total
},
tenantLoading: false
})
} catch (error) {
console.error('获取租户列表失败:', error)
set({ tenantLoading: false })
}
setSystemParameters: (parameters: SystemParameter[]) => {
set({ systemParameters: parameters });
},
fetchTenantDetail: async (id) => {
try {
set({ tenantLoading: true })
const response = await configApi.getTenantDetail(id)
set({
selectedTenant: response.data,
tenantLoading: false
})
} catch (error) {
console.error('获取租户详情失败:', error)
set({ tenantLoading: false })
}
setCurrentParameter: (parameter: SystemParameter | null) => {
set({ currentParameter: parameter });
},
createTenant: async (data) => {
try {
const response = await configApi.createTenant(data)
const currentList = get().tenantList
set({
tenantList: [response.data, ...currentList]
})
} catch (error) {
console.error('创建租户失败:', error)
}
getTenants: () => {
return get().tenants;
},
updateTenant: async (id, data) => {
try {
const response = await configApi.updateTenant(id, data)
const currentList = get().tenantList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
tenantList: updatedList,
selectedTenant: response.data
})
} catch (error) {
console.error('更新租户失败:', error)
}
getCurrentTenant: () => {
return get().currentTenant;
},
deleteTenant: async (id) => {
try {
await configApi.deleteTenant(id)
const currentList = get().tenantList
const updatedList = currentList.filter(item => item.id !== id)
set({
tenantList: updatedList,
selectedTenant: null
})
} catch (error) {
console.error('删除租户失败:', error)
}
getUsers: () => {
return get().users;
},
suspendTenant: async (id) => {
try {
const response = await configApi.suspendTenant(id)
const currentList = get().tenantList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
tenantList: updatedList,
selectedTenant: response.data
})
} catch (error) {
console.error('暂停租户失败:', error)
}
getCurrentUser: () => {
return get().currentUser;
},
activateTenant: async (id) => {
try {
const response = await configApi.activateTenant(id)
const currentList = get().tenantList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
tenantList: updatedList,
selectedTenant: response.data
})
} catch (error) {
console.error('激活租户失败:', error)
}
getSystemParameters: () => {
return get().systemParameters;
},
setSelectedTenant: (tenant) => set({ selectedTenant: tenant }),
// 用户操作
fetchUserList: async (params) => {
try {
set({ userLoading: true })
const response = await configApi.getUserList({
page: params?.page || 1,
pageSize: params?.pageSize || 10,
...params
})
set({
userList: response.data.items,
userPagination: {
page: response.data.page,
pageSize: response.data.pageSize,
total: response.data.total
},
userLoading: false
})
} catch (error) {
console.error('获取用户列表失败:', error)
set({ userLoading: false })
}
getCurrentParameter: () => {
return get().currentParameter;
},
}));
fetchUserDetail: async (id) => {
try {
set({ userLoading: true })
const response = await configApi.getUserDetail(id)
set({
selectedUser: response.data,
userLoading: false
})
} catch (error) {
console.error('获取用户详情失败:', error)
set({ userLoading: false })
}
},
createUser: async (data) => {
try {
const response = await configApi.createUser(data)
const currentList = get().userList
set({
userList: [response.data, ...currentList]
})
} catch (error) {
console.error('创建用户失败:', error)
}
},
updateUser: async (id, data) => {
try {
const response = await configApi.updateUser(id, data)
const currentList = get().userList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
userList: updatedList,
selectedUser: response.data
})
} catch (error) {
console.error('更新用户失败:', error)
}
},
deleteUser: async (id) => {
try {
await configApi.deleteUser(id)
const currentList = get().userList
const updatedList = currentList.filter(item => item.id !== id)
set({
userList: updatedList,
selectedUser: null
})
} catch (error) {
console.error('删除用户失败:', error)
}
},
resetPassword: async (id, newPassword) => {
try {
await configApi.resetPassword(id, newPassword)
} catch (error) {
console.error('重置密码失败:', error)
}
},
lockUser: async (id) => {
try {
const response = await configApi.lockUser(id)
const currentList = get().userList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
userList: updatedList,
selectedUser: response.data
})
} catch (error) {
console.error('锁定用户失败:', error)
}
},
unlockUser: async (id) => {
try {
const response = await configApi.unlockUser(id)
const currentList = get().userList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
userList: updatedList,
selectedUser: response.data
})
} catch (error) {
console.error('解锁用户失败:', error)
}
},
setSelectedUser: (user) => set({ selectedUser: user }),
// 系统参数操作
fetchParameterList: async (params) => {
try {
set({ parameterLoading: true })
const response = await configApi.getParameterList({
page: params?.page || 1,
pageSize: params?.pageSize || 10,
...params
})
set({
parameterList: response.data.items,
parameterPagination: {
page: response.data.page,
pageSize: response.data.pageSize,
total: response.data.total
},
parameterLoading: false
})
} catch (error) {
console.error('获取系统参数列表失败:', error)
set({ parameterLoading: false })
}
},
fetchParameterDetail: async (id) => {
try {
set({ parameterLoading: true })
const response = await configApi.getParameterDetail(id)
set({
selectedParameter: response.data,
parameterLoading: false
})
} catch (error) {
console.error('获取系统参数详情失败:', error)
set({ parameterLoading: false })
}
},
createParameter: async (data) => {
try {
const response = await configApi.createParameter(data)
const currentList = get().parameterList
set({
parameterList: [response.data, ...currentList]
})
} catch (error) {
console.error('创建系统参数失败:', error)
}
},
updateParameter: async (id, data) => {
try {
const response = await configApi.updateParameter(id, data)
const currentList = get().parameterList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
parameterList: updatedList,
selectedParameter: response.data
})
} catch (error) {
console.error('更新系统参数失败:', error)
}
},
deleteParameter: async (id) => {
try {
await configApi.deleteParameter(id)
const currentList = get().parameterList
const updatedList = currentList.filter(item => item.id !== id)
set({
parameterList: updatedList,
selectedParameter: null
})
} catch (error) {
console.error('删除系统参数失败:', error)
}
},
getParametersByCategory: async (category) => {
try {
set({ parameterLoading: true })
const response = await configApi.getParametersByCategory(category)
set({
parameterList: response.data,
parameterLoading: false
})
} catch (error) {
console.error('获取分类参数失败:', error)
set({ parameterLoading: false })
}
},
setSelectedParameter: (parameter) => set({ selectedParameter: parameter }),
// 系统监控操作
fetchSystemLogs: async (params) => {
try {
set({ logLoading: true })
const response = await configApi.getSystemLogs({
page: params?.page || 1,
pageSize: params?.pageSize || 10,
...params
})
set({
logList: response.data.items,
logPagination: {
page: response.data.page,
pageSize: response.data.pageSize,
total: response.data.total
},
logLoading: false
})
} catch (error) {
console.error('获取系统日志失败:', error)
set({ logLoading: false })
}
},
fetchSystemMetrics: async () => {
try {
const response = await configApi.getSystemMetrics()
set({
systemMetrics: response.data
})
} catch (error) {
console.error('获取系统指标失败:', error)
}
},
fetchSystemHealth: async () => {
try {
const response = await configApi.getSystemHealth()
set({
systemHealth: response.data
})
} catch (error) {
console.error('获取系统健康状态失败:', error)
}
},
// 消息操作
fetchMessageList: async (params) => {
try {
set({ messageLoading: true })
const response = await configApi.getMessageList({
page: params?.page || 1,
pageSize: params?.pageSize || 10,
...params
})
set({
messageList: response.data.items,
messagePagination: {
page: response.data.page,
pageSize: response.data.pageSize,
total: response.data.total
},
messageLoading: false
})
} catch (error) {
console.error('获取消息列表失败:', error)
set({ messageLoading: false })
}
},
fetchMessageDetail: async (id) => {
try {
set({ messageLoading: true })
const response = await configApi.getMessageDetail(id)
set({
selectedMessage: response.data,
messageLoading: false
})
} catch (error) {
console.error('获取消息详情失败:', error)
set({ messageLoading: false })
}
},
createMessage: async (data) => {
try {
const response = await configApi.createMessage(data)
const currentList = get().messageList
set({
messageList: [response.data, ...currentList]
})
} catch (error) {
console.error('创建消息失败:', error)
}
},
markMessageAsRead: async (id) => {
try {
const response = await configApi.markMessageAsRead(id)
const currentList = get().messageList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
messageList: updatedList,
selectedMessage: response.data
})
} catch (error) {
console.error('标记消息已读失败:', error)
}
},
archiveMessage: async (id) => {
try {
const response = await configApi.archiveMessage(id)
const currentList = get().messageList
const updatedList = currentList.map(item =>
item.id === id ? response.data : item
)
set({
messageList: updatedList,
selectedMessage: response.data
})
} catch (error) {
console.error('归档消息失败:', error)
}
},
deleteMessage: async (id) => {
try {
await configApi.deleteMessage(id)
const currentList = get().messageList
const updatedList = currentList.filter(item => item.id !== id)
set({
messageList: updatedList,
selectedMessage: null
})
} catch (error) {
console.error('删除消息失败:', error)
}
},
getUnreadCount: async () => {
try {
const response = await configApi.getUnreadCount()
set({
unreadCount: response.data.count
})
} catch (error) {
console.error('获取未读消息数量失败:', error)
}
},
setSelectedMessage: (message) => set({ selectedMessage: message })
}))
export default useConfigStore;