提交前端代码
This commit is contained in:
parent
7b3ffc69c0
commit
8f6de47af3
@ -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;
|
|
||||||
@ -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) => {
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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}});
|
||||||
};
|
};
|
||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user