私活必备,一个react+vite+antd的标准后台管理系统开发模版,动态菜单配置、权限精确到按钮...

先看几张图:

0781d7a6d7b6b15ffebbe2bf3997f847.png

c84cbb51e432aa19f0c7e558d9208225.png

在现代前端开发中,构建一个高效灵活的后台管理系统已成为许多开发者的一个基本要求,发布构建是否够快,尤其是当项目不断迭代,代码不断增多后,是否还能高效构建。

本文将介绍一个基于React、Vite和Antd的标准后台管理系统开发模板,支持动态菜单配置和权限精确到按钮的实现。通过这个模板,开发者可以迅速搭建起一个功能完备、可扩展性强的后台管理系统,没有使用create-rect-app脚手架,完全从0开始自己搭建,使用了目前比较先进的技术。

1578be273d32f05d11afb41b61ecb944.png

c186f51b07ddcf5c57cf2e27b3c4ed49.png

9c2d2e326bc8c41003c1f9e36976bf98.png

技术栈:

react+redux+hook+vite+antd+less+axios  基于vite构建,本地开发体验很不错

非服务端渲染,仿antd-pro外观,但没有使用dva和roadhog

目录结构:

2121d1afb1a9435d9571a360430e4d11.png

项目启动

pnpm install       // 安装依赖模块
pnpm run dev       // 运行开发环境
pnpm run build     // 正式打包,生成最终代码
pnpm run preview   // 本地运行正式打包后的最终代码
pnpm run prettier  // 一键格式化代码

启动问题:

执行 npm run build 后有提示ts错误,传入的类型和实际定义的不符

dba108f3b5f7d56eb8eabcb3964277e2.png

解决办法:找到getData方法的定义,入参增加any即可。

3d35f79fea15a7be6e16a87dbc224d1f.png

e7df4556b106d2e31156c21a8a6ccf9f.png

本地开发走mock:

本地使用 mockjs 进行接口拦截做本地mock数据。

正式环境需要关闭此配置。

/**
 * MOCK模拟数据
 * 不需要下面这些mock配置,仅本地用
 * */
import Mock from "mockjs";
// @ts-ignore
import mock from "../../mock/app-data.js";
Mock.mock(/\/api.*/, (options: any) => {
  const res = mock(options);
  return res;
});

4b784d72c53fb4345e73ea68614a0597.png

动态菜单配置:

接口按照此格式返回即可。

/**
 * MOCK模拟数据
 * 不需要下面这些mock配置,仅本地用
 * 正式打包需要去掉
 * */
import Mock from "mockjs";
// @ts-ignore
import mock from "../../mock/app-data.js";
Mock.mock(/\/api.*/, (options: any) => {
  const res = mock(options);
  return res;
});// 所有的菜单数据
const menus = [
  {
    id: 1,
    title: "首页",
    icon: "icon-home",
    url: "/home",
    parent: null,
    desc: "首页",
    sorts: 0,
    conditions: 1,
  },
  {
    id: 2,
    title: "系统管理",
    icon: "icon-setting",
    url: "/system",
    parent: null,
    desc: "系统管理目录分支",
    sorts: 1,
    conditions: 1,
  },
  {
    id: 3,
    title: "用户管理",
    icon: "icon-user",
    url: "/system/useradmin",
    parent: 2,
    desc: "系统管理/用户管理",
    sorts: 0,
    conditions: 1,
  },
  {
    id: 4,
    title: "角色管理",
    icon: "icon-team",
    url: "/system/roleadmin",
    parent: 2,
    desc: "系统管理/角色管理",
    sorts: 1,
    conditions: 1,
  },
  {
    id: 5,
    title: "权限管理",
    icon: "icon-safetycertificate",
    url: "/system/poweradmin",
    parent: 2,
    desc: "系统管理/权限管理",
    sorts: 2,
    conditions: 1,
  },
  {
    id: 6,
    title: "菜单管理",
    icon: "icon-appstore",
    url: "/system/menuadmin",
    parent: 2,
    desc: "系统管理/菜单管理",
    sorts: 3,
    conditions: 1,
  },
];// 所有的菜单数据
const menus = [
  {
    id: 1,
    title: "首页",
    icon: "icon-home",
    url: "/home",
    parent: null,
    desc: "首页",
    sorts: 0,
    conditions: 1,
  },
  {
    id: 2,
    title: "系统管理",
    icon: "icon-setting",
    url: "/system",
    parent: null,
    desc: "系统管理目录分支",
    sorts: 1,
    conditions: 1,
  },
  {
    id: 3,
    title: "用户管理",
    icon: "icon-user",
    url: "/system/useradmin",
    parent: 2,
    desc: "系统管理/用户管理",
    sorts: 0,
    conditions: 1,
  },
  {
    id: 4,
    title: "角色管理",
    icon: "icon-team",
    url: "/system/roleadmin",
    parent: 2,
    desc: "系统管理/角色管理",
    sorts: 1,
    conditions: 1,
  },
  {
    id: 5,
    title: "权限管理",
    icon: "icon-safetycertificate",
    url: "/system/poweradmin",
    parent: 2,
    desc: "系统管理/权限管理",
    sorts: 2,
    conditions: 1,
  },
  {
    id: 6,
    title: "菜单管理",
    icon: "icon-appstore",
    url: "/system/menuadmin",
    parent: 2,
    desc: "系统管理/菜单管理",
    sorts: 3,
    conditions: 1,
  },
];

