一个公用的数据状态修改组件

news2024/11/17 5:40:26

灵感来自于一项重复的工作,下图中,这类禁用启用、审核通过不通过、设计成是什么状态否什么状态的场景很多。每一个都需要单独提供接口。重复工作还蛮大的。于是,基于该组件类捕获组件跳转写了这款通用接口。省时省力。
在这里插入图片描述
代码如下:

/*
 * 文件名称: 类UnifyBatchUpdateEndpoint
 * 文件描述:
 * 创建人: simple_zeng
 * 创建时间: 2024/6/8
 */
@RestController
public class UnifyBatchUpdateEndpoint implements InterestedClassAware {

    @Autowired
    private SqlScriptExecutor sqlScriptExecutor;

    // 实体类名对应tableId
    private static Map<String, UnifyBatch> BUCKET = new HashMap<>();

    @RequestMapping("/unify/status")
    public JsonResult unifyBatchUpdate(@RequestBody UnifyBatchUpdate unifyBatchUpdate) {
        List<String> ids = unifyBatchUpdate.getIds();
        if (ZYListUtils.isEmptyList(ids)) {
            throw new LocalException("请至少选择一条数据");
        }
        Integer status = unifyBatchUpdate.getStatus();
        if (null == status) {
            throw new LocalException("请选择数据状态");
        }

        String entityName = unifyBatchUpdate.getEntityName();
        if (null == entityName) {
            throw new LocalException("请选择目标对象");
        }

        String prop = unifyBatchUpdate.getProp();
        if (null == prop) {
            throw new LocalException("请选择目标对象属性");
        }


        UnifyBatch unifyBatch = BUCKET.get(entityName.toLowerCase());
        if (null == unifyBatch) {
            throw new LocalException("不能识别的状态类型");
        }
        String tableName = unifyBatch.getTableName(); // 表名
        String keyColumnName = unifyBatch.getKeyColumnName(); // 主键字段名
        String column = unifyBatch.getColumn(prop); // 状态字段名
        String idInWhere = ZYWrapperHelper.toIn(ids); // id条件
        String sqlTemplate = "update %s set %s=%s where %s in %s";  // update sys_user set is_using=1 where id in ('1')
        String sql = String.format(sqlTemplate, tableName, column, status, keyColumnName, idInWhere);
        sqlScriptExecutor.executeUpdateScript(sql);
        return JsonResult.success();
    }

    public boolean match(AnnotationMetadata annotationMetadata) {
        return annotationMetadata.hasAnnotation(TableName.class.getName());
    }

    @Override
    public void setClasses(Set<Class<?>> classes) {
        for (Class<?> aClass : classes) {
            TableName tableName = aClass.getAnnotation(TableName.class);
            if (null == tableName) {
                continue;
            }
            String simpleName = aClass.getSimpleName();

            // 实体与表的关系
            UnifyBatch unifyBatch = new UnifyBatch();
            unifyBatch.setTableName(tableName.value());

            Field[] fields = ZYReflectUtils.getFields(aClass);

            Map<String, String> propMapColumn = new HashMap<>();
            for (Field field : fields) {
                field.setAccessible(true);
                Class<?> type = field.getType();
                // 主键
                TableId tableId = field.getAnnotation(TableId.class);
                if (null != tableId) {
                    unifyBatch.setKeyColumnName(tableId.value());
                }
                // 只处理int类型的状态值修改
                if (!Integer.class.isAssignableFrom(type)) {
                    continue;
                }
                // 字段
                TableField tableField = field.getAnnotation(TableField.class);
                if (null != tableField) {
                    propMapColumn.put(field.getName().toLowerCase(), tableField.value());
                }
            }
            unifyBatch.setPropMapColumn(propMapColumn);
            if (!unifyBatch.empty()) {
                BUCKET.put(simpleName.toLowerCase(), unifyBatch);
            }
        }
    }
}


@Data
public class UnifyBatchUpdate implements Serializable {

    private List<String> ids;
    private String entityName;
    private String prop;
    private Integer status;
}


@Data
public class UnifyBatch {

    private String tableName;

    private String keyColumnName;

    private Map<String, String> propMapColumn;

