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

一、页面 

<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>

 四、页面效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

基于Java Springboot旅游信息推荐系统

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

基础网络安全知识

1.ctfhub技能树 1.1 Web-SQL注入 Web-SQL注入-整数型 && 字符型 && MySQL结构 参考&#xff1a;5.9.6MySql注入 Web-SQL注入-报错注入 step1: 查库名 ?id1 and extractvalue(1,concat(0x7e,database(),0x7e))-- step2: 查看表名 ?id1 and extractvalue(1…

01-Ajax入门与axios使用、URL知识

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

iStore OS 插件的手动安装与特殊卸载

有些插件在iStore 中并没有展示,因此需要手动安装,手动安装无法通过前端彻底卸载,本文提供方法和流程。 1.插件手动安装 1.1地址 github 项目地址根据自己需求选择。本人以x86_64 为主。 https://github.com/AUK9527/Are-u-ok/tree/main/x86 点击后下载得到run安装包 1…

neo4j desktop基本入门

下载安装不在赘述&#xff0c;本文只记述一些neo4j的基本入门操作 连接本地neo4j数据库 1. 点击ADD添加连接 端口一般是7687 账户名和密码忘记了&#xff0c;可以通过neo4j web&#xff08;默认为neo4jneo4j://localhost:7687/neo4j - Neo4j Browser&#xff09;重置密码 AL…

ElasticSearch的Python Client测试

一、Python环境准备 1、下载Python安装包并安装 https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe 2、安装 SDK 参考ES官方文档: https://www.elastic.co/guide/en/elasticsearch/client/index.html python -m pip install elasticsearch一、Client 代…

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习&#xff0c;本科时已经学习过了&#xff0c;但是感觉还是有些概念和算法没有学懂学透&#xff0c;所以想重新系统性的学习一下&#xff0c;记录了整个学习过程&#xff0c;而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…

redis 原理篇 26 网络模型 Redis是单线程的吗?为什么使用单线程

都是学cs的&#xff0c;有人月薪几万&#xff0c;有人月薪几千&#xff0c;哎&#xff0c; 相信 边际效用&#xff0c; 也就是说&#xff0c; 随着技术提升的越来越多&#xff0c;薪资的提升比例会更大 一个月几万&#xff0c;那肯定是高级开发了&#xff0c; 一个月几千&…

UE4 Cook 从UAT传递参数给UE4Editor

需求 一句Cook的命令如下&#xff1a; ${EnginePath}/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -project${ClientPath}/${ProjectName}.uproject -noP4 -platformIOS -cooksinglepackage -client -clientconfig${CookConfig} -iterate -skipbuild -nocompile -NoMutex…

jmeter基础05_第1个http请求

本节课使用网站“httpbin.org”进行基础的http请求全流程。 请求获取httpbin.org的首页&#xff1a; 请求方法&#xff1a;GET URL&#xff1a;http://httpbin.org 参数&#xff1a;无 1、操作步骤 ① 打开jmeter&#xff1a;命令行窗口输入“jmeter”并回车。 ② 添加线程组…

【Ubuntu24.04】从双系统到虚拟机再到单系统的故事

故事 在大学前期&#xff0c;我使用Ubuntu系统都是为了学习一些命令或者其它Linux的东西&#xff0c;对性能的要求不高&#xff0c;所以选择了虚拟机&#xff0c;后来为了做毕设&#xff0c;选择安装了Ubuntu20.04双系统&#xff0c;因为虚拟机实在带不动&#xff0c;那时我的主…

力扣 LeetCode 18. 四数之和(Day3:哈希表)

解题思路&#xff1a; 需要先弄懂三数之和&#xff0c;思路类似 三数之和&#xff1a;指针 i &#xff0c;left &#xff0c;right 四数之和&#xff1a;指针 k &#xff0c;i &#xff0c;left &#xff0c;right&#xff08;相当于多了一个 k &#xff0c;多了一个外层 fo…

30 秒!用通义灵码画 SpaceX 星链发射流程图

不想读前人“骨灰级”代码&#xff0c; 不想当“牛马”程序员&#xff0c; 想像看图片一样快速读复杂代码和架构&#xff1f; 来了&#xff0c;灵码又加新 buff&#xff01;&#xff01; 通义灵码支持代码逻辑可视化&#xff0c; 可以把你的每段代码画成流程图。 你可以把…

sql注入之二次注入(sqlilabs-less24)

二阶注入&#xff08;Second-Order Injection&#xff09;是一种特殊的 SQL 注入攻击&#xff0c;通常发生在用户输入的数据首先被存储在数据库中&#xff0c;然后在后续的操作中被使用时&#xff0c;触发了注入漏洞。与传统的 SQL 注入&#xff08;直接注入&#xff09;不同&a…

Warped Universe游戏即将在Sui上推出,为玩家提供多样化的游戏体验

Warped Games选择Sui作为其即将推出的创新多类型游戏Warped Universe的首选Web3技术。Warped Universe让玩家可以体验第三视角实时动作、回合制策略和基地建设等玩法。该游戏使用Unreal Engine 5开发&#xff0c;将借助Sui的技术使玩家能够拥有、交易和变现其游戏内资产。 War…

显示微服务间feign调用的日志

第一步 package com.niuniu.common.config;import com.niuniu.common.CommonConstant; import com.niuniu.common.utils.UserContext; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.…

nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。

在项目中会碰见需要在nginx代理多个项目&#xff0c;如果在加上uniapp开发的H5端的项目&#xff0c;你还要在nginx中区分PC端和手机H5端&#xff0c;这就会让人很头大&#xff01;网上大部分的资料都是采用在nginx的conf配置文件中添加区分pc和手机端的变量例如&#xff1a;set…

redis 原理篇 31 redis内存回收 内存淘汰策略

哦哦&#xff0c; 内存满了咋搞 就算过期key 删除&#xff0c;还是不够用&#xff0c; 这种问题没办法&#xff0c;只能了解一下啥解决方案了&#xff0c; 内存是有限的&#xff0c;一直存&#xff0c;肯定会满&#xff0c;这时&#xff0c;咋处理&#xff1f; 首先&#xff…

C++《继承》

在之前学习学习C类和对象时我们就初步了解到了C当中有三大特性&#xff0c;分别是封装、继承、多态&#xff0c;通过之前的学习我们已经了解了C的封装特性&#xff0c;那么接下来我们将继续学习另外的两大特性&#xff0c;在此将分为两个章节来分别讲解继承和多态。本篇就先来学…