点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定

  • 点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成
    已锁定
  • 点击解锁按钮,解锁按钮要变成锁定按钮,然后状态要从已锁定变成
    待绑定
{
    "code": 0,
    "msg": "状态更新成功",
    "data": {
        "status": 3
    }
}

1、状态列的 el-table-column

<el-table-column
  prop="status"
  label="状态"
  header-align="center"
  align="center"
>
  <template slot-scope="scope">
      <el-tag
      :type="getStatusType(scope.row.status)"
       size="mini"
      >
        {{ getStatusText(scope.row.status) }}
      </el-tag>
 </template>
 </el-table-column>

2、操作列的 el-table-column

<el-table-column
  label="操作"
  header-align="center"
  align="center"
>
  <template slot-scope="scope">
    <div class="operation-cell">
      <el-button
        type="text"
        size="mini"
        class="operation-btn"
        @click="handleLock(scope.row)"
      >
        {{ scope.row.isLocked === 0 ? '锁定' : '解锁' }}
      </el-button>
      <el-button
        type="text"
        size="mini"
        class="operation-btn"
        @click="handleRemark(scope.row)"
      >
        备注
      </el-button>
      <el-button
        type="text"
        size="mini"
        class="operation-btn"
        @click="handleLog(scope.row)"
      >
        日志
      </el-button>
    </div>
  </template>
</el-table-column>

3、invite-code-status.ts

// invite-code-status.ts
export class InviteCodeStatus {
    static readonly EFFECTIVE = { value: 0, name: "effective" };
    static readonly EXPIRED = { value: 1, name: "expired" };
    static readonly BOUND = { value: 2, name: "bound" };
    static readonly LOCKED = { value: 3, name: "locked" };

    static fromValue(value: number): { value: number, name: string } {
        switch (value) {
            case 0:
                return InviteCodeStatus.EFFECTIVE;
            case 1:
                return InviteCodeStatus.EXPIRED;
            case 2:
                return InviteCodeStatus.BOUND;
            case 3:
                return InviteCodeStatus.LOCKED;
            default:
                throw new Error(`No enum constant with value ${value}`);
        }
    }
      static fromName(name: string): { value: number, name: string } {
        switch (name) {
            case "effective":
                return InviteCodeStatus.EFFECTIVE;
            case "expired":
                return InviteCodeStatus.EXPIRED;
            case "bound":
                return InviteCodeStatus.BOUND;
             case "locked":
                return InviteCodeStatus.LOCKED;
            default:
                throw new Error(`No enum constant with value ${name}`);
        }
    }
}

4、updateInviteCodeStatus

import request from '@/utils/request';

// 更新邀请码状态接口
export const updateInviteCodeStatus = (data: {
  inviteCodeId: number;
  statusName: string;
}) =>
  request({
      url: '/api/invite-codes/updateStatus',
      method: 'put',
      params: data,
  });

3、handleLock

  private async handleLock(row: any) {
    const newIsLocked = row.isLocked === 0 ? 1 : 0;
    const newStatus = newIsLocked === 0
        ? InviteCodeStatus.EFFECTIVE.name
        : InviteCodeStatus.LOCKED.name;

    this.$confirm(
        `确定要${row.isLocked === 0 ? '锁定' : '解锁'}该邀请码吗?`,
        '提示',
        {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
        }
    )
    .then(async () => {
        try {
            console.log('请求参数:', {
                inviteCodeId: row.id,
                statusName: newStatus
            });

            // 调用后端的更新状态接口
            const response = await updateInviteCodeStatus({
                inviteCodeId: row.id,
                statusName: newStatus
            });

            console.log('response.data:', response.data);
            console.log('typeof response.data', typeof response.data);

            if (response &&  response.data && typeof response.data === 'object' && 'status' in response.data) {
                const status = response.data.status;

                // 调试步骤 1:打印状态值
                console.log('状态值:', status);

                // 调试步骤 2:检查状态映射
                let statusObj;
                try {
                    statusObj = InviteCodeStatus.fromValue(status);
                    console.log('映射后的状态:', statusObj);
                } catch (e) {
                    console.error('状态映射错误:', e);
                    this.$message.error('状态映射错误,请联系管理员');
                    return;
                }

                // 更新本地数据
                const index = this.tableData.findIndex(item => item.id === row.id);
                if (index !== -1) {
                    this.$set(this.tableData, index, {
                        ...this.tableData[index],
                        isLocked: newIsLocked,
                        status: status // 使用后端返回的 status 值
                    });
                    console.log('更新后的行数据:', this.tableData[index]);
                }

                this.$message.success(`${newIsLocked === 0 ? '解锁' : '锁定'}成功`);

                // 选择性地重新拉取数据,根据实际需求
                // await this.fetchInviteCodeList();
            } else {
                this.$message.error(' ');
            }
        } catch (error) {
            console.error('更新邀请码状态失败:', error);
            console.error('错误详情:', error.response || error.message);
            this.$message.error('更新邀请码状态失败:未知错误');
        }
    })
    .catch(() => { });
}