登录信息保存:

登录状态保存在的localstorage内

// 用户提交登录
  const onSubmit = async (): Promise<void> => {
    try {
      const values = await form.validateFields();
      setLoading(true);
      const res = await loginIn(values.username, values.password);
      if (res && res.status === 200) {
        message.success("登录成功");
        if (rememberPassword) {
          localStorage.setItem(
            "userLoginInfo",
            JSON.stringify({
              username: values.username,
              password: tools.compile(values.password), // 密码简单加密一下再存到localStorage
            })
          ); // 保存用户名和密码
        } else {
          localStorage.removeItem("userLoginInfo");
        }
        /** 将这些信息加密后存入sessionStorage,并存入store **/
        sessionStorage.setItem(
          "userinfo",
          tools.compile(JSON.stringify(res.data))
        );
        await dispatch.app.setUserInfo(res.data);
        navigate("/"); // 跳转到主页
      } else {
        message.error(res?.message ?? "登录失败");
        setLoading(false);
      }
    } catch (e) {
      // 验证未通过
    }
  };

github地址:https://github.com/javaLuo/react-admin

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React全家桶是指使用React作为开发框架时所使用的相关技术和工具的集合,包括ReactReact Router、Redux等。而Ant Design是一款由蚂蚁金服团队开发React组件库,提供了丰富的基础组件和模板,可以帮助我们快速构建美观、可靠的后台管理系统。 在开发共享单车后台管理系统时,使用React全家桶和Ant Design框架可以带来一系列的优势。首先,React可以帮助我们构建可复用的组件,通过组件化的开发方式提高开发效率和代码的可维护性。其次,React Router实现了前端路由的管理,可以实现多页面之间的无刷新跳转,提升用户体验。再者,Redux是一个可预测状态管理的容器,可以方便地管理应用的状态和数据流动,提供了一种可靠的数据管理方式。 Ant Design作为一个UI组件库,提供了丰富的基础组件和模板,可以帮助我们快速构建整洁美观的后台管理系统。它的组件库包括了输入框、按钮、表格、图标等常见组件,还有一些特殊的业务组件,比如日期选择器、地图等等。通过使用Ant Design的组件库,我们可以快速搭建界面,减少开发时间,提高开发效率。同时,Ant Design提供了一套规范的设计语言和配色方案,保证了整个系统在视觉上的一致性,提升了用户的使用体验。 综上所述,使用React全家桶和Ant Design框架开发共享单车后台管理系统,可以提高开发效率、代码可维护性和用户体验。同时,Ant Design的美观、可靠的组件库能够有效地帮助我们构建一个优质的后台管理系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz_jesse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值