使用vite+react+ts+Ant Design开发后台管理项目(一)

前言

本文将引导开发者从零基础开始,运用vitereactreact-routerreact-reduxAnt Design、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术工具,从项目构思到最终实现的全过程,提供清晰的开发思路和实用的技术应用技巧。

项目gitee地址:lbking666666/enqi-admin

  本系列文章:

  • 使用vite+react+ts+Ant Design开发后台管理项目(一)
  • 使用vite+react+ts+Ant Design开发后台管理项目(二)
  • 使用vite+react+ts+Ant Design开发后台管理项目(三)
  • 使用vite+react+ts+Ant Design开发后台管理项目(四)

项目初始化

  1. 执行命令
     ​​​​​​​npm create vite
  2. 输入项目名称:给项目起个名字
  3. 选择使用的框架:react
  4. 选择语言(  SWC是JavaScript编译工具比Babel要快,但是在功能和插件生态系统方面Babel更完善88849ad8cab64ab3bcb799e3a66e2194.png
  5. 选择完成后,按照提示进入项目文件夹b7087bf09f944606860476b97326c577.png
  6. 安装依赖799cd72441d34713992645e9ac17a0c8.png

配置

路径别名

vite.config.ts里面配置:

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'export default defineConfig({plugins: [react()],resolve: {alias: {"@": path.resolve(__dirname, './src') // 路径别名...}}
})

  如果开发环境是ts,会提示如找不到path或找不到__dirname等,需要先安装一下node的类型声明文件:

npm i -D @types/node

yarn add @types/node -D

修改tsconfig.json文件:添加baseUrl和paths

{"compilerOptions": {"baseUrl": "./",/* path alias */"paths": {"@/*": ["src/*"],...}},
}

样式重置

安装normlize.css重置游览器样式

npm install normalize.css -S

yarn add normalize.css

main.ts文件引入:

import 'normalize.css'

配置Less

npm install  less -S

或者

yarn add less

 安装成功后修改app.css为app.less 使用嵌套写法验证下less是否可以正常使用

b1bd16b24325462c902a2beb6b9aa948.png

539eb273d77d4317b956b728415b0cf0.png

验证less没有问题,后续就可以直接使用less开发

配置Tailwind CSS

安装依赖

npm install -D tailwindcss postcss autoprefixer

成功后执行

npx tailwindcss init -p

 生成tailwind.config.js和postcss.config.js文件

//tailwind.config.jsexport default {content: ["./index.html","./src/**/*.{js,jsx,ts,tsx}"],theme: {extend: {},},plugins: [],
}
//postcss.config.js
export default {plugins: {tailwindcss: {},autoprefixer: {},},
}

引入antd

npm install antd -S

yarn add antd

引入路由

npm install react-router-dom -S

yarn add react-router-dom

 createBrowserRouter模式

使用推荐的路由createBrowserRouter模式;

使用对象方式处理路由,这种配置结构更清晰;

0131424c24eb4723a3882a40cdf64e9a.png

路由文件

在src下新增router文件夹添加index.tsx文件

//router/index.tsx
import { createBrowserRouter } from "react-router-dom";const routers = createBrowserRouter([]);
export default routers;

创建布局组件

目前没有路由所需的文件

先在src文件夹下创建一个layout文件夹 添加index.tsx文件

写一个基本的组件页面只包含一个div文本内容为App Layout

注意:React 组件必须以大写字母开头,而 HTML 标签则必须是小写字母

const AppLayout =()=>{return (<div>App Layout</div>)
}
export default AppLayout;

将布局组件添加到路由

修改router文件夹下的index.tsx文件,添加AppLayout组件

