Vue项目 五、表现->5.2数据模拟

1、json-server

安装

全局安装json-server

npm install -g json-server

配置

1、package.json设置

package.json添加一些设置:

在scripts中加入代码:

"scripts": {
    "mock": "json-server --watch mock/data.json --port 9090", 
    "mockdev": "npm run mock & npm run dev"
}

这两句代码的作用都是在webpack中加入这两个指令,mockmockdev。使用这两条指令的时候只需要在终端中加上npm run

  • npm run mock, 单纯启动数据模拟。

  • npm run mockdev, 启动数据模拟并编译

--watch mock/data.json --port 9090 表示的是观察项目根目录下的mock文件下的data.json,端口号为9090。数据文件目录可以自己配置,当启动服务式找不到这个路径就会报错,可以没有数据文件,当文件缺失时会自动生成一个。如:

这里写图片描述

2、proxy设置

通常在本地调试的时候我们已经启动了一个静态服务,因此需要用代理服务进行跨域(两个服务分别在两个端口上)。对于使用Webpack打包的项目,已经使用了它自带的webpack-dev-server服务,它很贴心的提供了proxy参数来解决这个问题。

打开config/index.js文件

dev下的proxyTable添加如下代码:

'/gm/api/*': {
    target: 'http://localhost:9090',
    secure: false
}

添加完这两个我们就可以成功mock数据了。

3、运行

npm run mockdev

成功编译后,8080的端口和9090的端口便可以同时访问了。

在地址栏输入localhost:9090查看数据

这里写图片描述

上图中红色部分便是data.json文件里的数据。最后一个/db应该是database的缩写,这里它的数据是整个json文件的完成结构。

4、分类数据

我们在项目中常常会遇到很多不同的接口,非常繁杂的数据,如果将这些数据全部都写在一个data.json文件中是非常复杂的,而且不利于维护。因此我们希望将这些接口能够分类存放,但是json-server下只能观察一个json,为了能够实现多个,我们还需要做一些配置。

首先我们在项目中安装json-server,因为之后的操作需要在代码中加载这个模块。

npm install json-server --save-dev

mock文件夹下新建一个server.js文件,增加如下代码:

//加载json-server模块
const jsonServer = require('json-server');

//创建服务
const server = jsonServer.create();

// Support middleware
const middleware = jsonServer.defaults();
server.use(middleware);

/** 
 * 加载多个文件
 */
const _ = require('underscore');
const path = require('path'); //path是node.js内置的package,用来处理路径的。
const fs = require('fs'); //node.js的fs模块
const mockDir = path.join(__dirname, 'data');//拼接路径
const base = {}; //新建一个空对象,
const files = fs.readdirSync(mockDir); //读取文件
files.forEach(function (file) {
  _.extend(base, require(path.resolve(mockDir, file)))//解析一个新路径,然后从路径加载文件,然后合并到base
});

//创建一个router
const router = jsonServer.router(base);

/**
 * 自定义路由规则
 * 要在server.use(router)前添加
 */
// server.use(jsonServer.rewriter({
//   // '/api/*': '/$1',
//   // '/blog/:resource/:id/show': '/:resource/:id'

//   //add your rules
// }));

server.use(router);

// 返回自定义格式数据
router.render = (req, res) => {
  console.log(res.locals.data);
  res.jsonp({
    data: res.locals.data,
    status: 0,
    msg: ''
  });
};

/**
 * 用户权限验证
 */
server.use((req, res, next) => { 
  if (isAuthorized(req)) { 
  // add your authorization logic here   
    next();
  // continue to JSON Server router 
  } else {   
    res.sendStatus(401);
  }
});

//监听9090端口
server.listen(9090, () => {
  console.log('JSON Server is running');
});

注:读取文件的时候要排除掉不是.json的文件,因为在MACOS中系统会为文件夹添加一个.DS_Store的文件。这样做的还有好处就是可以将mock数据的.js文件放在同一个目录,并以同名方式存储,以便维护。

