首页 文章 精选 留言 我的

精选列表

搜索[多语言适配],共10001篇文章
优秀的个人博客,低调大师

PMD 6.40.0 发布,多语言静态代码自动分析工具

PMD 是一个代码分析器,能够帮助发现常见的编程问题,比如未使用的变量、空的 catch 块、不必要的对象创建等等。最初仅支持 Java 代码,目前还可支持 JavaScript、Salesforce.comApex 和 Visualforce、PLSQL、Apache Velocity、XML 和 XSL 。 PMD 6.40.0 正式发布,本次更新内容如下: 更新的 Apex 支持 Apex 语言支持已经升级到 54.0 版本; 新规则 新的 Apex 规则 EagerlyLoadedDescribeSObjectResult查找DescribeSObjectResult,它可以通过SObjectType.getDescribe()急速加载。 <rule ref="category/apex/performance.xml/EagerlyLoadedDescribeSObjectResult" /> 修复的问题 apex #1089: [apex] ApexUnitTestClassShouldHaveAsserts: 未检测到其他方法中的测试断言 #3566: [apex] ApexDoc 规则不应要求 "@description" #3570: [apex] OneDeclarationPerLine: 应该提供一个选项来忽略 for 循环初始化器中的多个声明 java-bestpractices #3542: [java] MissingOverride: 修复枚举方法的误报 java-codestyle #3563: [java] The ClassNamingConventionsRule 在类名 "Constants "上出现误报 java-errorprone #3560: [java] InvalidLogMessageFormat: 在 lambda 内部的一个块中出现消息和异常的误报 …… 更多详情可查看:https://github.com/pmd/pmd/releases/tag/pmd_releases%2F6.40.0

优秀的个人博客,低调大师

PMD 6.39.0 发布,多语言静态代码自动分析工具

PMD 是一个代码分析器,能够帮助发现常见的编程问题,比如未使用的变量、空的 catch 块、不必要的对象创建等等。最初仅支持 Java 代码,目前还可支持 JavaScript、Salesforce.comApex 和 Visualforce、PLSQL、Apache Velocity、XML 和 XSL 。 PMD 6.39.0 正式发布,本次更新内容如下: 修复的问题 core #3499: [core] 使用组合节点测试修复 XPath 规则链 java-errorprone #3493: [java] AvoidAccessibilityAlteration: 添加测试并修复规则 javascript #3516: [javascript] NPE 在指定显式行号时创建规则违规 plsql #3487: [plsql] 解析异常 OPEN ref_cursor_name FOR 语句 #3515: [plsql] 在分析 Associative Arrays Types 上的 SELECT...INTO 时,解析异常 统计数据 37 次提交 10 个已关闭的 tickets 和 PR 自上次发布以来的天数:27 更多详情可查看:https://github.com/pmd/pmd/releases/tag/pmd_releases%2F6.39.0

优秀的个人博客,低调大师

PMD 6.36.0 发布,多语言静态代码自动分析工具