//router/index.tsx
import { createBrowserRouter} from "react-router-dom";
import AppLayout from "@/layout/index";const routers = createBrowserRouter([{path: "/",element: <AppLayout />,children: [], // 如果需要子路由,可以在这里添加},
]); export default routers;

将路由挂载到app.tsx

修改src文件夹下的app.tsx文件内容

//app.tsx
import { RouterProvider } from "react-router-dom";
import routers from '@/router';function App() {return (<><RouterProvider router={routers} /></>)
}export default App

保存后运行命令

npm run dev

预览效果

d8b4324ecea144389efa3d49bfde7908.png

改造布局组件

 在Ant Design上选择布局

b12c505252ac44979cd1399a76bfcb81.png

这里我选择了一个侧边栏布局查看代码,这里选择typeScript语言的代码

0fdc6f8b78584318a6697d2a992b36a6.png

修改布局组件代码

直接复制这里的代码到layout文件夹下的index.tsx文件中替换原来的内容

保存后预览效果如下

64419a76412c45f4ba424799a3231886.png

添加全局样式

上图中高度不能铺满屏幕,这里需要设置一些样式

创建src文件夹下main.less文件

引入tailwind css 

//main.less
@tailwind base;
@tailwind components;
@tailwind utilities;

添加一些样式

//main.less@tailwind base;
@tailwind components;
@tailwind utilities;
:root {font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;line-height: 1.5;font-weight: 400;color-scheme: light dark;color: rgba(255, 255, 255, 0.87);background-color: #242424;font-synthesis: none;text-rendering: optimizeLegibility;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;
}html,body,#root,.app-layout{height:100%;
}

main.tsx中引入main.less

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.tsx'
import 'normalize.css'
import './main.less'createRoot(document.getElementById('root')!).render(<StrictMode><App /></StrictMode>,
)

 测试tailwind css

修改layout下的index.tsx文件

在content文本上添加一些tailwind css的样式

e758be219dcc43eb8e54eca6948fdd37.png

import React, { useState } from "react";
import {MenuFoldOutlined,MenuUnfoldOutlined,UploadOutlined,UserOutlined,VideoCameraOutlined,
} from "@ant-design/icons";
import { Button, Layout, Menu, theme } from "antd";const { Header, Sider, Content } = Layout;const App: React.FC = () => {const [collapsed, setCollapsed] = useState(false);const {token: { colorBgContainer, borderRadiusLG },} = theme.useToken();return (<Layout className="app-layout "><Sider trigger={null} collapsible collapsed={collapsed}><div className="demo-logo-vertical" /><Menutheme="dark"mode="inline"defaultSelectedKeys={["1"]}items={[{key: "1",icon: <UserOutlined />,label: "nav 1",},{key: "2",icon: <VideoCameraOutlined />,label: "nav 2",},{key: "3",icon: <UploadOutlined />,label: "nav 3",},]}/></Sider><Layout><Header style={{ padding: 0, background: colorBgContainer }}><Buttontype="text"icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}onClick={() => setCollapsed(!collapsed)}style={{fontSize: "16px",width: 64,height: 64,}}/></Header><Contentstyle={{margin: "24px 16px",padding: 24,minHeight: 280,background: colorBgContainer,borderRadius: borderRadiusLG,}}><div className="bg-blue-500 text-white p-4 rounded-md">Content</div></Content></Layout></Layout>);
};export default App;

可以看到tailwind css样式生效了

bdef57057e4e464d9c7b7b93c57c92b1.png

拆分布局组件

因为目前的布局组件是都在一个文件中,正常项目里面都是拆分为多个组件中写逻辑,现在需要把layout文件夹下的index.tsx文件进行拆分,在layout文件夹下新增三个文件header.tsx,sider.tsx和main.tsx,本文先大概拆分layout这个布局组件到各个子组件中,下一篇文章中会详细丰富各个子组件的内容

d01a042c2ce148c4bcd8eba5bd8bfb76.png

侧边组件

把index.tsx中的sider部分拿到sider.tsx文件中,里面有个collapsed状态这里先去掉,之后会使用redux状态管理来处理这里

//sider.tsx
import {UploadOutlined,UserOutlined,VideoCameraOutlined,
} from "@ant-design/icons";
import { Layout, Menu } from "antd";const { Sider } = Layout;
const AppSider = () => {return (<Sider trigger={null} collapsible><div className="demo-logo-vertical" /><Menutheme="dark"mode="inline"defaultSelectedKeys={["1"]}items={[{key: "1",icon: <UserOutlined />,label: "nav 1",},{key: "2",icon: <VideoCameraOutlined />,label: "nav 2",},{key: "3",icon: <UploadOutlined />,label: "nav 3",},]}/></Sider>);
};
export default AppSider;