    public String getColumn(String prop) {
        return null != propMapColumn ? propMapColumn.get(prop.toLowerCase()) : null;
    }

    public boolean empty() {
        if (ZYStrUtils.isNull(tableName)) {
            return true;
        }
        if (ZYStrUtils.isNull(keyColumnName)) {
            return true;
        }
        if (null == propMapColumn || propMapColumn.isEmpty()) {
            return true;
        }
        return false;
    }
}

调用示例,后端不用写任何代码,只需要告诉前端调哪个实体类和某个属性即可。岂不美哉。

POST http://localhost:{{port}}/unify/status
Content-Type: application/json
Authorization: {{auth_token}}
u-login-areaId: {{areaId}}

{
  "entityName": "User",
  "prop": "isUsing",
  "status": 1,
  "ids": [
    "1",
    "1790218983664807938",
    "1790219261998821377"
  ]
}

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

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

相关文章

专业学习|博弈论-课程沿革

学习来源&#xff1a;北京大学刘霖《博弈论》MOOC公开课 备注&#xff1a;仅做学习分享&#xff0c;请勿转载&#xff0c;转载必究&#xff01; &#xff08;一&#xff09;博弈论的预备知识 基本的微积分的知识和概率论的知识。简单的说会求导数&#xff0c;会求简单的积分&am…

文案策划日常大公开:掌握这些技巧,让你工作效率翻倍

本周的工作和生活安排得满满当当&#xff0c;但这些看似繁重的任务&#xff0c;其实都是我利用碎片化时间高效完成的。 这里和大家分享一下&#xff0c;我是如何在这忙碌的一周中&#xff0c;既完成本职工作又享受生活的。 本周工作日常汇总&#xff1a; 1. 品牌小红薯笔记&…

Java高阶数据结构-----并查集(详解)

目录 &#x1f9d0;一.并查集的基本概念&实例&#xff1a; &#x1f92a;二.并查集代码&#xff1a; &#x1f602;三&#xff1a;并查集的一些习题&#xff1a; A.省份数量 B.等式方程的可满足性 &#x1f9d0;一.并查集的基本概念&实例&#xff1a; 并查集概念&…

5.3 数据模型设计总结

概述&#xff1a; 数据模型设计是指根据需求和目标设计出合适的数据模型的过程。数据模型是对现实世界中数据的抽象和表示&#xff0c;它定义了数据的结构、关系和约束。数据模型设计的目标是保证数据的一致性、完整性和可用性&#xff0c;同时满足系统性能和可扩展性的要求。…

Python基础教程(十二):模块

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

【Java】解决Java报错:IOException during File Operations

文章目录 引言一、IOException的定义与概述1. 什么是IOException&#xff1f;2. IOException的常见触发场景3. 示例代码 二、解决方案1. 检查文件是否存在2. 使用try-with-resources语句3. 捕获和处理IOException4. 使用NIO进行文件操作 三、最佳实践1. 检查文件状态2. 使用try…

为什么你应该本地化你的软件

本地化您的软件是一项战略举措&#xff0c;可以显著提高其成功率和影响力。以下是您应该投资于软件本地化的几个令人信服的原因&#xff1a; 扩大您的市场覆盖范围 通过本地化您的软件&#xff0c;您可以开拓新市场并接触到更广泛的受众。许多用户更喜欢甚至需要他们母语的软…

(十二)人工智能应用--深度学习原理与实战--模型编译及训练参数的选择

