前端mock了所有……

news/2024/11/9 23:33:29 标签: 前端

目录

一、背景描述

二、开发流程

1.引入Mock

2.创建文件

3.需求描述

4.Mock实现

三、总结


一、背景描述

前提:

事情是这样的,老板想要我们写一个demo拿去路演/拉项目,有一些数据,希望前端接一下,写几个表格,画几个图,然后leader们又有其他考量,决定把数据处理完(处理成一群JSON数据)给前端前端自己写一些查询,分页,绘图,因为数据量不算太大,一个JSON也就最多5MB,所以客户端处理完全OK,于是就这样,前端写所有的一切开始了。

哦,故事的开始是,我使用的是RuoYi的模板,感谢!很规范,让我少了很多繁琐的工作。


二、开发流程

第一步,关于RouYi:若依管理系统

文档:介绍 | RuoYi

第二步,关于Mock:Mock.js

1.引入Mock

因为前端处理所有,所以不是--save dev

npm install mockjs -g

src\main.js

import './mock'; // 执行 mock.js 中的副作用
import Mock from 'mockjs'; // 导入 Mock 对象,我们在main中不使用这个,暂时引入来打印数据,等下就删掉

console.log(Mock);

试试打印Mock,如果出现这些,代表引入正常了:
 

2.创建文件

创建如下的结构——data是存放我的一些mock数据,modules是不同模块的mock处理。

 

src\mock\index.js

import './modules/user' // 引入登录用户模块的 mock 
export default {}

 src\mock\modules\user.js

import Mock from 'mockjs'

// 模拟用户登录数据
Mock.mock('/login', 'post', (options) => {
  const { username, password } = JSON.parse(options.body)
  // 检查用户名和密码
  if (username === 'admin' && password === '123456') {
    return {
      code: 200,
      msg: '登录成功',
      token: '111111' // 模拟一个 token
    }
  } else {
    return {
      code: 500,
      msg: '用户不存在/密码错误'
    }
  }
})

// 模拟路由数据
Mock.mock('/getRouters', 'get', {
  code: 200,
  msg: '操作成功',
  data: [
    {
      name: 'Project',
      path: '/project',
      hidden: false,
      redirect: 'noRedirect',
      component: 'Layout',
      alwaysShow: false,
      meta: {
        title: '项目管理',
        icon: 'form',
        noCache: false,
        link: null
      },
      children: [
        //...
      ]
    },

  ]
})

// 模拟获取用户信息接口
Mock.mock('/api/user/info', 'get', {
  code: 200,
  message: '获取成功',
  data: {
    name: 'admin',
    roles: ['admin'],
    avatar: 'https://example.com/avatar.png'
  }
})

// 模拟用户列表接口
Mock.mock('/api/users', 'get', {
  code: 200,
  message: '获取成功',
  data: Mock.mock({
    'users|10': [
      {
        id: '@id',
        name: '@cname',
        age: '@integer(20, 50)',
        gender: '@pick(["male", "female"])',
        email: '@email'
      }
    ]
  })
})

Mock.mock('/logout', 'post', {
  code: 200,
  message: '退出登录成功'
})

export default Mock

上述的操作都是在基于rouyi的Demo定义的返回值,上面写了一些简单的用户登录和获取路由信息的mock,也就相当于平时跟后端接接口的一些过程,只是这部分前端来写了,比较难的是下面部分,前端处理列表数据,并且进行查询等等处理。

3.需求描述

我需要展示一个项目列表,那么项目列表支持,分页和查询功能。

除此之外,我还需要点击列表的某一行,能显示这一个项目里的角色列表,并且也支持分页查询。

首先,我需要的参数和接口如下:

src\api\project.js

import request from '@/utils/request'

// 查询项目列表
export function listProject(query) {
  return request({
    url: '/project/list',
    method: 'get',
    params: query
  })
}

// 查询项目内的角色列表
export function listData(query) {
  return request({
    url: '/project/role/data/list',
    method: 'get',
    params: query
  })
}

