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"},....]

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

发布了61 篇原创文章 · 获赞 90 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/wkh___/article/details/98204939
今日推荐