记一次umi开发后台管理系统的基础使用

2023-11-15

先介绍一个umi,阿里开源的一个企业级可插拔的react脚手架,

umi相对比react官方推荐的脚手架更加的简单,更贴近vue-cli的使用感受,而本文仅仅介绍基础使用方法,高手请绕行

开发展示

仿叮咚买菜后台管理系统预览: http://dingdong-admin.nodebook.top/

仿叮咚买菜 前台页面: http://dingdong.nodebook.top/

叮咚买菜后台管理系源码: https://github.com/cgq001/dingdong-admin

叮咚买菜源码: https://github.com/cgq001/dingdong

功能说明:

演示动图:

一.介绍

介绍内容来自官网,感兴趣可 百度 umi 到官网查看详情

创建项目:

 yarn create umi

选择 project

? Select the boilerplate type (Use arrow keys)
  ant-design-pro  - Create project with an layout-only ant-design-pro boilerplate, use together with umi block.
❯ app             - Create project with a simple boilerplate, support typescript.
  block           - Create a umi block.
  library         - Create a library with umi.
  plugin          - Create a umi plugin.

然后,选择你需要的功能 这里 antd 是UI库 dva 封装了redux 等

? What functionality do you want to enable? (Press <space> to select, <a> to toggle all, <i> to invert selection)
❯◯ antd
❯◯ dva
 ◯ code splitting
 ◯ dll

运行项目

 yarn start

目录

├── dist/                          // 默认的 build 输出目录
├── mock/                          // mock 文件所在目录,基于 express
├── config/
    ├── config.js                  // umi 配置,同 .umirc.js,二选一
└── src/                           // 源码目录,可选
    ├── layouts/index.js           // 全局布局
    ├── pages/                     // 页面目录,里面的文件即路由
        ├── .umi/                  // dev 临时目录,需添加到 .gitignore
        ├── .umi-production/       // build 临时目录,会自动删除
        ├── document.ejs           // HTML 模板
        ├── 404.js                 // 404 页面
        ├── page1.js               // 页面 1,任意命名,导出 react 组件
        ├── page1.test.js          // 用例文件,umi test 会匹配所有 .test.js 和 .e2e.js 结尾的文件
        └── page2.js               // 页面 2,任意命名
    ├── global.css                 // 约定的全局样式文件,自动引入,也可以用 global.less
    ├── global.js                  // 可以在这里加入 polyfill
    ├── app.js                     // 运行时配置文件
├── .umirc.js                      // umi 配置,同 config/config.js,二选一
├── .env                           // 环境变量
└── package.json

使用

一.路由

1.1关于.umirc.js 文件配置

umi 可以使用类似 nuxt.js的约定式路由,当然本次介绍 类似于我们常在vue用使用的配置式路由,即可在这里配置

具体配置详情,请看 代码注释:

export default {
  treeShaking: true,
  routes: [    // 配置路由
      { path: '/',  //重定向到主页
        redirect: '/index/'
      },
      {
        path: '/index',  //主页
        component: '../layouts/index', //公共主页
        // Routes: ['./routes/Login.js'] , //这里是相对根目录(非pages)的,文件名后缀不能少
        routes: [
          // { path: '/index/', component: '../pages/index' },
          { path: '/index/', component: '../pages/Home/HomeIndex/HomeIndex' },  //首页
          { path: '/index/data/index', component: '../pages/Datas/DataIndex/DataIndex' ,srcPath: '12456'} , //数据分析
          { path: '/index/product/shoping/index', component: '../pages/Product/Shoping/ShopIndex/ShopIndex' }, //商品管理
          { path: '/index/product/shoping/add', component: '../pages/Product/Shoping/AddShop/AddShop' }, //添加商品
          { path: '/index/product/class/index', component: '../pages/Product/Class/ClassIndex/ClassIndex' }, //分类管理
          { path: '/index/product/class/add', component: '../pages/Product/Class/AddClass/AddClass' }, //添加分类
          { path: '/index/product/comment/index', component: '../pages/Product/Comment/CommentIndex/CommentIndex' }, //评论管理
          { path: '/index/set/personalcenter/index', component: '../pages/Set/PersonalCenter/PersonalCenter' }, //个人中心
          { path: '/index/set/PersonalSettings/index', component: '../pages/Set/PersonalSettings/PersonalSettings' }, //个人设置
          { path: '/index/order/refund/index', component: '../pages/Order/Refund/RefundIndex/RefundIndex'} ,  //待退款列表
          { path: '/index/order/refund/details', component: '../pages/Order/Refund/RefundDetails/RefundDetails'},   //退款详情
          { path: '/index/order/shipped/index', component: '../pages/Order/Shipped/ShippedIndex/ShippedIndex'} ,  //待发货详情
          { path: '/index/order/shipped/deliver', component: '../pages/Order/Shipped/ShippedDeliver/ShippedDeliver'} ,  //待发货详情
          { path: '/index/control/carousel/index', component: '../pages/Control/Carousel/CarouselIndex/CarouselIndex'} ,  //布局控制 首页轮播 轮播列表
          { path: '/index/control/carousel/add', component: '../pages/Control/Carousel/CarouselAdd/CarouselAdd'} ,  //布局控制 首页轮播 添加轮播图
          { path: '/index/control/keyword/index', component: '../pages/Control/Keyword/KeywordIndex/KeywordIndex'} ,   //布局控制 搜索发现关键词 关键词列表
          { path: '/index/marketing/buy/index', component: '../pages/Marketing/Buy/BuyIndex/BuyIndex'},   //营销控制 首页疯狂抢购 疯狂抢购列表
          { path: '/index/marketing/buy/add', component: '../pages/Marketing/Buy/BuyAdd/BuyAdd'}   //营销控制 首页疯狂抢购 所有商品列表

        ]
      },
      {
        path: '/login',  //登录页
        component: './Login/Login',
      }
  ],
  plugins: [
    // ref: https://umijs.org/plugin/umi-plugin-react.html
    ['umi-plugin-react', {
      antd: true,  //开启antd UI库
      dva: true,  //开启dav
      dynamicImport: false,
      title: '商城管理系统',  //title
      dll: false,
      
      routes: {
        exclude: [
          /models\//,
          /services\//,
          /model\.(t|j)sx?$/,
          /service\.(t|j)sx?$/,
          /components\//,
        ],
      },
    }],
  ],
  "proxy": {  //请求代理
    "/api": {
      "target": "http://192.168.188.200:5005/",  //http://192.168.188.200:5005/admin/
      "changeOrigin": true,
      "pathRewrite": { "^/api" : "" }
    }
  }
}

