el-form el-table 前端排序+校验+行编辑

news2024/11/18 15:18:05

一、页面 

<template>
  <div class="bg" v-if="formData.mouldData?.length == 0"
  >当前暂无模板,点击
    <view class="add" @click="addMould">立即创建</view>
  </div>
  <div v-else>
    <el-col :xs="24">
      <ContentWrap>
        <el-form class="-mb-15px" :inline="true" label-width="68px">
          <el-form-item label="版本" prop="defKey">
            <el-select v-model="versionType" @change="handleSelectChange" style="width: 120px">
              <el-option
                v-for="version in versionArray"
                :key="version.versionNumber"
                :label="
                  version.state == 1
                    ? 'V' + version.versionNumber + '.0(启用)'
                    : 'V' + version.versionNumber + '.0'
                "
                :value="version.versionNumber"
              />
            </el-select>
          </el-form-item>
<!--          {{versionType}}-->
          <el-form-item>
            <el-button
              type="primary"
              plain
              v-if="showUpgradeMouldButton"
              @click="upgradeMould(versionType)"
            >升级
            </el-button>
          </el-form-item>
        </el-form>
      </ContentWrap>
    </el-col>
    <el-col style="margin-bottom: 1vh" v-if="viewStats == '编辑'">
      <el-button type="primary" plain @click="handleAddClick">新增</el-button>
      <el-button type="primary" plain @click="upRow"> ↑</el-button>
      <el-button type="primary" plain @click="downOrder"> ↓</el-button>
    </el-col>

    <ContentWrap>
      <el-form ref="formRef" :model="formData" :rules="formRules" :inline-message="true">
      <el-table
        :data="formData.mouldData"
        border
        stripe
        highlight-current-row
        :row-class-name="tableRowClassName"
        :cell-style="{ 'text-align': 'center' }"
        @row-click="handleRowClick"
        :header-cell-style="{
          background: '#b7babd',
          color: '#1e1f22',
          height: '35px',
          'text-align': 'center'
        }"
        style="width: 100%;max-height:45vh;overflow-y: auto"
        max-height="600"

      >
        <el-table-column label="序号" label-width="100px" type="index" />
        <el-table-column label="等级名称">
          <template #header>等级名称</template>
          <template #default="scope">
            <el-form-item
              size="small"
              :prop="'mouldData.[' + scope.$index + '].evaluationProject'"
              :rules="formRules.evaluationProject"
              style="margin-top: 15px"
              v-show="scope.row.show"
            >
              <el-input v-model="scope.row.evaluationProject" size="large" @input="handleInput(scope.row)"/>
            </el-form-item>
            <span v-show="!scope.row.show">{{ scope.row.evaluationProject }}</span>
          </template>
        </el-table-column>
        <el-table-column label="操作" width="150px" v-if="viewStats == '编辑'">
          <template #default="scope">
            <el-button
              v-if="scope.row.rowState == 0"
              link
              type="primary"
              @click="handleOpenFormClick(scope.$index, scope.row, '保存')"
            >
              确认
            </el-button>
            <el-button
              v-if="scope.row.rowState == 0"
              link
              type="primary"
              @click="handleOpenFormClick(scope.$index, scope.row, '取消')"
            >
              取消
            </el-button>
            <el-button
              v-if="scope.row.rowState != 0"
              type="primary"
              link
              @click="handleOpenFormClick(scope.$index, scope.row, '编辑')"
            >编辑
            </el-button>
            <el-button
              v-if="scope.row.rowState != 0"
              link
              type="primary"
              @click="handleOpenFormClick(scope.$index, scope.row, '删除')"
            >
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      </el-form>
    </ContentWrap>
  </div>
  <div class="footer" v-if="viewStats == '编辑'">
    <el-button type="primary" @click="handleCancle">取消</el-button>
    <el-button @click="saveData">保存</el-button>
    <el-button @click="saveDataRelease">保存并发布</el-button>
  </div>
</template>

二、js

<script setup lang="ts">
import * as templateAPi from '@/api/.......'
import {reactive, ref} from "vue";

