JAVA 列表动态增加字段显示和任意字段排序

需求是用户可以在页面管理展示的字段,并且对字段的展示顺序自定义排序,控制所有字段显示隐藏,表中有默认基础字段是不可以删除的

这边全部都是后端实现:

思路:

  1. 数据表设定一个字段专门存放动态字段,字段内容以JSON的格式k-v形式存放 
  2. 建立字段管理表,设置code码,名称,排序
  3. 查询接口将对象根据字段顺序转换成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;
    }

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,如果要动态显示字段的值,可以使用反射机制。反射是Java中的一种机制,可以在运行时动态地获取类的字段、方法和构造函数等信息,并可以在运行时调用它们。 首先,我们需要使用Class类的forName()方法获取目标类的Class对象,例如: Class clazz = Class.forName("com.example.ClassName"); 然后,可以使用Class对象的getField()方法获取指定的字段,getField()方法需要传入字段的名称作为参数,例如: Field field = clazz.getField("fieldName"); 接下来,可以使用Field对象的get()方法获取字段的值,get()方法需要传入目标对象作为参数,例如: Object value = field.get(object); 需要注意的是,get()方法返回的是Object类型,如果字段的类型是基本数据类型,需要进行适当的类型转换。 最后,可以将字段的值动态显示出来,可以使用System.out.println()方法将值打印到控制台,例如: System.out.println("字段的值为:" + value); 通过上述步骤,我们可以在运行时动态地获取指定字段的值并进行显示。无论字段名称是固定的还是动态地生成,都可以通过反射机制来实现动态显示字段的值。这种方法在一些需要动态操作和显示字段值的场景中非常有用,如配置文件读取、数据库操作等。需要注意的是,由于反射操作相对较耗时,所以在性能要求较高的场景中,应当谨慎使用反射。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值