3、invite-code-list.vue

<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator'
import { ElMessageBox } from 'element-ui/types/message-box'
import InviteCodeAdd from './invite-code-add.vue'
import { AppModule } from '@/store/modules/app'
import { getInviteCodeList } from '@/api/invite-code'
import { getInviteCodeListByInvitor , updateInviteCodeStatus} from '@/api/invite-code'
import { UserModule } from '@/store/modules/user'
import { InviteCodeStatus } from '@/utils/productAuthentication/InviteCodeStatus'

type MessageBoxData = {
  value: string
  action: 'confirm' | 'cancel'
}

@Component({
  name: 'InviteCodeForm',
  components: {
    InviteCodeAdd
  }
})
export default class extends Vue {
  get tableHeight() {
    return Math.floor(AppModule.tableHeight * 2 / 3)
  }

  @Prop({ default: false })
  private visible!: boolean

  private tableData = []
  private currentPage = 1
  private pageSize = 100
  private total = 0

  private addVisible = false

  // private getStatusType(status: string) {
  //   const map: { [key: string]: string } = {
  //     effective: 'primary',
  //     expired: 'info',
  //     locked: 'danger',
  //     bound: 'success'
  //   }
  //   return map[status] || 'info'
  // }
    // 获取状态文字
  private getStatusText(status: number): string {
      try {
          const inviteCodeStatus = InviteCodeStatus.fromValue(status);
          const map: { [key: string]: string } = {
              effective: '待绑定',
              expired: '已失效',
              locked: '已锁定',
              bound: '已绑定'
          };
          return map[inviteCodeStatus.name] || inviteCodeStatus.name
      } catch (e) {
          console.error(`状态值${status}不存在`)
          return String(status)
      }

  }

  // private getStatusText(status: string) {
  //   const map: { [key: string]: string } = {
  //     effective: '待绑定',
  //     expired: '已失效',
  //     locked: '已锁定',
  //     bound: '已绑定'
  //   }
  //   return map[status] || status
  // }

    // 获取状态类型
  private getStatusType(status: number): string {
       try {
           const inviteCodeStatus = InviteCodeStatus.fromValue(status);
           const map: { [key: string]: string } = {
               effective: 'primary',
               expired: 'info',
               locked: 'danger',
               bound: 'success'
           };
           return map[inviteCodeStatus.name] || 'info'
       } catch (e) {
           console.error(`状态值${status}不存在`)
           return 'info';
       }
  }

  private formatDate(dateString: string): { date: string; time: string } {
    if (!dateString) {
      return { date: '', time: '' }
    }
    const date = new Date(dateString)
    const year = date.getFullYear()
    const month = String(date.getMonth() + 1).padStart(2, '0')
    const day = String(date.getDate()).padStart(2, '0')
    const hours = String(date.getHours()).padStart(2, '0')
    const minutes = String(date.getMinutes()).padStart(2, '0')
    const seconds = String(date.getSeconds()).padStart(2, '0')
    return {
      date: `${year}-${month}-${day}`,
      time: `${hours}:${minutes}:${seconds}`
    }
  }
  private handleClose() {
    this.$emit('update:visible', false)
  }

