提交前端代码
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> => {
|
||||
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) => {
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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}});
|
||||
};
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user