美文网首页javaWeb学习
JeeSite | 保存信息修改记录封装

JeeSite | 保存信息修改记录封装

作者: 码农UP2U | 来源:发表于2017-11-29 04:42 被阅读0次

    前面写过两篇关于“保存信息修改记录”的内容,分别如下:
    JeeSite|保存信息修改记录
    JeeSite|保存信息修改记录续

    回顾

    第一篇文章通过类字段的比较返回一个有字段值不同的List,然后自己构造表字段和字典的Map来生成修改前和修改后的差异字符串。从而实现“信息”修改“前”和修改“后”的对比记录。
    第二篇文章不再自己构造表字段和字典的Map,而是直接使用了JeeSite自带的GenTable类取代了自己构造表字段和字典的Map,只是需要将“代码生成”中的“业务表配置”模块维护好就可以了。第二篇文章对第一篇文章进行了改进。

    对于保存信息修改记录这个功能会在很多表单中进行使用,那么按照前面的解决方法,需要在每个表单对应的Controller中增加相同的代码来完成同样的事情,这样代码就重复了。因此,本篇就将这个功能封装为一个类,这样每次使用的时候只要实例化这个类,就可以完成“信息”修改“前”和修改“后”对比记录的功能了。

    代码的具体功能前面都介绍过了,因此不进行太多的介绍了,只是介绍一下具体如何的封装。

    差异字段列表生成

    在JeeSite下的src\main\java\com\thinkgem\jeesite\common\utils\(该目录下存放了JeeSite项目的通用工具类,比如文件操作类、字符串操作类、日期操作类等)下新建一个CompareClassUtils.java的类文件。
    该文件的代码如下:

    public class CompareClassUtils {
        /**
         * 获取两个对象同名属性内容不相同的列表
         * 
         * @param class1
         *            对象1
         * @param class2
         *            对象2
         * @return
         * @throws ClassNotFoundException
         * @throws IllegalAccessException
         */
        public static List<Map<String, Object>> compareTwoClass(Object class1, Object class2) {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            // 获取对象的class
            Class<?> clazz1 = class1.getClass();
            Class<?> clazz2 = class2.getClass();
            // 获取对象的属性列表
            Field[] field1 = clazz1.getDeclaredFields();
            Field[] field2 = clazz2.getDeclaredFields();
            // 遍历属性列表field1
            for (int i = 0; i < field1.length; i++) {
                // 遍历属性列表field2
                for (int j = 0; j < field2.length; j++) {
                    // 如果field1[i]属性名与field2[j]属性名内容相同
                    if (field1[i].getName().equals(field2[j].getName())) {
                        if (field1[i].getName().equals(field2[j].getName())) {
                            field1[i].setAccessible(true);
                            field2[j].setAccessible(true);
                            // 如果field1[i]属性值与field2[j]属性值内容不相同
                            try {
                                if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
                                    Map<String, Object> map2 = new HashMap<String, Object>();
                                    map2.put("name", field1[i].getName());
                                    map2.put("old", field1[i].get(class1));
                                    map2.put("new", field2[j].get(class2));
                                    list.add(map2);
                                }
                            } catch (IllegalArgumentException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            break;
                        }
                    }
                }
            }
    
            return list;
        }
    
        /**
         * 对比两个数据是否内容相同
         * 
         * @param object1,object2
         * @return boolean类型
         */
        public boolean compareTwo(Object object1, Object object2) {
    
            if (object1 == null && object2 == null) {
                return true;
            }
            if (object1 == null && object2 != null) {
                return false;
            }
            if (object1.equals(object2)) {
                return true;
            }
            return false;
        }
    }
    

    差异信息的拼接

    差异信息的拼接需要使用数据表中字段的注释,如果代码中使用了字典则需要维护好对应的字典。在前面的文章中,在GenTableService.java增加了两个方法,并在GenTableDao.xml和GenTableColumnDao.xml增加了相应的SQL。前面文章中,拼接差异信息定义在了表单对应的Controller中,即catModifyInfo()方法写在了各个表单的Controller中,而这里只需要将catModifyInfo()方法移动到GenTableService.java文件中即可。
    在GenTableService.java下添加如下代码:

        public String catModifyInfo(List<Map<String, Object>> list, String className) {
            // 根据类名获得对应的表信息
            GenTable genTable = getTableByClass(className.toString());
            
            if ( genTable == null ) {
                return "";
            }
            
            // 根据表id获取表相应的字段信息
            List<GenTableColumn> columnList = getColumnByTable(genTable.getId());
            if ( columnList == null ) {
                return "";
            }
            
            Map<String, String> mapField = new HashMap<String, String>();
            Map<String, String> mapDict  = new HashMap<String, String>();
            
            // 获得字段对应的Java属性和字段注释
            for( GenTableColumn gtc : columnList ) {
                mapField.put(gtc.getJavaField(), gtc.getComments());
            }
            
            // 获得字段对应的注释和对应的字典
            for ( GenTableColumn gtc : columnList ) {
                if ( StringUtils.isNotEmpty(gtc.getDictType()) 
                        && StringUtils.isNotBlank(gtc.getDictType()) ) {
                    mapDict.put(gtc.getComments(), gtc.getDictType());
                }
            }
            
            // 构造的修改字符串
            String modInfo = "";
            
            for ( Map<String, Object> mp : list) {
                System.out.println(mp.get("name") + "---" + mp.get("old") + "---" + mp.get("new"));
                System.out.println(mapField.get(mp.get("name")));
                            
                // 判断修改的值是否为字典
                if ( mapDict.containsKey(mapField.get(mp.get("name"))) ) {
                    String oldValue = mp.get("old").toString();
                    String newValue = mp.get("new").toString();
                    String type     = mapDict.get(mapField.get(mp.get("name")));
                    String oldStr = DictUtils.getDictLabel(oldValue, type, "");
                    String newStr = DictUtils.getDictLabel(newValue, type, "");
                    System.out.println(mapField.get(mp.get("name")) + ":(" + oldStr + ") => (" + newStr + ");");
                    modInfo += mapField.get(mp.get("name")) + ":(" + oldStr + ") => (" + newStr + ");"; 
                } else {
                    modInfo += mapField.get(mp.get("name")) + ":(" + mp.get("old") + ") => (" + mp.get("new") + ");"; 
                }
            }
            
            return modInfo;
        }
    

    上面的代码不再进行解释,前面已经有过具体的说明了。

    封装后的调用

    在JeeSite中,新建和修改的“保存”调用的都是Controller中的"save"方法,具体是修改还是新建,只要通过判断对象是否存在id即可,代码如下:

    /*
     * 如果id不为空,则表示为修改
     */
    if ( StringUtils.isNotBlank(sellContract.getId()) ) {
        SellContract sc = new SellContract();
        // 获取原来的信息
        sc = sellContractService.get(sellContract.getId());
        
        // 比较修改后的信息和未修改的信息
        List<Map<String, Object>> modList = CompareClassUtils.compareTwoClass(sc, sellContract);
        // 生成差异信息
        String strModifyInfo = genTableService.catModifyInfo(modList, "SellContract");
        // 输出差异字符串
        System.out.println(strModifyInfo);
        
        // 记录修改信息
        ContractModifyInformation cmi = new ContractModifyInformation();
        cmi.setContractId(sellContract.getId());
        cmi.setModifyContent(strModifyInfo);
        cmi.setModifyDept(UserUtils.getUser().getOffice().getId());
        cmi.setModifyUser(UserUtils.getUser().getId());
        cmi.setModifyDate(new Date());
        contractModifyInformationService.save(cmi);
    }
    

    到此,具体的封装就完成了。

    关于JeeSite相关的其他文章还有:
    JeeSite|Excel导入导出
    JeeSite|数据权限应用

    相关文章

      网友评论

        本文标题:JeeSite | 保存信息修改记录封装

        本文链接:https://www.haomeiwen.com/subject/xbgxbxtx.html