  private handleAdd() {
    this.addVisible = true
  }

  private async handleAddSuccess() {
    // TODO: 刷新列表数据
    this.addVisible = false
    await this.fetchInviteCodeList()
  }
  private async handleLock(row: any) {
    const newIsLocked = row.isLocked === 0 ? 1 : 0;
    const newStatus = newIsLocked === 0
        ? InviteCodeStatus.EFFECTIVE.name
        : InviteCodeStatus.LOCKED.name;

    this.$confirm(
        `确定要${row.isLocked === 0 ? '锁定' : '解锁'}该邀请码吗?`,
        '提示',
        {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
        }
    )
    .then(async () => {
        try {
            console.log('请求参数:', {
                inviteCodeId: row.id,
                statusName: newStatus
            });

            // 调用后端的更新状态接口
            const response = await updateInviteCodeStatus({
                inviteCodeId: row.id,
                statusName: newStatus
            });

            console.log('response.data:', response.data);
            console.log('typeof response.data', typeof response.data);

            if (response &&  response.data && typeof response.data === 'object' && 'status' in response.data) {
                const status = response.data.status;

                // 调试步骤 1:打印状态值
                console.log('状态值:', status);

                // 调试步骤 2:检查状态映射
                let statusObj;
                try {
                    statusObj = InviteCodeStatus.fromValue(status);
                    console.log('映射后的状态:', statusObj);
                } catch (e) {
                    console.error('状态映射错误:', e);
                    this.$message.error('状态映射错误,请联系管理员');
                    return;
                }

                // 更新本地数据
                const index = this.tableData.findIndex(item => item.id === row.id);
                if (index !== -1) {
                    this.$set(this.tableData, index, {
                        ...this.tableData[index],
                        isLocked: newIsLocked,
                        status: status // 使用后端返回的 status 值
                    });
                    console.log('更新后的行数据:', this.tableData[index]);
                }

                this.$message.success(`${newIsLocked === 0 ? '解锁' : '锁定'}成功`);

                // 选择性地重新拉取数据,根据实际需求
                // await this.fetchInviteCodeList();
            } else {
                this.$message.error(' ');
            }
        } catch (error) {
            console.error('更新邀请码状态失败:', error);
            console.error('错误详情:', error.response || error.message);
            this.$message.error('更新邀请码状态失败:未知错误');
        }
    })
    .catch(() => { });
}

  private handleRemark(row: any) {
    this.$prompt('请输入备注', '备注', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      inputValue: row.remark,
      inputValidator: (value: string) => {
        return value.length <= 60
      },
      inputErrorMessage: '备注不能超过60个字符'
    })
      .then(async(data: MessageBoxData) => {
        // TODO: 调用保存备注API
        row.remark = data.value
        this.$message.success('备注保存成功')
      })
      .catch(() => { })
  }

  private handleLog(row: any) {
    // TODO: 显示日志记录
    // 可以打开一个新的对话框显示操作日志列表
  }

  private handleCurrentChange(page: number) {
    this.currentPage = page
    // TODO: Add your fetch data logic here
  }

  async mounted() {
    await this.fetchInviteCodeList()
  }

  // private async fetchInviteCodeList() {
  //   try {
  //     const response = await getInviteCodeList({
  //       page: this.currentPage,
  //       pageSize: this.pageSize
  //     })
  //     console.log(response)
  //     if (response && response.data && response.data.list) {
  //       this.tableData = response.data.list
  //       this.total = response.data.total
  //     } else {
  //       this.$message.error('获取邀请码列表失败: 返回数据结构不符合预期')
  //       console.error('getInviteCodeList response data error', response)
  //     }

  //   } catch (error) {
  //     console.error('获取邀请码列表时发生错误', error)
  //     this.$message.error('获取邀请码列表时发生错误')
  //   }
  // }

  private async fetchInviteCodeList() {
    try {
      const response = await getInviteCodeListByInvitor({
        invitorId: UserModule.id,
        page: this.currentPage,
        pageSize: this.pageSize
      })
      console.log(response)
      if (response && response.data && response.data.list) {
        this.tableData = response.data.list
        this.total = response.data.total
      } else {
        this.$message.error('获取邀请码列表失败: 返回数据结构不符合预期')
        console.error('getInviteCodeList response data error', response)
      }

    } catch (error) {
      console.error('获取邀请码列表时发生错误', error)
      this.$message.error('获取邀请码列表时发生错误')
    }
  }

  private copyInviteCode(inviteCode: string) {
    const input = document.createElement('input')
    input.value = inviteCode
    document.body.appendChild(input)
    input.select()
    document.execCommand('copy')
    document.body.removeChild(input)
    this.$message.success('邀请码已复制到剪贴板')
  }
}
</script>

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

