一、创建登陆页面
- src\pages\login\index.tsx
import React from "react";
import { useNavigate } from "react-router-dom";
import { Button, Form, Input, message, Space } from "antd";
import { doLogin } from "../../api/login";
import styles from "./login.module.scss";
const Index = () => {
const navigateTo = useNavigate();
const login = (values: Login) => {
doLogin(values).then((res) => {
if (res.success) {
localStorage.setItem("token", res.data.token);
message.success("登录成功");
setTimeout(() => {
navigateTo("/");
}, 1500);
} else {
message.error(res.errorMessage);
}
});
};
return (
<>
<div className={styles.loginContainer}>
<Form
className={styles.loginForm}
initialValues={{
username: "最爱白菜吖",
password: "123456",
}}
onFinish={login}
labelCol={{ span: 5 }}
wrapperCol={{ span: 16 }}
>
<Form.Item
label="用户名"
name={"username"}
rules={[
{
min: 2,
required: true,
message: "用户名长度至少2位",
},
]}
>
<Input />
</Form.Item>
<Form.Item
label="密码"
name={"password"}
rules={[
{
min: 6,
required: true,
message: "用户名长度至少6位",
},
]}
>
<Input />
</Form.Item>
<Form.Item wrapperCol={{ offset: 8, span: 16 }}>
<Space>
<Button type="primary" htmlType="submit">
登录
</Button>
<Button htmlType="reset">重置</Button>
</Space>
</Form.Item>
</Form>
</div>
</>
);
};
export default Index;
- 样式 src\pages\login\login.module.scss
.loginContainer {
width: 100vw;
height: 100vh;
background-image: url(../../static/images/bg.jpg);
background-size: cover;
.loginForm {
padding: 80px;
width: 500px;
height: 300px;
background-color: white;
border-radius: 6px;
left: 50%;
top: 50%;
position: absolute;
transform: translate(-50%, -50%);
}
}
- 全局的变量声明 src\pages\login\login.d.ts
declare interface Login {
username: string;
password: string;
}
二、网络请求
- 配置 axios => src\request\request.tsx
import { message } from "antd";
import axios from "axios";
const request = axios.create({
timeout: 5000,
});
request.interceptors.request.use((config) => {
const token = localStorage.getItem("token");
if (token) {
if (config && config?.headers) {
config.headers["authorization"] = token;
}
}
return config;
});
request.interceptors.response.use(
(res) => {
return res.data;
},
(e) => {
message.error(e.message);
return Promise.reject(e);
}
);
export default request;
- 配置转发 src\setupProxy.js
const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function (app) {
app.use(
"/admin",
createProxyMiddleware({
target: "http://localhost:3006",
changeOrigin: true,
})
);
};
- 配置请求返回的类型声明 src\react-app-env.d.ts
declare global {
interface ResponseSuccess<T = {}> {
success: boolean;
errorMessage?: string;
data: T;
}
interface IPagination<T> {
success: boolean;
errorMessage?: string;
data: {
list: T[];
current: 1;
pageSize: number;
total: number;
totalPage: number;
};
}
interface Window {
logout(): void;
}
}
export {};
- 登陆请求 src\api\login.tsx
import request from "../request/request";
export function doLogin(admin: Login) {
return request.post<any, ResponseSuccess<{ token: string }>>(
"/admin/admin/login",
admin
);
}
- App.tsx 中引入
import React from "react";
import Login from "./pages/login";
function App() {
return (
<>
<Login />
</>
);
}
export default App;