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

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

代码如下:

java 复制代码
/*
 * 文件名称: 类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;
    }
}

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

java 复制代码
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"
  ]
}
相关推荐
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht1 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht1 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20241 小时前
Swift 数组
开发语言
stm 学习ing2 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe4 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin4 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python