V6.3.3.0

发布清单

标识 主题 问题类型 报告人 需重新生成代码 需手工修改配置文件 项目归属 演示
GL-19669 【无码开发】自定义sql如果查询条件是多行文本,操作符是包含的,查询会自定义sql解析错误 改进 甘惠羡     云平台  
GL-19670 有配置自定义SQL去外层条件:自定义sql如果有orderby,查询条件会加在order by 后面 改进 甘惠羡     云平台  
GL-19685 【无码开发】同步数据服务支持主对象是自定义SQL,子对象是自定义SQL的场景 改进 林建文     云平台  
GL-19686 【无码开发】同步数据服务支持子对象是自定义SQL的场景 改进 林建文     云平台  
GL-19687 【无码开发】搜索帮助点同步数据服务改造为使用对比方式同步 改进 林建文     云平台  
GL-19700 业务对象分组管理支持循环生成,有对象报错不会影响其他对象生成 改进 林建文     云平台  
GL-19702 【云平台】平台Example查询通过前端传入的查询条件必须指定COLUMN_NAME,优化为只需要属性名称,字段名称后台自动转换 改进 林进旭     云平台  
GL-19706 【云平台】HTML静态资源版本控制优化 改进 林进旭     物流-象屿综合物流管理平台项目  
GL-19662 【云平台】多行文本精确匹配控件类型,用于查询条件使用 新功能 林建文     平台事业部-象道物流多式联运平台一期项目  
GL-19664 象道多语言改造 新功能 张文波     云平台  
GL-19666 页面类型如果是用户自定义页面,那么页面名称建议要做个校验,不能输入中文字符 校验 甘惠羡     云平台  
GL-19680 新增编辑页有多个tab页,如果tab勾选页签懒加载、DIV延时加载异步渲染方式,tabs没有勾选主页面,生成代码会报错,报错的信息定位不够准确 校验 甘惠羡     云平台  

升级文档

平台多语言支持