1.2关于页面内的路由跳转


//引入
import Link from 'umi/link';
import withRouter from 'umi/withRouter';
//使用
<Link to='/index/data/index'>
    <Icon type="heat-map" />
    <span>数据分析</span>
</Link>

// 最后 生成的 包含Link 的组件 需要子withRouter(组件) 中高阶一下即可

1.3导航守卫

在 .umirc.js 文件中声明的路由中配置: Routes: [’./routes/Login.js’]

然后在 routes/Login.js中进行路由守卫

//例如
        path: '/index',  //主页
        component: '../layouts/index',
        Routes: ['./routes/Login.js'] , //这里是相对根目录(非pages)的,文件名后缀不能少

Login.js

export default props => {
    if(Math.random > 0.5){  // 大于0.5 去 login   否则去访问的这个路径页面,从而完成导航守卫
        return <Redirect to= '/login'></Redirect>
    }
    return (
        <div style={{width: '100%',height: '100%'}}>
            {props.children}
        </div>
    )
}

二.dva

2.1在models/UserRedux.js 文件 存储全局状态

// 获取 本地存储的 token
let token = localStorage.getItem('token') || sessionStorage.getItem('token')

let global ={
    namespace: 'UserRedux',  //model的命名空间,区分多个model
    state : {
        https: 'http://192.168.188.200:5005/',   //普通接口  
        httpsUpload: 'http://192.168.188.200:5005/index/upload',  //图片上传接口
        token: token || null,      //token 
        isLogin: false  ,  //是否正在登录
        userList:{
            name: '张三'
        }
    },
    effects:{  // 异步操作
        
    },
    reducers: {  //更新状态(同步)
        isLogin(state,action){
            let stateSrc = state
                stateSrc.isLogin = true
            return stateSrc
        },
        removeLogin(state,action){
            let stateSrc = state
                stateSrc.isLogin = false
            return stateSrc
        },
        setToken(state,action){   //设置token
            let stateSrc = state
            stateSrc.token = action.token
            return stateSrc
        },
        setUserList(state,action){   //设置用户信息
            let stateSrc = state
            stateSrc.userList = action.userList
            return stateSrc
        }
    }
}

export default  global;

2.2使用全局状态

import { connect } from 'dva'  //引入dva

export default connect(
      state => ({
          loading: state.loading , //dva已经可以获得 loading状态
          UserRedux: state.UserRedux  //获取指定命名空间的模型状态
      }),
      {
        setUserList: userList => ({
            type: 'UserRedux/setUserList', //action的type需要以命名空间为前缀+reducer名称
            userList //拿到 userList
        })
      }

)(withRouter(Headers))  
this.props.UserRedux.token  //即可获取 UserRedux中的内容
//Headers为基本组件 withRouter为路由告诫组件, withRouter(Headers) 需要使用Link跳转页面的写法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次umi开发后台管理系统的基础使用 的相关文章