头部组件

同样这里也去掉了collapsed处理和点击事件collapsed的处理

//header.tsx
import { Button, Layout, theme } from "antd";
import {MenuFoldOutlined,} from '@ant-design/icons';
const { Header} = Layout;
const AppHeader = () => {const {token: { colorBgContainer},} = theme.useToken();return (<Header style={{ padding: 0, background: colorBgContainer }}><Buttontype="text"icon={<MenuFoldOutlined />}style={{fontSize: "16px",width: 64,height: 64,}}/></Header>);
};
export default AppHeader;

主体组件

//main.tsx
import { Layout, theme } from "antd";const { Content } = Layout;
const AppMain = () => {const {token: { colorBgContainer, borderRadiusLG },} = theme.useToken();return (<Contentstyle={{margin: "24px 16px",padding: 24,minHeight: 280,background: colorBgContainer,borderRadius: borderRadiusLG,}}><div className="bg-blue-500 text-white p-4 rounded-md">Content</div></Content>);
};
export default AppMain;

重组布局组件

目前已经把头部、侧边栏、主体都已经拆分出去了 需要改造下index.tsx文件如下

//layout/index.tsx
import React from "react";
import {Layout} from "antd";
import AppHeader from "./header";
import AppSider from "./sider";
import AppMain from "./main";const App: React.FC = () => {return (<Layout className="app-layout "><AppSider /><Layout><AppHeader /><AppMain /></Layout></Layout>);
};export default App;

后续

因篇幅限制后续会持续写vite+react+ts+Ant Design开发后台管理项目的系列文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431971.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud Alibaba之Seata处理分布式事务

&#xff08;学习笔记&#xff0c;必用必考&#xff09; 问题&#xff1a;Transactional 的9种失效场景&#xff1f; 1、介绍 1.1、简介 官网地址&#xff1a;Apache Seata 源码地址&#xff1a;Releases apache/incubator-seata GitHub Seata是一款开源的分布式事务解决…

Thinkphp5x远程命令执行 靶场攻略

环境配置 靶场&#xff1a;vulhub/thinkphp/5-rce docker-compose up -d #启动环境 漏洞复现 1.访问靶场&#xff1a;http://172.16.1.198:8080/ 2.远程命令执⾏ POC&#xff1a; ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system…

【VUE_ruoyi-vue】基于ruoyi-vue框架实现简单的系统通用文件模块

基于ruoyi-vue框架&#xff0c;新增一个简单的系统通用文件模块&#xff0c;服务与各个模块涉及到文件上传信息的记录和相关展示 运行sql,创建数据库表 DROP TABLE IF EXISTS sys_file_info; CREATE TABLE sys_file_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT id,lin…

在虚幻引擎中实时显示帧率

引擎自带了显示帧率的功能 但是只能在编辑器中显示 , 在游戏发布后就没有了 , 所以我们要自己做一个 创建一个控件蓝图 创建画布和文本 , 修改文本 文本绑定函数 , 点击创建绑定 添加一个名为 FPS 的变量 格式化文本 用大括号把变量包起来 {FPS Int} FPS 然后转到事件图表…

机器学习算法与Python实战 | 三万字详解!GPT-5:你需要知道的一切(下)建议收藏!

本文来源公众号“机器学习算法与Python实战”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;三万字详解&#xff01;GPT-5&#xff1a;你需要知道的一切 作者&#xff1a;Alberto Romero &#xff08;青稞AI整理&#xff09; 原…

Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解

目录 Linux环境下配置安装VScode并配置Go语言开发环境Go语言源码的组织方式Go语言源码安装后的结果Go程序构建和安装的过程go build扩展go get 命令详解 之前学习过Go语言&#xff0c;学习的时候没有记录笔记&#xff0c;最近找了个极客时间的Go语言36讲&#xff0c;打算时间学…

第 1 章:Vue 核心

1. Vue 简介 1.1. 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/&#xff1a;中文官网里面【教程】和【API】是比较重要的。用到api就去查询&#xff0c;实践当中记忆更牢靠。 风格指南&#xff1a;官方推荐写的一个代码风格cookbook&#xff1a;编写v…