const formData = ref({ mouldData: [] }) // 模板数据
const versionArray = ref([]) // 版本数据
const versionType = ref('') // 选中的版本号
const versionState = ref('') // 选中的版本号的状态
const viewStats = ref('')
const rowIndex = ref(0) // 选中的行
const message = useMessage() // 消息弹窗
const showUpgradeMouldButton = ref(false) // 是否显示升级模板按钮
const isFirst = ref(false) // 是否第一次进入
const formRef = ref()
const init = async () => {
  formData.value.mouldData = []
  versionArray.value = []
  let versionList = await templateAPi.getVersionList()
  versionArray.value = versionList
  let data = await templateAPi.getTemplateList(versionType.value)
  if (data) {
    formData.value.mouldData = data
    isFirst.value = false
    // const state = mouldData.value[0]['state']
    const state = formData.value.mouldData[0]?.state
    switch (state) {
      case '0':
        viewStats.value = '编辑'
        showUpgradeMouldButton.value = false
        break
      case '1':
        viewStats.value = '查看'
        showUpgradeMouldButton.value = true // 可升级
        break
      case '3':
        viewStats.value = '查看'
        showUpgradeMouldButton.value = false
        break
      default:
        viewStats.value = '查看'
        showUpgradeMouldButton.value = false
        break
    }
  }
}


const formRules = reactive({
  evaluationProject: [{ required: true, message: '等级名称不能为空', trigger: ['blur']}],
})


onMounted(async () => {
  versionArray.value = []
  let versionList = await templateAPi.getVersionList()
  versionArray.value = versionList
  versionType.value = versionArray.value[0]['versionNumber']
  await init()
})

const getVersonList = async () => {
  versionArray.value = []
  let versionList = await templateAPi.getVersionList()
  versionArray.value = versionList
  // 过滤出版本号最新的一个
  let maxObject = null
  let maxVersion = -Infinity

  versionList.forEach((obj) => {
    const versionNumber = parseInt(obj.versionNumber)
    if (obj.state == '1' && versionNumber > maxVersion) {
      maxVersion = versionNumber
      maxObject = obj
    }
  })

  versionType.value = maxObject?.versionNumber
  versionState.value = maxObject?.state
}


const handleSelectChange = (value) => {
  console.log('value', value)
  init()
}
const addMould = () => {
  isFirst.value = true
  viewStats.value = '编辑'
  addNewEmptyRow()
}

const upRow = () => {
  formData.value.mouldData.push({
    index: 0,
    // versionNumber: null,
    state: '0', // 0默认1生效3失效
    rowState: 0, // 0时显示确认、取消,1时显示编辑、删除
    show: true, // true为编辑状态,false为表格行状态
    versionNumber: versionType.value
  })
}
//降序
const downOrder = () => {
  console.log('row', rowIndex.value)
  if (rowIndex.value == formData.value.mouldData.length - 1) {
    message.warning('已经是最后一条了')
    return
  }
  let data = formData.value.mouldData
  let temp = formData.value.mouldData[rowIndex.value]
  data[rowIndex.value] = data[rowIndex.value + 1]
  data[rowIndex.value + 1] = temp
  rowIndex.value = rowIndex.value + 1
  formData.value.mouldData = data
}
//升序
const handleAscendingOrder = () => {
  if (rowIndex.value === 0) {
    message.warning('已经是第一条了')
    return
  }
  console.log('row', rowIndex.value)
  let data = formData.value.mouldData
  let temp = formData.value.mouldData[rowIndex.value]
  data[rowIndex.value] = data[rowIndex.value - 1]
  data[rowIndex.value - 1] = temp
  rowIndex.value = rowIndex.value - 1
  formData.value.mouldData = data
}
const tableRowClassName = ({ row, rowIndex }) => {
  row.index = rowIndex
}
const handleAddClick = () => {
  console.log('row', rowIndex.value)
  addNewEmptyRow()
}
const handleCancle = () => {
  viewStats.value = '查看'
  init()
}
const handleRowClick = (row) => {
  console.log('handleRowClick', row)
  rowIndex.value = row.index
}

const handleInput = (row) => {
  row.evaluationProject = row.evaluationProject.replace(/\s+/g, '');
}


const handleOpenFormClick = async (index, row, type) => {
  switch (type) {
    case '保存':
      const valid = await formRef.value?.validate()
      if (valid) {
        row.show = false // 点击确定后,该行变为不可编辑状态
        row.rowState = 1 // 操作列变为编辑、删除
      }
      break
    // 取消时,已保存过的数据恢复原样,未保存的数据直接清空
    case '取消':
      // 假设存在数据库里的数据有的唯一标识id,若该行无id,则表示数据库未曾保存过,点击取消前端直接删除该数据
      row.show = false
      row.rowState = 1
      break
    case '编辑':
      console.log('当前是编辑操作', row)
      row.show = true
      row.rowState = 0
      break
    case '删除':
      handleDelete(row.id, index)
      break
  }
}
const handleDelete = async (id,index) => {
  if (!id) {
    // 检查是否是最后一条数据
    if (formData.value.mouldData.length > 1){
      formData.value.mouldData.splice(index, 1); // 删除指定索引的数据
    } else {
      message.warning('不能删除最后一条数据');
    }
  }else {
    if (formData.value.mouldData.length > 1) {
      await crmCustomerSatisfactionTemplateAPi.deleteSatisfactionTemplate(id)
      message.success('删除成功')
      await init()
    }else {
      message.warning('不能删除最后一条数据');
    }
  }
}

