首页 > 其他分享 >React、Ant Design 5.0 构建通用后台管理系统 - 登录页面

React、Ant Design 5.0 构建通用后台管理系统 - 登录页面

时间:2023-04-24 16:45:14浏览次数:51  
标签:5.0 React return 登录 LoginType Ant import Login css

目录

安装依赖

npm install antd @ant-design/icons @ant-design/pro-components

Ant Design组件库
@ant-design/pro-components封装一些好用的常用组件库

main.tsx

import '@/styles/global.css'
import 'antd/dist/reset.css'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <App />
)

// React.StrictMode在开发时出现两次执行,开发时注释掉,部署时放开
// ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
//   <React.StrictMode>
//     <App />
//   </React.StrictMode>,
// )

添加了antd的reset样式,以及自定义样式global.css

src/styles/global.css

#root {
  height: 100%;
}

App.tsx

import Login from '@/pages/user/Login'
import { ConfigProvider } from 'antd'
import zhCN from 'antd/es/locale/zh_CN'
import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'

function App() {
  // 路由对象转标签
  // const convert = (route: RouteObject) => {
  //   if (Array.isArray(route.children)) {
  //     return (
  //       <Route key={route.path} path={route.path} element={route.element}>
  //         {route.children.map((item) => convert(item))}
  //       </Route>
  //     )
  //   } else {
  //     return (
  //       <Route key={route.path} path={route.path} element={route.element} />
  //     )
  //   }
  // }

  return (
    <ConfigProvider locale={zhCN}>
      <BrowserRouter>
        <Routes>
          {/* 开发登录组件,默认跳转到登录页面,Navigate具有跳转功能 */}
          <Route path="*" element={<Navigate to={'/user/login'} />} />
          {/* 登录页面 */}
          <Route path="/user/login" element={<Login />} />
          {/* <Route
            element={
              <div>
                <Link to={'/'}>首页</Link>
                <Link to={'/system'}>系统管理</Link>
                <Outlet />
              </div>
            }
          >
            {routes.map((route) => convert(route))}
          </Route> */}
        </Routes>
      </BrowserRouter>
    </ConfigProvider>
  )
}

export default App

src/pages/user/Login/index.tsx

import { LockOutlined, MobileOutlined, UserOutlined } from '@ant-design/icons'
import {
  LoginForm,
  ProFormCaptcha,
  ProFormCheckbox,
  ProFormText,
} from '@ant-design/pro-components'
import { Tabs, message } from 'antd'
import { useState } from 'react'
import style from './style.module.css'

const enum LoginType {
  Account = 'account',
  Phone = 'phone',
}

function Login() {
  const [messageApi, contextHolder] = message.useMessage()
  const [loginType, setLoginType] = useState<LoginType>(LoginType.Account)
  return (
    <>
      {contextHolder}
      <div className={style.container}>
        <div className={style.content}>
          <LoginForm
            title="后台管理登录系统"
            subTitle="The Backend Login System."
          >
            <Tabs
              centered
              activeKey={loginType}
              onChange={(activeKey) => setLoginType(activeKey as LoginType)}
              items={[
                {
                  key: LoginType.Account,
                  label: '账号密码登录',
                },
                {
                  key: LoginType.Phone,
                  label: '手机号登录',
                },
              ]}
            />
            {loginType === LoginType.Account && (
              <>
                <ProFormText
                  name={'username'}
                  fieldProps={{
                    size: 'large',
                    prefix: <UserOutlined />,
                  }}
                  placeholder={'用户名'}
                  rules={[
                    {
                      required: true,
                      message: '请输入用户名!',
                    },
                  ]}
                />
                <ProFormText.Password
                  name={'password'}
                  fieldProps={{
                    size: 'large',
                    prefix: <LockOutlined />,
                  }}
                  placeholder={'密码'}
                  rules={[
                    {
                      required: true,
                      message: '请输入密码!',
                    },
                  ]}
                />
              </>
            )}
            {loginType === LoginType.Phone && (
              <>
                <ProFormText
                  name={'mobile'}
                  fieldProps={{
                    size: 'large',
                    prefix: <MobileOutlined />,
                  }}
                  placeholder={'手机号'}
                  rules={[
                    {
                      required: true,
                      message: '请输入手机号!',
                    },
                  ]}
                />
                <ProFormCaptcha
                  name={'captcha'}
                  fieldProps={{
                    size: 'large',
                    prefix: <LockOutlined />,
                  }}
                  captchaProps={{
                    size: 'large',
                  }}
                  placeholder={'请输入验证码'}
                  captchaTextRender={(timing, count) => {
                    if (timing) {
                      return `${count} 获取验证码`
                    }
                    return '获取验证码'
                  }}
                  onGetCaptcha={async () => {
                    messageApi.success(`获取验证码成功! 验证码为1234`)
                  }}
                />
              </>
            )}
            <div
              style={{
                marginBlockEnd: 24,
              }}
            >
              <ProFormCheckbox noStyle name={'autoLogin'}>
                自动登录
              </ProFormCheckbox>
              <a style={{ float: 'right' }}>忘记密码?</a>
              <div style={{ clear: 'both' }}></div>
            </div>
          </LoginForm>
        </div>
      </div>
    </>
  )
}

