Vue3 实现页面简单的CRUD

请求拦截器

import axios from 'axios';
import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus';
import { saveAs } from 'file-saver';
import store from '@/store';
import { getToken } from '@/utils/token';
import errorCode from '@/utils/errorCode';
import { isBlobData } from '@/utils/common';
import { encodeURIParams } from '@/utils/strUtil';
import cache from '@/plugins/cache';let downloadLoadingInstance;
// 是否显示重新登录
export const isReLogin = { show: false };axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// 创建axios实例
const service = axios.create({// axios中请求配置有baseURL选项,表示请求URL公共部分baseURL: import.meta.env.VITE_APP_BASE_API,// 超时timeout: 30000,
});// request拦截器
service.interceptors.request.use((config) => {// 是否需要设置 tokenconst isToken = (config.headers || {}).isToken === false;// 是否需要防止数据重复提交const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;if (getToken() && !isToken) {config.headers.AuthToken = `Bearer ${getToken()}`; // 让每个请求携带自定义token 请根据实际情况自行修改}// get请求映射params参数if (config.method === 'get' && config.params) {let url = `${config.url}?${encodeURIParams(config.params)}`;url = url.slice(0, -1);config.params = {};config.url = url;}if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {const requestObj = {url: config.url,data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,time: new Date().getTime(),};const sessionObj = cache.session.getJSON('sessionObj');if (sessionObj === undefined || sessionObj === null || sessionObj === '') {cache.session.setJSON('sessionObj', requestObj);} else {const s_url = sessionObj.url; // 请求地址const s_data = sessionObj.data; // 请求数据const s_time = sessionObj.time; // 请求时间const interval = 10; // 间隔时间(ms),小于此时间视为重复提交if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {const message = 'The request is in processing, please do not repeat the same request.';console.warn(`[${s_url}]: ${message}`);return Promise.reject(new Error(message));}cache.session.setJSON('sessionObj', requestObj);}}return config;},(error) => {console.log(error);Promise.reject(error);},
);// 响应拦截器
service.interceptors.response.use((res) => {// 二进制数据则直接返回if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {return res.data;} else {if (res.data.state === 'S') {return Promise.resolve(res.data.payload);} else {//{"state":"F","errorCode":5001,"error":"User is not exists!"}// 未设置状态码则默认成功状态const code = res.data.errorCode;// 获取错误信息const msg = res.data.error;if (code == 4004 || code == 4005 || code == 4006 || code == 4007) {if (!isReLogin.show) {isReLogin.show = true;ElMessageBox.confirm('Login state has been expired, Please re-login!', 'System Info', {confirmButtonText: 'Re-Login',cancelButtonText: 'Cancel',type: 'warning',}).then(() => {isReLogin.show = false;store.dispatch('LogOut').then(() => {location.href = import.meta.env.BASE_URL;});}).catch(() => {isReLogin.show = false;});}return Promise.reject('Please re-login!');} else {ElNotification.error({title: msg,});return Promise.reject('error');}}}return Promise.resolve(res.data.payload);},(error) => {console.log(`err${error}`);let { message } = error;ElMessage({message,type: 'error',duration: 5 * 1000,});return Promise.reject(error);},
);// 通用下载方法
export function download(url, params, filename) {downloadLoadingInstance = ElLoading.service({ text: '正在下载数据,请稍候', background: 'rgba(0, 0, 0, 0.7)' });return service.post(url, params, {transformRequest: [(params) => encodeURIParams(params)],headers: { 'Content-Type': 'application/x-www-form-urlencoded' },responseType: 'blob',}).then(async (data) => {const isLogin = await isBlobData(data);if (isLogin) {const blob = new Blob([data]);saveAs(blob, filename);} else {const resText = await data.text();const rspObj = JSON.parse(resText);const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode.default;ElMessage.error(errMsg);}downloadLoadingInstance.close();}).catch((r) => {console.error(r);ElMessage.error('下载文件出现错误,请联系管理员!');downloadLoadingInstance.close();});
}export default service;

api

import request from '@/utils/request';export function addAccountSettingsSubscribeType(data) {return request({url: '/dic/common/accountSettingsSubscribeType',method: 'post',data});
}
export function removeAccountSettingsSubscribeType(data) {return request({url: `/dic/common/accountSettingsSubscribeType/` + data,method: 'delete',data});
}
export function updateAccountSettingsSubscribeType(data) {return request({url: `/dic/common/accountSettingsSubscribeType/` + data.id,method: 'put',data,});
}
export function getAccountSettingsSubscribeType(data) {return request({url: `/dic/common/accountSettingsSubscribeType/` + data,method: 'get'});
}
export function getAccountSettingsSubscribeTypeList(data) {return request({url: '/dic/common/accountSettingsSubscribeType/findPage' + data,method: 'get',data});
}

功能管理

<template><div><div class="card-wrap" style="padding: 0 12px;"><el-form :model="queryParams" ref="queryRef" :inline="true" class="form-search-wrap"><el-form-item label="编码"><el-input v-model="queryParams.code" clearable style="width: 240px" /></el-form-item><el-form-item><el-button type="primary" icon="Search" @click="getList()">搜索</el-button><el-button icon="Refresh" @click="resetSearchForm">重置</el-button></el-form-item></el-form></div><div class="card-wrap" style="padding-bottom: 100px;"><div class="operation-wrap"><el-button type="primary" @click="handleEdit(null, 1)">添加</el-button><el-button type="danger">删除</el-button></div><el-table :data="tableData"v-loading="loading"><el-table-column prop="code" label="编码"></el-table-column><el-table-column prop="value" label="值"></el-table-column><el-table-column prop="i18n" label="国际化"></el-table-column><el-table-column label="操作" align="center"><template #default="scope"><el-button type="primary" icon="Edit" @click="handleEdit(scope.row, 0)" circle /><el-button type="danger" icon="Delete" @click="remove(scope.row.id, 0)" circle /></template></el-table-column></el-table><div class="pagination"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="queryParams.page":page-sizes="[10, 20, 50, 100]":page-size="queryParams.size"layout="total, sizes, prev, pager, next, jumper":total="queryParams.total"></el-pagination></div></div><el-dialog :title="type?'添加':'修改'" v-model="dialogVisible" width="30%"  destroy-on-close @close='resetForm'><el-form ref="addForm" :rules="rules" :model="addFormField" label-width="100px"><el-form-item label="编码" prop="code"><el-input v-model="addFormField.code" style="width:220px" ></el-input></el-form-item><el-form-item label="值" prop="value"><el-input v-model="addFormField.value" style="width:220px" ></el-input></el-form-item><el-form-item label="国际化" prop="i18n"><el-input v-model="addFormField.i18n" style="width:220px" ></el-input></el-form-item></el-form><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取 消</el-button><el-button type="primary" @click="add">确 定</el-button></span></template></el-dialog><el-dialogv-model="dialogVisible"title="Tips"width="30%":before-close="remove"><span>This is a message</span><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">Cancel</el-button><el-button type="primary" @click="dialogVisible = false">Confirm</el-button></span></template></el-dialog></div>
</template><script>
import { reactive, toRefs, onMounted, ref } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import * as api from '@/api/dic/accountSettingsSubscribeType';
export default {name: "AccountSettingsSubscribeType",setup() {//vue3.x获取refconst addForm = ref();const dialogVisible = ref(false)//定义字段const state = reactive({dialogVisible: false,num: 1,loading: false,type: "添加",tableData: [],addFormField: {id: "",code: "",value: "",i18n: "",},queryParams: {code: undefined,page: 1,size: 10,total: 0,},rules: {code: [{ required: "true", message: "code不能为空", trigger: ["change"] },],value: [{ required: "true", message: "value不能为空", trigger: ["change"] },],i18n: [{ required: "true", message: "i18n不能为空", trigger: ["change"] },],},});const handleEdit = (row, type) => {if(row){state.addFormField = JSON.parse(JSON.stringify(row));}if (type) {state.type = true;} else{state.type = false;}state.dialogVisible = true;};const resetForm = () => {state.addFormField = {id: undefined,code: undefined,value: undefined,i18n: undefined,}};const resetSearchForm = () => {state.queryParams.code = undefined;};const remove = (id) => {ElMessageBox.confirm('Are you sure to remove this data?').then(() => {api.removeAccountSettingsSubscribeType(id).then((res) => {}).finally(() => {state.loading = false;});ElMessage.success("删除成功");setTimeout(() => {getList();}, 300);}).catch(() => {// catch error})};const add = () => {addForm.value.validate((valid) => {if (valid) {let id = state.addFormField.id;if (id) {api.updateAccountSettingsSubscribeType(state.addFormField).then((res) => {}).finally(() => {state.loading = false;});ElMessage.success("修改成功");}else{api.addAccountSettingsSubscribeType(state.addFormField).then((res) => {}).finally(() => {state.loading = false;});ElMessage.success("添加成功");}resetForm();state.dialogVisible = false;setTimeout(() => {getList();}, 200);} else {return false;}});};const getList = () => {state.loading = true;let data = {};if(state.queryParams){data = JSON.stringify(state.queryParams).replace(/:/g, '=').replace(/,/g, '&').replace(/{/g, '?').replace(/}/g, '').replace(/"/g, '');}api.getAccountSettingsSubscribeTypeList(data).then((res) => {state.tableData = res.items;state.queryParams.page = res.page;state.queryParams.size = res.size;state.queryParams.total = res.total;}).finally(() => {state.loading = false;});};const handleSizeChange = (val) => {state.queryParams.size = val;getList();};const handleCurrentChange = (val) => {state.queryParams.page = val;getList();};onMounted(() => {getList();});return {add,addForm,handleEdit,getList,remove,resetForm,handleSizeChange,handleCurrentChange,resetSearchForm,...toRefs(state),};},
};
</script>
<style scoped >
.pagination {background: #fff;padding: 10px;display: flex;justify-content: flex-end;box-sizing: border-box;
}
.card-wrap{padding: 15px 20px 20px 20px;border-radius: 4px;border: 1px solid #e6ebf5;background-color: #fff;overflow: hidden;color: #303133;-webkit-transition: .3s;transition: .3s;box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);margin: 10px;
}
.operation-wrap{margin: 0 0 16px 0;
}
.form-search-wrap{margin: 10px 0 0 12px;
}
</style>

今天水一篇,祝各位大佬 1024程序员节快乐~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于斑点鬣狗算法的无人机航迹规划-附代码

基于斑点鬣狗算法的无人机航迹规划 文章目录 基于斑点鬣狗算法的无人机航迹规划1.斑点鬣狗搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用斑点鬣狗算法来优化无人机航迹规划。 …

LuatOS-SOC接口文档(air780E)-- ioqueue - io序列操作

ioqueue.init(hwtimer_id,cmd_cnt,repeat_cnt) 初始化一个io操作队列 参数 传入值类型 解释 int 硬件定时器id&#xff0c;默认用0&#xff0c;根据实际MCU确定&#xff0c;air105为0~5&#xff0c;与pwm共用&#xff0c;同一个通道号不能同时为pwm和ioqueue int 一个完…

Java 基础 面试 多线程

1.多线程 1.1 线程&#xff08;Thread&#xff09; 线程时一个程序内部的一条执行流程&#xff0c;java的main方法就是由一条默认的主线程执行 1.2 多线程 多线程是指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09; 许多平台都离不开多…

【Matlab笔记_17】查找数组中相同元素

案例一&#xff1a;找到数组中相同元素所在位置索引 方法&#xff1a;使用unique函数用于找到唯一的元素和它们在原数组中的索引。然后&#xff0c;histc函数用于计算每个唯一元素的出现次数&#xff0c;并通过ismember函数找到重复元素在原数组中的索引。最后&#xff0c;通过…

动手学深度学习—网络中的网络NiN(代码详解)

目录 1. NiN块2. NiN模型3. 训练模型 LeNet、AlexNet和VGG都有一个共同的设计模式&#xff1a; 通过一系列的卷积层与汇聚层来提取空间结构特征&#xff1b;然后通过全连接层对特征的表征进行处理。 如果在过程的早期使用全连接层&#xff0c;可能会完全放弃表征的空间结构。 …

Day 1 Vue 页面框架

现在前端框架越来越像后端了&#xff0c;特别是TypeScript这样的语言出现后&#xff0c;开发前端的体验跟后端渐渐接近了。当然&#xff0c;作为一个后端&#xff0c;直接上手前端&#xff0c;还是有很多坑要填的。 本次开发&#xff0c;前端页面框架直接选择Vue。原因很简单&…

深入浅出排序算法之归并排序

目录 1. 归并排序的原理 1.1 二路归并排序执行流程 2. 代码分析 2.1 代码设计 3. 性能分析 4. 非递归版本 1. 归并排序的原理 “归并”一词的中文含义就是合并、并入的意思&#xff0c;而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表。 归并排序…

Python-pptx教程之一从零开始生成PPT文件

简介 python-pptx是一个用于创建、读取和更新PowerPoint&#xff08;.pptx&#xff09;文件的python库。 典型的用途是根据动态内容&#xff08;如数据库查询、分析数据等&#xff09;&#xff0c;将这些内容自动化生成PowerPoint演示文稿&#xff0c;将数据可视化&#xff0c…

hutool 工具类提高编码效率

hutool 工具类 hutool 依赖 引入 hutool 依赖包。 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.6</version> </dependency>StrUtil 常用方法&#xff1a; StrUtil.equals&…

【IDEA配置】IDEA配置

参考视频&#xff1a;【idea必知必会】优化设置 告别卡顿 1. 显示内存 右击底下空白区域&#xff0c;出现memory indicator内存指示器&#xff0c;点击勾选即可显示。有的是在Settings->Appearance->Window Options里&#xff0c;如图所示&#xff1a; 2. 内存设置 …

虚拟世界游戏定制开发:创造独一无二的虚拟体验

在游戏开发领域&#xff0c;虚拟世界游戏定制开发是一项引人注目的任务&#xff0c;旨在满足客户独特的需求和愿景&#xff0c;创造一个完全个性化的虚拟世界游戏。这种类型的游戏开发需要专业的技能、深刻的游戏开发知识和密切的与客户合作&#xff0c;以确保游戏满足客户的期…

数据库Redis(二):基本数据类型

Redis中采用Key-Value键值对的形式将数据存储在数据库中&#xff0c;首先介绍Redis中针对键Key的操作命名。 Redis键Key相关命令 # 查看当前库所有key keys * # 判断某个key是否存在 exists <key> # 查看你的key是什么类型 type <key> # 删除指定的key数据 …

uboot移植之环境变量bootargs

一. 简介 uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs。本文来学习 uboot的环境变量 bootargs。 bootargs 环境变量也叫命令行参数。bootargs 保存着 uboot 传递给 Linux 内核的参数。 二. uboot移植之环境变量bootargs 环境变量 bootargs 的设置是在 mx6ull_al…

CI2454 2.4g无线MCU芯片应用

Ci2454集成MCU芯片 | Ci2454是一款集成无线收发器和 8 位 RISC&#xff08;精简指令集&#xff09;MCU 的SOC芯片。 #Ci2454芯片 集成MCU芯片# 中国芯片# 无线收发器特性&#xff1a; 工作在 2.4GHz ISM 频段 调制方式&#xff1a;GFSK/FSK 数据速率&#xff1a;2Mbps/1Mbps…

数据库基础(一)【MySQL】

文章目录 安装 MySQL修改密码连接和退出数据库服务器使用 systemctl 管理服务器进程配置数据库从文件角度看待数据库查看连接情况 安装 MySQL 这是在 Linux 中安装 MySQL 的教程&#xff1a;Linux 下 MySQL 安装。本系列测试用的 MySQL 版本是 5.7&#xff0c;机器是 centOS7.…

LabVIEW中将枚举与条件结构一起使用

LabVIEW中将枚举与条件结构一起使用 枚举是一个具有相应数值的字符串标签型列表。在LabVIEW&#xff08;U8 &#xff0c; U16-默认值和U32&#xff09;中以无符号整数形式应用。 例如&#xff0c;可以有一个枚举保存四个季节&#xff0c;在这种情况下&#xff0c;每个字符串都…

Go之流程控制大全: 细节、示例与最佳实践

引言 在计算机编程中&#xff0c;流程控制是核心的组成部分&#xff0c;它决定了程序应该如何根据给定的情况执行或决策。以下是Go语言所支持的流程控制结构的简要概览&#xff1a; 流程控制类型代码if-else条件分支if condition { } else { }for循环for initialization; con…

GoLong的学习之路(一)语法之变量与常量

目录 GoLang变量批量声明变量的初始化类型推导短变量声明匿名变量 常量iota&#xff08;特殊&#xff09;&#xff08;需要重点记忆&#xff09; GoLang go的诞生为了解决在21世纪多核和网络化环境越来越复杂的变成问题而发明的Go语言。 go语言是从Ken Thomepson发明的B语言和…

分享个包含各省、市、区的编码数据的在线静态资源脚本

在翻《SpringBootVue3》——十三尼克陈作者的大型前后端分离项目实战里面&#xff0c;在看到地址管理的部分时&#xff0c;发现了该作者记录有一个静态的地址资源脚本 这里做个记录&#xff0c;打点 一、引入js <script src"https://s.yezgea02.com/1641120061385/td…

2024王道考研计算机组成原理——指令系统

零、本章概要 指令寻址&#xff1a;解决的是PC"1"的问题 数据寻址&#xff1a;使用寄存器/内存/结合 基址寻址&#xff1a;用于多道程序的并发执行 直接寻址&#xff1a;call 0x12345678 变址寻址&#xff1a;esi edi用于循环&#xff0c;因为使用直接寻址需要一堆…