diff --git a/frontend/src/api/request.ts b/frontend/src/api/request.ts deleted file mode 100644 index be83ccef..00000000 --- a/frontend/src/api/request.ts +++ /dev/null @@ -1,44 +0,0 @@ -import axios, { AxiosResponse } from 'axios'; -import { message } from 'antd'; - -export interface ApiResponse { - code: number; - message: string; - data: T; - success: boolean; -} - -const request = axios.create({ - baseURL: '/api', - timeout: 5000, -}); - -request.interceptors.request.use( - (config) => { - const token = localStorage.getItem('token'); - if (token) { - config.headers.Authorization = `Bearer ${token}`; - } - return config; - }, - (error) => { - return Promise.reject(error); - } -); - -request.interceptors.response.use( - (response: AxiosResponse>) => { - const res = response.data; - if (res.code !== 200) { - message.error(res.message || '请求失败'); - return Promise.reject(new Error(res.message || '请求失败')); - } - return res.data; - }, - (error) => { - message.error(error.message || '请求失败'); - return Promise.reject(error); - } -); - -export default request; \ No newline at end of file diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts index d4929774..040e4212 100644 --- a/frontend/src/api/user.ts +++ b/frontend/src/api/user.ts @@ -15,7 +15,7 @@ export interface LoginResult { } export const login = async (data: LoginParams): Promise => { - return request.post('/api/auth/login', data); + return request.post('/api/v1/users/login', data); }; export const logout = async (): Promise => { @@ -23,7 +23,7 @@ export const logout = async (): Promise => { }; export const getUserMenus = async (): Promise => { - return request.get('/api/system/user/menus'); + return request.get('/api/v1/menu/user'); }; export const getUsers = async (params: any) => { diff --git a/frontend/src/pages/Login/index.tsx b/frontend/src/pages/Login/index.tsx index 8ab97e60..c7411895 100644 --- a/frontend/src/pages/Login/index.tsx +++ b/frontend/src/pages/Login/index.tsx @@ -1,120 +1,120 @@ -import React, { useEffect, useState } from 'react'; -import { Form, Input, Button, message, Select } from 'antd'; -import { useNavigate } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; -import { login } from '../../api/user'; -import { getEnabledTenants } from '../../pages/System/Tenant/service'; -import { setToken, setUserInfo } from '../../store/userSlice'; -import type { LoginParams } from '../../types/user'; -import type { TenantDTO } from '../../pages/System/Tenant/types'; +import React, {useEffect, useState} from 'react'; +import {Form, Input, Button, message, Select} from 'antd'; +import {useNavigate} from 'react-router-dom'; +import {useDispatch} from 'react-redux'; +import {login} from '../../api/user'; +import {getEnabledTenants} from '../System/Tenant/service'; +import {setToken, setUserInfo} from '../../store/userSlice'; +import type {LoginParams} from '../../types/user'; +import type {TenantDTO} from '../System/Tenant/types'; const Login: React.FC = () => { - const navigate = useNavigate(); - const dispatch = useDispatch(); - const [form] = Form.useForm(); - const [loading, setLoading] = useState(false); - const [tenants, setTenants] = useState([]); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [tenants, setTenants] = useState([]); - useEffect(() => { - fetchTenants(); - }, []); + useEffect(() => { + fetchTenants(); + }, []); - const fetchTenants = async () => { - try { - const data = await getEnabledTenants(); - setTenants(data); - } catch (error) { - console.error('获取租户列表失败:', error); - } - }; + const fetchTenants = async () => { + try { + const data = await getEnabledTenants(); + setTenants(data); + } catch (error) { + console.error('获取租户列表失败:', error); + } + }; - const onFinish = async (values: LoginParams & { tenantId?: string }) => { - try { - setLoading(true); - const { tenantId, ...loginParams } = values; - const result = await login(loginParams); - - // 保存租户ID到localStorage - if (tenantId) { - localStorage.setItem('tenantId', tenantId); - } + const onFinish = async (values: LoginParams & { tenantId?: string }) => { + try { + setLoading(true); + const {tenantId, ...loginParams} = values; + const result = await login(loginParams); - dispatch(setToken(result.token)); - dispatch(setUserInfo({ - id: result.id, - username: result.username, - nickname: result.nickname, - email: result.email, - phone: result.phone - })); - - message.success('登录成功'); - navigate('/dashboard', { replace: true }); - } catch (error) { - console.error('登录失败:', error); - } finally { - setLoading(false); - } - }; + // 保存租户ID到localStorage + if (tenantId) { + localStorage.setItem('tenantId', tenantId); + } - return ( -
-
-

系统登录

-
- - - + message.success('登录成功'); + navigate('/dashboard', {replace: true}); + } catch (error) { + console.error('登录失败:', error); + } finally { + setLoading(false); + } + }; - - - + return ( +
+
+

系统登录

+ + + + + + + + + + + + + +
+
+ ); }; export default Login; \ No newline at end of file diff --git a/frontend/src/pages/System/Tenant/service.ts b/frontend/src/pages/System/Tenant/service.ts index de0e269d..d78139e1 100644 --- a/frontend/src/pages/System/Tenant/service.ts +++ b/frontend/src/pages/System/Tenant/service.ts @@ -1,37 +1,37 @@ import request from '@/utils/request'; -import type { TenantDTO, TenantQuery } from './types'; +import type {TenantDTO, TenantQuery} from './types'; // 获取租户列表(分页) export const getTenants = async (params?: TenantQuery) => { - return request.get('/api/system/tenants', { params }); + return request.get('/api/system/tenants', {params}); }; // 获取所有启用的租户(用于登录页面) export const getEnabledTenants = async () => { - return request.get('/api/system/tenants/list'); + return request.get('/api/v1/tenant/list'); }; // 创建租户 export const createTenant = async (data: Partial) => { - return request.post('/api/system/tenants', data); + return request.post('/api/system/tenants', data); }; // 更新租户 export const updateTenant = async (id: number, data: Partial) => { - return request.put(`/api/system/tenants/${id}`, data); + return request.put(`/api/system/tenants/${id}`, data); }; // 删除租户 export const deleteTenant = async (id: number) => { - return request.delete(`/api/system/tenants/${id}`); + return request.delete(`/api/system/tenants/${id}`); }; // 检查租户编码是否存在 export const checkTenantCode = async (code: string) => { - return request.get(`/api/system/tenants/check-code`, { params: { code } }); + return request.get(`/api/system/tenants/check-code`, {params: {code}}); }; // 检查租户名称是否存在 export const checkTenantName = async (name: string) => { - return request.get(`/api/system/tenants/check-name`, { params: { name } }); + return request.get(`/api/system/tenants/check-name`, {params: {name}}); }; \ No newline at end of file diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index 918c2941..82c7fe43 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -1,55 +1,53 @@ -import axios, { AxiosResponse } from 'axios'; -import { message } from 'antd'; +import axios, {AxiosResponse} from 'axios'; +import {message} from 'antd'; export interface ApiResponse { - code: number; - message: string; - data: T; - success: boolean; + code: number; + message: string; + data: T; + success: boolean; } const request = axios.create({ - baseURL: '', - timeout: 300000, - withCredentials: true, - headers: { - 'Content-Type': 'application/json' - } + baseURL: '', + timeout: 300000, + withCredentials: true, + headers: { + 'Content-Type': 'application/json' + } }); request.interceptors.request.use( - (config) => { - const token = localStorage.getItem('token'); - const tenantId = localStorage.getItem('tenantId'); - - if (token) { - config.headers.Authorization = `Bearer ${token}`; + (config) => { + const token = localStorage.getItem('token'); + const tenantId = localStorage.getItem('tenantId'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + if (tenantId) { + config.headers['X-Devops-Tenant-Id'] = tenantId; + } + + return config; + }, + (error) => { + return Promise.reject(error); } - - if (tenantId) { - config.headers['X-Tenant-ID'] = tenantId; - } - - return config; - }, - (error) => { - return Promise.reject(error); - } ); request.interceptors.response.use( - (response: AxiosResponse>) => { - const res = response.data; - if (res.code !== 200) { - message.error(res.message || '请求失败'); - return Promise.reject(new Error(res.message || '请求失败')); + (response: AxiosResponse>) => { + const res = response.data; + if (res.code !== 200) { + message.error(res.message || '请求失败'); + return Promise.reject(new Error(res.message || '请求失败')); + } + return Promise.resolve(res.data); + }, + (error) => { + message.error(error.response?.data?.message || '请求失败'); + return Promise.reject(error); } - return Promise.resolve(res.data); - }, - (error) => { - message.error(error.response?.data?.message || '请求失败'); - return Promise.reject(error); - } ); export default request; \ No newline at end of file