黑马智数Day7

 获取行车管理计费规则列表

封装接口

export function getRuleListAPI(params) {return request({url: 'parking/rule/list',params})
}

获取并渲染数据

import { getRuleListAPI } from '@/apis/car'mounted() {this.getRuleList()
}methods: {// 获取规则列表async getRuleList() {const res = await getRuleListAPI(this.params)this.ruleList = res.data.rows}
}<el-table :data="ruleList" style="width: 100%">

计费规则分页实现

<el-paginationlayout="prev, pager, next":total="total":page-size="params.pageSize"@current-change="pageChange"></el-pagination>pageChange(page) {this.params.page = page;this.getRuleList();},

导出功能实现

  • 后端主导实现 流程:前端调用到导出excel接口 -> 后端返回excel文件流 -> 浏览器会识别并自动下载  场景:大部分场景都有后端来做

  • 前端主导实现 流程:前端获取要导出的数据 -> 把常规数据处理成一个excel文件 -> 浏览器识别下载  场景:少数据量的导出

前端主导实现基础导出

Tutorial | SheetJS Community Edition 插件导出流程:

  1. 创建一个工作簿

  2. 创建一个工作表

  3. 把工作表加入到工作簿中

  4. 调用插件方法导出

使用三方插件做需求的步骤:

  1. 不考虑具体业务 实现一个能跑起来最简单的DEMO [基础环境 + 基础效果]

  2. 在基础DEMO基础上按照实际的业务数据去做对应的修改

import { utils, writeFileXLSX } from 'xlsx'exportToExcel() {// 创建一个新的工作簿const workbook = utils.book_new()// 创建一个工作表 要求一个对象数组格式const worksheet = utils.json_to_sheet([{ name: '张三', age: 18 },{ name: '李四', age: 28 }])// 把工作表添加到工作簿  Data为工作表名称utils.book_append_sheet(workbook, worksheet, 'Data')// 改写表头utils.sheet_add_aoa(worksheet, [['姓名', '年龄']], { origin: 'A1' })// 导出方法进行导出writeFileXLSX(workbook, 'SheetJSVueAoO.xlsx')
}

按照业务数据导出

// 导出excel
async exportToExcel() {// 获取要导出的业务数据const res = await getRuleListAPI(this.params)// 表头英文字段keyconst tableHeaderKeys = ['ruleNumber', 'ruleName', 'freeDuration', 'chargeCeiling', 'chargeType', 'ruleNameView']// 表头中文字段valueconst tableHeaderValues = ['计费规则编号', '计费规则名称', '免费时长(分钟)', '收费上线(元)', '计费方式', '计费规则']// 以excel表格的顺序调整后端数据const sheetData = res.data.rows.map((item) => {const obj = {}tableHeaderKeys.forEach(key => {obj[key] = item[key]})return obj})// 创建一个工作表const worksheet = utils.json_to_sheet(sheetData)// 创建一个新的工作簿const workbook = utils.book_new()// 把工作表添加到工作簿utils.book_append_sheet(workbook, worksheet, 'Data')// 改写表头utils.sheet_add_aoa(worksheet, [tableHeaderValues], { origin: 'A1' })writeFileXLSX(workbook, 'SheetJSVueAoO.xlsx')
}

 

适配付费状态

