## 代码提交审查清单 ### 代码风格 * 所有文件的换行符使用 Unix 格式(LF或`/n`),禁止使用 Windows 格式(CRLF或`/r/n`) * 在Linux/Mac下提交时,文件不得设置`x`执行权限 * Java文件import类禁止使用`*` * 不需要的代码直接删除 ### SQL * 所有SQL不能放在业务代码中,必须写在独立的SQL文件中 * SQL必须兼容Oracle和MySQL,无法兼容需使用Clause区别差异 * SQL中所有主句的变量,在Param参数中设置为非空 * SQL中in绑定变量,必须使用ArrayList参数 * 所有SQL必须有单元测试案例 * SQL中有Clause的,必须有多个单元测试案例测试不同的SQL组合 ### Controller * 使用VO对象接受前端参数 ### 单元测试验证 - 提交主线版本的代码必须完整的执行SQL单元测试进行SQL验证 - 需要先将lis-framework-base中的SysConst的下面变量设置成true - SQL_JUNIT_TEST_IND - SQL_JUNIT_TEST_GRP - SQL_JUNIT_TEST_EASYQUERY - 使用maven命令`mvn clean`清除已有编译结果 - 因上述变量为final,必须执行清除 - 使用maven命令`mvn test`执行单元测试 - 检查所有输出中没有fail的执行结果。如果有,则需要进行修正 - MySQL和Oracle两个不同数据库下都需要执行通过 ## [LIS 代码规范](http://git.sinosoft.net/LIS7/CodingGuide) * [1 前言](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Preface.md) * [2 项目结构规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Project.md) * [3 HTML 编码规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/HTML.md) * [4 JavaScript 编码规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/JavaScript.md) * [5 Java 编程规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Java.md) * [6 数据库及 SQL 规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Database.md) * [7 多语言开发规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/i18n.md) * [8 设计规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Design.md) ## LIS 2022 技术框架更新 + Springboot升级到 2.6.6 + JDK最低版本 8,不再支持 JDK7 + Tomcat最低版本 8.5 ## LIS 2021 技术框架更新 + 文件路径开发规范 * 严禁使用数据库LDSysVar存储文件路径信息 * 严禁使用以下方式获取物理路径: * `request.getSession().getServletContext().getResource("/").getPath()` * `session.getServletContext().getRealPath("/")` * `application.getRealPath("/")` * 具体规范参见 [文件路径开发规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/File.md) ## LIS 2020 技术框架更新 ![开发框架的变化](./DevArch2020.png) + 全面使用VO对象 * 前端MulLine定义必须以Grid结尾 * 否则当MulLine只有一行数据时,后端VO将无法以数组形式获取数据 * 其他变化详见新版 [Controller使用规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Controller.md) - 全面取消UI类,不再需要开发 + SQL全面从业务代码中剥离,与Schema一同构成独立的DAO层 * 所有SQL必须在独立的SQL文件中 * 禁止使用`new SQLwithBindVariables`产生SQL,全部从SQL类中获取 * 需要区分 单表SQL 和 多表SQL * 详见 [SQL开发规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/SQL.md) - 打印模版文件后移 * 放在service模块的`/src/main/resources`下 * 不再放在web模块下 - Schema支持@Version乐观锁注解 * 表现: * Schema在Version控制字段上有@Version注解 * 当前仅支持数字版本记录 * 定义: * 对需要并发控制的表,新增一个int类型的字段,该字段必须设置默认值且为1。 * 不能使用0作为默认值,否则与Schema int类型默认值相同,在使用db.query方法时会失效 * 如果使用PDM生成Schema,需要在PMD的Column的Keyword信息中增加关键词`@Vesion` * 如果连接数据库生成Schema,需要在数据库的列注释上增加关键词`@Version` * @Version标记的几种写法 | 写法 | 是否锁行 | 是否允许执行Update语句 | 控制效果 | | --- | --- | --- | --- | | @Version | 否 | 是 | 最弱 | | @Version(lock) | 是 | 是 | 弱 | | @Version(nosql) | 否 | 否 | 强 | | @Version(nosql+lock) | 是 | 否 | 最强 | * SQL操作限制`暂缓实现` * @Version的sqlExecution参数如果为false,则该表无法执行SQL Update语句,只能使用Schema方式更新 * Lock锁表限制`暂缓实现` * @Version的lock参数如果为true,该行数据在Schema执行`update`前先执行`select for update` * 使用: * 没有明显不同,开发者不用关心@Version字段,由系统自动处理。 * DB.update() / DBSet.update() / MMap.put(Schema, Update) / MMap.put(Set, Update) * 通常需要先查询,再更新(MMap.put默认支持自动查询) * 未查询的更新会报错 + SchemaSet支持forEach方式遍历 * 可以使用`for (XXXSchema schema : XXXSet)` 遍历了Set中的Schema对象了 - SSRS支持forEach方式遍历 * 使用`for (SSRS.RowData rowData : ssrs)` 遍历了SSRS中的行数据 * 使用 `int rowNum = rowData.getRowNum()` 获取行号(从`0`开始,而不是`1`) * 使用 `String colI = rowData.getData(i)` 获取本行第i列数据(从`0`开始,而不是`1`) * 使用 `String[] row = rowData.getData()` 获取本行所有数据 + VData变化 * 用法改为 `mInputData.get(GlobalInput.class, 0)` * 不再支持`(GlobalInput) mInputData.getObjectByObjectName("GlobalInput", 0)` - MMap变化 * 用法改为`mMap.put(xxxSchema, MMap.Action.INSERT)` * 不再支持`mMap.put(xxxSchema, "INSERT")` 用法 * MMap可放入的对象 * Schema * SchemaSet * SQLwithBindVariables * MMap.Action支持的Action包括: * INSERT、DROP、TRUNCATE、CREATE、UPDATE、DELETE * SELECT * DELETE_INSERT * BLOBINSERT、BLOBUPDATE、BLOBDELETE + @Transaction事务统一管理 * 事务统一管理是指:或者全部提交,或者全部回退。 * 在Controller中请求方法上增加@Transaction注解,在整个调用链中将统一事务管理。 * 有异常,全部rollback; * 执行过程中有一个rollback,全部rollback; * 其他情况下,默认提交。 * 如果业务逻辑需要手动rollback,请使用`DBConnPool.rollback()`; * 不支持自定义线程的事务统一管理。 ## LIS 2020 * LIS7业务功能升级,包括多主险、多投保人、家庭单、豁免责任、主流重疾等业务功能。 ## LIS 2019 * 版本号使用规范 * 只允许在主POM文件中设置版本号 * 其他任何子模块都不得使用具体版本号 * 包括第三方依赖,Maven插件等 * EasyScan 解耦调用规范 * 通过Java API调用 * 直接使用的模块 * pom中引入依赖:lis-component-easyscan-api * 通过EasyScanFactory获取所需的API接口类后,使用所需的API方法即可。 * 通过看API上的Swagger注解了解使用说明 * 部署: * 在lis-web中增加补充依赖:lis-component-easyscan-impl * 通过URL调用的 * 请阅读 [EasyScan Web-API使用说明](./lis-module-easyscan-common-web/README.md) * Maven须使用3.5.0以上版本 * 所有pom文件使用了${revision}占位符统一管理LIS版本号,${revision}需要Maven3.5.0以上版本支持 * 详见: https://maven.apache.org/maven-ci-friendly.html * IntelliJ IDEA等IDE内置Maven低于3.5.0的,需要修改其配置 * 使用JDK7可能出现“Failed to execute goal org.codehaus.mojo:flatten-maven-plugin:1.1.0:flatten (flatten)”错误 * 切换到JDK8运行,成功一次后,再继续使用JDK7 * flatten-maven-plugin插件主要用与在mvn install/depoly时将${revision}变量自动替换成指定的版本号,确保仓库中pom文件正确 * Schema及Maker升级 * 最新版本的LIS使用了lombok,使用IDE开发需要安装对应插件 * 下载地址: https://projectlombok.org/download * Eclipse安装: https://projectlombok.org/setup/eclipse * IntelliJ IDEA安装: https://projectlombok.org/setup/intellij * LIS从2019开始是多语言版本,所有开发(WEB/JAVA/SQL)都必须支持多语言 * 参看 [多语言开发规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/i18n.md) * LIS从2019开始使用Spring Controller,不再使用Save.jsp形式 * JSP中禁止书写Java逻辑 * JSP中只能使用JDK中的类,以及lis-framework-base中的LIS系统Java类,其他任何Java类都不能使用! * 参看 [Controller使用规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Controller.md) * SQL书写规范升级 * 参看 [SQL新规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/SQL.md) * ExeSQL、SchemaDB类、MMap(PubSubmit)不再支持String的SQL操作,LIS所有SQL必须使用绑定变量形式! * 前台SQL查询升级(EasyQuery) * JS中直接写完整SQL查询不再支持,已无法使用 * 参看 [EasyQuery新规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/EasyQuerySQL.md) * "双击下拉选择"控件升级(ShowCodeList和CodeQueryBL) * 参看 [CodeQuery新规范.md](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/CodeQuerySQL.md) * 读写分离支持 * 在SchemaDB和ExeSQL中可以传入只读数据源的标志 * 在@SQL注解中可以通过设置readOnly属性 * 在Controller的方法上增加@ReadOnly注解 * 整个调用链全部会使用只读数据源 * 日志记录统一使用slf4j * `注意:BusinessDelegate不再使用,直接new对象即可!` ## LIS 简易使用说明 * 不使用IDE * 使用`git checkout`合适的分支 * 修改`lis-framework-common/src/main/resources/datasource.yml`数据库相关信息 * 在根目录下使用`mvn package`命令编译打包 * `lis-web/target/lis.war`即是最终的应用! * 使用IDEA开发 * 在IDEA中增加"Lombok"插件 * 在IDEA中使用"Open"指向本项目所在目录直接打开 * 调整IDEA的Maven(Newest)、SDK(1.8+)为合适版本 * 在"Run/Debug Configurations"中增加Tomcat配置 * 设置合适的Tomcat版本 * 设置"On 'Update' action"和"On frame deactivation"为"Update classes and resources" * 设置"Deployment"为"lis-web:war: exploded" * 设置"Application context"为合适的路径 * 启动Tomcat配置Run/Debug * IDEA控制台在Windows下乱码 * 在点击菜单"Help->Edit Custom VM Options",在"idea.vmoptions"中增加一行:-Dfile.encoding=UTF-8 * 在Tomcat配置"Vm options"中添加:-Dfile.encoding=UTF-8 * 管理员账号:001/admin001 ## LIS7 2018 编译说明 * ~~JDK7编译~~ 不再支持JDK7 * ~~需要调整JDK的Classpath设置,将jre/lib/plugin.jar放在jre/lib/jfxrt.jar之前~~ * ~~两个系统jar中都存在netscape.javascript.JSObject类,但我们使用的是plugin.jar下的~~ * OpenJDK编译 * 缺少netscape.javascript.JSObject类,需要复制OracleJDK下jre/lib/plugin.jar到OpenJDK里 * 第三方Jar说明 * 公网非中央库 * ojdbc6-11.2.0.3.jar * kaptcha-2.3.2.jar * itextasian-1.5.2.jar * QRCode_swetake-3.0.0.jar * jimi-1.0.jar * 润乾报表私有 * dm-1.0.jar * guide-1.0.jar * report-1.0.jar * icu4j-3.4.5.jar * report5StaticHtml-1.0.jar * itext2_rq-1.0.jar * LIS私有 * F1J9Swing-1.0.jar * im-1.0.jar等 * 公网中央库 * 其他所有 ## LIS7 2018 部署说明 * 单个Web并不能直接运行,需要合并公共Web才可运行 * lis-web 为合并部署运行设计,根据需要在lis-web的dependency中添加所需的模块即可 * 每个模块可以在自己的web中增加依赖对应的service,在这里只引用web * 也可以在模块自己的web中不含service,在这里使用"Web+Service"组合的模块引用 * 建议使用此模式,能大大降低项目部署打包占用的磁盘空间(20G -> 3G),提高打包速度 * 默认使用配置 * 最基本的Web(+Service) * lis-framework-web(+service) 公共页面 * lis-logon-web(+service) 登录框架 * 本项目结构是研发使用,正式项目部署请根据项目情况拆分此项目 * Websphere与Weblogic部署 * 在Websphere下部署时需要删除web.xml文件(WAS9下测试) * 在Weblogic下部署需要确保存在web.xml文件和weblogic.xml文件(Weblogic12c下测试) * web.xml和weblogic.xml文件在"lis-framework-web/src/main/webapp/WEB-INF/"下 ## LIS7 2018 架构说明 * 详见 [代码规范之项目结构规范](http://git.sinosoft.net/LIS7/CodingGuide/blob/master/Project.md)