//query就是下面的queryParams,字段可以根据需求增减
const data = reactive({
  form: {},
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    projectId: undefined,
    projectStage: undefined,
    firstStartDate: undefined,
    endDate: undefined
  },
  rules: {
    projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
  }
})

4.Mock实现

官网上有一个简单的例子:

Mock.mock(/\.json/, function(options) {
    return options
})

我这里的数据结构如下:

src\mock\data\projects.json

[
  {
    "id": 1,
    "projectId": "projectAA",
    "projectName": "测试项目名称",
    "totalCases": 174,
    "firstStartDate": "2022-03-01",
    "endDate": "",
    "projectStage": "正在进行中"
  }
]

src\mock\data\project_role.json

{
  "projectAA": [
    {
      "id": 1,
      "projectId": "projectAA",
      "roleName": "角色名称111",
      "region": "北区",
      "province": "天津",
      "roleProvince": "天津",
      "roleCity": "天津",
      "department": "管理组",
      "roleStatus": "在组",
      "startDate": ""
    }
  ]
}

有了数据结构,那么根据官网的例子再扩展一番,就能得到以下:

 src\mock\modules\project.js

import Mock from 'mockjs'
const baseUrl = 'http://localhost'

import projectData from '../data/projects.json'

// 项目列表
Mock.mock(/\/project\/list/, 'get', (options) => {
  const url = new URL(options.url, baseUrl)
  const params = new URLSearchParams(url.search)

  const pageNum = params.get('pageNum') || 1
  const pageSize = params.get('pageSize') || 10
  const projectId = (params.get('projectId') || '').toLowerCase()
  const projectStage = (params.get('projectStage') || '').toLowerCase()
  const startDateRange = params.get('firstStartDate') || ''
  const endDateRange = params.get('endDate') || ''

  const filteredProjects = projectData.filter((project) => {
    const projectStartDate = new Date(project.firstStartDate)
    const projectEndDate = new Date(project.endDate)
    const startDate = new Date(startDateRange)
    const endDate = new Date(endDateRange)

    return (
      (!projectId || project.projectId.toLowerCase().includes(projectId)) &&
      (!projectPhase || project.projectPhase.toLowerCase().includes(projectPhase)) &&
      (!projectStage || project.projectStage.toLowerCase().includes(projectStage)) &&
      (!startDateRange || projectStartDate >= startDate) &&
      (!endDateRange || projectEndDate <= endDate)
    )
  })

  const total = filteredProjects.length
  const start = (pageNum - 1) * pageSize
  const end = start + parseInt(pageSize)
  const pageData = filteredProjects.slice(start, end)

  return {
    code: 200,
    msg: '操作成功',
    data: {
      list: pageData,
      total: total,
      allList: filteredProjects
    }
  }
})

import projectAndRoleData from '../data/project_role.json'
Mock.mock(/\/project\/role\/data\/list/, 'get', (options) => {
  const url = new URL(options.url, baseUrl)
  const params = new URLSearchParams(url.search)

  const projectId = (params.get('projectId') || '').toLowerCase()
  const pageNum = parseInt(params.get('pageNum')) || 1
  const pageSize = parseInt(params.get('pageSize')) || 10
  const roleId = (params.get('roleId') || '').toLowerCase()
  const roleName = (params.get('roleName') || '').toLowerCase()
  const department = (params.get('department') || '').toLowerCase()
  

  // 过滤项目数据
  const filteredProjects = Object.keys(projectAndRoleData)
    .filter((key) => !projectId || key.toLowerCase() === projectId) // 按 projectId 筛选
    .map((key) => projectAndRoleData[key]) // 获取 projectId 对应的数据
    .flat() // 将结果从嵌套的数组展平

  // 进一步过滤数据
  const filteredRoles = filteredProjects.filter((role) => {
    return (
      (!roleId || role.roleId.toLowerCase().includes(roleId)) &&
      (!roleName || role.roleName.toLowerCase().includes(roleName)) &&
      (!department || role.department.toLowerCase().includes(department))
    )
  })

  const total = filteredRoles.length
  const start = (pageNum - 1) * pageSize
  const end = start + pageSize
  const pageData = filteredRoles.slice(start, end)

  return {
    code: 200,
    msg: '操作成功',
    data: {
      list: pageData,
      total: total,
      allList: filteredRoles
    }
  }
})

