提交前端代码

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> => {
return request.post('/api/auth/login', data);
return request.post('/api/v1/users/login', data);
};
export const logout = async (): Promise<void> => {
@ -23,7 +23,7 @@ export const logout = async (): Promise<void> => {
};
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) => {

View File

@ -1,12 +1,12 @@
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();
@ -31,7 +31,7 @@ const Login: React.FC = () => {
const onFinish = async (values: LoginParams & { tenantId?: string }) => {
try {
setLoading(true);
const { tenantId, ...loginParams } = values;
const {tenantId, ...loginParams} = values;
const result = await login(loginParams);
// 保存租户ID到localStorage
@ -49,7 +49,7 @@ const Login: React.FC = () => {
}));
message.success('登录成功');
navigate('/dashboard', { replace: true });
navigate('/dashboard', {replace: true});
} catch (error) {
console.error('登录失败:', error);
} finally {
@ -72,7 +72,7 @@ const Login: React.FC = () => {
borderRadius: '8px',
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}
name="login"
@ -81,7 +81,7 @@ const Login: React.FC = () => {
>
<Form.Item
name="tenantId"
rules={[{ required: true, message: '请选择租户!' }]}
rules={[{required: true, message: '请选择租户!'}]}
>
<Select
placeholder="请选择租户"
@ -94,16 +94,16 @@ const Login: React.FC = () => {
<Form.Item
name="username"
rules={[{ required: true, message: '请输入用户名!' }]}
rules={[{required: true, message: '请输入用户名!'}]}
>
<Input placeholder="用户名" size="large" />
<Input placeholder="用户名" size="large"/>
</Form.Item>
<Form.Item
name="password"
rules={[{ required: true, message: '请输入密码!' }]}
rules={[{required: true, message: '请输入密码!'}]}
>
<Input.Password placeholder="密码" size="large" />
<Input.Password placeholder="密码" size="large"/>
</Form.Item>
<Form.Item>

View File

@ -1,14 +1,14 @@
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<TenantDTO[]>('/api/system/tenants', { params });
return request.get<TenantDTO[]>('/api/system/tenants', {params});
};
// 获取所有启用的租户(用于登录页面)
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) => {
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) => {
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 { message } from 'antd';
import axios, {AxiosResponse} from 'axios';
import {message} from 'antd';
export interface ApiResponse<T> {
code: number;
@ -21,13 +21,11 @@ request.interceptors.request.use(
(config) => {
const token = localStorage.getItem('token');
const tenantId = localStorage.getItem('tenantId');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
if (tenantId) {
config.headers['X-Tenant-ID'] = tenantId;
config.headers['X-Devops-Tenant-Id'] = tenantId;
}
return config;