java自定义字段实现

 

参考博文:https://blog.csdn.net/ytangdigl/article/details/70145910

 

前言

来个需求,要求用户可以添加自定义字段,由于之前没做过相关的代码实现。

当时的第一反应是想着动态添加数据库表字段,越想越不靠谱,搜一下才知道真的是想错了。

这里根据开头给的链接的那篇博文参考实现的需求,但我公司的需求逻辑没有那位老哥那么复杂,对字段类型或者长度都没有要求。

 

前端效果

 

 

数据表结构

公司自定义字段名称类型表

filedName是字段名称,label是显示名称。

如:[{"filedName":"age", "label":"年龄"},{"filedName":"sex", "label":"性别"}]

 

用户自定义字段内容表

用户表存储就是自定义字段具体的内容,

对应自定义字段表的filedName为key,value就是用户输入的值。

 

编码实现

模板表对应实体类

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 自定义字段
 * @author 954L
 * @create 2019/7/23 15:35
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SysCompanyCustomField {

    private Integer id ;
    private String content ;
    private Integer companyId ;

    @Getter
    @Setter
    public static class CustomField{
        private String label ;
        private String filedName ;
    }

}

写了个内部类,来做自定义字段的key模板。

content就是内部类的模板内容,比方说上文的:[{"filedName":"asd","label":"asd"}]

 

添加自定义字段

controller

    /**
     * 添加自定义字段
     * @param customField
     * @param request
     * @return
     */
    @PostMapping("customField/insert")
    public ResultVo customFieldInsert(SysCompanyCustomField.CustomField customField, HttpServletRequest request) {
        return companyCustomFieldService.insert(customField, AdminUtils.getSessionAdmin(request)) ;
    }

service

    public ResultVo insert(SysCompanyCustomField.CustomField customField, SysAdmin sessionAdmin) {
        Integer companyId = sessionAdmin.getCompanyId();
        SysCompanyCustomField companyCustomField = companyCustomFieldMapper.queryByCompanyId(companyId) ;
        List<SysCompanyCustomField.CustomField> customFieldList = new ArrayList<>() ;
        // 校验
        if (companyCustomField != null && StringUtils.isNotBlank(companyCustomField.getContent())){
            // 取出该公司的自定义字段,判断是否超额
            if ((customFieldList = JSONArray.parseArray(companyCustomField.getContent(), SysCompanyCustomField.CustomField.class)).size() > MAX_CUSTOM_FIELD_NUM){
                // 已超额
                return ResultUtil.getResult(SysCompanyCustomFieldEnum.MAX_NUM) ;
            } else if (!CollectionUtils.isEmpty(customFieldList)){
                // 判断字段名称是否重复
                long size = customFieldList.stream().filter(x ->
                    x.getFiledName().equals(customField.getFiledName())
                ).limit(1).count() ;
                if (size > 0)
                    // 已重复
                    return ResultUtil.getResult(SysCompanyCustomFieldEnum.FIELD_EXIST) ;
            }
        }
        // 添加
        customFieldList.add(customField) ;
        String content = JSONArray.toJSONString(customFieldList) ;
        companyCustomFieldMapper.insert(new SysCompanyCustomField(null, content, companyId)) ;
        return ResultUtil.getResult(SysEnum.SUCCESS_ADD) ;
    }

以上代码就是添加自定义字段的后端接口。

添加用户时候将公司的自定义字段返回给前端渲染页面,

提交表单时候前端将自定义字段处理成数组的json格式存储即可,

每一个json表示一个字段,如:[{"asd":"dada"},....]

 

对你有帮助的话,右上角给个赞呗~

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

954L

帮帮孩子把~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值