提交前端代码

This commit is contained in:
dengqichen 2024-11-29 18:02:28 +08:00
parent 7b3ffc69c0
commit 8f6de47af3
5 changed files with 154 additions and 200 deletions

View File

@ -1,44 +0,0 @@
import axios, { AxiosResponse } from 'axios';
import { message } from 'antd';
export interface ApiResponse<T> {
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<ApiResponse<any>>) => {
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;

View File

@ -15,7 +15,7 @@ export interface LoginResult {
} }
export const login = async (data: LoginParams): Promise<LoginResult> => { export const login = async (data: LoginParams): Promise<LoginResult> => {
return request.post('/api/auth/login', data); return request.post('/api/v1/users/login', data);
}; };
export const logout = async (): Promise<void> => { export const logout = async (): Promise<void> => {
@ -23,7 +23,7 @@ export const logout = async (): Promise<void> => {
}; };
export const getUserMenus = async (): Promise<MenuDTO[]> => { export const getUserMenus = async (): Promise<MenuDTO[]> => {
return request.get('/api/system/user/menus'); return request.get('/api/v1/menu/user');
}; };
export const getUsers = async (params: any) => { export const getUsers = async (params: any) => {

View File

@ -1,12 +1,12 @@
import React, { useEffect, useState } from 'react'; import React, {useEffect, useState} from 'react';
import { Form, Input, Button, message, Select } from 'antd'; import {Form, Input, Button, message, Select} from 'antd';
import { useNavigate } from 'react-router-dom'; import {useNavigate} from 'react-router-dom';
import { useDispatch } from 'react-redux'; import {useDispatch} from 'react-redux';
import { login } from '../../api/user'; import {login} from '../../api/user';
import { getEnabledTenants } from '../../pages/System/Tenant/service'; import {getEnabledTenants} from '../System/Tenant/service';
import { setToken, setUserInfo } from '../../store/userSlice'; import {setToken, setUserInfo} from '../../store/userSlice';
import type { LoginParams } from '../../types/user'; import type {LoginParams} from '../../types/user';
import type { TenantDTO } from '../../pages/System/Tenant/types'; import type {TenantDTO} from '../System/Tenant/types';
const Login: React.FC = () => { const Login: React.FC = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@ -31,7 +31,7 @@ const Login: React.FC = () => {
const onFinish = async (values: LoginParams & { tenantId?: string }) => { const onFinish = async (values: LoginParams & { tenantId?: string }) => {
try { try {
setLoading(true); setLoading(true);
const { tenantId, ...loginParams } = values; const {tenantId, ...loginParams} = values;
const result = await login(loginParams); const result = await login(loginParams);
// 保存租户ID到localStorage // 保存租户ID到localStorage
@ -49,7 +49,7 @@ const Login: React.FC = () => {
})); }));
message.success('登录成功'); message.success('登录成功');
navigate('/dashboard', { replace: true }); navigate('/dashboard', {replace: true});
} catch (error) { } catch (error) {
console.error('登录失败:', error); console.error('登录失败:', error);
} finally { } finally {
@ -72,7 +72,7 @@ const Login: React.FC = () => {
borderRadius: '8px', borderRadius: '8px',
boxShadow: '0 2px 8px rgba(0,0,0,0.1)' boxShadow: '0 2px 8px rgba(0,0,0,0.1)'
}}> }}>
<h2 style={{ textAlign: 'center', marginBottom: '30px' }}></h2> <h2 style={{textAlign: 'center', marginBottom: '30px'}}></h2>
<Form <Form
form={form} form={form}
name="login" name="login"
@ -81,7 +81,7 @@ const Login: React.FC = () => {
> >
<Form.Item <Form.Item
name="tenantId" name="tenantId"
rules={[{ required: true, message: '请选择租户!' }]} rules={[{required: true, message: '请选择租户!'}]}
> >
<Select <Select
placeholder="请选择租户" placeholder="请选择租户"
@ -94,16 +94,16 @@ const Login: React.FC = () => {
<Form.Item <Form.Item
name="username" name="username"
rules={[{ required: true, message: '请输入用户名!' }]} rules={[{required: true, message: '请输入用户名!'}]}
> >
<Input placeholder="用户名" size="large" /> <Input placeholder="用户名" size="large"/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="password" name="password"
rules={[{ required: true, message: '请输入密码!' }]} rules={[{required: true, message: '请输入密码!'}]}
> >
<Input.Password placeholder="密码" size="large" /> <Input.Password placeholder="密码" size="large"/>
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>

View File

@ -1,14 +1,14 @@
import request from '@/utils/request'; import request from '@/utils/request';
import type { TenantDTO, TenantQuery } from './types'; import type {TenantDTO, TenantQuery} from './types';
// 获取租户列表(分页) // 获取租户列表(分页)
export const getTenants = async (params?: TenantQuery) => { export const getTenants = async (params?: TenantQuery) => {
return request.get<TenantDTO[]>('/api/system/tenants', { params }); return request.get<TenantDTO[]>('/api/system/tenants', {params});
}; };
// 获取所有启用的租户(用于登录页面) // 获取所有启用的租户(用于登录页面)
export const getEnabledTenants = async () => { export const getEnabledTenants = async () => {
return request.get<TenantDTO[]>('/api/system/tenants/list'); return request.get<TenantDTO[]>('/api/v1/tenant/list');
}; };
// 创建租户 // 创建租户
@ -28,10 +28,10 @@ export const deleteTenant = async (id: number) => {
// 检查租户编码是否存在 // 检查租户编码是否存在
export const checkTenantCode = async (code: string) => { export const checkTenantCode = async (code: string) => {
return request.get<boolean>(`/api/system/tenants/check-code`, { params: { code } }); return request.get<boolean>(`/api/system/tenants/check-code`, {params: {code}});
}; };
// 检查租户名称是否存在 // 检查租户名称是否存在
export const checkTenantName = async (name: string) => { export const checkTenantName = async (name: string) => {
return request.get<boolean>(`/api/system/tenants/check-name`, { params: { name } }); return request.get<boolean>(`/api/system/tenants/check-name`, {params: {name}});
}; };

View File

@ -1,5 +1,5 @@
import axios, { AxiosResponse } from 'axios'; import axios, {AxiosResponse} from 'axios';
import { message } from 'antd'; import {message} from 'antd';
export interface ApiResponse<T> { export interface ApiResponse<T> {
code: number; code: number;
@ -21,13 +21,11 @@ request.interceptors.request.use(
(config) => { (config) => {
const token = localStorage.getItem('token'); const token = localStorage.getItem('token');
const tenantId = localStorage.getItem('tenantId'); const tenantId = localStorage.getItem('tenantId');
if (token) { if (token) {
config.headers.Authorization = `Bearer ${token}`; config.headers.Authorization = `Bearer ${token}`;
} }
if (tenantId) { if (tenantId) {
config.headers['X-Tenant-ID'] = tenantId; config.headers['X-Devops-Tenant-Id'] = tenantId;
} }
return config; return config;