参考博文: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"},....]
对你有帮助的话,右上角给个赞呗~