以上主要做了这些工作:支持大小写、模糊搜索;支持数字类型的输入;支持日期范围筛选;支持分页


三、总结

上面只是讲了一个简单的例子,关于前端处理列表,其实通过这个,前端可以讲所有的从服务器端获取数据的操作,都通过mock进行拦截,然后自定义返回数据,只是我这里是写一个demo,主要是展示数据,所以对于返回的数据,我并没有做很多处理,只是简单的返回了数据,如果大家有需要,可以自己根据需要,对返回的数据进行处理。


http://www.niftyadmin.cn/n/5665159.html

相关文章

软件测试 BUG 篇

目录 一、软件测试的生命周期 二、BUG 1. bug的概念 2. 描述bug的要素 3. bug的级别 4. bug的生命周期 5. 与开发产生争执怎么办&#xff1f;&#xff08;面试高频考题&#xff09; 5.1 先检查自身&#xff0c;是否bug描述不清楚 5.2 站在用户角度考虑并抛出问题 5.3 …

charles抓包flutter

一&#xff0c;准备工作 在我的另一篇文章flutter Dio发送post请求-CSDN博客里面&#xff0c;直接复用一部分代码 该方法无需让手机安装charles的ca证书&#xff08;当然安装了也没事儿&#xff09;&#xff0c;也无需设置手机wifi的网络代理&#xff08;因为ca证书的内容和网…

鸿萌数据恢复服务: 修复 Windows, Mac, 手机中 “SD 卡无法读取”错误

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 公司是多款国际主流数据恢复软件的授权代理商&#xff0c;为…

【VUE】快速上手

一、快速上手 创建HTML文件引入vue.js <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> <script src"https://cdn.bootcdn.net/ajax/libs/vue/3.3.4/vue.global.prod.js"></script>按照vue.js的语法编写代码…

ReKep——李飞飞团队提出的新一代机器人操作方法:基于视觉语言模型和关键点约束

前言 由于工厂、车厂的任务需求场景非常明确&#xff0c;加之自今年年初以来&#xff0c;我司在机器人这个方向的持续大力度投入(包括南京、长沙两地机器人开发团队的先后组建)&#xff0c;使得近期我司七月接到了不少来自车厂/工厂的订单&#xff0c;比如柔性上料、物料分拣、…

飞睿智能UWB BLE Tag蓝牙防丢器模块,APP测距定位一键绑定,安全守护每一刻

我们总在不经意间与生活中的小物件擦肩而过——钥匙遗忘在咖啡厅的角落&#xff0c;钱包遗失在拥挤的地铁&#xff0c;甚至孩子的书包在人群中悄然消失……每一次的失而复得都是幸运的眷顾&#xff0c;但更多的是遗憾与不便。今天&#xff0c;就让我带你走进一个智能守护的新世…

前后端分离的情况下,后端接口有必要加CSP策略吗?

目录 什么是 Content Security Policy (CSP)? 后端接口加CSP策略的必要性分析 小结 在 Web 应用开发中&#xff0c;前后端分离架构模式逐渐成为主流&#xff0c;前端负责用户界面的呈现和交互逻辑的处理&#xff0c;后端则专注于提供数据和处理业务逻辑。这种架构模式提高了…

ChatGPT 为何将前端框架从 Next.js 更换为 Remix以及框架的选择

**老师**&#xff1a;大家好&#xff0c;今天我们来聊一下前端框架的选择与切换。最近&#xff0c;有个非常热门的话题&#xff1a;ChatGPT 官网将前端框架从 Next.js 更换为 Remix。这一举动引发了广泛关注。你们觉得这背后的原因是什么呢&#xff1f; **学生A**&#xff1a;…