需求是用户可以在页面管理展示的字段,并且对字段的展示顺序自定义排序,控制所有字段显示隐藏,表中有默认基础字段是不可以删除的
这边全部都是后端实现:
思路:
- 数据表设定一个字段专门存放动态字段,字段内容以JSON的格式k-v形式存放
- 建立字段管理表,设置code码,名称,排序
- 查询接口将对象根据字段顺序转换成map返回
伪代码:
字段管理
public class StaffManager implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name", length = 32)
private String name;
@ApiParam(value = "排序")
private Integer sorts;
@ApiParam(value = "代表字段")
private String code;
@ApiParam(value = "是否展示")
private Boolean isShow;
}
@ApiParam(value = "自定义字段")
private String customFields;
/**
* 定义字段
*
* @param content [{"name":"xx", "sorts":"", "code":"name", "isShow":"true"}...]
*/
public void update(String content) {
//清空数据表
dao.truncate();
JSONArray array = JSONObject.parseArray(content);
for (int i = 0; i < array.size(); i++) {
StaffManager staffManager = JSONObject.toJavaObject((JSONObject)array.get(i), StaffManager.class);
if (StringUtil.isEmpty(staffManager.getCode())) {
//设置扩展字段的名称
staffManager.setCode("extend_" + UUIDUtil.getCode());
}
staffManager.setSorts(i);
//保存对象。。。
}
}
/**
* 新增用户
*
* @param content 扩展字段 [{"code":"xx", "value":""}]
* extend
*/
public void insert(Integer id, String name, String tel, Integer classId,
Integer deptId, String tagCode, String content) {
if (StringUtil.isNotEmpty(content)){
JSONArray array = JSONObject.parseArray(content);
List<Map<String, String>> list = Lists.newArrayList();
for (Object o : array) {
Map<String, String> req = JSONObject.toJavaObject((JSONObject)o, Map.class);
req.forEach((k,v)->{
//判断是否存在该字段
StaffManager manager = dao.findByCode(k);
if (manager != null){
list.add(req);
}
});
}
String s = JSON.toJSONString(list);
//保存列表对象。。。
}
}
最后查询排序结果
public Map<String, Object> pageVagueStaff2(Integer num, Integer size, String content) {
//分页获取到列表对象。。。
Page<staff> = ...
List<Map<String, Object>> list = Lists.newArrayList();
//设置对比集合表头 并排序
List<StaffManager> titles = staffManagerService
.findAll()
.stream()
.sorted(Comparator.comparing(StaffManager::getSorts, Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.toList());
List<Staff> staffList = staff.getContent();
staffList.forEach(x->{
Map<String, Object> hashMap = new LinkedHashMap<>(16);
//将原对象转换成Map
Map<String, Object> map = ...
//根据列表字段和顺序设置
titles.forEach(u->{
String code = u.getCode();
String substring = code;
if (code.contains(SPLIT)){
substring = code.substring(0, code.indexOf(SPLIT));
}
Object o = map.get(substring);
//根据顺序设置值
hashMap.put(substring, o);
});
//每个对象顺序重排后 设置扩展字段的值
String customFields = x.getCustomFields();
JSONArray array = JSONObject.parseArray(customFields);
if (array != null && array.size() > 0){
for (Object o : array) {
Map<String, String> jsonMap = JSONObject.toJavaObject((JSONObject)o, Map.class);
//判断是否是是存在的字段
jsonMap.forEach((k,v)->{
if (hashMap.containsKey(k)){
hashMap.put(k, v);
}
});
}
}
list.add(hashMap);
});
Map<String, Object> map = Maps.newHashMap();
map.put("pageMax", staff.getTotalElements());
map.put("data", list);
map.put("title", titles);
return map;
}