LabVIEW化工实验室设备故障实时监测

化工实验室中&#xff0c;各类设备的运行状态直接影响实验的精度与安全性。特别是重要分析仪器的突发故障&#xff0c;可能导致实验中断或数据失效。为了实现设备运行状态的实时监控与故障快速响应&#xff0c;本文提出了一套基于LabVIEW的解决方案&#xff0c;通过多参数采集、…

常见的CMS漏洞

WordPress 搭建网站 一.上传文件模板 1.从网上随便下载一个模板 2.把我们的模板托出来并改名 写好我们的木马命名为eval;然后进行压缩 3.上传我们的木马模板 上传压缩包即可;网站会帮我们解压 上传成功 找到我们的模板准备连接他 这套网站是开源的;想知道页面模板的路径在哪…

FloatingActionBar组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了如何使用BottomNavigationBar切换页面,本章回中将介绍浮动按钮:FloatingActionBar。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 浮动按钮就是悬浮在屏幕上的按钮,通常们于屏幕右下角或者底部中央位置,…

计算机网络习题( 第3章 物理层 第4章 数据链路层 )

第3章 物理层 一、单选题 1、下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; &#xff09;。 A、 接口形状 B、 引脚功能 C、 传输媒体 D、 信号电平 正确答案&#xff1a; C 2、在物理层接口特性中&#xff0c;用于描述完成每种功能的事件发…

SemiDrive E3 MCAL 开发系列(6)– Icu 模块的使用

一、 概述 本文将会介绍 SemiDrive E3 MCAL Icu 模块的简介以及基本配置&#xff0c;其中还会涉及到 Xtrg 模块的配置。此外会结合实际操作的介绍&#xff0c;帮助新手快速了解并掌握这个模块的使用&#xff0c;文中的 MCAL 是基于 PTG3.0 的版本&#xff0c;开发板是官方的 …

智慧地下采矿:可视化引领未来矿业管理

图扑智慧地下采矿可视化平台通过整合多源数据&#xff0c;提供实时 3D 矿井地图及分析&#xff0c;提升了矿产开采的安全性与效率&#xff0c;为矿业管理提供数据驱动的智能决策支持&#xff0c;推动行业数字化转型。

MySQL 服务器简介

通常所说的 MySQL 服务器指的是mysqld程序&#xff0c;当运⾏mysqld后对外提供MySQL 服务&#xff0c;这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容&#xff0c;包括&#xff1a; 服务器⽀持的启动选项。可以在命令⾏和配置⽂件中指定这些选项。 服务器系统变…

echarts没有map地图解决方案

在echarts4.9以后的版本中移除了map地图 使用命令npm install echarts --save它会下载最新版本 的echarts 所有我们要下载回echarts4.9版本中 如果已经下载了最新的可以卸载 // 卸载echarts运行&#xff1a; npm uninstall echarts然后再去下载4.9版本 // 安装4.9版本的ech…

Java高频面试之SE-06