// 适配收费状态
formatChargeType(type) {const TYPEMAP = {'duration': '按时长收费','turn': '按次收费','partition': '分段收费'}return TYPEMAP[type]
}// 适配table
<el-table-column label="计费方式"><template #default="scope">{{ formatChargeType(scope.row.chargeType ) }}</template>
</el-table-column>// 适配excel表格
const sheetData = res.data.rows.map(item => {const _obj = {}headerKeys.forEach(key => {// 赋值// 针对计费规则做处理if (key === 'chargeType') {_obj[key] = this.formatChargeType(item[key])} else {_obj[key] = item[key]}})return _obj
})

添加计费规则

控制弹框打开关闭

<!-- 弹框 -->
<el-dialog :visible="dialogVisible" width="680px" title="新增规则"><!-- 表单接口 --><div class="form-container"><el-form ref="addForm" :model="addForm" :rules="addFormRules" label-position="top"><el-form-item label="计费规则编号" prop="ruleNumber"><el-input v-model="addForm.ruleNumber" /></el-form-item><el-form-item label="计费规则名称" prop="ruleName"><el-input v-model="addForm.ruleName" /></el-form-item><el-form-item label="计费方式" prop="chargeType"><el-radio-group v-model="addForm.chargeType" size="small"><el-radio label="duration" border>时长收费</el-radio><el-radio label="turn" border>按次收费</el-radio><el-radio label="partition" border>分段收费</el-radio></el-radio-group></el-form-item><div class="flex-container"><el-form-item label="免费时长"><el-input v-model="addForm.freeDuration" /></el-form-item><el-form-item label="收费上限"><el-input v-model="addForm.chargeCeiling" /></el-form-item></div><el-form-item label="计费规则"><!-- 按时长收费区域 --><div  class="duration">每 <el-input v-model="addForm.durationTime" class="input-box" /> 小时 <el-input v-model="addForm.durationPrice" class="input-box" /> 元</div><!-- 按次收费区域 --><div class="turn">每次 <el-input v-model="addForm.turnPrice" class="input-box" /> 元</div><!-- 按分段收费区域 --><div class="partition"><div class="item"><el-input v-model="addForm.partitionFrameTime" class="input-box" />小时内,每小时收费<el-input v-model="addForm.partitionFramePrice" class="input-box" /> 元</div><div class="item">每增加<el-input v-model="addForm.partitionIncreaseTime" class="input-box" />小时,增加<el-input v-model="addForm.partitionIncreasePrice" class="input-box" /> 元</div></div></el-form-item></el-form></div><template #footer><el-button size="mini" @click="dialogVisible = false">取 消</el-button><el-button size="mini" type="primary">确 定</el-button></template>
</el-dialog>data() {return {dialogVisible: true, // 控制弹框关闭打开addForm: {ruleNumber: '', // 计费规则编号ruleName: '', // 计费规则名称chargeType: 'duration', // 计费规则类型 duration / turn / partitionchargeCeiling: null,freeDuration: null,// 时长计费独有字段durationTime: null, // 时长计费单位时间durationPrice: null, // 时长计费单位价格durationType: 'hour',// 按次收费独有字段turnPrice: null,// 分段计费独有字段partitionFrameTime: null, // 段内时间partitionFramePrice: null, // 段内费用partitionIncreaseTime: null, // 超出时间partitionIncreasePrice: null // 超出费为收费价钱}, // 计费规则表单对象addFormRules: {ruleNumber: [{required: true,message: '请输入规则编号',trigger: 'blur'}],ruleName: [{required: true,message: '请输入规则名称',trigger: 'blur'}],chargeType: [{required: true,message: '请选择收费类型',trigger: 'blur'}]} // 计费规则校验规则对象}
}

根据计费方式适配计费规则

<el-form-item label="计费规则"><!-- 按时长收费区域 --><div v-if="addForm.chargeType === 'duration'" class="duration">每 <el-input v-model="addForm.durationTime" class="input-box" /> 小时 <el-input v-model="addForm.durationPrice" class="input-box" /> 元</div><!-- 按次收费区域 --><div v-if="addForm.chargeType === 'turn'" class="turn">每次 <el-input v-model="addForm.turnPrice" class="input-box" /> 元</div><!-- 按分段收费区域 --><div v-if="addForm.chargeType==='partition'" class="partition"><div class="item"><el-input v-model="addForm.partitionFrameTime" class="input-box" />小时内,每小时收费<el-input v-model="addForm.partitionFramePrice" class="input-box" /> 元</div><div class="item">每增加<el-input v-model="addForm.partitionIncreaseTime" class="input-box" />小时,增加<el-input v-model="addForm.partitionIncreasePrice" class="input-box" /> 元</div></div>
</el-form-item>

确认提交

export function createRuleAPI(data) {return request({url: '/parking/rule',method: 'POST',data})
}confirmAdd() {this.$refs.addForm.validate(async valid => {if (valid) {await createRuleAPI(this.addForm)this.getRuleList()this.dialogVisible = false}})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14100.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

员工电脑怎么监控?这些电脑监控软件必备

在当今远程办公、灵活工时盛行的时代&#xff0c;如何掌握员工的在线活动、确保工作效率和数据安全成为许多企业关注的焦点。电脑监控软件作为管理工具中的关键一环&#xff0c;可以有效帮助企业了解员工的在线行为&#xff0c;避免效率低下和数据泄露等风险。今天我们就来介绍…

学习干货|实战学习应急响应之Windows日志分析,网络安全零基础入门到精通教程!

前言 本次环境将从大赛内与实战环境相结合去了解在应急响应中Windows日志分析的几个关键点&#xff0c;符合大赛及真实环境案例&#xff0c;本次环境将从WEB层面的日志分析到主机内的几种关键日志分析和重点功能进行排查 题目描述&#xff1a;某台Windows服务器遭到攻击者入侵…

零基础光伏人,数据计算轻松拿捏

在可再生能源领域&#xff0c;光伏产业以其清洁、可再生的特点日益受到全球关注。然而&#xff0c;对于初学者或“零基础光伏人”而言&#xff0c;光伏项目涉及的一系列数据计算和专业知识往往显得复杂而难以入手。幸运的是&#xff0c;随着技术的进步&#xff0c;一系列光伏计…

一文搞懂链表相关算法

目录 链表的逆序和截断 逆序 截断 查找链表的中间节点 力扣题 博主主页&#xff1a;东洛的克莱斯韦克-CSDN博客 链表的逆序和截断 逆序 推荐使用头插法逆序&#xff0c;首先要 new 一个虚拟头节点——newNode。如下图 链表的头节点为head&#xff0c;由cur指针指向head&a…

红外热成像技术开启光伏检测新视界

随着全球对可再生能源需求的不断增加&#xff0c;光伏发电系统的应用日益广泛。然而&#xff0c;光伏组件在长期运行中可能会出现各种故障&#xff0c;如热斑效应、隐裂、接线盒故障等&#xff0c;这些问题不仅影响光伏系统的发电效率&#xff0c;还可能引发安全隐患。 红外热成…

基于vue框架的的社区智慧养老系统1mo30(程序+源码+数据库+调试部署+开发环境)

系统程序文件列表 项目功能&#xff1a;老人,员工,老人档案,养生视频,社区医生,就医信息,在线咨询,咨询回复,菜品信息,点餐订单,服务预约,通知信息,服务评价,健康关爱,新闻公告,监控日志 开题报告内容 以下是一份基于Vue框架的社区智慧养老系统的开题报告&#xff0c;详细阐述…

龙蜥8.6 配置用户登录次数和锁定策略(已亲测)

操作系统&#xff1a;龙蜥8.6 x86_64 查看是否安装pam模块 rpm -qa | grep pam 查看可以使用的认证模块&#xff0c;因为有的系统是pam_tally2. cd /etc/pam.d ls 经过查看&#xff0c;该服务器是使用的pam_faillock 模块 打开/etc/pam.d/password-auth 的 PAM 配置文件…

【6.4】位运算-判断是否存在重复元素

一、题目 给定一个整数数组&#xff0c;判断 是否存在重复元素 。如果存在一值在数组中 出现至少两次 &#xff0c;函数返回 true 。如果数组中每个元素都不相同&#xff0c;则返回 false 。 示例 1: 输入: [ 1 , 2 , 3 , 1 ] 输出: true 示例 2: 输入: [ 1 , 2 , 3 , 4 ] 输出…

PCB打样下单流程

PCB打样下单流程 一、PCB打样在线下单流程1&#xff0e;平台登录2&#xff0e;PCB打样领券3&#xff0e;进入下单系统4&#xff0e;上传PCB文件5&#xff0e;PCB订单界面 PCB&#xff08;印刷电路板&#xff09;打样是验证设计、优化性能和推进项目进度的关键环节。随着互联网的…

Python爬虫知识体系-----正则表达式-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、正则基础1. 为什么使用正则2. 正则与re模块简介 二、正则表达式1. 匹配单个字符与数字2. 限定符3. 定位符4. 选择匹…

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注 1.引言1.初阶“自动标注”&#xff0c;给每个图像都生成一个固定的标注文件&#xff0c;进而在labglimg中对矩形框进行微调&#xff0c;减少标注的工作量2.高阶自动标注&#xff0c;利用我们训练好的&#xff08;但是没有特别精准的&#xff09;yolo文件先对每…

在 WPF 中,如何使用命令来替代事件处理?

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;命令是一种非常强大的替代传统事件处理的方法&#xff0c;特别适用于 MVVM&#xff08;Model-View-ViewModel&#xff09;架构。命令可以实现界面&#xff08;View&#xff09;和逻辑&#xff08;…

语音 AI 革命:未来,消费者更可能倾向于与 AI 沟通,而非人工客服

「未来&#xff0c;消费者更可能倾向于与 AI 沟通&#xff0c;而非人工客服&#xff0c;因为这将成为解决问题的最高效途径。」 这篇来自 Bessemer Venture Partners 的报告&#xff0c;是目前为止对语音 AI 在企业应用上最完整清晰的一次梳理。 核心要点&#xff1a; 尽管市…

过去几年电子学习的趋势

近年来&#xff0c;在技术和不断变化的学习者期望的推动下&#xff0c;电子学习已经发展成为一种适应性强、沉浸式和社会化的教育形式。个性化已成为最具影响力的趋势之一&#xff0c;Coursera和LinkedIn Learning等平台为个人量身定制内容。这些平台使用人工智能来建议课程、跟…

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

springboot 之 整合springdoc2.6 (swagger 3)

版本 springboot 3.3.5 jdk 17 springdoc 2.6.0 依赖pom <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version> </dependency>注解对比…

Zabbix部署

1.集群规划 进程虚拟机节点1虚拟机节点2虚拟机节点3zabbix-agent√√√zabbix-server√PostgreSQL√zabbix-web√ 2.准备工作 默认在虚拟机节点2安装kafka、在虚拟机节点3安装redis 2.1关闭3台节点防火墙 sudo systemctl stop firewalld.service sudo systemctl disable fi…

如何优化锚文本来提升关键词排名?

锚文本在SEO中是个小细节&#xff0c;但作用可不小。它不仅能影响外链的质量&#xff0c;还直接影响你的目标关键词排名。你要知道&#xff0c;锚文本并不是随便加上就行&#xff0c;它得讲究技巧和策略。 锚文本的关键词选择一定要精准&#xff0c;且与页面内容高度相关。比如…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 4.部署任务&#xff0c;执行部署脚本

怎么能够制作活码的二维码?在线生成活码的简单技巧

活码是现在很常用的一种二维码类型&#xff0c;可以用来展示日常生活中的视频、音频、图片、文件等多种类型的内容&#xff0c;有效提高内容分享的效率&#xff0c;可以让更多人同时扫码获取内容。使用二维码来展示内容&#xff0c;用户也不需要下载或者保存内容&#xff0c;扫…