神经网络模型的编译实际上是为网络指定几个非常重要的运行参数,包括优化器、损失函数(误差函数】和评价指标,这三者也代表着神经网络的核心运行机制----通过损失函数来计算网络误差、通过优化器来调整网络参数以降低误差、通过评价指标来衡量网络的性能。神经网络训练时除了…

【漏洞复现】Rejetto HTTP文件服务器 未授权RCE漏洞(CVE-2024-23692)

0x01 产品简介 Rejetto HTTP File Server(HFS)是一个基于HTTP协议的文件服务器软件&#xff0c;旨在为用户提供简单、轻量级且易于使用的文件共享解决方案。功能强大、易于使用的文件服务器软件&#xff0c;无论是个人使用还是团队协作&#xff0c;HFS都能满足用户的需求&…

平价蓝牙耳机推荐有哪些?四款平价顶尖机型盘点

对于预算有限但又追求高品质音效的朋友们&#xff0c;平价蓝牙耳机成为了一个非常实用的选择&#xff0c;在市面上琳琅满目的蓝牙耳机中&#xff0c;挑选出性价比极高且性能出众的款式并不容易&#xff0c;作为一个多年的蓝牙耳机发烧友&#xff0c;接下来我就将为大家盘点四款…

《精通ChatGPT:从入门到大师的Prompt指南》第7章:创意写作

第7章&#xff1a;创意写作 7.1 角色设定 角色设定是创意写作中最关键的环节之一。成功的角色设定能够让读者对故事产生共鸣&#xff0c;使故事更加生动有趣。角色不仅仅是情节发展的载体&#xff0c;更是读者情感的投射对象。因此&#xff0c;深入了解如何设定一个生动而有深…

如何使用免费的 Instant Data Scraper快速抓取网页数据

Instant Data Scraper 是一款非常简单易用的网页数据爬虫工具&#xff0c;你不需要任何代码知识&#xff0c;只需要点几下鼠标&#xff0c;就可以把你想要的数据下载到表格里面。以下是详细的使用步骤&#xff1a; 第一步&#xff1a;安装 Instant Data Scraper 打开谷歌浏览…

java:一个springfox swagger2的简单例子

# 示例程序 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>…

【每日刷题】Day61

【每日刷题】Day61 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 671. 二叉树中第二小的节点 - 力扣&#xff08;LeetCode&#xff09; 2. 2331. 计算布尔二叉树的值…

02-DHCP原理与配置

1、DHCP的工作原理 当局域网中有大量的主机时&#xff0c;如果逐个为每一台主机手动设置IP地址、默认网关、DNS服务器地址等网络参数&#xff0c;这显然是一个费力也未必讨好的办法。 而DHCP服务器的应用&#xff0c;正好可以解决这一问题。 1.1 DHCP是什么 DHCP——动态主机…

单片机多个中断源时的设计思路,(51为例)工作寄存器R0-R7

51单片机中四组工作寄存器&#xff08;R0-R7&#xff09; 参考 可以看出每个工作寄存器区有8个字节即为R0-R7&#xff0c;当不指定使用哪个工作寄存器区的时候默认0区。其他工作区作为普通的RAM使用。特殊功能寄存器中有可以位寻址和不能位寻址的区域 下面文字引用 通过修改…

ABB机器人修改IO信号的具体方法介绍

ABB机器人修改IO信号的具体方法介绍 具体步骤可从参考以下内容: 导出IO配置文件 打开【控制面板】-【配置】-【I/O System】-【文件】-【‘EIO’另存为】,就可以保存IO配置文件【EIO.cfg】用RobotStudio软件打开EIO.cfg文件在软件界面,鼠标右击,选择【I/O信号数据编辑器】选…

嵌入式八股文

C/C基础 C和C有什么区别 C是⾯向对象的语⾔&#xff0c;⽽C是⾯向过程的语⾔&#xff1b; C引⼊ new/delete 运算符&#xff0c;取代了C中的 malloc/free 库函数&#xff1b; C引⼊引⽤的概念&#xff0c;⽽C中没有&#xff1b; C引⼊类的概念&#xff0c;⽽C中没有&#xff…

2024年,计算机相关专业还值得选择吗? 又该如何判断自己是否适合这类专业呢?

文章目录 一、2024年,计算机相关专业还值得选择吗?二、判断自己是否适合这类专业呢&#xff1f;三、哪所大学的计算机专业最好&#xff1f;四、计算机专业是否仍具有长远的发展潜力和就业前景呢? 一、2024年,计算机相关专业还值得选择吗? 在2024年选择大学专业时&#xff0…

人工智能ChatGPT的多种应用:提示词工程

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中&#xff0c;沟通本来就是很重要的一门课程&#xff0c;沟通的过程中表达的越清晰&#xff0c;给到的信息越多&#xff0c;那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&#xff0c;如果想要 …