zoukankan      html  css  js  c++  java
  • 三、工具模块封装(二):封装mock模块

    为了可以统一管理和集中控制数据模拟接口,我们对mock模块进行了封装,可以方便地定制模拟接口的统一开关和个体开关。

    1.文件结构

    在mock目录下新建一个index.js,创建modules目录并在里面创建子模块的*.js文件.

    1.1 index.js

    index.js是聚合模块,统一导入所有子模块并通过调用mock进行数据模拟。

    import Mock from 'mockjs'
    import { baseUrl } from '@/utils/global'
    import * as login from './modules/login'
    import * as user from './modules/user'
    import * as role from './modules/role'
    import * as dept from './modules/dept'
    import * as menu from './modules/menu'
    import * as dict from './modules/dict'
    import * as config from './modules/config'
    import * as log from './modules/log'
    import * as loginlog from './modules/loginlog'
    
    // 1. 开启/关闭[所有模块]拦截, 通过调[openMock参数]设置.
    // 2. 开启/关闭[业务模块]拦截, 通过调用fnCreate方法[isOpen参数]设置.
    // 3. 开启/关闭[业务模块中某个请求]拦截, 通过函数返回对象中的[isOpen属性]设置.
    let openMock = true
    // let openMock = false
    fnCreate(login, openMock)
    fnCreate(user, openMock)
    fnCreate(role, openMock)
    fnCreate(dept, openMock)
    fnCreate(menu, openMock)
    fnCreate(dict, openMock)
    fnCreate(config, openMock)
    fnCreate(log, openMock)
    fnCreate(loginlog, openMock)
    
    /**
     * 创建mock模拟数据
     * @param {*} mod 模块
     * @param {*} isOpen 是否开启?
     */
    function fnCreate (mod, isOpen = true) {
      
      if (isOpen) {
        for (var key in mod) {
          ((res) => {
            if (res.isOpen !== false) {
              let url = baseUrl
              if(!url.endsWith("/")) {
                url = url + "/"
              }
              url = url + res.url
              Mock.mock(new RegExp(url), res.type, (opts) => {
                opts['data'] = opts.body ? JSON.parse(opts.body) : null
                delete opts.body
                console.log('
    ')
                console.log('%cmock拦截, 请求: ', 'color:blue', opts)
                console.log('%cmock拦截, 响应: ', 'color:blue', res.data)
                return res.data
              })
            }
          })(mod[key]() || {})
        }
      }
    }

    1.2 user.js

    子模块modules下的代码太多,这里以用户管理模块为例,格式跟后台接口保持一致。

    /* 
     * 用户管理模块
     */
    
    // 保存
    export function save() {
      return {
        url: 'user/save',
        type: 'post',
        data: {
          "code": 200,
          "msg": null,
          "data": 1
        }
      }
    }
    // 批量删除
    export function batchDelete() {
      return {
        url: 'user/delete',
        type: 'post',
        data: {
          "code": 200,
          "msg": null,
          "data": 1
        }
      }
    }
    // 分页查询
    export function findPage(params) {
      let findPageData = {
        "code": 200,
        "msg": null,
        "data": {}
      }
      let pageNum = 1
      let pageSize = 8
      if(params !== null) {
        // pageNum = params.pageNum
      }
      if(params !== null) {
        // pageSize = params.pageSize
      }
      let content = this.getContent(pageNum, pageSize)
      findPageData.data.pageNum = pageNum
      findPageData.data.pageSize = pageSize
      findPageData.data.totalSize = 50
      findPageData.data.content = content
      return {
        url: 'user/findPage',
        type: 'post',
        data: findPageData
      }
    }
    export function getContent(pageNum, pageSize) {
      let content = []
      for(let i=0; i<pageSize; i++) {
        let obj = {}
        let index = ((pageNum - 1) * pageSize) + i + 1
        obj.id = index
        obj.name = 'mango' + index
        obj.password = '9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d'
        obj.salt = 'YzcmCZNvbXocrsz9dm8e'
        obj.email = 'mango' + index +'@qq.com'
        obj.mobile = '18688982323'
        obj.status = 1
        obj.deptId = 12
        obj.deptName = '技术部'
        obj.status = 1
        if(i % 2 === 0) {
          obj.deptId = 13
          obj.deptName = '市场部'
        }
        obj.createBy= 'admin'
        obj.createTime= '2018-08-14 11:11:11'
        obj.createBy= 'admin'
        obj.createTime= '2018-09-14 12:12:12'
        content.push(obj)
      }
      return content
    }
    // 查找用户的菜单权限标识集合
    export function findPermissions() {
      let permsData = {
        "code": 200,
        "msg": null,
        "data": [
          null,
          "sys:user:view",
          "sys:menu:delete",
          "sys:dept:edit",
          "sys:dict:edit",
          "sys:dict:delete",
          "sys:menu:add",
          "sys:user:add",
          "sys:log:view",
          "sys:dept:delete",
          "sys:role:edit",
          "sys:role:view",
          "sys:dict:view",
          "sys:user:edit",
          "sys:user:delete",
          "sys:dept:view",
          "sys:dept:add",
          "sys:role:delete",
          "sys:menu:view",
          "sys:menu:edit",
          "sys:dict:add",
          "sys:role:add"
        ]
      }
      return {
        url: 'user/findPermissions',
        type: 'get',
        data: permsData
      }
    }
    2. 登录界面

    修改登录界面,包括导入语句和返回数据格式的获取。

    <script>
      import mock from '@/mock/index.js'
      import Cookies from "js-cookie"
      import router from '@/router'
      export default {
        name: 'Login',
        methods: {
          login() {
            this.$api.login.login().then(function(res) {
               //res是指response
           alert(res.data.token)
                Cookies.set('token', res.data.token) // 放置token到Cookie 
                router.push('/')  // 登录成功,跳转到主页
              }).catch(function(res) {
                alert(res);
              });
          }
        }
      }
    </script>

    3.主页界面

    修改主页界面,替换导入mock文件的语句

    <script>
    import axios from 'axios'
    import mock from '@/mock/index.js'
    export default {
      name: 'Home',
      methods: {
        testAxios() {
          axios.get('http://localhost:8080').then(res => { alert(res.data) })
        },
        getUser() {
          axios.get('http://localhost:8080/user').then(res => { alert(JSON.stringify(res.data)) })
        },
        getMenu() {
          axios.get('http://localhost:8080/menu').then(res => { alert(JSON.stringify(res.data)) })
        }
      }
    }
    </script>
    4.页面测试

    在浏览器访问localhost:8080/#/login

  • 相关阅读:
    jQuery自学笔记(四):jQuery DOM节点操作
    jQuery自学笔记(三):jQuery动画效果
    jQuery自学笔记(二):jQuery选择器
    面试记录与复盘总结
    wh-研发功能复盘
    st项目-要素标记功能的实现以及经验总结
    ST项目经验总结2
    S台项目记录-1
    统计模型项目开发经验汇总
    开发规范
  • 原文地址:https://www.cnblogs.com/xc-xinxue/p/12527763.html
Copyright © 2011-2022 走看看