export default Login

src/pages/user/Login/style.module.css

.container {
  height: 100%;
  background-image: url("/images/login_bg.svg");
  background-size: 100%;
  background-position: center 110px;
  background-repeat: no-repeat;
  background-color: #f0f2f5;
}

.container .content {
  padding-top: 40px;
}

请自备背景图,存放在src/public/images/上,或者自定义路径都行

至此,中规中矩的登录页面做好,下一章会编写api接口,sql建表语句等等

标签:5.0,React,return,登录,LoginType,Ant,import,Login,css
From: https://www.cnblogs.com/EvilChan/p/17350026.html

相关文章

  • 解决 vagrant up下载太慢的问题
    1、下载链接手动下载CentOS7镜像,这里的2004_01可以修改成自己想要的版本(这里下载很快的,一两分钟就搞定了)https://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box2、加载下载的镜像1、cd到下载镜像的文件,打开windowcmd命令......
  • centos7 安装bash5.0
    查看自己bash的版本/bin/bash--version下载bash5.0版本wgethttp://ftp.gnu.org/gnu/bash/bash-5.0.tar.gz解压tarzxvfbash-5.0.tar.gz进入目录cdbash-5.0编译./configure&&make&&makeinstall创建软连接mv/bin/bash/bin/bash.bakln-s/usr/local/bin/bash......
  • codeforces 559C Gerald and Giant Chess(dp+组合数学)
    题目链接:codeforces559C题目大意:给出一个h*r的矩阵,从左上角走到右下角,中间有一些点不能经过,问不同的路径有多少种?题目分析:首先我们考虑一个n*m的矩阵,从左上角只能向右或向下走能走到右下角的方案数,也就是C(n+m,n),就是一共要走n+m次,选出n次横着走。那么我们定义dp[i]表示在前不经......
  • SpringBoot+React 前后端分离
    SpringBoot+React前后端分离写个转发数据的小工具,本来只想开个SpringBoot服务带个页面,但感觉有点难受,正好之前研究了React,尝试一下前后端分离。后端简单用SpringBoot起个服务,写个接口处理请求:@RestController@RequestMapping("/data")publicclassDataController{......
  • react
    React是一个用于构建用户界面的JAVASCRIPT库。React主要用于构建UI,很多人认为React是MVC中的V(视图)。React起源于Facebook的内部项目,用来架设Instagram的网站,并于2013年5月开源。React拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。1.......
  • vue项目结合,vant 实现中轮播图中,点击图片放大图片
    思路:vant中提供函数ImagePreview给原每一个图片子元素设置点击事件,api中提供initial-swipe索引,拿到原图索引设置change事件,保存大图切换的对应索引给到自己的initial-swipe索引中设置图片预览切换时,根据切换后的索引,设置原图的位置,大图原图同步原图片swipeTo(i)切换到......
  • ant design of vue的a-rang-picker时间控制既不能选今天以后的日期且开始时间跟结束时
    在项目中这个问题在困扰我,虽然我知道它是有一个Api是disableDate来控制时间的选择;但是只能够实现开始时间跟结束时间之间差不能超过3天。效果图接下来就是代码时间呀<a-col><a-form-model-itemlabel="任务时间范围"prop="priceRangeDate"><a-range-picker......
  • FastCopy v5.0.5 绿色汉化版
    更新流水:2023.04.22:自改官方5.0.5最新正式版本2022.04.20:首个自改官方 5.0.4最新正式版本修改内容:by.th_sjy&安心爱&萌面蛋饺基于th_sjy汉化版为模板,重新修正中文语言(感谢安心爱对日语翻译提供帮助)删除多余语言,解除在WinPE环境下运行限制剔除检测更新及帮助内多余菜单......
  • VirtualBox、Vagrant以及与Docker的区别
    VirtualBox和Vagrant都是虚拟化工具,用于在计算机上创建虚拟操作系统或虚拟开发环境。以下是它们的介绍:1.VirtualBox:VirtualBox是由Oracle公司开发的开源虚拟化软件,适用于Windows、Linux、Mac和其他操作系统。它允许用户在计算机上运行多个虚拟操作系统,这些操作系统以软件方式(......
  • 计算机网络 ACL和ANT
    目录一、ACL概况二、ACL工作过程三、ACL实验四、ANT概况五、ANT工作过程六、ANT实验            一、ACL概况概念:主要是对报文进行区分,路由器会对报文进行检查,查看是否符合通过标准或者不通过标准,才判断允许通过和不允许通过原理:当数据......