随机推荐

  • weblogic CVE-2023-21839 复现

    影响版本 Weblogic 12 2 1 3 0 Weblogic 12 2 1 4 0 Weblogic 14 1 1 0 0 这里是用的docker下载的vulhub的CVE 2023 21839 靶机和攻击机都是192 168 85
  • 2019.08 FSGAN -论文解读

    原文链接 https zhuanlan zhihu com p 138042376 笔者前言 FSGAN Subject Agnostic Face Swapping and Reenactment 是ICCV19的一篇文章 主要工作是面部
  • 高等代数 二次型与矩阵的合同(第6章)1 二次型,标准形,规范形

    一 二次型 6 1 1 概念 2 非退化线性替换 准确地说 应该是将 x x x用 C x Cx Cx带入 这样能保证代换前后二次型中的元不
  • 玩转Mysql系列 - 第15篇:详解视图

    这是Mysql系列第15篇 环境 mysql5 7 25 cmd命令中进行演示 需求背景 电商公司领导说 给我统计一下 当月订单总金额 订单量 男女订单占比等信息 我们啪啦啪啦写了一堆很复杂的sql 然后发给领导 这样一大片sql 发给领导
  • Request对象和response对象

    一 概念 request对象和response对象是通过Servlet容器 如Tomcat 自动创建并传递给Servlet的 Servlet容器负责接收客户端的请求 并将请求信息封装到request对象中 然后将request对象传 递给相
  • C语言实现栈(基于数组)

    栈是一种操作受限的数据结构 只允许从一段操作 而且先进后出 FILO first in last out 这里将栈的操作封装在C语言的头文件里 实现栈的代码如下 include
  • 关于Git看这一篇就够了(IDEA版本)

    目录 一 Git简介 1 1 项目的版本管理 1 2 团队协同开发 1 3 版本管理工具 Git 二 Git下载及安装 2 1 下载Git 2 2 安装Git 2 3 检查 三 Git架构 四 Git基本使用 4 1 创建版本库 4 2 查
  • 132_Springboot总是会自动在/tmp/spring.log生成日志文件问题处理

    原因是项目配置文件中有如下引用
  • 2016年蓝桥杯预赛第十题最大比例

    题目 最大比例 X星球的某个大奖赛设了M级奖励 每个级别的奖金是一个正整数 并且 相邻的两个级别间的比例是个固定值 也就是说 所有级别的奖金数构成了一个等比数列 比如 16 24 36 54 其等比值为 3 2 现在 我们随机调查了一些获奖
  • vue 工程从window 到mac

    ERROR in src assets css theme default scss node modules css loader node modules postcss loader lib node modules sass loa
  • 五十三.L1-003 个位数统计

    include
  • 骨骼蒙皮动画(SkinnedMesh)的原理解析(一)

    一 3D模型动画基本原理和分类 3D模型动画的基本原理是让模型中各顶点的位置随时间变化 主要种类有Morph 变形 动画 关节动画和骨骼蒙皮动画 SkinnedMesh 从动画数据的角度来说 三者一般都采用关键帧技术 即只给出关键帧的数据
  • 使用Flutter之后,我们的CPU占用率降了50%

    近年来 移动互联网迅猛发展 业务需求频繁更新 业务内容动态化需求急剧增加 纯原生开发已经无法满足业务快速增长的需求 因此诞生了多种跨平台开发框架 如 H5 原生开发 React Native 和 Weex 但这两年最受开发者青睐的莫过于 F
  • 自己编写chrome插件

    1 首先你需要一个menifest json文件 manifest version 3 name My Extension version 2 0 action default popup popup html default icon i
  • 【python基础】:分类统计各字符的个数

    功能实现 利用python实现统计一个字符串中数字 字母及其他字符的个数和各个字符的总数 方法一 利用 isdigit isalpha 函数判断字符是否是数字或者字母 代码如下 s input 请输入一串字符 num char space
  • How to Change SSH Port on CentOS 7, 8 and 9

    The default SSH service port value is 22 in which case hackers may be able to launch attacks on the server through port
  • 第十章 内部类(上)

    第十章 内部类 上 可以将一个类的定义放在另一个类的定义内部 这就是内部类 内部类是一种非常有用的特性 因为它允许你把一些逻辑相关的类组织在一起 并控制位于内部的类的可视性 然而必须要了解 内部类与组合是完全不同的概念 这一点很重要 在最初
  • QT信号连接信号

    有时候代码可能复杂 我们需要一个信号连接另一个信号 比如例子中的下课不是直接运行时触发的 而是点击下课按钮 include mainwindow h include ui mainwindow h include QPushbutton h
  • linux bmc管理(工作笔记,随时更新)

    ipmi使用 概述 1 修改bmc IP地址 2 修改bmc 用户信息 概述 在日常工作中 对机器bmc配置一般是连接显示器进行相应配置 通过ipmi进行bmc的配置可以实现在系统下进行bmc的配置 从而实现对多台服务器进行bmc的配置 大
  • 记一次umi开发后台管理系统的基础使用

    先介绍一个umi 阿里开源的一个企业级可插拔的react脚手架 umi相对比react官方推荐的脚手架更加的简单 更贴近vue cli的使用感受 而本文仅仅介绍基础使用方法 高手请绕行 开发展示 仿叮咚买菜后台管理系统预览 http din