然后修改package.json的配置,修改scripts中的mock为

 "mock": "node mock/server.js"
 /**用node运行这个文件*/

2、mock.js

在mock大量数据时手动添加这些数据太费时费力,这时候我们想要有个工具能随机生成这样的数据,这时候就可以用到Mock.js

1、安装

npm install mockjs --save-dev

2、创建数据模板

mock/data.json的同级目录创一个js文件data.js,这里名字不一定要相同。这个js的作用是用来生成模板数据。

例如:

var Mock = require('mockjs');

module.exports = function () {
  return {
    notes: Mock.mock({
      'note|20': [{ 
        'id': '@id()',
        'topic': '@ctitle()',
        'content': '@cparagraph()',
        'create': '@date("yyyy-MM-dd")',
        'modification': '@date("yyyy-MM-dd")',
        'img': '@image(200*200,@hex())',
        'time': '@time()',
        'ulr': '@url("http","nuysoft.com")'
      }]
    })
  }
};

3、生成数据

在终端中运行

json-server mock/data.js

如果端口冲突,修改端口,默认为3000

json-server mock/data.jsn --port 9000

运行成功的终端信息:

这里写图片描述

上图的信息中我们可以看到使用生成数据的方式。并且我们可以使用S键+Enter键的方式保存这个数据在本目录下。

这里写图片描述

生成的数据结构如下:

{
  "notes": {
    "note": [
      {
        "id": "620000197508020078",
        "topic": "照各子积林",
        "content": "条再把解连部们选矿走学响划百。般国少达及中习手但造风体。毛族高段带天两其家行队拉。",
        "create": "1989-10-08",
        "modification": "1975-08-19",
        "img": "http://dummyimage.com/200*200/7984f2)",
        "time": "11:47:06",
        "ulr": "http://localhost:8080/xzsm"
      },
      {
        "id": "62000020170228915X",
        "topic": "件三委新",
        "content": "向派离老根林京队根至指热习。元只取利水质心布斯平形系素阶正条。组事结多强关角论该选队常太反。往容离高作省十气很速知业调。群空平并率市路起发加社真济保总。从一研安事结基往入制由十民。",
        "create": "1986-02-18",
        "modification": "1970-08-01",
        "img": "http://dummyimage.com/200*200/a7f279)",
        "time": "16:55:18",
        "ulr": "http://localhost:8080/yigsyvn"
      }
    ]
  }
}

参考文档

基本依赖

三级标题

四级标题

注:

<template> <div class="app-container"> <h2 style="text-align: center;">生产规格书</h2> <!-- 表单编辑 --> <el-form label-width="180px" :model="form" label-position="left"> <!-- 客户信息 --> <el-form-item label="客户名称"> <el-input v-model="form.customer_name" /> </el-form-item> <el-form-item label="项目名称"> <el-input v-model="form.project_name" /> </el-form-item> <el-form-item label="成品料号"> <el-input v-model="form.battery_finished_part_number" /> </el-form-item> <el-form-item label="半成品料号"> <el-input v-model="form.pcb_semi_finished_part_number" /> </el-form-item> <el-form-item label="保密等级"> <el-radio-group v-model="form.confidential_level"> <el-radio label="绝密">绝密</el-radio> <el-radio label="机密">机密</el-radio> <el-radio label="内部公开">内部公开</el-radio> <el-radio label="外部公开">外部公开</el-radio> </el-radio-group> </el-form-item> <!-- 文件修正记录 --> <el-form-item label="文件修正记录"> <el-table :data="form.revision_records" border> <el-table-column prop="version" label="版次"> <template slot-scope="{ row }"> <el-input v-model="row.version" /> </template> </el-table-column> <el-table-column prop="change_date" label="变更日期"> <template slot-scope="{ row }"> <el-date-picker v-model="row.change_date" type="date" /> </template> </el-table-column> <el-table-column prop="change_description" label="变更内容"> <template slot-scope="{ row }"> <el-input v-model="row.change_description" /> </template> </el-table-column> <el-table-column prop="prepared_by" label="拟制"> <template slot-scope="{ row }"> <el-input v-model="row.prepared_by" /> </template> </el-table-column> <el-table-column prop="reviewed_by" label="审核"> <template slot-scope="{ row }"> <el-input v-model="row.reviewed_by" /> </template> </el-table-column> <el-table-column prop="approved_by" label="批准"> <template slot-scope="{ row }"> <el-input v-model="row.approved_by" /> </template> </el-table-column> </el-table> </el-form-item> <!-- 硬件版本 --> <el-form-item label="2.1 硬件版本"> <el-table :data="form.hardware_versions" border> <el-table-column prop="pcb" label="PCB"> <template slot-scope="{ row }"> <el-input v-model="row.pcb" /> </template> </el-table-column> <el-table-column prop="silk_screen" label="丝印"> <template slot-scope="{ row }"> <el-input v-model="row.silk_screen" /> </template> </el-table-column> <el-table-column prop="part_number" label="料号"> <template slot-scope="{ row }"> <el-input v-model="row.part_number" /> </template> </el-table-column> <el-table-column label="备注"> <template slot-scope="{ row }"> <el-input v-model="row.remark" /> </template> </el-table-column> </el-table> </el-form-item> <!-- 电芯配组要求 --> <el-form-item label="5.1 电芯配组要求"> <el-table :data="form.cell_group_requirements" border> <el-table-column prop="check_item" label="检查项"> <template slot-scope="{ row }"> <el-input v-model="row.check_item" /> </template> </el-table-column> <el-table-column prop="requirement" label="要求"> <template slot-scope="{ row }"> <el-input v-model="row.requirement" /> </template> </el-table-column> <el-table-column label="备注"> <template slot-scope="{ row }"> <el-input v-model="row.remark" /> </template> </el-table-column> </el-table> </el-form-item> <!-- PCM组装上电顺序 --> <el-form-item label="5.2 PCM组装上电顺序"> <el-input v-model="form.cell_power_on_sequence" type="textarea" :rows="3" /> </el-form-item> <!-- 功能测试及检验标准 --> <el-form-item label="5.4 功能测试及检验标准"> <el-table :data="form.function_test_specs" border> <el-table-column prop="test_item" label="测试项目"> <template slot-scope="{ row }"> <el-input v-model="row.test_item" /> </template> </el-table-column> <el-table-column prop="requirement" label="性能要求"> <template slot-scope="{ row }"> <el-input v-model="row.requirement" /> </template> </el-table-column> <el-table-column prop="mandatory" label="必检项"> <template slot-scope="{ row }"> <el-select v-model="row.mandatory" placeholder="请选择"> <el-option label="是" value="是" /> <el-option label="否" value="否" /> </el-select> </template> </el-table-column> <el-table-column prop="sampling" label="抽检项"> <template slot-scope="{ row }"> <el-select v-model="row.sampling" placeholder="请选择"> <el-option label="是" value="是" /> <el-option label="否" value="否" /> </el-select> </template> </el-table-column> </el-table> </el-form-item> <!-- 图片上传 --> <el-form-item label="3 PCB贴片图 - 顶面"> <el-upload action="#" list-type="picture-card" :auto-upload="false" :limit="1" :on-preview="handlePreview" > <i class="el-icon-plus"></i> </el-upload> </el-form-item> <el-form-item label="3 PCB贴片图 - 底面"> <el-upload action="#" list-type="picture-card" :auto-upload="false" :limit="1" :on-preview="handlePreview" > <i class="el-icon-plus"></i> </el-upload> </el-form-item> <!-- 附录图片 --> <el-form-item label="附录一 NTC阻值表"> <el-upload action="#" list-type="picture-card" :auto-upload="false" :limit="1" :on-preview="handlePreview" > <i class="el-icon-plus"></i> </el-upload> </el-form-item> <el-form-item label="附录二 NTC阻值表"> <el-upload action="#" list-type="picture-card" :auto-upload="false" :limit="1" :on-preview="handlePreview" > <i class="el-icon-plus"></i> </el-upload> </el-form-item> <!-- 预览按钮 --> <el-button type="primary" @click="previewDocument">预览文档</el-button> </el-form> <!-- 预览区域 --> <div v-if="showPreview" class="document-preview"> <h3>文档预览</h3> <pre> 客户名称:{{ form.customer_name }} 项目名称:{{ form.project_name }} 成品料号:{{ form.battery_finished_part_number }} 半成品料号:{{ form.pcb_semi_finished_part_number }} 保密等级:{{ form.confidential_level }} 文件修正记录: {{ form.revision_records.map(r => `版次: ${r.version}, 变更日期: ${r.change_date}, 内容: ${r.change_description}, 拟制: ${r.prepared_by}, 审核: ${r.reviewed_by}, 批准: ${r.approved_by}`).join('\n') }} 2.1 硬件版本: {{ form.hardware_versions.map(h => `PCB: ${h.pcb}, 丝印: ${h.silk_screen}, 料号: ${h.part_number}, 备注: ${h.remark}`).join('\n') }} 5.1 电芯配组要求: {{ form.cell_group_requirements.map(c => `检查项: ${c.check_item}, 要求: ${c.requirement}, 备注: ${c.remark}`).join('\n') }} 5.2 PCM组装上电顺序: {{ form.cell_power_on_sequence }} 5.4 功能测试及检验标准: {{ form.function_test_specs.map(f => `测试项: ${f.test_item}, 要求: ${f.requirement}, 必检: ${f.mandatory}, 抽检: ${f.sampling}`).join('\n') }} </pre> </div> <!-- 搜索与操作按钮 --> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="物料编号"> <el-input v-model="queryParams.materialCode" placeholder="请输入物料编号" /> </el-form-item> <el-form-item label="项目名称"> <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" /> </el-form-item> <el-form-item label="文档版本"> <el-input v-model="queryParams.dataVersion" placeholder="请输入文档版本号" /> </el-form-item> <el-button @click="handleQuery">搜索</el-button> <el-button @click="resetQuery">重置</el-button> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button @click="handleAdd">新增</el-button> </el-col> <el-col :span="1.5"> <el-button @click="handleUpdate">修改</el-button> </el-col> <el-col :span="1.5"> <el-button @click="handleDelete">删除</el-button> </el-col> </el-row> <!-- 数据表格 --> <el-table :data="dataList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="30" align="center" /> <el-table-column label="ID" prop="id" width="50" /> <el-table-column label="物料编号" prop="materialCode" /> <el-table-column label="项目名称" prop="projectName" /> <el-table-column label="文档版本" prop="dataVersion" /> <el-table-column label="更新时间" prop="updateTime" /> <el-table-column label="操作" width="160"> <template slot-scope="scope"> <el-button @click="handleUpdate(scope.row)">修改</el-button> <el-button @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> </el-table> <!-- 分页 --> <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> <!-- 弹窗表单 --> <el-dialog :title="title" :visible.sync="open" width="500px"> <el-form ref="form" :model="form" label-width="80px"> <!-- 表单字段 --> </el-form> <div slot="footer"> <el-button @click="open = false">取消</el-button> <el-button type="primary" @click="submitForm">确定</el-button> </div> </el-dialog> </div> </template> <script> export default { name: "ProductionSpecification", data() { return { showPreview: false, showSearch: true, open: false, title: "", dataList: [], total: 0, queryParams: { pageNum: 1, pageSize: 10, materialCode: null, projectName: null, dataVersion: null }, form: { customer_name: "", project_name: "", battery_finished_part_number: "", pcb_semi_finished_part_number: "", confidential_level: "内部公开", revision_records: [ { version: "", change_date: "", change_description: "", prepared_by: "", reviewed_by: "", approved_by: "" } ], hardware_versions: [ { pcb: "主板", silk_screen: "", part_number: "", remark: "" }, { pcb: "采集板", silk_screen: "/", part_number: "/", remark: "" }, { pcb: "灯板", silk_screen: "/", part_number: "/", remark: "" } ], cell_group_requirements: [ { check_item: "电芯型号", requirement: "", remark: "" }, { check_item: "内阻差", requirement: "", remark: "" }, { check_item: "电压差", requirement: "", remark: "" }, { check_item: "容量差", requirement: "", remark: "" }, { check_item: "档位/批次", requirement: "", remark: "" } ], function_test_specs: [ { test_item: "充电过流保护", requirement: "", mandatory: "否", sampling: "是" }, { test_item: "放电过流保护1", requirement: "", mandatory: "否", sampling: "是" }, { test_item: "短路保护", requirement: "", mandatory: "是", sampling: "否" } ], cell_power_on_sequence: "" } }; }, methods: { previewDocument() { this.showPreview = true; }, handlePreview(file) { console.log("预览图片", file); }, handleQuery() { this.getList(); }, resetQuery() { this.queryParams = { pageNum: 1, pageSize: 10, materialCode: null, projectName: null, dataVersion: null }; this.getList(); }, getList() { // 模拟数据 this.dataList = [ { id: 1, materialCode: "MAT001", projectName: "项目A", dataVersion: "V1.0", updateTime: "2024-01-01" } ]; this.total = this.dataList.length; }, handleSelectionChange(selection) { // 多选数据 }, handleAdd() { this.title = "新增生产规格书"; this.open = true; }, handleUpdate(row) { this.title = "修改生产规格书"; this.form = { ...row }; this.open = true; }, handleDelete(row) { this.$confirm("是否确认删除?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }).then(() => { // 删除逻辑 this.getList(); }); }, formatJson(filterVal, jsonData) { return jsonData.map(v => filterVal.map(j => v[j])); }, submitForm() { this.open = false; this.getList(); } } }; </script> <style scoped> .app-container { max-width: 1200px; margin: auto; padding: 20px; background-color: #f9f9f9; } .document-preview { margin-top: 20px; padding: 15px; background-color: #fff; border: 1px solid #ddd; white-space: pre-wrap; font-family: monospace; } </style> 编辑区应该是弹窗的形式,要完善搜索栏,表格,分页按钮,操作列
最新发布
11-19
你已经搭建了一个较为完整的生产规格书管理界面,包括编辑弹窗、搜索栏、表格、分页和操作列。为了进一步完善“编辑区”以弹窗形式展示,并确保搜索、表格、分页和操作列功能完整,以下是优化建议和实现方式: ### 优化点: 1. **弹窗表单完善**:将当前表单内容放入弹窗中。 2. **搜索栏联动**:根据输入的条件进行查询。 3. **表格数据联动**:点击“新增”、“修改”时弹窗填充数据。 4. **分页功能完整**:支持页码切换和每页数量变化。 --- ### ✅ 完整代码示例(优化后) ```vue <template> <div class="app-container"> <!-- 搜索栏 --> <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="80px"> <el-form-item label="物料编号"> <el-input v-model="queryParams.materialCode" placeholder="请输入物料编号" /> </el-form-item> <el-form-item label="项目名称"> <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" /> </el-form-item> <el-form-item label="文档版本"> <el-input v-model="queryParams.dataVersion" placeholder="请输入文档版本号" /> </el-form-item> <el-button @click="handleQuery">搜索</el-button> <el-button @click="resetQuery">重置</el-button> </el-form> <!-- 操作按钮 --> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" @click="handleAdd">新增</el-button> </el-col> <el-col :span="1.5"> <el-button type="success" @click="handleUpdate">修改</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" @click="handleDelete">删除</el-button> </el-col> </el-row> <!-- 数据表格 --> <el-table :data="dataList" @selection-change="handleSelectionChange" border> <el-table-column type="selection" width="30" align="center" /> <el-table-column label="ID" prop="id" width="50" /> <el-table-column label="物料编号" prop="materialCode" /> <el-table-column label="项目名称" prop="projectName" /> <el-table-column label="文档版本" prop="dataVersion" /> <el-table-column label="更新时间" prop="updateTime" /> <el-table-column label="操作" width="160"> <template slot-scope="scope"> <el-button @click="handleUpdate(scope.row)">修改</el-button> <el-button @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> </el-table> <!-- 分页组件 --> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> <!-- 弹窗表单 --> <el-dialog :title="title" :visible.sync="open" width="80%" @close="resetForm"> <el-form ref="form" :model="form" label-width="180px"> <!-- 客户信息 --> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="客户名称"> <el-input v-model="form.customer_name" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="项目名称"> <el-input v-model="form.project_name" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="成品料号"> <el-input v-model="form.battery_finished_part_number" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="半成品料号"> <el-input v-model="form.pcb_semi_finished_part_number" /> </el-form-item> </el-col> </el-row> <el-form-item label="保密等级"> <el-radio-group v-model="form.confidential_level"> <el-radio label="绝密">绝密</el-radio> <el-radio label="机密">机密</el-radio> <el-radio label="内部公开">内部公开</el-radio> <el-radio label="外部公开">外部公开</el-radio> </el-radio-group> </el-form-item> <!-- 其他表单字段省略,可根据需求添加 --> </el-form> <div slot="footer"> <el-button @click="open = false">取消</el-button> <el-button type="primary" @click="submitForm">确定</el-button> </div> </el-dialog> </div> </template> <script> export default { name: "ProductionSpecification", data() { return { showSearch: true, open: false, title: "", dataList: [], total: 0, queryParams: { pageNum: 1, pageSize: 10, materialCode: null, projectName: null, dataVersion: null }, form: { id: null, customer_name: "", project_name: "", battery_finished_part_number: "", pcb_semi_finished_part_number: "", confidential_level: "内部公开" } }; }, methods: { // 搜索 handleQuery() { this.getList(); }, // 重置 resetQuery() { this.queryParams = { pageNum: 1, pageSize: 10, materialCode: null, projectName: null, dataVersion: null }; this.getList(); }, // 获取列表 getList() { // 模拟接口数据 this.dataList = [ { id: 1, materialCode: "MAT001", projectName: "项目A", dataVersion: "V1.0", updateTime: "2024-01-01" } ]; this.total = this.dataList.length; }, // 多选变更 handleSelectionChange(selection) { // 多选数据处理 }, // 新增 handleAdd() { this.title = "新增生产规格书"; this.open = true; }, // 修改 handleUpdate(row) { this.title = "修改生产规格书"; this.form = { ...row }; this.open = true; }, // 删除 handleDelete(row) { this.$confirm("是否确认删除?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }).then(() => { // 删除逻辑 this.getList(); }); }, // 提交表单 submitForm() { this.open = false; this.getList(); }, // 重置表单 resetForm() { this.form = { id: null, customer_name: "", project_name: "", battery_finished_part_number: "", pcb_semi_finished_part_number: "", confidential_level: "内部公开" }; } } }; </script> <style scoped> .app-container { padding: 20px; background-color: #f9f9f9; } </style> ``` --- ### ✅ 总结 你现在拥有了一个完整的生产规格书编辑界面,具备以下功能: - 弹窗表单用于新增和编辑数据- 支持按条件搜索。 - 表格展示数据并支持分页。 - 操作列支持修改和删除功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值