QT窗口无法激活弹出问题排查记录

问题背景 问题环境 操作系统: 银河麒麟V10SP1qt版本 : 5.12.12 碰见了一个问题应用最小化,然后激活程序窗口无法弹出 这里描述一下代码的逻辑,使用QLocalServer实现一个单例进程,具体的功能就是在已存在一个程序A进程时,再启动这个程序A,新的程序A进程会被杀死,然后激活已存…

视频汇聚EasyCVR视频监控平台调取接口提示“认证过期”是什么原因?

视频汇聚EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。EasyCVR平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&…

Kolmogorov-Arnold——代替 MLP以提高模型的代表性和性能

前言 论文地址&#xff1a;https://arxiv.org/abs/2409.10594 源码地址&#xff1a;https://github.com/Adamdad/kat.git 传统的变压器模型使用多层感知器&#xff08;MLP&#xff09;来混合通道间的信息&#xff0c;而本文则使用了科尔莫哥罗德网络&#xff08;KAN&#xff0…

golang操作mysql利器-gorm

1、傻瓜示例 GORM通过将数据库表中的数据映射到面向对象的模型中&#xff0c;简化了数据库操作&#xff0c;使得开发者可以很方便的使用代码来操作数据库&#xff0c;而无需编写SQL语句。 目前有个mysql表&#xff1a;miniprogram_orders&#xff0c;其存储了所有用户对应的订…

Go容器化微服务系统实战

1-1 本课的go微服务有什么不同&#xff1f; 聚焦于容器化可观测的购物微服务系统实战&#xff0c;通过介绍Go语言的应用趋势、容器化优势及微服务适用性&#xff0c;旨在解决学习微服务过程中遇到的难点。课程内容涵盖微服务整体架构、技术工具框架及容器平台等关键技术&#…

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用&#xff0c; clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

百度amis框架经验分享

百度amis框架经验分享 官方文档 amis - 低代码前端框架 这篇文章讲了amis的设计 为什么说百度AMIS框架是一个优秀的设计_百度前端框架-CSDN博客 学习方法&#xff1a; 最好的学习方法就是GPT官方文档 不要去很大力气通读官方文档&#xff0c;大概浏览一遍就行&#xff0c; 以你…

JS面试真题 part6

JS面试真题 part6 26、如何判断一个元素是否在可视区域中27、什么是单点登录&#xff1f;如何实现28、 如何实现上拉加载&#xff0c;下拉刷新29、说说你对正则表达式的理解&#xff1f;应用场景&#xff1f;30、说说你对函数式编程的理解&#xff1f;优缺点 26、如何判断一个元…

MySQL 主从复制部署与优化

文章目录 前言 在现代数据库管理中&#xff0c;MySQL 主从复制是一种关键技术&#xff0c;用于提高数据的可用性和性能。随着 Docker 容器技术的普及&#xff0c;利用 Docker 搭建 MySQL 主从复制环境已成为一种趋势&#xff0c;它提供了一种简便、高效且可扩展的解决方案。本…

某建筑市场爬虫数据采集逆向分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

应用层 I(C/S模型、P2P模型、域名系统DNS)【★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、网络应用模型 在网络边缘的端系统之间的通信方式通常可划分为两大类&#xff1a;客户 - 服务器方式&#xff08;C/S 方式 [Client/Server] &#xff09;和对等…

Linux:编译,调试和Makefile

一丶vim编译器 ### 基本概念 模式&#xff1a;Vim有几种不同的模式&#xff0c;包括&#xff1a; 命令/正常/普通模式&#xff1a;控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入Insert mode下&#xff0c;或者到 last line mode 插入模…

【Vision Transformer】辅助理解笔记

注&#xff1a;本文主要是对 PPT 部分内容的补充与拓展&#xff0c;建议结合使用&#xff08;当然也完全可以单看&#xff09;。 一、基础知识 1、从向量表示到词嵌入 这部分主要是参考如下文章&#xff0c;大部分图片均来自此文&#xff1a;The Illustrated Word2vec – Jay…