feat: 重构登录页面和API结构,添加动态菜单和路由权限控制
- 重构登录页面为简洁风格,移除动画角色,优化表单验证和错误提示 - 重新组织API模块结构,拆分为system和user子模块 - 添加动态菜单获取和路由权限控制功能 - 实现404页面和错误处理 - 更新环境配置文件,区分开发、测试和生产环境 - 优化请求拦截器,处理token和错误响应 - 添加菜单状态管理,支持动态路由生成和权限验证 - 更新主布局,支持动态菜单渲染和响应式设计 - 优化首页样式和组件结构
This commit is contained in:
4
src/api/index.ts
Normal file
4
src/api/index.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
// API 统一出口
|
||||
export * from './system/loginApi'
|
||||
export * from './system/menuApi'
|
||||
export * from './user/userApi'
|
||||
@@ -14,8 +14,11 @@ request.interceptors.request.use(
|
||||
(config) => {
|
||||
const userStore = useUserStore()
|
||||
if (userStore.token) {
|
||||
config.headers.Authorization = `Bearer ${userStore.token}`
|
||||
config.headers.token = userStore.token
|
||||
}
|
||||
// 删除 Cookie 和 Authorization
|
||||
delete config.headers.Cookie
|
||||
delete config.headers.Authorization
|
||||
return config
|
||||
},
|
||||
(error) => {
|
||||
@@ -26,11 +29,12 @@ request.interceptors.request.use(
|
||||
request.interceptors.response.use(
|
||||
(response: AxiosResponse) => {
|
||||
const { data } = response
|
||||
if (data.code !== 200) {
|
||||
ElMessage.error(data.message || '请求失败')
|
||||
return Promise.reject(new Error(data.message))
|
||||
// code 为 0 或 200 表示成功
|
||||
if (data.code !== 0 && data.code !== 200) {
|
||||
ElMessage.error(data.msg || '请求失败')
|
||||
return Promise.reject(new Error(data.msg || '请求失败'))
|
||||
}
|
||||
return data
|
||||
return data.data
|
||||
},
|
||||
(error) => {
|
||||
const { response } = error
|
||||
@@ -39,7 +43,7 @@ request.interceptors.response.use(
|
||||
userStore.clearUser()
|
||||
window.location.href = '/login'
|
||||
}
|
||||
ElMessage.error(response?.data?.message || '网络错误')
|
||||
ElMessage.error(response?.data?.msg || '网络错误')
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
24
src/api/system/loginApi.ts
Normal file
24
src/api/system/loginApi.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import request from '../request'
|
||||
|
||||
// 登录接口
|
||||
export function login(data: { username: string; password: string; captcha: string; uuid: string }) {
|
||||
return request({
|
||||
url: '/login',
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
||||
// 获取验证码
|
||||
export function getCaptchaUrl(uuid: string) {
|
||||
const baseUrl = import.meta.env.VITE_API_BASE_URL || '/api'
|
||||
return `${baseUrl}/captcha?uuid=${uuid}&t=${Date.now()}`
|
||||
}
|
||||
|
||||
// 退出登录
|
||||
export function logout() {
|
||||
return request({
|
||||
url: '/sys/logout',
|
||||
method: 'post',
|
||||
})
|
||||
}
|
||||
9
src/api/system/menuApi.ts
Normal file
9
src/api/system/menuApi.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import request from '../request'
|
||||
|
||||
// 获取动态菜单
|
||||
export function getNavMenu() {
|
||||
return request({
|
||||
url: '/sys/menu/nav',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
45
src/api/user/userApi.ts
Normal file
45
src/api/user/userApi.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import request from '../request'
|
||||
|
||||
// 获取用户信息
|
||||
export function getUserInfo() {
|
||||
return request({
|
||||
url: '/sys/user/info',
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
// 获取用户列表
|
||||
export function getUserList(params: { page: number; limit: number; username?: string }) {
|
||||
return request({
|
||||
url: '/sys/user/list',
|
||||
method: 'get',
|
||||
params,
|
||||
})
|
||||
}
|
||||
|
||||
// 新增用户
|
||||
export function addUser(data: Record<string, any>) {
|
||||
return request({
|
||||
url: '/sys/user/save',
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
||||
// 修改用户
|
||||
export function updateUser(data: Record<string, any>) {
|
||||
return request({
|
||||
url: '/sys/user/update',
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
||||
// 删除用户
|
||||
export function deleteUser(ids: number[]) {
|
||||
return request({
|
||||
url: '/sys/user/delete',
|
||||
method: 'post',
|
||||
data: ids,
|
||||
})
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
import request from './request'
|
||||
|
||||
export interface LoginParams {
|
||||
username: string
|
||||
password: string
|
||||
}
|
||||
|
||||
export interface LoginResult {
|
||||
token: string
|
||||
userInfo: Record<string, any>
|
||||
}
|
||||
|
||||
export function login(data: LoginParams) {
|
||||
return request.post<LoginResult>('/user/login', data)
|
||||
}
|
||||
|
||||
export function getUserInfo() {
|
||||
return request.get('/user/info')
|
||||
}
|
||||
|
||||
export function logout() {
|
||||
return request.post('/user/logout')
|
||||
}
|
||||
Reference in New Issue
Block a user