hello啊&#xff0c;各位老6&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; 访问修饰符 public、private、protected的区别是什么&#xff1f; 在Java中&#xff0c;访问修饰符用于控制类、方法和变量的访问权限。主要的访…

pymysql中的问题

首先像代码所示&#xff1a; 正确输出了mysql版本&#xff0c;但是&#xff0c;在pycharm链接mysql成功后创建表时又出现报错内容&#xff1a; Traceback (most recent call last): File "D:\PycharmProjects\PythonProject0\pymysqllearning.py", line 13, in &…

VuePress搭建个人博客

VuePress搭建个人博客 官网地址: https://v2.vuepress.vuejs.org/zh/ 相关链接: https://theme-hope.vuejs.press/zh/get-started/ 快速上手 pnpm create vuepress vuepress-starter# 选择简体中文、pnpm等, 具体如下 .../19347d7670a-1fd8 | 69 .../19…

【DC简介--Part1】

DC简介-Part1 1 overview1.1 DC操作步骤1.2 Steps1.2.1 Develop HDL files1.2.2 Specify libraries1.2.3 Read design1.2.4 Define design environment1.2.5 Set design constraints1.2.6 Select compile strategy1.2.7 Synthesize and optimize the design1.2.8 Analyze and r…

【Unity3D】ECS入门学习(十二)IJob、IJobFor、IJobParallelFor

IJob&#xff1a;开启单个线程进行计算&#xff0c;线程内不允许对同一个数据进行操作&#xff0c;也就是如果你想用多个IJob分别计算&#xff0c;将其结果存储到同一个NativeArray<int>数组是不允许的&#xff0c;所以不要这样做&#xff0c;如下例子就是反面教材&#…

HCIA-Access V2.5_7_1_XG(S)原理_系统概述

近年来&#xff0c;随着全球范围内接入市场的飞快发展以及全业务运营的快速开展&#xff0c;已有的PON技术标准在带宽需求&#xff0c;业务支撑能力以及接入节点设备和配套设备的性能提升等方面都面临新的升级需求&#xff0c;而GPON已经向10G GPON演示&#xff0c;本章将介绍1…

imgproxy图像处理的高效与安全

摘要 imgproxy作为一个高效且安全的独立服务器,为图像处理提供了全新的解决方案。它不仅简化了图像调整和转换的过程,还极大地提升了处理速度,确保了整个流程的安全性。通过集成imgproxy,用户可以轻松优化网页上的图像,提高加载速度,改善用户体验。本文将深入探讨imgpro…

CPT203 Software Engineering 软件工程 Pt.4 软件设计(中英双语)

文章目录 6. 设计概念6.1 Principle6.2 Concepts6.2.1 General design concepts&#xff08;常见的设计概念&#xff09;6.2.1.1 Abstraction&#xff08;抽象&#xff09;6.2.1.2 Modularity&#xff08;模块化&#xff09;6.2.1.3 Functional independence&#xff08;功能独…

MultiDiff 论文解读

一、CameraCtrl AnimateDiff->MotionCtrl->CameraCtrl CameraCtrl将多帧图像的Plucker射线输入到Camera Encoder&#xff0c;Plucker射线可以表示每个像素对应的光线方向。 Camera Encoder包括ResNet block和Temporal Attention&#xff0c;来提取每一帧相机位姿的时序…

OpenCV-Python实战(4)——图像处理基础知识

一、坐标 在 OpenCV 中图像左上角坐标为&#xff08;0&#xff0c;0&#xff09;&#xff0c;竖直向下为 Y&#xff08;height&#xff09; &#xff1b;水平向右为 X&#xff08;width&#xff09;。 二、生成图像 2.1 灰度图像 img np.zeros((h,w), dtype np.uint8) i…

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源&#xff0c;请执行以下操作&#xff1a; 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录&#xff08;例如&#xff0c;深色 UI 主题或本地化字符串的不同图像&#xff09;。 依赖项和目录设置 要访问多平台项目中的资源…