feat: 重构登录页面和API结构,添加动态菜单和路由权限控制

- 重构登录页面为简洁风格,移除动画角色,优化表单验证和错误提示
- 重新组织API模块结构,拆分为system和user子模块
- 添加动态菜单获取和路由权限控制功能
- 实现404页面和错误处理
- 更新环境配置文件,区分开发、测试和生产环境
- 优化请求拦截器,处理token和错误响应
- 添加菜单状态管理,支持动态路由生成和权限验证
- 更新主布局,支持动态菜单渲染和响应式设计
- 优化首页样式和组件结构
This commit is contained in:
LuRuiqian
2026-04-17 11:44:50 +08:00
parent 44d19d4eb1
commit 39542b378f
16 changed files with 847 additions and 651 deletions

4
src/api/index.ts Normal file
View File

@@ -0,0 +1,4 @@
// API 统一出口
export * from './system/loginApi'
export * from './system/menuApi'
export * from './user/userApi'

View File

@@ -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)
}
)

View 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',
})
}

View 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
View 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,
})
}

View File

@@ -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')
}