vue.js3+element-plus+typescript add,edit,del,search

vite.config.ts

server: {cors: true, // 默认启用并允许任何源host: '0.0.0.0', // 这个用于启动port: 5110, // 指定启动端口open: true, //启动后是否自动打开浏览器  proxy: {'/api': {target: 'http://localhost:8081/',  //实际请求地址,数据库的rest APIschangeOrigin: true      },}

数据来源于前面文章的介绍的方式


import axios from "axios";/* eslint-disable class UserinfoDataService*/
/*** Userinfo Rest API* 和前文章的各数据操作,可以用其一任一种*/
class UserinfoDataService
{/*** 查看所有记录    getAll():Promise<any> {* @returns */ getAllData(){axios.get('/api/userinfos').then(response=>{console.log(response.data);return response.data;}).catch(error=>{console.log(error);return null});//console.log(axios.get("/tutorials"));// return axios.get("/api/tutorials");// http.get("/tutorials");//}/*** 2 查询所有记录*/
getAll(): Promise<any>{return axios.get("/api/userinfos");// http.get("/tutorials");//
}/*** 登录* @param userName * @param userPassword * @returns */
userlogin(userName:any,userPassword:any):Promise<any> 
{return axios.get(`/api/userinfos/?userName=${userName}&userPassword=${userPassword}`);
}/*** 查询一条记录* @param id * @returns */get(id: any): Promise<any> {console.log(id);return axios.get(`/api/userinfos/${id}`);//http.get(`/api/tutorials/${id}`);}/*** 添加* @param data * @returns */create(data: any): Promise<any> {return axios.post("/api/userinfos", data);}/*** 更新* @param id * @param data * @returns */update(id: any, data: any): Promise<any> {return axios.put(`/api/userinfos/${id}`, data);}/*** 删除* @param id * @returns */delete(id: any): Promise<any> {return axios.delete(`/api/userinfos/${id}`);}/***删除所有* @returns */deleteAll(): Promise<any> {return axios.delete(`/api/api/userinfos`);}/*** 查找* @param username * @returns */findByTitle(username: string): Promise<any> {return axios.get(`/api/userinfos?username=${username}`);}
}
// new TutorialDataService()
export default new UserinfoDataService();

调用:

<!--
** _______________#########_______________________ * ______________############_____________________ * ______________#############____________________ * _____________##__###########___________________ * ____________###__######_#####__________________ * ____________###_#######___####_________________ * ___________###__##########_####________________ * __________####__###########_####_______________ * ________#####___###########__#####_____________ * _______######___###_########___#####___________ * _______#####___###___########___######_________ * ______######___###__###########___######_______ * _____######___####_##############__######______ * ____#######__#####################_#######_____ * ____#######__##############################____ * ___#######__######_#################_#######___ * ___#######__######_######_#########___######___ * ___#######____##__######___######_____######___ * ___#######________######____#####_____#####____ * ____######________#####_____#####_____####_____ * _____#####________####______#####_____###______ * ______#####______;###________###______#________ * ________##_______####________####______________ * * @Author: geovindu* @Date: 2024-08-26 19:55:02* @LastEditors: geovindu* @LastEditTime: 2024-08-27 20:24:32* @FilePath: \vue\vuetest\src\components\tablebind.vue* @Description: geovindu* @lib,packpage: * * @IDE: vscode* @jslib: node 20 vue.js 3.0* @OS: windows10* @database: mysql 8.0  sql server 2019 postgreSQL 16* Copyright (c) geovindu 2024 by geovindu@163.com, All Rights Reserved. --><template><div style="padding: 10px"> <ElConfigProvider :locale="zhCn"><ElInput style="width: 300px" placeholder="请输入名称..." v-model="name" clearable></ElInput><ElButton type="primary" @click="search" style="margin-left: 5px">查询数据</ElButton><ElButton type="primary" @click="handleAdd">新增数据</ElButton><div style="margin: 10px 0"><ElTable :data="paginatedData" border style="width: 100%">  <ElTableColumn prop="id" label="ID" width="20"/>     <ElTableColumn prop="userName" label="用户名" width="80"/>        <ElTableColumn prop="userReal" label="姓名" width="80"/><ElTableColumn prop="userPassword" label="密码"/><ElTableColumn prop="userIsOk" label="否可用"/><ElTableColumn prop="userMail" label="邮件"/><ElTableColumn prop="userMobile" label="手机号码"/><ElTableColumn prop="createdAt" label="日期" width="80"/><ElTableColumn label="操作"><template #default="scope"><ElButton type="text" size="small" @click="handleEdit(scope.row, scope.$index)">编辑</ElButton>  <ElButton type="danger" size="small" @click.prevent="remove(scope.$index)">删除</ElButton></template></ElTableColumn></ElTable><div class="pagination-block">  <ElPagination  background  layout="prev, pager, next, jumper, total, sizes"  :current-page="state.page"  :page-size="state.limit"  :page-sizes="[10, 20, 30, 40]"  :total="total"  @current-change="handleCurrentChange"  @size-change="handleSizeChange"  />  </div>  </div><!--弹窗--><ElDialog v-model="dialogFormVisible" title="信息" width="40%"><ElForm :model="form" label-width="100px" style="padding-right:30px "><ElFormItem label="ID"><ElInput v-model="form.id" autocomplete="off"/></ElFormItem>                <ElFormItem label="用户名"><ElInput v-model="form.userName" autocomplete="off"/></ElFormItem><ElFormItem label="姓名"><ElInput v-model="form.userReal" autocomplete="off"/></ElFormItem><ElFormItem label="密码"><ElInput v-model="form.userPassword" autocomplete="off"/></ElFormItem><ElFormItem label="邮件"><ElInput v-model="form.userMail" autocomplete="off"/></ElFormItem><ElFormItem label="手机号码"><ElInput v-model="form.userMobile" autocomplete="off"/></ElFormItem><ElFormItem label="是否可用"><ElCheckbox v-model="form.userIsOk"/></ElFormItem><ElFormItem label="日期">                    <ElDatePickerv-model="form.createdAt"type="date"placeholder="Pick a day"format="YYYY/MM/DD"value-format="YYYY-MM-DD"        :disabled-date="disabledDate":shortcuts="shortcuts":size="size"/>     </ElFormItem></ElForm><template #footer><span class="dialog-footer"><ElButton @click="dialogFormVisible = false">取消</ElButton><ElButton type="primary" @click="save">确认</ElButton></span></template></ElDialog></ElConfigProvider></div>
</template>
<script lang="ts" setup>import { ElMessageBox,ElTable,ElButton,ElTableColumn,ElDialog,ElForm,ElFormItem,ElInput,ElDatePicker,ElConfigProvider,ElCheckbox } from "element-plus";//https://element-plus.org/zh-CN/guide/i18n.htmlimport zhCn from 'element-plus/es/locale/lang/zh-cn'//中文import {reactive, ref,computed} from "vue";import  UserinfoDataService from "../services/UserinfoDataService";import router from "@/router"; //路由配置文件import Crypoto from "../common/Cryptographer"; //;加密const total=ref(0);//const state = reactive({  page: 1,  limit: 10,  });  // 计算属性用于分页  const paginatedData = computed(() => {  const start = (state.page - 1) * state.limit;  const end = start + state.limit;  total.value=tableData.value.length;return tableData.value.slice(start, end);  });  // 改变页码  const handleCurrentChange = (e: number) => {  state.page = e;  };      // 改变页数限制  const handleSizeChange = (e: number) => {  state.limit = e;  };  //https://element-plus.org/zh-CN/component/date-pickerconst size = ref<'default' | 'large' | 'small'>('default');const shortcuts = [{text: 'Today',value: new Date(),},{text: 'Yesterday',value: () => {const date = new Date()date.setTime(date.getTime() - 3600 * 1000 * 24)return date},},{text: 'A week ago',value: () => {const date = new Date()date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)return date},},
]const disabledDate = (time: Date) => {return time.getTime() > Date.now()
}//const tableData = ref([{}]);//读数据UserinfoDataService.getAll().then(response=>{     console.log("class处理成功情况2");console.log(response.data);tableData.value=response.data;}).catch(error=>{console.log(error);});const dialogFormVisible = ref(false)const form = reactive({id:total,userName:"",userReal:"",userPassword:"",userIsOk:false,userMail:"",userMobile:"",createdAt:""})//全局保存编辑的行号const globalIndex = ref(-1)const name = ref('')//新增数据 设置新的空的绑值对象 打开弹窗const handleAdd = () => {//生成最大的IDform.id=tableData.value.length+1;form.userName = '';  form.userReal="";form.userPassword = '';  form.userIsOk = false;form.userMail="";form.userMobile="";form.createdAt="";dialogFormVisible.value = true;}//保存数据,把数据插入到tableData中,并刷新页面,弹窗关闭const save = () => {if (globalIndex.value >= 0) {//表示编辑tableData.value[globalIndex.value,20] = form    //还原回去globalIndex.value = -1UserinfoDataService.update(form.id,form); //修改成功 (密码需要加密一下)router.push('tablebind')} else {//新增tableData.value.push(form)UserinfoDataService.create(form); //添加成功!(密码需要加密一下)router.push('tablebind')}dialogFormVisible.value = false}//编辑数据 先赋值到表单再弹窗const handleEdit = (row: {id:number, userName: string; userReal:string,userPassword: string; userIsOk:boolean,userMail:string,userMobile:string,createdAt:string}, index: number) => {const newObj = Object.assign({}, row)form.id=newObj.id;form.userName =newObj.userName;form.userReal=newObj.userReal;form.userPassword=newObj.userPassword;form.userIsOk=newObj.userIsOk;form.userMail=newObj.userMail; //.toLocaleDateString()form.userMobile=newObj.userMobile;form.createdAt=newObj.createdAt;console.log(form);// reactive(newObj)//把当前编辑的行号赋值给全局保存的行号globalIndex.value = index;console.log(globalIndex.value);dialogFormVisible.value = true;}//删除数据 从index位置开始,删除一行即可 删除前有一个提示为好const remove = (index:any) => {tableData.value.splice(index, 1)// UserinfoDataService.delete(form.id) //删除}//查询数据有问题,需要修改const search = () =>{tableData.value = tableData.value.filter(v =>v.userName.includes(form.userName)) //userName.value// UserinfoDataService.getAll(form.userName)}
</script>

还有BUG,待完善

输出:

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

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

相关文章

MySQL索引(二)

MySQL索引(二) 文章目录 MySQL索引(二)MySQL有哪些索引&#xff1f;MySQL的主键是聚簇索引吗&#xff1f;聚簇索引和非聚簇索引的区别什么是覆盖索引什么是回表主键问题 外键约束什么是外键什么是外键约束外键带来的问题 联合索引最左匹配原则如何建立联合索引索引下推 学习地址…

Android Auto推出全新Google助手设计

智能手机与汽车的无缝整合已成为现代驾驶的重要组成部分&#xff0c;而 Android Auto 一直在这一领域处于领先地位。谷歌通过不断推出新功能和更新&#xff0c;体现了其致力于提升 Android Auto 体验的决心。最近&#xff0c;Android Auto 引入了 Google助手的全新设计。 当系…

微信小程序代码目录结构介绍

文件描述app.js小程序的入口文件&#xff0c;负责监听和处理小程序的生命周期函数&#xff0c;以及定义一些全局的公共方法和数据。app.json公共全局配置文件。app.wxss公共全局样式文件。project.config.json项目的配置文件&#xff0c;包含一些项目级别的配置&#xff0c;如项…

科研绘图系列:R语言对角线矩阵图(corrplot plot)

介绍 对角线矩阵图(Diagonal Matrix Plot)是一种特殊类型的图表,用于可视化对角线矩阵中的元素。对角线矩阵是一种方阵,其中非对角线上的元素都是零,而对角线上的元素可以是任意值。这种矩阵在数学和计算机科学中非常有用,尤其是在线性代数、特征值问题和对角化等操作中…

使用 OpenCV 组合和缩放多张图像

在图像处理领域&#xff0c;我们经常需要将多张小图像组合成一张大图。例如&#xff0c;将多张图像按一定布局排列在一起&#xff0c;或者创建一个缩略图画廊。在这篇博客中&#xff0c;我将向你展示如何使用 Python 的 OpenCV 库来完成这一任务。 代码 下面是一段完整的 Pyt…

IO进程线程8月27日

1&#xff0c;思维导图 2&#xff0c;使用两个线程分别复制文件的上下两部分到同一个文件 #include<myhead.h> sem_t fastsem; //pthread_mutex_t fastmutex; void *capy_up(void *c) { // pthread_mutex_lock(&fastmutex);int len*(int *)c;int fp1open("./1…

代码随想录 刷题记录-18 动态规划(2)01背包问题、习题

一、01背包理论基础 例题&#xff1a;46. 携带研究材料 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 暴力解法&#xff1a…

SparkShop开源商城 uploadFile 任意文件上传漏洞复现

0x01 产品简介 SparkShop开源商城(也被称为星火商城)是一款基于ThinkPHP6和Element UI的开源免费可商用的高性能商城系统。适用于各类电商场景,包括但不限于B2C商城、新零售、分销商城等。无论是初创企业还是成熟品牌,都可以通过SparkShop快速搭建个性化独立商城,实现线上…

PHPShort轻量级网址缩短程序源码开心版,内含汉化包

需要网址缩短并且想获得更多有关链接点击率和流量的数据分析&#xff0c;那么 PHPShort 可能是一个非常好的选择。PHPShort 是一款高级的 URL 缩短器平台&#xff0c;可以帮助你轻松地缩短链接&#xff0c;并根据受众群体的位置或平台来定位受众。 该程序基于 Laravel 框架编写…

【Python机器学习】NLP分词——利用分词器构建词汇表(一)

在NLP中&#xff0c;分词&#xff08;也称切词&#xff09;是一种特殊的文档切分过程。而文档切分能够将文本切分成更小的文本块或片段&#xff0c;其中含有更集中的信息内容。文档切分可以是将文本分成段落&#xff0c;将段落分成句子&#xff0c;将句子分成短语&#xff0c;或…

GUI编程03:3种布局管理器

本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV1DJ411B75F?p5&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV1DJ411B75F?p5&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.FlowLayout 流式布局 代码&#xff1a;…

c++类的继承

1.直接继承父类的方法 #include <iostream> #include <string>using namespace std; class Person{ public:void eat(){cout<<"在吃饭"<<endl;} }; class Student : public Person{ private:int age; public:string name;Student() {cout &…

echarts倾斜横向堆叠柱状图

代码如下 option: {backgroundColor: "transparent",tooltip: {trigger: "axis",axisPointer: {lineStyle: {color: {type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: "rgba(126,199,255,0)", // 0% 处的颜色}…

J.U.C Review - 基本概念:进程、线程、线程组、优先级

文章目录 进程与线程的故事1.1 进程的诞生对操作系统的要求进一步提高为什么我们要使用多线程&#xff1f; 1.2 上下文切换的故事 Java多线程入门1. 继承Thread类代码示例 2. 实现Runnable接口代码示例 3. Thread类的构造方法和常用方法构造方法常用方法 4. Thread类与Runnable…

数据结构(邓俊辉)学习笔记】串 07——KMP算法:分摊分析

文章目录 1.失之粗糙2.精准估计 1.失之粗糙 以下&#xff0c;就来对 KMP 算法的性能做一分析。我们知道 KMP 算法的计算过程可以根据对齐位置相应的分为若干个阶段&#xff0c;然而每一个阶段所对应的计算量是有很大区别的。很快就会看到&#xff0c;如果只是简单地从最坏的角…

CocosCreator3.8 IOS 构建插屏无法去除的解决方案

CocosCreator3.8 IOS 构建插屏无法去除的解决方案 在实际项目开发过程中&#xff0c;我们通常无需CocosCreator 自带的插屏&#xff0c;一般采用自定义加载页面。 然后在构建IOS 项目时&#xff0c;启用&#xff08;禁用&#xff09;插屏无法操作&#xff0c;如下图所示&#…

运放阻抗和噪声(同相放大器的输入/输出阻抗 + 电压跟随器阻抗 + 噪声 +信噪比)

2024-8-27&#xff0c;星期一&#xff0c;21:03&#xff0c;天气&#xff1a;阴雨&#xff0c;心情&#xff1a;晴。培训终于结束啦&#xff0c;开始轮岗了&#xff0c;看了两天PPT&#xff0c;加油加油&#xff0c;继续学习。 今天继续学习第六章运算放大器&#xff0c;主要学…

第4章 汇编语言和汇编软件

第4章 汇编语言和汇编软件 该章主要介绍了汇编语言和汇编语言编译器的安装和使用。 汇编语言程序 该小节主要介绍了为什么要有汇编语言和汇编语言程序的一些基础写法。 书中有提到CPU有不同的架构&#xff0c;汇编语言有不同的风格&#xff0c;那么不同的CPU架构和不同的汇…

正则表达式——详解

正则表达式是什么&#xff1f; 正则表达式&#xff08;Regular Expression&#xff0c;通常简写为 regex、regexp 或 RE&#xff09;是一种强大的文本处理工具&#xff0c;用于描述一组字符串的模式。它可以用来匹配、查找、替换等操作&#xff0c;几乎所有现代编程语言都支持…

cola_os学习笔记(上)

cola_os的学习笔记 声明 该项目系本人学习项目所做的笔记。该项目的项目地址为cola_os: 300行代码实现多任务管理的OS&#xff0c;在很多MCU开发中&#xff0c;功能很简单&#xff0c;实时性要求不强&#xff0c;如果使用RTOS显得太浪费&#xff0c;任务多了管理不当又很乱&a…