const saveFirst = async () => {
  let sendData =
    formData.value.mouldData as unknown as crmCustomerSatisfactionTemplateAPi.CrmCustomerSatisfactionTemplateVO
  await crmCustomerSatisfactionTemplateAPi.addTemplateList(sendData)
  console.log('sendData', sendData)
  message.success('保存成功')
  versionArray.value = []
  let versionList = await crmCustomerSatisfactionTemplateAPi.getVersionList()
  versionArray.value = versionList
  versionType.value = versionArray.value[0]['versionNumber']
  await init()

}
const saveData = async () => {
  const valid = await formRef.value.validate()
  if (valid) {
    if (isFirst.value) {
      await saveFirst()
    } else {
      let sendData =
        formData.value.mouldData as unknown as                     
      templateAPi.CrmCustomerSatisfactionTemplateVO
      let resposeData = await templateAPi.saveTemplateList(sendData)
      versionType.value = resposeData[0]['versionNumber']
      console.log('sendData', sendData)
      message.success('保存成功')
      // await getVersonList()
      await init()
    }
  }
}

const saveDataRelease = async () => {
  const valid = await formRef.value.validate()
  if (!valid) return

  await message.delConfirm('发布后不允许修改,但可以升级!')
  for (let i = 0; i <  formData.value.mouldData.length; i++) {
    // 更改为1生效
    formData.value.mouldData[i]['state'] = '1'
  }
  if (isFirst.value) {
    await saveFirst()
  } else {
    let sendData =
      formData.value.mouldData as unknown as             
    templateAPi.CrmCustomerSatisfactionTemplateVO
    await templateAPi.saveTemplateList(sendData)
    message.success('保存成功')
    await getVersonList()
    await init()
  }
}
const upgradeMould = async () => {
  /* // todo 获取最大版本的数据 状态为0 不允许升级
   let data = await templateAPi.getNewVersion('')
   if (data[0]['state'] == '0') {
     message.warning('最新版本尚未发布 请发布!')
     return
   }*/
  // await templateAPi.upgrade()
  // message.success('升级成功')
  // versionType.value = ''
  //await init()
  viewStats.value = '编辑'
  for (let i = 0; i <  formData.value.mouldData.length; i++) {
    formData.value.mouldData[i]['upgrade'] = '是'
    formData.value.mouldData[i]['id'] = ''
    formData.value.mouldData[i]['state'] = '0'
  }
}
</script>

三、CSS

<style scoped>
.bg {
  display: flex;
  justify-content: center;
  margin-top: 30%;
}

.add {
  color: #2d8cf0;
}

.top {
  display: flex;
  align-items: center;
  justify-content: space-around;
  width: 270px;
  margin-bottom: 10px;
}
.error {
  color: red;
}
</style>

 四、页面效果

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

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

相关文章

解决Docker环境变量的配置的通用方法

我们部署的很多服务都是以Docker容器的形式存在的。 在运行Docker容器前&#xff0c;除了设置网络、数据卷之外&#xff0c;还需要设置各种各样的环境变量。 有时候&#xff0c;由于容器版本的问题&#xff0c;一些文档没有及时更新&#xff0c;可能同时存在多个新旧版本的环…

使用win32com将ppt(x)文件转换为pdf文件

本文来记录下如何使用win32com将ppt(x)文件转换为pdf文件 文章目录 win32com概述win32com优缺点代码实例本文小结 win32com概述 Pywin32 是一个用于与 Microsoft Windows 操作系统交互的 Python 扩展模块&#xff0c;它提供了对多个 Windows API 的访问&#xff0c;包括对 Mic…

【nginx】client timed out和send_timeout的大小设置

websocket连接会断开&#xff0c;抓包检查后发现是中间的代理服务器nginx断开的&#xff0c;同时将后端和浏览器都断开了。将nginx日志调到debug级别后&#xff0c;有下面的断开信息。 [info] 125923#125923: *34 client timed out (110: Connection timed out) while proxyin…

代码段数据段的划分

DPL DPL存储在段描述符中&#xff0c;规定访问该段的权限级别(Descriptor Privilege Level) CPL CPL是当前进程的权限级别(Current Privilege Level)&#xff0c;是当前正在指向的代码段所在段的成绩&#xff0c;也就是CS段的DPL RPL RPL说明的是进程对段访问的请求权限(Re…

