• 【后台管理系统】—— Ant Design Pro入门学习&项目实践笔记(一)


    前言:最近在做公司的一个后台管理系统项目,前端是用React的Ant Design Pro 2.0 ,可以开箱即用,底层使用了dva和umi代替了redux和umi,使用起来更方便了。

    第一次用Ant Design Pro,这里为进一步学习做一个梳理便于自己和大家翻阅(O(∩_∩)O~


    一、项目准备

    • 官网https://pro.ant.design/docs/getting-started-cn
    • 官方工作台https://preview.pro.ant.design/dashboard/workplace
    • 本地环境:需要安装 node 和 git。我们的技术栈基于 ES2015+ReactUmiJSdvag2 和 antd
    • 安装
      $ git clone --depth=1 https://github.com/ant-design/ant-design-pro.git my-project
      $ cd my-project  
    • 目录结构:已自动生成一个完整的框架
      ├── config                   # umi 配置,包含路由,构建等配置
      ├── mock                     # 本地模拟数据
      ├── public
      │   └── favicon.png          # Favicon
      ├── src
      │   ├── assets               # 本地静态资源
      │   ├── components           # 业务通用组件
      │   ├── e2e                  # 集成测试用例
      │   ├── layouts              # 通用布局
      │   ├── models               # 全局 dva model
      │   ├── pages                # 业务页面入口和常用模板
      │   ├── services             # 后台接口服务
      │   ├── utils                # 工具库
      │   ├── locales              # 国际化资源
      │   ├── global.less          # 全局样式
      │   └── global.js            # 全局 JS
      ├── tests                    # 测试工具
      ├── README.md
      └── package.json  
    • 本地开发:安装依赖
      $ npm install
      
      $ npm start  
    • 启动完成:会自动打开浏览器访问 http://localhost:8000

       

    二、布局

    • 抽离出的通用布局:放在 layouts 目录中
    1. BasicLayout:基础页面布局,包含了头部导航,侧边栏和通知栏
    2. UserLayout:抽离出用于登陆注册页面的通用布局
    3. BlankLayout:空白的布局
    • 布局与路由系统结合:Ant Design Pro 的路由使用了 Umi 的路由方案,将配置信息统一抽离到 config/router.config.js 下
    1. 映射路由与页面布局之间的关系
      module.exports = [{
        path: '/',
        component: '../layouts/BasicLayout',  // 指定以下页面的布局
        routes: [
          // dashboard
          { path: '/', redirect: '/dashboard/analysis' },
          {
            path: '/dashboard',
            name: 'dashboard',
            icon: 'dashboard',
            routes: [
              { path: '/dashboard/analysis', name: 'analysis', component: './Dashboard/Analysis' },
              { path: '/dashboard/monitor', name: 'monitor', component: './Dashboard/Monitor' },
              { path: '/dashboard/workplace', name: 'workplace', component: './Dashboard/Workplace' },
            ],
          },
        ],
      }]  
    2. 更多的Umi路由配置方式 :Umi 配置式路由
    3. Pro扩展配置:在 router.config.js 扩展了一些关于 pro 全局菜单的配置
      {
        name: 'dashboard',  //当前路由在菜单和面包屑中的名称,国际化配置的key
        icon: 'dashboard',  //当前路由在菜单下的图标名
        hideInMenu: true,   //当前路由在菜单中不展现,默认 false
        hideChildrenInMenu: true,  //当前路由的子级在菜单中不展现,默认 false
        hideInBreadcrumb: true,    //当前路由在面包屑中不展现,默认 false
        authority: ['admin'],      //允许展示的权限,不设则都可见
      }  
    • 布局组件:除了 Pro 里的内建布局以外,在一些页面中需要进行布局,可以使用 AntD 的两套布局组件工具:Layout 和 Grid

    1. Grid 组件:栅格布局按比例划分页面,具有弹性布局的特点,能设置间距、支持响应式的比例设置和flex模式 (Grid

    2. Layout 组件:辅助页面框架级别的布局设计,只需要填空就可以开发规范专业的页面整体布局(Layout

    3.  注意:通常会把抽象出来的布局组件,放到跟 pages、 components 平行的 layouts 文件夹中方便管理 

     

    三、路由和菜单 

    • 基本结构
    1. 路由管理:通过约定的语法根据在 router.config.js 中配置路由
    2. 菜单生成:根据路由配置来生成菜单。菜单项名称,嵌套路径与路由高度耦合
    3. 面包屑:组件 PageHeader 中内置的面包屑也可由脚手架提供的配置信息自动生成
    • 路由
    1. 目前脚手架中所有的路由都通过 router.config.js 来统一管理
    2. 在 umi 的配置中我们增加了一些参数,来辅助生成菜单,如上↑(Pro扩展配置)(更多:umi#路由)
    • 菜单
    1. 菜单根据 router.config.js 生成,具体逻辑在 src/models/menu.js 中的 formatter 方法实现。
    2. 注意:如果项目不需要菜单,可直接在 BasicLayout 中删除 SiderMenu 组件的挂载。并在 src/layouts/BasicLayout 中设置 const MenuData = []
    • 从服务器请求菜单
    1. 只需在 models/menu 中发起 http 请求(*getMenuData),menuData 是一个 json 数组。只需服务器返回类似格式的 json 即可。
    2. 注意:path 必须要在 routre.config.js 中定义。(约定式路由不需要,只需页面真实有效即可)
    • 面包屑
    1. 面包屑由 PageHeaderWrapper 实现,MenuContext 将 根据 MenuData 生成的 breadcrumbNameMap 通过 props 传递给了 PageHeader。
    2. 自定义的面包屑:可以通过修改传入的 breadcrumbNameMap 来解决。
    3. 菜单跳转到外部地址:直接将完整 url 填入 path 中,框架会自动处理。
    • 带参数的路由
    1. 支持,但需要自己写
      { 
        path: '/dashboard/:page',
        hideInMenu:true,
        name: 'analysis',
        component: './Dashboard/Analysis', 
      },  
    2. 路由跳转:2种方法,umi的router.push()和<Link  />
      import router from 'umi/router';
      
      router.push('/dashboard/anyParams')
      
      //or
      
      import Link from 'umi/link';
      
      <Link to="/dashboard/anyParams">go</Link>
    3. 在路由组件中,可以通过this.props.match.params 来获得路由参数 

     

    四、新增页面和业务组件

    • 新增 js、less 文件:在 src/pages 下新建页面的 js 及 less 文件,多个页面可以新建文件夹放置
    • 将文件加入菜单和路由:按照上面↑方式加入,访问 http://localhost:8000/#/new 即可看到新增页面
    • 新增 model 和 service:如果需要用到 dva 中的数据流,要在 src/models src/services 中建立相应的 model 和 service
    • 新增业务组件:在 src/components 下新建一个以组件名命名的文件夹,注意首字母大写,命名尽量体现组件的功能

     

    五、样式

    • Less: Ant Design Pro 默认使用 less 作为样式语言

    • CSS Modules: 模块化引入css文件

      // example.js
      import styles from './example.less';
      
      export default ({ title }) => <div className={styles.title}>{title}</div>;
      
      // example.less
      .title {
        color: @heading-color;
        font-weight: 600;
        margin-bottom: 16px;
      }
      
    1. js 文件的改变就是在设置 className 时,用一个对象属性取代了原来的字符串,属性名跟 less 文件中对应的类名相同,对象从 less 文件中引入

    2. .title只会在本文件中生效,要定义全局样式,使用:global
      /* 定义全局样式 */
      :global(.text) {
        font-size: 16px;
      }
      
      /* 定义多个全局样式 */
      :global {
        .footer {
          color: #ccc;
        }
        .sider {
          background: #ebebeb;
        }
      }  
    • 样式文件类别
    1. src/index.less:全局样式文件(因为 antd 会自带一些全局设置,如字号,颜色,行高等,所以这里只需要关注自己的个性化需求即可,不用进行大量的 reset)
    2. src/utils/utils.less:工具函数供调用,如.clearfox清除浮动

    3. src/layouts/BasicLayout.less: 基本布局样式(如项目需要使用其他布局,也建议将布局相关的 js 和 less 放在这里src/layouts

    4. src/routes/Dashborad/Monitor.less:具体页面相关的样式,里面的内容仅和本页面的内容相关

    5. 组件级样式:重复使用的组件,其相关的样式也应该提炼出来放在组件中,而不是混淆在页面里

    6. 内联样式: style={{ ... }}
    • 覆盖组件样式

    1. 被覆盖的类名必须放到 :global 中,此时覆盖是全局性的

    2. 为了防止对其他 同类 组件造成影响,所以需要包裹额外的 className 限制样式的生效范围 

     

    六、和服务端进行交互

    • DVA 是基于 redux、redux-saga 和 react-router 的轻量级前端框架及最佳实践沉淀(model 是 DVA 中最重要的概念)
    1. namespace:model 的命名空间,只能用字符串。一个大型应用可能包含多个 model,通过namespace区分。

    2. state:当前 model 状态的初始值,表示当前状态。

    3. reducers:用于处理同步操作,可以修改 state,由 action 触发。reducer 是一个纯函数,它接受当前的 state 及一个数据体(payload)作为入参,返回一个新的 state。

    4. effects:用于处理异步操作(例如:与服务端交互)和业务逻辑,也是由 action 触发。但是,它不可以修改 state,要通过触发 action 调用 reducer 实现对 state 的间接操作。 

    5. action:是 reducers 及 effects 的触发器,一般是一个对象,形如{ type: ‘add’, payload: todo },通过 type 属性可以匹配到具体某个 reducer 或者 effect,payload 属性则是数据体,用于传送给 reducer 或 effect。

         

    • 使用mock模拟数据
    1. 在根目录下新建mock文件夹

    2. 新建 mock/xxx.js

      // 代码中会兼容本地 service mock 以及部署站点的静态数据
      export default {
          // 支持值为 Object 和 Array
          // GET POST 可省略
          'POST /api/register': (req, res) => {
               res.send({ status: 'ok', currentAuthority: 'user' });
          }
      }  
    3. mock文件夹在umi中,会自动引入使用,可以新建多个mock文件。会根据请求路径对应拦截  

    • 在 model 中请求服务端数据
    1. 代理请求:跨域问题

    2. 在配置文件config/config.js添加
      proxy: {
          '/login': {
            target: 'http://192.168.1.106:9099', //代理请求的服务器地址
            changeOrigin: true,
            pathRewrite: { '^/login/': '' }
          },
      }  
    3. 代理请求成功,显示的请求地址不会改变,仍为 http://localhost:8000
    4. 如果没做其他处理,使用mock数据时,需要关闭proxy代码

     

    七、构建和发布

    • 构建
      npm run build  
    • 前端路由与服务端的结合
    1. Ant Design Pro 使用的 Umi 支持两种路由方式:browserHistory 和 hashHistory
    2. 可以在 config/config.js 中配置选择用哪种方式:
      export default {
        history: 'hash', // 默认是 browser
      }  
    3. browserHistory路由方式:需要服务器做好处理 URL 的准备,否则在刷新路由后,请求会异常内容不能正常显示
    4. hashHistory路由方式:浏览器访问到的始终都是根目录下 index.html,在来回刷新路由后,请求正常内容可以正常显示

     

    八、学习推荐  

     

    参考资料 


    注:转载请注明出处

  • 相关阅读:
    较全的ASCII码对照表
    关于.NET Framework 3.5 SP1 bootstrapper 包(安装和部署)的解决方案
    C#中DllImport用法和路径问题
    在Winform中给的button等控件添加快捷键的几种方法。
    DataGridView之为每行前面添加序号
    【软件设计过程PowerDesigner v12简介】
    死锁与活锁的区别,死锁与饥饿的区别
    性能优化之 — AS3.0对象池运用
    wc之“HelloWorld”
    php之memcache缓存技术
  • 原文地址:https://www.cnblogs.com/ljq66/p/10705898.html
Copyright © 2020-2023  润新知