一、相关的配置项目

  • glpaas.i18n.jdbcTemplateName:jdbcTemplate
  • 设置多语言消息表查询,使用的jdbcTemplateName用于系统扩展性, 可能需要把所有消息统一放在一个数据库时候使用

  • glpaas.i18n.default.locale:zh_CN
  • 设置默认的语言 ;默认为 zh_CN,目前需要设置为 zh

  • glpaas.i18n.cookie.name:locale
  • 不需要配置,默认为 locale
    设置cookie 名称 locale

    二、后台多语言消息使用

    为了兼容老版本,平台上新增了视图级配置项【开启新后台I18n支持】,配置为【Y】。

    //操作成功 消息 18nUtils.getMessage(LangConstants.OPERATOR_SUCCESS, LangConstants.OPERATOR_SUCCESS_MSG); 
    //自定义的消息编码 18nUtils.getMessage("pwdModifySucess", "密码修改成功!");
    
    1、消息编码维护、消息模板
    pwdModifySucess=密码修改成功!
    usrNotFound=用户名{0}不存在!
    

    在多语言消息文件中维护消息编码;或者在多语言消息表中维护是一样的格式的。
    参考平台的多语言消息文件 i18n/ipf-common_en.properties
    或者消息表 SYS_I18N_MESSAGE

    2、I18nUtils.java 接口说明
    参数 code : 消息编码 
    参数 args: 用于参数模板中替换的参数列表 
    参数 defaultMessage: 默认提示消息
    
  • public static String getMessage(String code) 根据消息编码获取消息文本
  • public static String getMessage(String code, String defaultMessage) 根据消息编码获取消息文本,如果没找到使用默认文本
  • public static String getMessage(String code, Object[] args) 根据消息编码获取消息文本
  • public static String getMessage(String code, Object[] args, String defaultMessage) 根据消息编码获取消息 文本,如果没找到使用默认文本
  • 三、项目类型升级说明

  • spring boot 项目只需要引入gillion-component-i18n-def包
  • 在参数配置文件中设置 glpaas.i18n.default.locale:zh

  • 非spring boot 项目需要xml配置加入 application-i18n.xml
  • 然后在 core-servlet.xml添加 LocaleResolver, 当然也可以考虑使用其他的
    LocaleResolver 实现,目前平台这建议使用 CookieLocaleResolver

    <!‐‐ 2020‐04‐24 linjx 多语言使用 CookieLocaleResolver‐‐> 
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
            <property name="defaultLocale" value="${i18n.default.locale:zh_CN}"></property> 
            <property name="cookieName" value="${i18n.cookie.name:locale}"></property> 
    </bean>
    

    平台HTML前端资源版本优化

    平台生成的HTML中,头部有些公用的css\js等,如果这些文件并未全部加入静态资源版本号,
    导致了项目发布时候,如果这些文件有修改,客户端浏览器必须要清除缓存才能生效;
    此次改造把所有的JS纳入到静态资源版本控制中, 并做了JS抽取,代码更加简洁。
    需要更新前端文件 /static/app/main/writeScript.js

    老版本HTML

    多系统,appconfig.js 未在版本控制中

    <script src="/static/app/appconfig.js"></script> 
      <script> 
                       function getCookie(c_name) { 
                                     var c_start, c_end; 
                                     if (document.cookie.length > 0) { 
                                         c_start = document.cookie.indexOf(c_name + "=") 
                                             if (c_start != ‐1) { 
                                                c_start = c_start + c_name.length + 1; 
                                                    c_end = document.cookie.indexOf(";", c_start); 
                                                    if (c_end == ‐1) c_end = document.cookie.length; 
                                                    return decodeURIComponent(document.cookie.substring(c_start, c_end)); 
                                                    } 
                                            }
                                                    return "" 
                                        }
                                        window.version = getCookie('gillion‐res‐version'); 
                                        document.write( 
                                                          '<link rel="stylesheet" href="/static/css/iconfont.css?v=' + window.version + '"/>' + 
                                                                            '<link rel="stylesheet" href="/static/css/controls.css?v=' + window.version + '"/>' + 
                                                                            '<link rel="stylesheet" href="/bower_components/bootstrap/css/bootstrap.min.css?v=' + window.version + '"/>' +                                         '<link rel="stylesheet" href="/resource/css/main.css?v=' + window.version + '" />' + 
                                                                            '<link rel="stylesheet" href="/resource/css/custom.css?v=' + window.version + '" />' + 
                                                                            '<script ' + 'src="/bower_components/requirejs/require.js?v=' + window.version + '" ' + 
                                                                            'data‐main="/static/app.js"' + 
                                                                            'data‐bootstrap‐modules="[\'platform/implement/metadata/ipfCcmBoManage\']" '+ '>
                                                                            <\/script>' 
                                                                            ); 
            </script>
    

    单系统,所有都在版本控制中,但是代码冗余

    <script> 
                 function getCookie(c_name) { 
                             var c_start, c_end; 
                             if (document.cookie.length > 0) { 
                                 c_start = document.cookie.indexOf(c_name + "=") 
                                 if (c_start != ‐1) { 
                                     c_start = c_start + c_name.length + 1; 
                                     c_end = document.cookie.indexOf(";", c_start); 
                                     if (c_end == ‐1) 
                                         c_end = document.cookie.length;
                                         return decodeURIComponent(document.cookie.substring(c_start, c_end)); 
                                    } 
                                 }
                             return "" 
                             }
                             window.version = getCookie('gillion‐res‐version'); 
                             document.write( '<link rel="stylesheet" href="/static/css/iconfont.css?v=' + window.version + '"/>' + 
                                                 '<link rel="stylesheet" href="/static/css/controls.css?v=' + window.version + '"/>' + 
                                                 '<link rel="stylesheet" href="/bower_components/bootstrap/css/bootstrap.min.css?v=' + window.version + '"/>' + 
                                                 '<link rel="stylesheet" href="/resource/css/main.css?v=' + window.version + '" />' + 
                                                 '<link rel="stylesheet" href="/resource/css/custom.css?v=' + window.version + '" />' + 
                                                 '<script ' + 'src="/bower_components/requirejs/require.js?v=' + window.version + '" ' + 
                                                 'data‐main="/static/app.js"' + 'data‐bootstrap‐modules="[\'platform/implement/metadata/ipfCcmBoManage\']" '+ '>                                   <\/script>' ); 
    </script>
    

    优化以后

    单系统

    <script> document.write('<script id="write‐script" src="/static/app/main/writeScript.js? s=s&t=' + new Date() + '"><\/script>');</script> <script> 
            document.write( 
                                      '<script ' + 
                                      'src="/bower_components/requirejs/require.js?v=' + window.version + '" ' + 
                                      'data‐main="/static/app.js"' + 
                                      'data‐bootstrap‐modules="[\'platform/implement/metadata/ipfCcmBoManage\']" '+ 
                                    '><\/script>' 
                    ); 
    </script>
    

    多系统

    <script>document.write('<script id="write‐script" src="/static/app/main/writeScript.js?t=' + new Date() + '"><\/script>');</script>
    <script> 
           document.write( 
                                   '<script ' + 
                                                     'src="/bower_components/requirejs/require.js?v=' + window.version + '" ' + 
                                                     'data‐main="'+ ${systemCtx}.path + '/static/app.js"' + 
                                                     'data‐bootstrap‐modules="[\'platform/implement/metadata/ipfCcmBoManage\']" '+ 
                                                     '><\/script>' 
                    ); 
    </script>
    

    平台多行文本精确查询控件使用说明

    平台新增一种控件类型 【多行精确查询】控件,这种控件为了提高业务作业上的全匹配查询的效率,采用的通过ES搜索引擎中进行全匹配查询,然后把查询到的列表 做为数据库精确查询的条件。
    备注:

  • 该控件类型只能使用在查询表单上。
  • 目前平台的运行期动态配置中还不支持这种控件类型
  • 1、 可视化中配置控件类型 及控件的必须属性

  • 控件属性 rows
  • 查询数据源标识名称(在控件查询时候,会把这个参数传到后台,后台根据这个来区分查询数据源)
  • <g‐exact‐matching 
             id="search.itemCode" 
                     name="search.itemCode" 
                     ng‐model="search.itemCode" 
                     rows="3" 
                     limit‐count="10" 
                     query‐name="BAS_ITEM" > 
    </g‐exact‐matching>
    

    2、配置

  • 在可视化布局中,从左侧基础控件中拖拽【精确匹配】控件,绑定业务对象及属性,操作符一般选择包含。
  • QQ截图20200507212239

  • 在config.properties 中配置全局的 数据源查询请求及 返回数据笔数限制。如果是分布式系统,直接加在对应模块下的配置文件
  • //在 controls 节点下,新增 exactMatching 
    controls : { 
            exactMatching: { 
                                //全局的查询数据请求路径 
                                queryUrl: '/ipf/testQuerySample/queryItemCods', 
                                            checkboxLabel: '精确匹配', 
                                            //最大返回数据笔数限制 
                                            limitCount: 100 
                        } 
    }
    

    3、后台查询请求实现,需要项目组自定义

    目前例子是使用后台的数据库查询,最终项目组可以实现为 ES搜索引擎的查询方式。

    <html>
     <head></head>
     <body>
      /*** 查询例子分页信息查询 ** @param * @return */ @RequestMapping(value = "testQuerySample/queryItemCods") public void queryItemCods(@RequestBody MatchingVo matchingVo , HttpServletRequest request, HttpServletResponse response) { Map
      <string, object="">
        result = Maps.newHashMap(); //模糊查询关键字列表 List
       <string>
         itemCodes = matchingVo.getValues(); //模糊查询的目标数据源标识名称 String name = matchingVo.getName(); //查询返回的数据笔数限制 int limitCOunt = matchingVo.getLimitCount(); if(CollectionUtils.isNotEmpty(itemCodes)) { String strSql = "select ITEM_CODE from BAS_ITEM where ITEM_CODE like "; StringBuilder sql = new StringBuilder(); Map
        <string,object>
          params = Maps.newHashMap(); for(int i=0;i<=itemCodes.size()‐1;i++){ if(i>0){ sql.append(" union all "); }String itemCode = itemCodes.get(i); String varName = "itemCode"+i; sql.append(strSql).append(" :"+varName); params.put(varName, "%".concat(itemCode).concat("%")); }NamedParameterJdbcTemplate namedParameterJdbcTemplate = SpringContextHolder.getBean(NamedParameterJdbcTemplate.class); List
         <string>
           codes = namedParameterJdbcTemplate.queryForList(sql.toString(), params, String.class);result.put("records", codes); }ResponseUtils.flushSuccess(response, result); }
         </string>
        </string,object>
       </string>
      </string,>
     </body>
    </html>
    

    4、需要在扩展JS中加入代码扩展查询

    把原来的JS中的查询方法存储在临时的变量中,然后重写覆盖掉 queryTestQuerySample
    参数 search.itemCode 是 配置了 多行文本精确查询的 控件上的 ID值。

    var superQueryTestQuerySample = $scope.queryTestQuerySample;
    $scope.queryTestQuerySample = function() {
        return ExactMatchingService.doExactMatching(['search.itemCode']).then(function() {
            return superQueryTestQuerySample();
        });
    };