游戏引擎学习第14天

视频参考:https://www.bilibili.com/video/BV1iNUeYEEj4/ 1. 为什么关注内存管理&#xff1f; 内存分配是潜在的失败点&#xff1a; 每次进行内存分配&#xff08;malloc、new等&#xff09;时&#xff0c;都可能失败&#xff08;例如内存不足&#xff09;。这种失败会引入不稳…

基于Java Springboot电商个性化推荐系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果&#xff1a; 实现原理&#xff1a; 移动到图片上的时候&#xff0c;给img加一个伪类 &#xff01;&#xff01;此时就要地方要注意了&#xff0c;因为img标签是闭合的标签&#xff0c;无法直接添加 伪类&#xff08;::after&#xff09;&#xff0c;所以 我是在img外…

基于Java Springboot拍卖行系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

HTML5+CSS前端开发【保姆级教学】+前端介绍和软件安装

学习了基础编程刚刚开始学习计算机的程序员&#xff0c;你是否会这样的想法:前端和后端是什么呢&#xff1f;如果你是刚上大学的大一大二基础小白&#xff0c;但是身边的卷王同学已经超前知道之后要从事前后端开发了&#xff0c;并且在学习各种框架的课程&#xff0c;Aahhahah,…

Android Framework层介绍

文章目录 前言一、Android Framework 层概述二、主要组件1. 应用程序接口&#xff08;API&#xff09;2. 系统服务3. Binder4. 资源管理5. Content Provider6. 广播接收器&#xff08;BroadcastReceiver&#xff09;7. 服务&#xff08;Service&#xff09; 三、与 Linux Kerne…

【C++滑动窗口】1248. 统计「优美子数组」|1623

本文涉及的基础知识点 C算法&#xff1a;滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字&#xff0c;我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…

【paper】分布式无人水下航行器围捕智能目标

An Effective Strategy for Distributed Unmanned Underwater Vehicles to Encircle and Capture Intelligent Targets2022.8IEEE TRANSACTIONS ON INDUSTRIAL ELECTRONICS【Q1 7.5】Mingzhi Chen 上海理工大学 Q1 Background&#xff1a;本文试图解决一个什么样的问题&#xf…

【更新中】《硬件架构的艺术》笔记(三):处理多个时钟

介绍 单时钟设计更易于实现&#xff0c;也更少出现亚稳态、建立和保持时间违例方面的问题。但在实践中&#xff0c;很少有设计只在一个时钟下运行。 多时钟域 多个始终可以有以下一种或多种时钟关系&#xff1a; 1、时钟频率不同。 2、时钟频率相同&#xff0c;但相位不同…

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…

从客户需求视角去认识ZLG | 边缘计算网关多种应用

在工业领域&#xff0c;串行总线与EtherNET总线广泛应用&#xff0c;物联网的兴起带来众多智能应用。尽管应用多样&#xff0c;但底层技术逻辑却殊途同归&#xff0c;本文将介绍ZLG致远电子串行总线和EtherNET总线之间的联动应用。 本文将从系统集成需求出发&#xff0c;以ZLG致…

Koa进阶:掌握中间件和参数校验的艺术

目录 一、首先下载依赖 二、在index.js中引入koa-parameter&#xff0c;一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同&#xff0c;返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…

Linux下使用miniconda构建python运行环境

文章目录 miniconda安装构建python运行环境 miniconda安装 miniconda在linux环境下载安装&#xff1a; # Linux环境下使用wget命令下载选定的miniconda # 这里使用的是清华镜像&#xff0c;这个命令每次下载的是最新版本的miniconda wget -c https://mirrors.tuna.tsinghua.e…

解决failed to execute PosixPath(‘dot‘) 或者GraphViz‘s executables not found

在网上找了很多方法都没解决&#xff0c;所以写一篇文章帮助和我遇到同样问题的人 解决方法&#xff1a; 因为python解释器会解释转移字符&#xff0c;因此在环境变量中把\bin换成\\bin即可 解决过程&#xff1a; 系统&#xff1a;win10 已安装pip install graphviz&#xff0…

Deep-Live-Cam -面部交换、视频深度伪造

文章目录 一、关于 Deep-Live-Cam免责声明 二、安装&#xff08;Windows/Nvidia&#xff09;安装&#xff08;手动&#xff09;基本安装&#xff08;CPU&#xff09; GPU加速&#xff08;可选&#xff09;CUDA执行提供商&#xff08;Nvidia&#xff09;CoreML执行提供商&#x…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…