PMD 是一个代码分析器,能够帮助发现常见的编程问题,比如未使用的变量、空的 catch 块、不必要的对象创建等等。最初仅支持 Java 代码,目前还可支持 JavaScript、Salesforce.comApex 和 Visualforce、PLSQL、Apache Velocity、XML 和 XSL 。 PMD 6.36.0 正式发布,本次更新内容如下: 改进的增量分析 长期以来,增量分析一直帮助我们的用户获得了更快的分析结果,然而,它的实现在检测运行时和类型解析类路径的变化时往往过于谨慎,产生不必要的缓存失效。我们现在已经改进了启发式方法,以消除一些错误的无效,并略微加快了缓存的的使用。 PMD 现在将忽略: 类路径中的非类文件和被引用的 jar/zip 文件; 更改 jar / zip 中文件条目的顺序; jar / zip 中文件元数据的更改; 新规则 新的 Apex 规则[AvoidDebugStatements](<https://pmd.github.io/pmd-6.36.0/pmd_rules_apex_performance.html#avoiddebugstatements>)System.debug 查找 System.debug 调用的用法。即使没有捕获调试日志,调试语句也会导致更长的事务并消耗 Apex CPU 时间。 你可以像这样尝试这个规则: <rule ref="category/apex/performance.xml/AvoidDebugStatements" /> 新的 Apex 规则[InaccessibleAuraEnabledGetter](<https://pmd.github.io/pmd-6.36.0/pmd_rules_apex_errorprone.html#inaccessibleauraenabledgetter>)AuraEnabled 检查 AuraEnabled 获取器是公共的还是全局的。 你可以像这样尝试这个规则: <rule ref="category/apex/errorprone.xml/InaccessibleAuraEnabledGetter" /> 重命名的规则 Java 规则 BadComparison 已被重命名为 ComparisonWithNaN,以更好地反映该规则实际检测的内容。 修正的问题 apex 避免调试语句,因为它影响性能; 新增规则,以检测不可访问的 AuraEnabled 获取器; CognitiveComplexity - "else if" 的增量不正确; core 错误加载样式表 cpdhtml.xslt; 在 SARIF 报告中添加 fullDescription 和标签; java-bestpractices #3340: [java] NullPointerException applying rule GuardLogStatement java-bestpractices GuardLogStatement:编译时常量参数误报 UnusedAssignment 在增量 expr 中使用时报告未使用的变量; UnusedAssignment 在报告未使用的变量时误报; LiteralsFirstInComparisons 两个常量的误报; JUnitTestsShouldIncludeAssert 应该支持 Junit 5; NullPointerException 应用规则 GuardLogStatement; java-代码样式 更新 UnnecessaryImport 以识别 javadoc@exception标签中导入类型的用法; 更多详情可查看:https://github.com/pmd/pmd/releases/tag/pmd_releases%2F6.36.0

优秀的个人博客,低调大师

PMD 6.35.0 发布,多语言静态代码自动分析工具

PMD 是一个代码分析器,能够帮助发现常见的编程问题,比如未使用的变量、空的 catch 块、不必要的对象创建等等。最初仅支持 Java 代码,目前还可支持 JavaScript、Salesforce.comApex 和 Visualforce、PLSQL、Apache Velocity、XML 和 XSL 。 PMD 6.35.0 正式发布,本次更新内容如下: Javascript 模块现在至少需要 Java 8: 我们使用了最新版本的 JavaScript 实现 Rhino 用于解析 JavaScript 代码,至少需要 Java 8。因此我们决定将 pmd-javascript 模块也升级到 Java 8。这意味着,从现在开始,需要一个 Java 8 或更高版本的运行时,以便来分析 JavaScript 代码。PMD 核心仍然只需要 Java 7。 新规则: 此版本附带 3 个新的 Java 规则: [JUnit5TestShouldBePackagePrivate](<https://pmd.github.io/pmd-6.35.0/pmd_rules_java_bestpractices.html#junit5testshouldbepackageprivate>) 强制执行以下约定:JUnit 5 测试应该具有最小的可见性。您可以像下面这样尝试此规则: <rule ref="category/java/bestpractices.xml/JUnit5TestShouldBePackagePrivate" /> [CognitiveComplexity](<https://pmd.github.io/pmd-6.35.0/pmd_rules_java_design.html#cognitivecomplexity>) 使用 cognitive complexity 指标来查找过于复杂的代码。该度量标准以多种方式改进了类似的循环复杂性,可以像下面这样尝试此规则: <rule ref="category/java/design.xml/CognitiveComplexity" /> [MutableStaticState](<https://pmd.github.io/pmd-6.35.0/pmd_rules_java_design.html#mutablestaticstate>) 查找非最终的非私有静态字段。这些字段破坏了封装,因为可以 在程序中的任何位置修改这些字段。可以像下面这样尝试此规则: <rule ref="category/java/design.xml/MutableStaticState" /> 修改后的规则: Java 规则 CompareObjectsWithEquals 现在有一个新属性 typesThatCompareByReference。通过这个属性,你可以配置应该通过引用进行比较被列入白名单的类型。默认情况下,java.lang.Enum 和 java.lang.Class 是允许的,但是你可以在这里添加自定义类型。 此外,现在还允许对常量进行比较; 废弃的规则: Java 规则 DefaultPackage 已经被弃用,取而代之的是 CommentDefaultAccessModifier; Java 规则 CloneThrowsCloneNotSupportedException 已被弃用,没有替换; 修复的问题: apex #3183: [apex] ApexUnitTestMethodShouldHaveIsTestAnnotation 在帮助方法中出现误报; #3243: [apex] 遍历 AST 时正确处理 findBoundary 核心; core #2639: [core] 如果路径中的目录不存在,则不创建 PMD CLI 输出文件; #3196: [core] 废弃 ThreadSafeReportListener; doc #3230: [doc] 删除语言索引页的 "Edit me" 按钮; dist #2466: [dist] 分发存档不包括所有批处理脚本; java #3269: [java] 修复 MethodTypeResolution 中的 NPE; java-design #2780: [java] 文档中的 DataClass 例子导致了错误的漏报; #2987: [java] 新规则:公共和受保护的静态字段必须是最终的; #2329: [java] Java 的 Cognitive complexity 规则; javascript: #699: [javascript] 更新 Rhino 库至 1.7.13; #2081: [javascript] 解析 Javascript 文件时出现 OutOfMemoryError 故障; …… 更多详情可查看:https://github.com/pmd/pmd/releases/tag/pmd_releases%2F6.35.0

优秀的个人博客,低调大师

PMD 6.34.0 发布,多语言静态代码自动分析工具

PMD 是一个代码分析器,能够帮助发现常见的编程问题,比如未使用的变量、空的 catch 块、不必要的对象创建等等。最初仅支持 Java 代码,目前还可支持 JavaScript、Salesforce.comApex 和 Visualforce、PLSQL、Apache Velocity、XML 和 XSL 。 PMD 6.34.0 正式发布,本次更新内容如下: 新规则 新的 Java 规则 UseStandardCharsets 可以查看 Charset.forName. 的使用情况,因此可以使用 StandardCharsets 来代替,该规则也是 Java 快速启动规则集( rulesets/java/quickstart.xml)的一部分; 新的 Java 规则 UnnecessaryImport 取代了以下规则 UnusedImports、 DuplicateImports、 ImportFromSamePackage 和 DontImportJavaLang,该规则也是 Java 快速启动规则集( rulesets/java/quickstart.xml)的一部分; 修改后的规则 Apex 规则 ApexCRUDViolation 不再忽略 getters,并且还标记了 SOQL/SOSL/DML 操作在 getters 中没有访问许可检查。这对于 VF getter 方法将产生误报,但我们无法可靠地检测一个 getter 是否是 VF getter。在这种情况下,违规行为应该被制止。 废弃的规则 java-bestpractices UnusedImports: 使用 UnnecessaryImport 规则代替 java-codestyle DuplicateImports:使用 UnnecessaryImport 规则来代替。 DontImportJavaLang:使用 UnnecessaryImport 规则来代替。 java-errorprone ImportFromSamePackage:使用 UnnecessaryImport 规则来代替。 修正的问题 apex-performance OperationWithLimitsInLoopRule: 支持更多限制消耗的静态方法调用 apex-security ApexCRUDViolationRule 未能报告 COUNT() 查询中的 CRUD 违规情况; ApexCRUDViolationRule 在非 VF getter 上误报; java-bestpractices 使用 StandardCharsets 而不是 Charset.forName; UnusedAssignment 在有嵌套记录时崩溃; java-codestyle 新规则 UnnecessaryImport,弃用 DuplicateImports、 ImportFromSamePackage、UnusedImports; java-errorprone CloseResource: 支持 Lombok 注解; CheckSkipResult: 使用模式绑定时的 NPE; 更多详情可查看:https://github.com/pmd/pmd/releases/tag/pmd_releases%2F6.34.0

优秀的个人博客,低调大师

PMD 6.33.0 发布,多语言静态代码自动分析工具

PMD 是一个代码分析器,能够帮助发现常见的编程问题,比如未使用的变量、空的 catch 块、不必要的对象创建等等。最初仅支持 Java 代码,目前还可支持 JavaScript、Salesforce.com Apex 和 Visualforce、PLSQL、Apache Velocity、XML 和 XSL 。 PMD 6.33.0 正式发布,本次更新内容如下: 新特性和值得注意的地方: PLSQL 解析排除 PMD PLSQL 解析器可能无法顺利解析每个有效的 PL/SQL 代码。为了在这样的文件上仍然使用 PMD,你现在可以将某些行标记为从解析器中排除。 外部贡献: #3161: [plsql] 在 SQL*Plus 脚本中添加了对词法参数的支持,允许排除解析器无法理解的行; #3167: [java] 改正快速入门规则集中的错别字。 修复的问题: apex-design #3142: [apex] ExcessiveClassLength 在同一个类上有多个警告; java #3117: [java] 解析嵌套在 lambdas 中的无效代码时的无限循环; #3145: [java] 使用"record"作为变量名时出现解析异常; java-bestpractices #3118: [java] UnusedPrivateMethod 在将 lombok.val 作为参数传递时误报; #3144: [java] GuardLogStatement 可以有更详细的例子; #3155: [java] GuardLogStatement:未加防护的方法调用时出现漏报; #3160: [java] MethodReturnsInternalArray 不考虑静态最终字段和以空数组初始化的字段; java-errorprone #3146: [java] 当使用 String.format 时,InvalidLogMessageFormat 检测失败; #3148: [java] CloseResource 带有 Objects.nonNull 的误报; #3165: [java] 在变量中使用 String.format 时,InvalidLogMessageFormat 检测失败; java-performance #2427: [java] ConsecutiveLiteralAppend 在 lambda 内部带有 builder 的误报; #3152: [java] ConsecutiveLiteralAppends 和 InsufficientStringBufferDeclaration:带有 switch 表达式的 FP plsql #195: [plsql] “&”符号在 SQL 文件中引起 PMD 处理错误——文件中的词法错误。 更多详情可查看:https://github.com/pmd/pmd/releases/tag/pmd_releases%2F6.33.0

优秀的个人博客,低调大师

PMD 6.26.0 发布,多语言静态代码自动分析工具

PMD 6.26.0 发布了。PMD 是一个代码分析器,能够帮助发现常见的编程问题,比如未使用的变量、空的 catch 块、不必要的对象创建等等。最初仅支持 Java 代码,目前还可支持 JavaScript、Salesforce.com Apex 和 Visualforce、PLSQL、Apache Velocity、XML 和 XSL 。 这是一个小的更新版本,处理了156 项 commit,关闭了43 项 PR,主要更新内容包括: 新规则: 新的 Java 规则UnusedAssignment(java-bestpractices)查找从未使用过且无用的变量分配。新规则应该被完全取代 DataflowAnomalyAnalysis。 修改的规则: 现在 Java 规则ArrayIsStoredDirectly(java-bestpractices) 默认会忽略私有方法和构造函数,可以通过将新属性设置 allowPrivate为“false”来还原旧行为。 此外修复了一些 bug,并有 API 变更,详情查看更新说明: https://github.com/pmd/pmd/releases/tag/pmd_releases%2F6.26.0

优秀的个人博客,低调大师

浅谈 Spark 的多语言支持(修订版)

作者:郑锴,花名铁杰,阿里巴巴高级技术专家,Apache Hadoop PMC,Apache Kerby 创立者。深耕分布式系统开发和开源大数据多年,先后专注在安全,存储和计算领域。之前在 Intel,目前转战阿里云上,致力于提供更好用更有弹性的 Hadoop/Spark 大数据平台。 Spark 设计上的优秀无容置疑,甫一出道便抢了 Hadoop 的 C 位,在开源大数据的黄金十年里一时风头无两,在人工智能时代的当下仍然能够与时俱进,不可谓不牛逼。架构和设计上的卓越,不遑多言,美中不足之处自然也有不少,比如调度模型跟 MapReduce 这种计算范式过于耦合,Spark 最近引入 Barrier 调度模式就是为了支持深度学习这种新的计算类型,所幸在于对框架的改动不会伤经动骨。有些缺陷则不然,影响全局,调整起来绝非易事。这儿我主要想

优秀的个人博客,低调大师

设计细节-----适配粒度权限设计

不积跬步无以至千里,在这里,总结一下自己最近的工作积累。 前言:CRM&OA类系统的设计负责度往往是在业务上,而业务上的复杂度,通常是由不同用户在不同业务场景下的各种可操作性决定的。就是说理清了系统用户在不同场景下的操作权限,业务脉络就很清晰了。 记录下,针对最近做的一套管理系统的权限设计方案,复杂性体现在下面的描述当中: 1.这里说的权限是指数据权限以及数据特权,并非菜单权限。 2.默认数据权限规则: a.登录用户是普通员工,默认情况下(无数据特权)只能看到自己创建的数据,比如说,业务主任下挂接的经销商。 b.登录用户是管理人员,默认情况下(无数据特权)可以看到自己创建的数据,以及所管理部门和部门下子部门下(一直迭代到末端部门节点)所有员工创建的数据。 3.含数据特权 a.登录用户是普通员工,有数据特权,可以看到自己创建的数据以及数据特权部门下所有数据。 b.登录用户是管理人员,有数据特权,可以看到2-b所述的所有数据以及数据特权部门下所有数据。 4.数据特权的赋值最小单位根据业务要求设计为部门,也就是,为某个用户赋值一组数据特权,可以理解为为该用户赋予查询特权部门下的所有数据 5.非部门组织机构内部人员权限的限定(组织机构外人员不含数据特权) a.业务要求,组织机构之外,还有两种角色需要参与到业务处理过程当中,属地化业务员:规定可以操作所属经销商下的所有数据 b.经销商:可以操作该用户所有数据 实现思路: 设计严格遵守开闭原则,在需要授权的地方,过滤权限。代码入口为 --UserUtils.screeningAndProcessingEn(param); 例子部分代码如下: public JSONObject getPageList(Map param) throws Exception { param.put("search_type", "1"); UserUtils.screeningAndProcessingEn(param); ................. BeanUtils.populate(dto, param); ................ try{ getTimeRange(kjTerminalNode); lists = KjTerminalNodeService.appOauthFindList( kjTerminalNode); ................... return json; } @SuppressWarnings("unchecked") public static void screeningAndProcessingEn(Map params) throws Exception { // TODO Auto-generated method stub List<String> users = new ArrayList<String>(); Map<String, String> role = getRole(params); if (Tools.str(role.get("roleName"), "").indexOf("属地业务员") >= 0) { users.add(Tools.str(role.get("id"), "")); params.put("dealerList", kjDealerCoverMapper.getDealerBySd(users)); } else if (Tools.str(role.get("roleName"), "").indexOf("经销商") >= 0) { List<String> list = new ArrayList<>(); list.add(Tools.str(role.get("id"), "")); params.put("dealerList",list); }else { UserUtils.setUserAndOffice(params); /*users.addAll(dto.getUserList()); results.addAll(kjDealerCoverMapper.getDealerByBm(users));*/ //业务主任及以上,不通过经销商获取数据 } if (Tools.str(params.get("search_type"), "").equals("1")) { UserUtils.searchProcessing(params); }else if (Tools.str(params.get("search_type"), "").equals("2")) { UserUtils.searchProcessing2(params); } } @SuppressWarnings("unchecked") public static void setUserAndOffice(Map params){ //数据权限 User user = UserUtils.getByLoginName((String)params.get("loginName")); /*AuthorityResponse<Office> offices = officeService.getAutorOfficeEh(user.getId()); if(null != offices.getResults() && offices.getResults().size() > 0) { List<String> list = new ArrayList<>(); for (Office item : offices.getResults()) { list.add(item.getId()); } params.put("officeList", list); }*/ //不再使用获取部门,获取部门封装到sql层直接调用 String offices = userMapper.getOfficeString(user); if (StringUtils.isNotBlank(offices)) { params.put("officeList", Tools.asList(Tools.str(offices, "").split("[|]"))); LOGGER.debug("==============当前登录者可以查看部门="+JSONArray.fromObject(Tools.asList(offices.split("[|]"))).toString()); }else { LOGGER.debug("==============当前登录者没有可以查看部门"); params.put("officeList",new ArrayList<>()); } List<String> list2 = new ArrayList<>(); list2.add(user.getId()); params.put("userList", list2); LOGGER.debug("当前登录者可以查看科室="+params.get("officeList")+"==============当前登录者可以查看用户="+params.get("userList")); //searchProcessing(params); } -->screeningAndProcessingEn的具体实现细节 -->setUserAndOffice(params); -->userMapper.getOfficeString(user); -->getAutorOfficeEh(user.getId()); -->searchProcessing(params); 权限过滤采用约定好的封装数据格式,然后层层装配数据,生成相应的查询sql,在dao层实现数据的统一过滤,和业务完全解耦,只需要在业务开始前,执行screeningAndProcessingEn()方法即可完成对权限的过滤,或者是在方法上标上@PerminssionFilter注解即可。根据自定义annotation结合aspect的前置通知实现,提供了对权限过滤的注解支持。 setUserAndOffice根据约定好的数据格式,封装好该登录用户可以查看的部门,具体实现是userMapper.getOfficeString(user)和getAutorOfficeEh(user.getId());两种方式。userMapper.getOfficeString(user)的设计是基于mysql函数(写了一个根据用户id,根据一定规则获取部门的函数),设计他是因为最早的方案getAutorOfficeEh(user.getId());是在代码层面根据权限规则递归获取部门等信息,经过测试,发现响应比较慢,一条设计到过滤权限的查询,有时需要3S才能响应。 给出getAutorOfficeEh(user.getId())的代码实现: public AuthorityResponse<Office> getAutorOfficeEh(String userId,Boolean onlyDownLevel,Boolean size ){ List<Office> results = Lists.newArrayList(); //List<Office> results = new ArrayList<Office>(); AuthorityResponse<Office> response = new AuthorityResponse<Office>(); User user = UserUtils.get(userId); String roleType=""; //get current user roles List<Role> roleList = Lists.newArrayList(); roleList = user.getRoleList(); if (roleList.size()>0) { //handle the role type roleType = getHignRoleType(roleList); } //这里混入数据特权 since 2018-5-2 String officeIds = user.getOfficeIds(); if (officeIds!=null && ! "".equals(officeIds)) {// has privilege /************************ * step 3 the type of user role is manager ********************/ if (roleType.equals(RularUtils.MANAGE_TYPE)) { // handle the situation 1 has privilege and the type of user role is manager //封装数据特权部门 if (onlyDownLevel) { handleAuthorityOffice(officeIds,results); }else { handleAuthorityOffice1(officeIds,results); } //封装本身管辖部门 Office office = user.getOffice(); if (onlyDownLevel) { if (office != null) { ergodicUni(results, office); } }else { if (office != null) { ergodicUni1(results, office); } } response.setStatus(0); response.setMsg("角色为管理人员,并且有数据特权,部门查询成功"); response.setResults(results); } else { /********************************** * step 4 the type of user role is staff *******/ // handle the situation 2 has privilege and the type of user role is staff //封装数据特权部门 if (onlyDownLevel) { handleAuthorityOffice(officeIds,results); }else { handleAuthorityOffice1(officeIds,results); } response.setStatus(0); response.setMsg("角色为普通人员,并且有数据特权,部门查询成功"); response.setResults(results); } } else {// do not has privilege /********************************** * step 5 the type of user role is manager *******/ if (roleType.equals(RularUtils.MANAGE_TYPE)) { // handle the situation 3 has't privilege and the type of user role is manager Office office = user.getOffice(); if (onlyDownLevel) { if (office != null) { ergodicUni(results, office); } }else { if (office != null) { ergodicUni1(results, office); } } response.setStatus(0); response.setMsg("角色为管理人员,没有数据特权,部门查询成功"); response.setResults(results); } else { // handle the situation 4 has't privilege and the type of user role is staff if (size) { results.add(user.getOffice()); } response.setStatus(0); response.setResults(results); response.setMsg("当前用户为普通员工且没有数据特权"); } } // 这里混入数据特权 end return response; }此方法是权限过滤的核心,是文章开始权限详细说明的代码实现。 searchProcessing(params)权限过滤的最后一步,封装高级查询参数。 最终,过滤权限代码在mapper中生效,通过mybatis动态的生成响应的sql去执行。这个过程是需要约定的 ......<where> a.status = '1' and (1 = 2 <if test="officeList != null and officeList.size() > 0 "> <foreach item="item" index="index" collection="officeList"> or v.parent_ids like CONCAT(#{item}, '%') </foreach> </if> <if test="userList != null and userList.size() > 0 "> <foreach item="item" index="index" collection="userList" > or v.businessMaster_id = #{item} </foreach> </if><if test="dealerList != null and dealerList.size() > 0 "> <foreach item="item" index="index" collection="dealerList"> or v.id = #{item} </foreach> </if> ) <if test="id != null and id != '' "> AND a.id = #{id} </if> <if test="searchOfficeParams != null and searchOfficeParams.size() > 0 "> <foreach item="item" index="index" collection="searchOfficeParams"> and v.parent_ids like CONCAT(#{item}, '%') </foreach> </if> <if test="searchRegionParams != null and searchRegionParams.size() > 0 "> <foreach item="item" index="index" collection="searchRegionParams"> and kr.idpath like CONCAT(#{item}, '%') </foreach> </if>在此做个总结。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册