Commit b88e3a1f authored by zydgitboox's avatar zydgitboox

Track 16 files into repository.

- untracked assets/mvn_archetype_plugin.png
- modified codeStyle.md
- modified git-guide.md
- modified liquibase-use.md
- modified project-create.md
- removed 前端组件/grid.md
- modified 前端组件/hlsDataSource.md
- modified 前端组件/hlsDatePicker.md
- untracked 前端组件/hlsGrid.md
- modified 前端组件/hlsMaskedTextBox.md
- modified 前端组件/hlsPage.md
- modified 前端组件/hlsTlEdit.md
- untracked 后端开发/database-config.md
- untracked 后端开发/database-init.md
- modified 框架功能描述/jad.md
- modified 融租易开发手册.md

Auto commit by GitBook Editor
parent a0edb5e8
## [一、后端开发规范](id:backEndDev) ## [一、后端开发规范](id:backEndDev)
1. 所有的项目文件必须采用UTF-8编码,IDEA及Eclipse需要手动设置项目编码以及编译编码。 1. 所有的项目文件必须采用UTF-8编码,IDEA及Eclipse需要手动设置项目编码以及编译编码。
- Eclipse中修改项目编码的方法参考:[Eclipse修改编码方法](http://jingyan.baidu.com/article/647f0115b0c9887f2148a822.html) - Eclipse中修改项目编码的方法参考:[Eclipse修改编码方法](http://jingyan.baidu.com/article/647f0115b0c9887f2148a822.html)
- IDEA中修改项目编码的方法参考:[IDEA修改编码方法](http://jingyan.baidu.com/article/948f5924e4de57d80ff5f998.html]) - IDEA中修改项目编码的方法参考:[IDEA修改编码方法](http://jingyan.baidu.com/article/948f5924e4de57d80ff5f998.html])
2. 提供他人使用的接口,原则上不允许修改**方法签名**,若是不再推荐使用,可以加**@ Deprecated**注解,同时提示新的接口名称。 2. 提供他人使用的接口,原则上不允许修改**方法签名**,若是不再推荐使用,可以加**@ Deprecated**注解,同时提示新的接口名称。
3. **DTO**类中所有的字段,不允许设置**默认值**,且DTO必须**重写toString()方法** 3. **DTO**类中所有的字段,不允许设置**默认值**,且DTO必须**重写toString()方法**
4. 原则上不允许使用递归,部分情况可以使用尾递归。 4. 原则上不允许使用递归,部分情况可以使用尾递归。
5. 代码中不允许出现魔法值,即未定义的任何常量。错误的用法不限于以下形式: 5. 代码中不允许出现魔法值,即未定义的任何常量。错误的用法不限于以下形式:
```java ```java
if(user.getStatus() == 5){ if(user.getStatus() == 5){
// 5即为魔法值,应当避免使用 // 5即为魔法值,应当避免使用
// do something // do something
} }
// 推荐使用常量 // 推荐使用常量
private static final int EXPIRED_USER_STATUS = 5; private static final int EXPIRED_USER_STATUS = 5;
if(user.getStatus() == EXPIRED_USER_STATUS){ if(user.getStatus() == EXPIRED_USER_STATUS){
// do something // do something
} }
``` ```
6. 在类中定义的常量、变量及方法,需要严格控制访问修饰符,提供自己使用的设为private,可以供别人使用的可以设为public、protected等。 6. 在类中定义的常量、变量及方法,需要严格控制访问修饰符,提供自己使用的设为private,可以供别人使用的可以设为public、protected等。
7. 所有的覆写方法,必须加**@Override**注解,防止错误的拼写导致意外。 7. 所有的覆写方法,必须加**@Override**注解,防止错误的拼写导致意外。
8. Long类型的数据在初始化时必须使用大写的字母L, Double类型的数据必须使用大写的字母D。常见形式如 8. Long类型的数据在初始化时必须使用大写的字母L, Double类型的数据必须使用大写的字母D。常见形式如
- **Long time=10000L** - **Long time=10000L**
- **Double money=12.3D** - **Double money=12.3D**
9. 所有的数值的包装类型之间的比较不允许使用<>、==之类的简单运算符,需要使用equals方法或者compareTo方法。 9. 所有的数值的包装类型之间的比较不允许使用<>、==之类的简单运算符,需要使用equals方法或者compareTo方法。
10. 所有方法的引用类型参数,若是未添加**@NotNull**注解,必须先进行null判断。 10. 所有方法的引用类型参数,若是未添加**@NotNull**注解,必须先进行null判断。
11. 捕获异常一般不允许直接捕获基类Exception,也不可捕获异常后不进行处理。方法中也不可抛出基类Exception。 11. 捕获异常一般不允许直接捕获基类Exception,也不可捕获异常后不进行处理。方法中也不可抛出基类Exception。
12. 部分异常若是上层(调用层)不能解决,则不允许抛出。最外层若是出现异常必须自行处理,不可将异常信息直接展示给用户。 12. 部分异常若是上层(调用层)不能解决,则不允许抛出。最外层若是出现异常必须自行处理,不可将异常信息直接展示给用户。
13. 所有的日志信息**不允许使用System.out.println**输出,异常的日志信息使用**log.error**打印时,必须使用重载方法将捕获的异常作为第二个参数。如: 13. 所有的日志信息**不允许使用System.out.println**输出,异常的日志信息使用**log.error**打印时,必须使用重载方法将捕获的异常作为第二个参数。如:
```java ```java
try{ try{
// throw some exceptions // throw some exceptions
}catch(IOException e){ }catch(IOException e){
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
} }
``` ```
--- --- --- ---
## [二、后端命名规范](id:backEndName) ## [二、后端命名规范](id:backEndName)
1. 所有的命名不允许使用**拼音或者拼音英文混合**方式,但部分公认的拼音允许使用,如**shanghai,beijing**等。 1. 所有的命名不允许使用**拼音或者拼音英文混合**方式,但部分公认的拼音允许使用,如**shanghai,beijing**等。
2. 所有的命名不允许使用**下划线`_`**或者**美元符`$`**作为起始或者结束。错误的情况有不限于以下几种: 2. 所有的命名不允许使用**下划线`_`**或者**美元符`$`**作为起始或者结束。错误的情况有不限于以下几种:
- **_param** - **_param**
- **$param** - **$param**
- **param_** - **param_**
- **param$** - **param$**
- **_param$** - **_param$**
### 包命名规范 ### 包命名规范
1. 包名一般为域名倒序开头,后接项目名,再加上单数形式的名词(项目中一般使用模块代码),且全部为小写字母,如: 1. 包名一般为域名倒序开头,后接项目名,再加上单数形式的名词(项目中一般使用模块代码),且全部为小写字母,如:
- 系统功能模块:**com.hand.hls.sys** - 系统功能模块:**com.hand.hls.sys**
- 合同功能模块:**com.hand.hls.cont** - 合同功能模块:**com.hand.hls.cont**
2. 在功能模块包中一般包含如下几种形式的包: 2. 在功能模块包中一般包含如下几种形式的包:
- 存放SpringMVC的控制层代码: **controllers** - 存放SpringMVC的控制层代码: **controllers**
- 存放该模块数据库实体对象: **dto** - 存放该模块数据库实体对象: **dto**
- 存放该模块的部分组件: **components** - 存放该模块的部分组件: **components**
- 存放该模块的业务接口: **service** - 存放该模块的业务接口: **service**
- 存放该模块的业务实现类: **service.impl** - 存放该模块的业务实现类: **service.impl**
- 存放该模块的Mybatis数据库交互层代码: **mapper** - 存放该模块的Mybatis数据库交互层代码: **mapper**
- 存放该模块的工具类代码: **utils** - 存放该模块的工具类代码: **utils**
- 存放自定义的异常类代码: **exception** - 存放自定义的异常类代码: **exception**
### 类命名规范 ### 类命名规范
1. 一般类名采用Pascal命名法,所有单词的首字母大写,其余字母小写,单词与单词之间不使用**下划线_**分割,常见形式如: 1. 一般类名采用Pascal命名法,所有单词的首字母大写,其余字母小写,单词与单词之间不使用**下划线_**分割,常见形式如:
- **HlsClassName** - **HlsClassName**
- **HlsNormalClass** - **HlsNormalClass**
2. 数据库实体类一般与数据表名称相同并改为Pascal命名规则,**DTO**结尾,如: 2. 数据库实体类一般与数据表名称相同并改为Pascal命名规则,如:
- **SysUserDTO** - **SysUser**
- **SysRoleDTO** - **SysRole**
3. 抽象类命名使用**Abstract**开头,接口一般以 **I** 开头,Mybatis的mapper对象可不用 **I** 开头但必须使用**Mapper**结尾,如: 3. 抽象类命名使用**Abstract**开头,接口一般以 **I** 开头,Mybatis的mapper对象可不用 **I** 开头但必须使用**Mapper**结尾,如:
- **AbstractClass** - **AbstractClass**
- **ILog** - **ILog**
- **SysUserMapper** - **SysUserMapper**
4. 业务逻辑层接口类使用 **I** 开头,且必须以**Service**结尾;业务的实现类在接口的基础上去掉开头的字母 **I**,最后加上**Impl**,如: 4. 业务逻辑层接口类使用 **I** 开头,且必须以**Service**结尾;业务的实现类在接口的基础上去掉开头的字母 **I**,最后加上**Impl**,如:
- **ISysUserService** - **ISysUserService**
- **SysUserServiceImpl** - **SysUserServiceImpl**
5. 自定义的异常类以**Exception**结尾,如: 5. 自定义的异常类以**Exception**结尾,如:
- **UserNotFoundException** - **UserNotFoundException**
- **UserDefineException** - **UserDefineException**
6. 项目中的测试类一般以测试对象的类名开头,以**Test**结尾,如: 6. 项目中的测试类一般以测试对象的类名开头,以**Test**结尾,如:
- **SysUserServiceImplTest** - **SysUserServiceImplTest**
7. 若是采用了设计模式的类,在命名时,可在最后添加设计模式的名称,如: 7. 若是采用了设计模式的类,在命名时,可在最后添加设计模式的名称,如:
- 工厂模式: **LoggerFactory** - 工厂模式: **LoggerFactory**
- 代理模式: **UserProxy** - 代理模式: **UserProxy**
- 适配器模式: **ArrayAdapter** - 适配器模式: **ArrayAdapter**
### 变量命名规范 ### 变量命名规范
1. 成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式,即**首单词**字母都小写,后面单词的**首字母大写**。如 1. 成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式,即**首单词**字母都小写,后面单词的**首字母大写**。如
+ **hlsClassFieldName** + **hlsClassFieldName**
+ **hlsLocalParamName** + **hlsLocalParamName**
2. 数据库对象的成员变量中若是变量的类型为Boolean类型,则变量名不允许使用 **is**开头,错误的命名如下: 2. 数据库对象的成员变量中若是变量的类型为Boolean类型,则变量名不允许使用 **is**开头,错误的命名如下:
- **private Boolean isAdmin** - **private Boolean isAdmin**
### 常量命名规范 ### 常量命名规范
1. 常量的命名一般所有单词都**大写**,各个单词之间使用下划线`_`分隔,如: 1. 常量的命名一般所有单词都**大写**,各个单词之间使用下划线`_`分隔,如:
- **PI** - **PI**
- **PROJECT_PATH** - **PROJECT_PATH**
2. 常量的命名尽量使用单词表达出常量的用途及含义,力求语义清晰,不用担心名字太长,如: 2. 常量的命名尽量使用单词表达出常量的用途及含义,力求语义清晰,不用担心名字太长,如:
- 周期的第一天:**FIRST_DAY_OF_CYCLE** - 周期的第一天:**FIRST_DAY_OF_CYCLE**
- 用户允许的最大错误次数:**USER_ALLOWED_MAX_ERROR_COUNT** - 用户允许的最大错误次数:**USER_ALLOWED_MAX_ERROR_COUNT**
### 方法命名规范 ### 方法命名规范
1. 方法的命名规则采用lowerCamelCase风格,方法名的首单词字母全部小写,其余单词首字母大写,如: 1. 方法的命名规则采用lowerCamelCase风格,方法名的首单词字母全部小写,其余单词首字母大写,如:
- **walkMyWay()** - **walkMyWay()**
- **doSomething()** - **doSomething()**
2. 对数据库进行查询的方法,一般以**select、find、query**开头,后面接查询的对象,若是查询结果为List集合,对象名可变为复数,如: 2. 对数据库进行查询的方法,一般以**select、find、query**开头,后面接查询的对象,若是查询结果为List集合,对象名可变为复数,如:
- `public SysUser selectSysUser()` - `public SysUser selectSysUser()`
- `public List<SysRole> findSysRoles()` - `public List<SysRole> findSysRoles()`
3. 对数据进行数据插入的方法,一般以**insert**开头,后接插入的对象,若是允许批量插入对象,对象名可变为复数,如: 3. 对数据进行数据插入的方法,一般以**insert**开头,后接插入的对象,若是允许批量插入对象,对象名可变为复数,如:
- `public int insertSysUser(SysUser user)` - `public int insertSysUser(SysUser user)`
- `public int insertSysRoles(List<SysRole> roles)` - `public int insertSysRoles(List<SysRole> roles)`
4. 对数据库进行数据删除的方法,一般以**delete**开头,后接插入的对象,若是允许批量插入对象,对象名可变为复数,如: 4. 对数据库进行数据删除的方法,一般以**delete**开头,后接插入的对象,若是允许批量插入对象,对象名可变为复数,如:
- `public int deleteSysUser(SysUser user)` - `public int deleteSysUser(SysUser user)`
- `public int deleteSysRoleByIds(List<Long> roleIds)` - `public int deleteSysRoleByIds(List<Long> roleIds)`
5. 对数据库进行数据更新的方法,一般以**update**开头,后接插入的对象,若是允许批量插入对象,对象名可变为复数,如: 5. 对数据库进行数据更新的方法,一般以**update**开头,后接插入的对象,若是允许批量插入对象,对象名可变为复数,如:
- `public SysRole updateSysRole(SysRole role)` - `public SysRole updateSysRole(SysRole role)`
- `public int updateSysUsers(List<SysUser> users)` - `public int updateSysUsers(List<SysUser> users)`
# Git简明教程 # Git简明教程
*** ***
# 1. git四大域 # 1. git四大域
*** ***
git四大域:工作目录,暂存区,仓库,远程仓库。 git四大域:工作目录,暂存区,仓库,远程仓库。
git对文件的操作都是在四大域上进行的,文件可以在四大域内与四大域间进行各种操作。(有一个例外,进行“git stash”系列操作时,文件可能被保存到四大域外的堆栈中) git对文件的操作都是在四大域上进行的,文件可以在四大域内与四大域间进行各种操作。(有一个例外,进行“git stash”系列操作时,文件可能被保存到四大域外的堆栈中)
![](http://i.imgur.com/UB94Upo.png) ![](http://i.imgur.com/UB94Upo.png)
# 2. git常用命令 # 2. git常用命令
*** ***
![](http://i.imgur.com/jqW1Odo.png) ![](http://i.imgur.com/jqW1Odo.png)
## 1. 设置 ## 1. 设置
*** ***
### 1. `config`命令 ### 1. `config`命令
*** ***
- `git config --global user.name lavor`:配置全局用户名,若不要“--global”或者将“global”改为“local”则表示配置局部用户名 - `git config --global user.name lavor`:配置全局用户名,若不要“--global”或者将“global”改为“local”则表示配置局部用户名
- `git config --global user.email lavor@qq.com`:配置全局电子邮箱 - `git config --global user.email lavor@qq.com`:配置全局电子邮箱
- `git config --global alias.cm commit`:配置别名,为git命令配置别名,还可以配置复合操作,比如 `git config --global alias.pom 'push origin master'`注意复合操作中不可以带`-``""` - `git config --global alias.cm commit`:配置别名,为git命令配置别名,还可以配置复合操作,比如 `git config --global alias.pom 'push origin master'`注意复合操作中不可以带`-``""`
- `git config --list`:显示所有配置信息 - `git config --list`:显示所有配置信息
### 2. `help`命令 ### 2. `help`命令
*** ***
- `git help`:显示帮助信息,会显示一些常见git命令及其意义 - `git help`:显示帮助信息,会显示一些常见git命令及其意义
## 2. 创建项目 ## 2. 创建项目
*** ***
### 1. `init`命令 ### 1. `init`命令
*** ***
- `git init`:在本地初始化一个git仓库 - `git init`:在本地初始化一个git仓库
### 2. `clone`命令 ### 2. `clone`命令
*** ***
- `git clone git@github.com:lavor-zl/Github-Git.git`:从远程服务器克隆一个仓库到本地 - `git clone git@github.com:lavor-zl/Github-Git.git`:从远程服务器克隆一个仓库到本地**如果gitlab发现pull或者push出现SSL问题,先在cmd执行git config --global http.sslVerify false**
## 3. 基本操作 ## 3. 基本操作
*** ***
### 1. `add`命令 ### 1. `add`命令
*** ***
- `git add README`:添加工作目录的文件到暂存区 - `git add README`:添加工作目录的文件到暂存区
### 2. `status`命令 ### 2. `status`命令
*** ***
- `git status`:显示工作树的状态,一般有三种状态 - `git status`:显示工作树的状态,一般有三种状态
- `Untracked files`:未被跟踪的文件,表示是工作目录新增加的文件 - `Untracked files`:未被跟踪的文件,表示是工作目录新增加的文件
- `Changes not staged for commit`:工作目录中修改了文件,但是没有被添加到暂存区 - `Changes not staged for commit`:工作目录中修改了文件,但是没有被添加到暂存区
- `Changes to be committed`:添加到暂存区的文件,等待提交 - `Changes to be committed`:添加到暂存区的文件,等待提交
### 3. `commit`命令 ### 3. `commit`命令
*** ***
- `git commit -m "提交消息"`:提交暂存区的文件,带有提交消息 - `git commit -m "提交消息"`:提交暂存区的文件,带有提交消息
- `git commit -a -m "提交消息"`:跳过暂存区,直接提交工作目录中所有改变的文件,但是不能提交工作目录中新增的文件 - `git commit -a -m "提交消息"`:跳过暂存区,直接提交工作目录中所有改变的文件,但是不能提交工作目录中新增的文件
- `git commit --author=lavor -m "提交消息"`:提交暂存区的文件,并重写提交作者 - `git commit --author=lavor -m "提交消息"`:提交暂存区的文件,并重写提交作者
- `git commit --date=06.13.2016T09:00:00 -m "提交消息"`:提交暂存区的文件,并重写提交日期 - `git commit --date=06.13.2016T09:00:00 -m "提交消息"`:提交暂存区的文件,并重写提交日期
- `git commit --amend -m "提交消息"`:通过创建一个新的提交,以替换当前分支的前端。所代表的含义就是在最新一次提交的基础上进行提交。比如我们完成了最新一次提交,并且这次提交完成后我们对工作目录进行了一些修改,但是我们发现某个文件忘了添加到暂存区并提交,我们可以先添加该文件到暂存区,然后利用该命令进行提交。 - `git commit --amend -m "提交消息"`:通过创建一个新的提交,以替换当前分支的前端。所代表的含义就是在最新一次提交的基础上进行提交。比如我们完成了最新一次提交,并且这次提交完成后我们对工作目录进行了一些修改,但是我们发现某个文件忘了添加到暂存区并提交,我们可以先添加该文件到暂存区,然后利用该命令进行提交。
### 4. `reset`命令 ### 4. `reset`命令
*** ***
- `git reset`:将暂存区的所有文件重置到当前分支的HEAD - `git reset`:将暂存区的所有文件重置到当前分支的HEAD
- `git reset <commit> files`:将暂存区的指定文件重置到指定的`<commit>`,`<commit>`既可以是commit的hash(或者hash前7位)也可以是`HEAD`及其祖先,`HEAD~1`表示`HEAD`的父亲,是`HEAD`的前一次提交,没有`<commit>`时默认是`HEAD` - `git reset <commit> files`:将暂存区的指定文件重置到指定的`<commit>`,`<commit>`既可以是commit的hash(或者hash前7位)也可以是`HEAD`及其祖先,`HEAD~1`表示`HEAD`的父亲,是`HEAD`的前一次提交,没有`<commit>`时默认是`HEAD`
- `git reset [--hard|soft|mixed|merge|keep] [<commit>]`:将当前的分支重设到指定的`<commit>`,并且根据`mode`有可能更新暂存区和工作目录。`mode`的取值可以是hard、soft、mixed、merged、keep。 - `git reset [--hard|soft|mixed|merge|keep] [<commit>]`:将当前的分支重设到指定的`<commit>`,并且根据`mode`有可能更新暂存区和工作目录。`mode`的取值可以是hard、soft、mixed、merged、keep。
- `hard`:重置暂存区与工作目录到指定提交,删除`<commit>`之后的所有提交并将`HEAD`指向该提交,此操作危险指数较大(应慎用) - `hard`:重置暂存区与工作目录到指定提交,删除`<commit>`之后的所有提交并将`HEAD`指向该提交,此操作危险指数较大(应慎用)
- `soft`:暂存区与工作目录不会变化,仅仅删除`<commit>`之后的所有提交并将`HEAD`指向该提交 - `soft`:暂存区与工作目录不会变化,仅仅删除`<commit>`之后的所有提交并将`HEAD`指向该提交
- `mixed`:默认的,重置暂存区到指定提交,删除`<commit>`之后的所有提交并将`HEAD`指向该提交 - `mixed`:默认的,重置暂存区到指定提交,删除`<commit>`之后的所有提交并将`HEAD`指向该提交
- `merge``keep`用的比较少,暂时不讨论 - `merge``keep`用的比较少,暂时不讨论
**`HEAD`是指向当前分支引用的指针,该指针指向在该分支上的最后一个提交的指针。这意味着`HEAD`将是下一个创建的提交的父亲。一般来说,把你的`HEAD`作为你最后一次提交的快照,是最简单的。`HEAD~1`表示`HEAD`的前一次提交,`HEAD~2`表示`HEAD`的前两次提交,以此类推** **`HEAD`是指向当前分支引用的指针,该指针指向在该分支上的最后一个提交的指针。这意味着`HEAD`将是下一个创建的提交的父亲。一般来说,把你的`HEAD`作为你最后一次提交的快照,是最简单的。`HEAD~1`表示`HEAD`的前一次提交,`HEAD~2`表示`HEAD`的前两次提交,以此类推**
### 5. `rm`命令 ### 5. `rm`命令
*** ***
- `git rm files`:删除工作目录的文件 - `git rm files`:删除工作目录的文件
- `git rm -f files`:强制删除工作目录的文件,不做更新检查 - `git rm -f files`:强制删除工作目录的文件,不做更新检查
- `git rm --cached files`:删除暂存区的文件 - `git rm --cached files`:删除暂存区的文件
### 6. `mv`命令 ### 6. `mv`命令
*** ***
- `git mv oldfile newfile`:为文件重命名 - `git mv oldfile newfile`:为文件重命名
- `git mv files dir`:移动文件到指定目录 - `git mv files dir`:移动文件到指定目录
- `git mv -f oldfile newfile`:强制为文件重命名,即使目标文件已存在 - `git mv -f oldfile newfile`:强制为文件重命名,即使目标文件已存在
- `git mv -f files dir`:强制移动文件到指定目录名,即使目标文件已存在 - `git mv -f files dir`:强制移动文件到指定目录名,即使目标文件已存在
## 4. 分支与合并 ## 4. 分支与合并
*** ***
### 1. `branch`命令 ### 1. `branch`命令
*** ***
- `git branch`:查看所有分支 - `git branch`:查看所有分支
- `git branch branchname`:创建分支 - `git branch branchname`:创建分支
- `git branch branchname <commit>`:以特定提交为基创建分支 - `git branch branchname <commit>`:以特定提交为基创建分支
- `git branch -d branchname`:删除分支 - `git branch -d branchname`:删除分支
- `git branch -D branchname`:强制删除分支 - `git branch -D branchname`:强制删除分支
- `git branch -m [oldbranchname] newbranchname`:移动或者删除分支 - `git branch -m [oldbranchname] newbranchname`:移动或者删除分支
- `git branch -M [oldbranchname] newbranchname`:强制移动或者删除分支 - `git branch -M [oldbranchname] newbranchname`:强制移动或者删除分支
- `git branch -r`:列出所有被跟踪的远程分支 - `git branch -r`:列出所有被跟踪的远程分支
- `git branch -r -d branchname`:删除被跟踪的远程分支 - `git branch -r -d branchname`:删除被跟踪的远程分支
- `git branch -a`:列出所有本地分支与被跟踪的远程分支 - `git branch -a`:列出所有本地分支与被跟踪的远程分支
### 2. `checkout`命令 ### 2. `checkout`命令
*** ***
- `git checkout`:检查本地仓库分支与远程仓库分支的差异 - `git checkout`:检查本地仓库分支与远程仓库分支的差异
- `git checkout branchname|tagname`:切换分支或切换到指定`tag`,同名时优先切换分支 - `git checkout branchname|tagname`:切换分支或切换到指定`tag`,同名时优先切换分支
- `git checkout tags/tagname`:切换到指定`tag` - `git checkout tags/tagname`:切换到指定`tag`
- `git checkout -b branchname`:新建分支并切换到该分支上 - `git checkout -b branchname`:新建分支并切换到该分支上
- `git checkout -B branchname`:强制新建分支并切换到该分支上 - `git checkout -B branchname`:强制新建分支并切换到该分支上
### 3. `merge`命令 ### 3. `merge`命令
*** ***
- `git merge branchname`:将指定分支合并到当前分支上(默认附带提交操作),在`merge`后面使用`-m <message>`表示提交消息 - `git merge branchname`:将指定分支合并到当前分支上(默认附带提交操作),在`merge`后面使用`-m <message>`表示提交消息
- `git merge <commit>`:将指定提交合并到当前分支上 - `git merge <commit>`:将指定提交合并到当前分支上
- `git merge oldbranchname newbranchname`:将`oldbranchname`分支合并到`newbranchname`分支上 - `git merge oldbranchname newbranchname`:将`oldbranchname`分支合并到`newbranchname`分支上
- `git merge --squash branchname`:将指定分支上所有修改放入当前分支工作目录与暂存区,不提交 - `git merge --squash branchname`:将指定分支上所有修改放入当前分支工作目录与暂存区,不提交
- `git merge no--squash branchname`:将指定分支上所有修改放入当前分支工作目录与暂存区,并提交 - `git merge no--squash branchname`:将指定分支上所有修改放入当前分支工作目录与暂存区,并提交
### 4. `mergetool`命令 ### 4. `mergetool`命令
*** ***
- `git mergetool`:在“merge”命令执行之后出现冲突时执行该命令,用来解决合并的冲突,冲突解决完了不要忘了提交 - `git mergetool`:在“merge”命令执行之后出现冲突时执行该命令,用来解决合并的冲突,冲突解决完了不要忘了提交
### 5. `stash`命令 ### 5. `stash`命令
*** ***
- `git stash`:储藏工作目录与暂存区的状态到堆栈中 - `git stash`:储藏工作目录与暂存区的状态到堆栈中
- `git stash pop [stash@{id}]`:恢复到指定储藏的状态(默认是最近一次储藏的状态),并从堆栈中移除该储藏 - `git stash pop [stash@{id}]`:恢复到指定储藏的状态(默认是最近一次储藏的状态),并从堆栈中移除该储藏
- `git stash apply [stash@{id}]`:恢复到指定储藏的状态(默认是最近一次储藏的状态) - `git stash apply [stash@{id}]`:恢复到指定储藏的状态(默认是最近一次储藏的状态)
- `git stash drop [stash@{id}]`:并从堆栈中移除指定储藏(默认是最近一次储藏) - `git stash drop [stash@{id}]`:并从堆栈中移除指定储藏(默认是最近一次储藏)
- `git stash list`:显示所有储藏信息 - `git stash list`:显示所有储藏信息
### 6. `tag`命令 ### 6. `tag`命令
*** ***
同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。
- `git tag`:列出所有标签 - `git tag`:列出所有标签
- `git tag -l 'v1.*'`:列出符合一定条件的标签 - `git tag -l 'v1.*'`:列出符合一定条件的标签
- `git tag tagname`:新建标签 - `git tag tagname`:新建标签
## 5. 分享与更新项目 ## 5. 分享与更新项目
*** ***
### 1. `fetch`命令 ### 1. `fetch`命令
*** ***
- `git fetch`:下载远程仓库“origin”到本地 - `git fetch`:下载远程仓库“origin”到本地
- `git fetch remoterepository`:下载指定远程仓库到本地 - `git fetch remoterepository`:下载指定远程仓库到本地
- `git fetch remoterepository branchname`:下载指定远程仓库指定分支到本地 - `git fetch remoterepository branchname`:下载指定远程仓库指定分支到本地
### 2. `pull`命令 ### 2. `pull`命令
*** ***
- `git pull remoterepository branchname[:localbranch]`:拉取指定远程仓库指定分支到本地仓库指定分支(默认是当前分支) - `git pull remoterepository branchname[:localbranch]`:拉取指定远程仓库指定分支到本地仓库指定分支(默认是当前分支)
### 3. `push`命令 ### 3. `push`命令
*** ***
- `git push remoterepository localbranch[:remotebranch] [--tags]`:推送本地仓库指定分支到远程仓库指定分支(默认是与本地分支同名的远程分支),默认是不推送标签到远程仓库的,加上`--tags`就会推送标签 - `git push remoterepository localbranch[:remotebranch] [--tags]`:推送本地仓库指定分支到远程仓库指定分支(默认是与本地分支同名的远程分支),默认是不推送标签到远程仓库的,加上`--tags`就会推送标签
### 4. `remote`命令 ### 4. `remote`命令
*** ***
- `git remote`:查看所有与本地仓库关联的远程仓库 - `git remote`:查看所有与本地仓库关联的远程仓库
- `git remote -v`:查看所有与本地仓库关联的远程仓库,并显示`url` - `git remote -v`:查看所有与本地仓库关联的远程仓库,并显示`url`
- `git remote add remote-name remote-url`:添加与本地仓库关联的远程仓库 - `git remote add remote-name remote-url`:添加与本地仓库关联的远程仓库
- `git remote rename oldname newname`:为远程仓库重命名 - `git remote rename oldname newname`:为远程仓库重命名
- `git remote remove remote-name`:移除远程仓库 - `git remote remove remote-name`:移除远程仓库
### 5. `submodule`命令 ### 5. `submodule`命令
*** ***
- `git submodule add repository-url dir`:添加仓库到指定目录,使之成为本仓库的子模块 - `git submodule add repository-url dir`:添加仓库到指定目录,使之成为本仓库的子模块
- `git submodule init`:初始化子模块 - `git submodule init`:初始化子模块
- `git submodule update`:更新子模块 - `git submodule update`:更新子模块
**子模块是本仓库依赖的另一个仓库,但是我们不会对所依赖的仓库(子模块)进行修改,只会在必要的时候进行更新操作。** **子模块是本仓库依赖的另一个仓库,但是我们不会对所依赖的仓库(子模块)进行修改,只会在必要的时候进行更新操作。**
## 6. 考察与比较 ## 6. 考察与比较
*** ***
### 1. `show`命令 ### 1. `show`命令
*** ***
- `git show [-times]`:显示最近`times`次(默认是一次)提交的所有对象信息 - `git show [-times]`:显示最近`times`次(默认是一次)提交的所有对象信息
### 2. `log`命令 ### 2. `log`命令
*** ***
- `git log`:查看提交记录 - `git log`:查看提交记录
- `git log --all`:查看所有提交记录 - `git log --all`:查看所有提交记录
- `git log --oneline`:查看提交记录,以`oneline`形式显示,只显示一行,显示的内容时提交hash的前7位与提交消息 - `git log --oneline`:查看提交记录,以`oneline`形式显示,只显示一行,显示的内容时提交hash的前7位与提交消息
- `git log -p -times`:表示查看最近`times`次提交改变的内容 - `git log -p -times`:表示查看最近`times`次提交改变的内容
- `git log -stat [-times]`:查看最近`times`次(默认是所有)提交记录,并显示文件的差异分析 - `git log -stat [-times]`:查看最近`times`次(默认是所有)提交记录,并显示文件的差异分析
### 3. `diff`命令 ### 3. `diff`命令
*** ***
- `git diff`:查看工作目录与暂存区的差异 - `git diff`:查看工作目录与暂存区的差异
- `git diff --cached [<commit>]`:查看暂存区与指定提交(默认是HEAD)的差异 - `git diff --cached [<commit>]`:查看暂存区与指定提交(默认是HEAD)的差异
- `git diff <commit>`:查看工作目录与指定提交的差异 - `git diff <commit>`:查看工作目录与指定提交的差异
- `git diff <commit>`:查看工作目录与指定提交的差异 - `git diff <commit>`:查看工作目录与指定提交的差异
- `git diff <commit> <commit>`:查看两次指定提交的差异 - `git diff <commit> <commit>`:查看两次指定提交的差异
- `git diff branchname`:查看工作目录与指定分支的差异 - `git diff branchname`:查看工作目录与指定分支的差异
- `git diff branchname branchname`:查看两个指定分支间的差异 - `git diff branchname branchname`:查看两个指定分支间的差异
上面的所有操作后面都可以加上`-- dir`表示查看该目录下面的差异,在后面加上`>patchname.patch`表示将差异生成补丁,`patchname`是补丁的名字。 上面的所有操作后面都可以加上`-- dir`表示查看该目录下面的差异,在后面加上`>patchname.patch`表示将差异生成补丁,`patchname`是补丁的名字。
### 4. `shortlog`命令 ### 4. `shortlog`命令
*** ***
- `git shortlog`:显示总提交次数与每次提交的提交消息 - `git shortlog`:显示总提交次数与每次提交的提交消息
### 5. `describe`命令 ### 5. `describe`命令
*** ***
- `git describe [<commit>|<tag>]`:查看指定提交或者指定标签(默认是最近一次提交)的注解标签信息 - `git describe [<commit>|<tag>]`:查看指定提交或者指定标签(默认是最近一次提交)的注解标签信息
- `git desribe --tags [<commit>|<tag>]`:查看指定提交或者指定标签(默认是最近一次提交)的标签信息 - `git desribe --tags [<commit>|<tag>]`:查看指定提交或者指定标签(默认是最近一次提交)的标签信息
- `git desribe --all [<commit>|<tag>]`:查看指定提交或者指定标签(默认是最近一次提交)的引用信息 - `git desribe --all [<commit>|<tag>]`:查看指定提交或者指定标签(默认是最近一次提交)的引用信息
### 6. `reflog`命令 ### 6. `reflog`命令
*** ***
- `git reflog`:显示所有提交,下拉,推送,与切换分支操作 - `git reflog`:显示所有提交,下拉,推送,与切换分支操作
- `git reflog --all`:显示所有提交,下拉,推送操作 - `git reflog --all`:显示所有提交,下拉,推送操作
## 7. 修补 ## 7. 修补
***  *** 
### 1. `apply`命令 ### 1. `apply`命令
*** ***
- `git apply [--index|--cached] patchname.patch`:在暂存区与工作目录或者暂存区(默认是工作目录)打补丁 - `git apply [--index|--cached] patchname.patch`:在暂存区与工作目录或者暂存区(默认是工作目录)打补丁
- `git apply --reverse|-R patchname.patch`:反向打补丁 - `git apply --reverse|-R patchname.patch`:反向打补丁
- `git apply --reject patchname.patch`:打补丁,将没有冲突的文件合并,将有冲突的文件标记出来,并生成对应的`.rej`文件 - `git apply --reject patchname.patch`:打补丁,将没有冲突的文件合并,将有冲突的文件标记出来,并生成对应的`.rej`文件
### 2. `cherry-pick`命令 ### 2. `cherry-pick`命令
*** ***
- `git cherry-pick <commit>`:将另一个分支上面的指定提交应用到当前分支上 - `git cherry-pick <commit>`:将另一个分支上面的指定提交应用到当前分支上
- `git cherry-pick banchname`:将指定分支上面的最后一次提交应用到当前分支上 - `git cherry-pick banchname`:将指定分支上面的最后一次提交应用到当前分支上
### 3. `rebase`命令 ### 3. `rebase`命令
*** ***
- `git rebase branchname`:将指定分支上所有修改应用到当前分支上 - `git rebase branchname`:将指定分支上所有修改应用到当前分支上
- `git rebase branchname branchname`:将第一个指定分支上所有修改应用到第二个分支上 - `git rebase branchname branchname`:将第一个指定分支上所有修改应用到第二个分支上
`rebase`加上`-i`会提供交互式的变基操作,在交互式操作中常用命令: `rebase`加上`-i`会提供交互式的变基操作,在交互式操作中常用命令:
![](http://i.imgur.com/zD7PgjP.png) ![](http://i.imgur.com/zD7PgjP.png)
### 4. `revert`命令 ### 4. `revert`命令
*** ***
- `git revert <commit>`:恢复一个指定提交 - `git revert <commit>`:恢复一个指定提交
## 8. 调试 ## 8. 调试
*** ***
### 1. `bisect`命令 ### 1. `bisect`命令
*** ***
使用二分查找,找到引入bug的提交 使用二分查找,找到引入bug的提交
- `git bisect start`:开始二分查找 - `git bisect start`:开始二分查找
- `git bisect bad [<commit>]`:设置指定提交(默认是当前分支)为bad - `git bisect bad [<commit>]`:设置指定提交(默认是当前分支)为bad
- `git bisect good [<commit>]`:设置指定提交(默认是当前分支)为good - `git bisect good [<commit>]`:设置指定提交(默认是当前分支)为good
输入了上面三个命令后就会自动开始二分查找,我们之后只需要标记当前提交时bad还是good就行了,如果当前找的的提交时bad就输入`git bisect bad`,否则输入`git bisect good`直到找到有bug的提交。 输入了上面三个命令后就会自动开始二分查找,我们之后只需要标记当前提交时bad还是good就行了,如果当前找的的提交时bad就输入`git bisect bad`,否则输入`git bisect good`直到找到有bug的提交。
### 2. `blame`命令 ### 2. `blame`命令
*** ***
显示修改和作者最后修改的文件的每一行,这就是一个“问责”的命令,如果哪里有问题,我们可以很快地找到该问题是谁导致的。 显示修改和作者最后修改的文件的每一行,这就是一个“问责”的命令,如果哪里有问题,我们可以很快地找到该问题是谁导致的。
- `git blame filename`:查看指定文件所有的操作者,看看是谁错误地修改了该文件 - `git blame filename`:查看指定文件所有的操作者,看看是谁错误地修改了该文件
### 3. `grep`命令 ### 3. `grep`命令
*** ***
- `git grep keys`:在工作目录中所有文件中搜索`keys` - `git grep keys`:在工作目录中所有文件中搜索`keys`
- `git grep --cached keys`:在暂存区中所有文件中搜索`keys` - `git grep --cached keys`:在暂存区中所有文件中搜索`keys`
Liquibase 使用手册 Liquibase 使用手册
--- ---
本文档主要介绍如何在 hap 开发过程中使用 liquibase 来维护数据库数据。 本文档主要介绍如何在 hap 开发过程中使用 liquibase 来维护数据库数据。
[参考 Liquibase 官方指令文档](http://www.liquibase.org/documentation/changes/index.html) [参考 Liquibase 官方指令文档](http://www.liquibase.org/documentation/changes/index.html)
`core-db` 模块 `hls/core/db/data`目录 `core-db` 模块 `hls/core/db/data`目录
有三个版本的数据库脚本:mysql,oracle,sqlserver。 有三个版本的数据库脚本:mysql,oracle,sqlserver。
> 旧版的基于 sql 的建表方式已经废弃, 只有第三方的 sql 脚本存在. > 旧版的基于 sql 的建表方式已经废弃, 只有第三方的 sql 脚本存在.
## 新建表 ## 新建表
--- ---
修改文件 `[yyyy-MM-dd]-init-table-migration.groovy` 修改文件 `[yyyy-MM-dd]-init-table-migration.groovy`
> 其他项目上, 应该是根据需要编写至少一个新的 groovy 文件, 命名规则同上. > 其他项目上, 应该是根据需要编写至少一个新的 groovy 文件, 命名规则同上.
参考 现有的建表 changeSet 写法, 添加新的 changeSet 参考 现有的建表 changeSet 写法, 添加新的 changeSet
注意 `author`,`id` 注意 `author`,`id`
* 如果是 oracle 数据库, 注意 `sequence` 的创建 * 如果是 oracle 数据库, 注意 `sequence` 的创建
* 如果有 tl 表, 写在一个 changeSet 中 * 如果有 tl 表, 写在一个 changeSet 中
其他建表需要注意的内容包括: 其他建表需要注意的内容包括:
* 基础建表语句 * 基础建表语句
* 表描述信息 * 表描述信息
* 主键设置 * 主键设置
* 列描述信息 * 列描述信息
* 合理的类型,长度 * 合理的类型,长度
* 是否允许 NULL * 是否允许 NULL
* 默认值(如果有) * 默认值(如果有)
* 索引(唯一索引,普通索引) * 索引(唯一索引,普通索引)
* 主键自增起始 10001 * 主键自增起始 10001
* oracle 是设置 sequence start with * oracle 是设置 sequence start with
* who 字段(8个) * who 字段(8个)
``` ```
column(name: "OBJECT_VERSION_NUMBER", type: "BIGINT", defaultValue : "1") column(name: "OBJECT_VERSION_NUMBER", type: "BIGINT", defaultValue : "1")
column(name: "REQUEST_ID", type: "BIGINT", defaultValue : "-1") column(name: "REQUEST_ID", type: "BIGINT", defaultValue : "-1")
column(name: "PROGRAM_ID", type: "BIGINT", defaultValue : "-1") column(name: "PROGRAM_ID", type: "BIGINT", defaultValue : "-1")
column(name: "CREATED_BY", type: "BIGINT", defaultValue : "-1") column(name: "CREATED_BY", type: "BIGINT", defaultValue : "-1")
column(name: "CREATION_DATE", type: "DATETIME", defaultValueComputed : "CURRENT_TIMESTAMP") column(name: "CREATION_DATE", type: "DATETIME", defaultValueComputed : "CURRENT_TIMESTAMP")
column(name: "LAST_UPDATED_BY", type: "BIGINT", defaultValue : "-1") column(name: "LAST_UPDATED_BY", type: "BIGINT", defaultValue : "-1")
column(name: "LAST_UPDATE_DATE", type: "DATETIME", defaultValueComputed : "CURRENT_TIMESTAMP") column(name: "LAST_UPDATE_DATE", type: "DATETIME", defaultValueComputed : "CURRENT_TIMESTAMP")
column(name: "LAST_UPDATE_LOGIN", type: "BIGINT", defaultValue : "-1") column(name: "LAST_UPDATE_LOGIN", type: "BIGINT", defaultValue : "-1")
``` ```
* 扩展字段 16个(可以不要) * 扩展字段 16个(可以不要)
> 如果不要,在DTO类上加@ExtensionAttribute\(disable=true\) > 如果不要,在DTO类上加@ExtensionAttribute\(disable=true\)
> TL 表均为联合主键,没有自增长、sequence 等 > TL 表均为联合主键,没有自增长、sequence 等
**请注意保持脚本格式工整** 参考示例:
在groovy中创建一张表
## 修改表结构 ```groovy
import com.hand.hap.liquibase.MigrationHelper
也是通过添加 changeSet, 顺序添加
def mhi = MigrationHelper.getInstance()
## 初始数据 databaseChangeLog(logicalFilePath: "2016-09-26-init-migration.groovy") {
---
changeSet(author: "作者名", id: "日期-作者-表名") {
HEL1.0中采用了全新的基于 excel 的基础数据维护. createTable(tableName: "HR_EMPLOYEE") {
column(autoIncrement: "true", startWith: "10001", name: "EMPLOYEE_ID", type: "BIGINT", remarks: "员工ID") {
请参考 `hel-db` 中 hls/core/db/data/2016-09-30-init-data.xlsx constraints(nullable: "false", primaryKey: "true", primaryKeyName: "HR_EMPLOYEE_PK")
}
excel 数据管理的主要特点有: column(name: "EMPLOYEE_CODE", remarks: "员工编码", type: "VARCHAR(30)") {
constraints(nullable: "false", unique: "true", uniqueConstraintName: "HR_EMPLOYEE_U1")
* 利用 `公式` 来解决外键依赖问题. }
* 可进行 `唯一性检查`, \(重复执行, 不会重复插入\) column(name: "NAME", remarks: "员工姓名", type: "VARCHAR(50)") { constraints(nullable: "false") }
* 数据可更新, 可持续维护 column(name: "BORN_DATE", remarks: "出生日期", type: "DATE")
column(name: "EMAIL", remarks: "电子邮件", type: "VARCHAR(50)")
excel 更直观, 便于维护, 所有的基础数据, 只需要维护一份 excel 即可. column(name: "MOBIL", remarks: "移动电话", type: "VARCHAR(50)")
column(name: "JOIN_DATE", remarks: "入职日期", type: "DATE")
> excel 在每次执行 mvn process-resoures ... 时 都会解析执行, column(name: "GENDER", remarks: "性别", type: "VARCHAR(1)")
> 会插入新的数据, 更改已存在的数据. column(name: "CERTIFICATE_ID", remarks: "ID", type: "VARCHAR(100)") {
constraints(nullable: "false", unique: "true", uniqueConstraintName: "HR_EMPLOYEE_U2")
使用参数 `-Ddb.skipUpdateTables=SYS_ROLE_B,SYS_USER` 可以禁止更新表中的数据(只插入,不更新) }
column(name: "STATUS", remarks: "状态", type: "VARCHAR(50)") { constraints(nullable: "false") }
更具体的用法 请参见 excel 第一 sheet 页的说明. column(name: "ENABLED_FLAG", remarks: "启用状态", type: "VARCHAR(1)", defaultValue: "Y") {
constraints(nullable: "false")
注意: }
column(name: "OBJECT_VERSION_NUMBER", type: "BIGINT", defaultValue: "1")
* 作者 column(name: "REQUEST_ID", type: "BIGINT", defaultValue: "-1")
* 时间 column(name: "PROGRAM_ID", type: "BIGINT", defaultValue: "-1")
column(name: "CREATED_BY", type: "BIGINT", defaultValue: "-1")
> 可以不通过 maven 命令直接执行 excel 导入, 参考代码 column(name: "CREATION_DATE", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP")
column(name: "LAST_UPDATED_BY", type: "BIGINT", defaultValue: "-1")
```java column(name: "LAST_UPDATE_DATE", type: "DATETIME", defaultValueComputed: "CURRENT_TIMESTAMP")
public static void main(String[] args) throws Exception { column(name: "LAST_UPDATE_LOGIN", type: "BIGINT", defaultValue: "-1")
System.setProperty("db.url", "jdbc:mysql://127.0.0.1:3306/hel"); }
System.setProperty("db.user", "hel_dev"); }
System.setProperty("db.password", "hel_dev"); }
System.setProperty("db.override", "true"); ```
ExcelDataLoader processor = new ExcelDataLoader(); **请注意保持脚本格式工整**
URL url = ExcelDataLoader.class.getResource("/hls/core/db/data/2016-09-30-init-data.xlsx");
if (url == null) { ## 修改表结构
throw new FileNotFoundException("excel not found.");
} 也是通过添加 changeSet, 顺序添加
processor.setFilePath(new File(url.toURI()).getAbsolutePath()); 修改表结构参考示例:
processor.execute(null); ```groovy
} package com.hand.hap.db
```
import com.hand.hap.liquibase.MigrationHelper
## 补丁数据
def mhi = MigrationHelper.getInstance()
--- dbType = MigrationHelper.getInstance().dbType()
databaseChangeLog(logicalFilePath: "patch.groovy") {
在需要执行比较特殊的数据库操作, 或者不方便归类的操作时 , 可以将脚本写在 patch 中. changeSet(author: "作者", id: "日期-作者-编号") {
/**
patch.groovy 中即可以写 liquibase 命令, 也可以执行 sql 语句. * 新增一列
*/
补丁脚本放在 `patch` 目录。 addColumn(tableName: "SYS_USER") {
column(name: "LAST_LOGIN_DATE", type: "datetime", remarks: "最后一次登录时间")
脚本内容可以包括,但不限于: }
/**
* 修改表 * 修改列名
*/
* 增删改 表中的数据 renameColumn(tableName: "SYS_IF_CONFIG_LINE_TL", columnDataType: "VARCHAR(255)", oldColumnName: "HEADER_ID", newColumnName: "LINE_ID")
/**
> 请注意,这些操作应该都是增量的进行 * 添加唯一约束
*/
补丁文件的命名方式:20161212-工号-序号.sql addUniqueConstraint(tableName: "SYS_IF_CONFIG_HEADER_B", columnNames: "INTERFACE_CODE", constraintName: "SYS_IF_CONFIG_HEADER_U1")
/**
每次提交都是一个单独的 sql 文件,每天提交多次时,需要指定`序号`加以区分 * 添加默认值
*/
> 脚本内部注释,写明作者,目的,时间,概要 addDefaultValue(tableName: "SYS_USER", columnName: "FIRST_LOGIN", columnDataType: "varchar", defaultValue: "Y")
编写完毕以后,将补丁配置到 patch.groovy 中。 /**
* 添加索引
> 补丁将会是用的比较多的方式,主要是增加新的数据,由于主键是手动指定的,请注意不要与他人的重复,必须在本地测试过之后再commit。 */
createIndex(tableName: "SYS_RESOURCE_B", indexName: "SYS_RESOURCE_B_N1") {
column(name: "TYPE", type: "varchar(15)")
}
/**
* 可以使用groovy语句进行条件判断
* 修改数据类型
*/
if (true) {
modifyDataType(tableName: "FND_COMPANY_B", columnName: "COMPANY_FULL_NAME", newDataType: "varchar(250)")
}
}
}
```
## 初始数据
---
HEL1.0中采用了全新的基于 excel 的基础数据维护.
请参考 `hel-db` 中 hls/core/db/data/2016-09-30-init-data.xlsx
excel 数据管理的主要特点有:
* 利用 `公式` 来解决外键依赖问题.
* 可进行 `唯一性检查`, \(重复执行, 不会重复插入\)
* 数据可更新, 可持续维护
excel 更直观, 便于维护, 所有的基础数据, 只需要维护一份 excel 即可.
> excel 在每次执行 mvn process-resoures ... 时 都会解析执行,
> 会插入新的数据, 更改已存在的数据.
使用参数 `-Ddb.skipUpdateTables=SYS_ROLE_B,SYS_USER` 可以禁止更新表中的数据(只插入,不更新)
更具体的用法 请参见 excel 第一 sheet 页的说明.
注意:
* 作者
* 时间
> 可以不通过 maven 命令直接执行 excel 导入, 参考代码
```java
public static void main(String[] args) throws Exception {
System.setProperty("db.url", "jdbc:mysql://127.0.0.1:3306/hel");
System.setProperty("db.user", "hel_dev");
System.setProperty("db.password", "hel_dev");
System.setProperty("db.override", "true");
ExcelDataLoader processor = new ExcelDataLoader();
URL url = ExcelDataLoader.class.getResource("/hls/core/db/data/2016-09-30-init-data.xlsx");
if (url == null) {
throw new FileNotFoundException("excel not found.");
}
processor.setFilePath(new File(url.toURI()).getAbsolutePath());
processor.execute(null);
}
```
## 补丁数据
---
在需要执行比较特殊的数据库操作, 或者不方便归类的操作时 , 可以将脚本写在 patch 中.
patch.groovy 中即可以写 liquibase 命令, 也可以执行 sql 语句.
补丁脚本放在 `patch` 目录。
脚本内容可以包括,但不限于:
* 修改表
* 增删改 表中的数据
> 请注意,这些操作应该都是增量的进行
补丁文件的命名方式:20161212-工号-序号.sql
每次提交都是一个单独的 sql 文件,每天提交多次时,需要指定`序号`加以区分
> 脚本内部注释,写明作者,目的,时间,概要
编写完毕以后,将补丁配置到 patch.groovy 中。
> 补丁将会是用的比较多的方式,主要是增加新的数据,由于主键是手动指定的,请注意不要与他人的重复,必须在本地测试过之后再commit。
*补丁数据的脚本编写可参考修改数据库的脚本*
# 新开项目 # 新开项目
本章节将引导您从零开始,创建一个可以运行的 Demo 工程。此工程基于HEL融租易标准版,包含一个 demo 实例。 本章节将引导您从零开始,创建一个可以运行的 Demo 工程。此工程基于HEL融租易标准版,包含一个 demo 实例。
## 后端项目 ## 开发工具准备
- JDK 1.8 及以上
- IntelliJ IDEA 或 Eclipse
### 确定项目信息 - Git
1. groupId 本项目的代号,比如融租易项目,代号为 hel - redis 3.0 及以上
2. artifactId 本项目的顶层目录名称,使用项目代号(第一个字母大写) +Parent,如 HelParent - maven 3.3 及以上
3. package 包名称,使用项目代号 + core ,如 Hel.core - Tomcat 7+ (**不支持 Tomcat 6**)
4. archetypeVersion 是指模板项目的版本,可以使用以下版本号 - 数据库(任选)
> 1.0-RELEASE - Mysql server 5.6 及以上
- SqlServer 2012 及以上
### 新建项目 (融租易HEL1.0) - Oracle 9 以上
- Navicat Premium(或其他)
确定上述信息后,可以使用如下命令新建项目: ### 软件安装
`注意` maven-archetype-plugin `2.4`及以下版本可以正常使用下面命令 #### Java 安装
``` 1.[Oracle 官网 ](https://nodejs.orghttp://www.oracle.com/technetwork/cn/java/javase/downloads/index.html)下载对应平台的 JDK 1.8 以上的环境。
mvn archetype:generate -D archetypeGroupId=hel-custom -D archetypeArtifactId=hel-custom-parent-archetype -D archetypeVersion=1.0-RELEASE -D groupId=hel -D artifactId=HelParent -D package=Hel.core -D version=1.0-RELEASE -D archetypeRepository=https://hel.hand-china.com/nexus/content/repositories/Hel-Releases 2. 本地执行安装文件,安装 JDK 环境。
3. Win 在环境变量系统变量中 path 配置 JDK 的环境变量指向 JDK 安装目录下 ` JDK/bin `
``` 4. 配置完成后打开 cmd 执行 ` javac `,有提示则说明环境安装成功。
在maven-archetype-plugin `3.0.0` 版本中,移除了对-D archetypeRepository参数的支持,会报以下错误 > eclipse 中 JRE 的配置需要指定 JDK 目录,不能是 JRE。(maven 需要 JDK)
![](/assets/mvn_archetype_plugin.png)
#### Git 安装
解决方案:
指定使用2.4版本的archetype-plugin插件: 1.[Git 官网 ](https://git-scm.com/download/)下载对应平台的 Git。
``` 2. 本地执行安装文件, 安装 Git 环境。
mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -D archetypeGroupId=hel-custom -D archetypeArtifactId=hel-custom-parent-archetype -D archetypeVersion=1.0-RELEASE -D groupId=hel -D artifactId=HelParent -D package=Hel.core -D version=1.0-RELEASE -D archetypeRepository=https://hel.hand-china.com/nexus/content/repositories/Hel-Releases 3. Win 在环境变量中系统变量的 path 配置 Git 的环境变量指向 Git 安装目录下的 ` /bin `
4. 配置完成后打开 cmd 执行 ` git `,有提示则说明环境安装成功。
```
[Git简明教程](git_guide.md)
> 对于 Windows,安装 Git 以后,你可以在任意目录右键,`Git Bash Here`
> 以下内容所指的 `HelParent` 均指上面命令中的参数 `artifactId` 的值,请按实际情况替换 > 打开的 MINGW 命令窗口可以执行 **兼容 linux 系统** 的命令,如`rm`,`ls` 等
新的项目目录结构如下: #### Maven 安装
```
. 1.[Maven 官网 ](http://mirror.bit.edu.cn/apache/maven/)下载对应平台的合适的 maven 版本的压缩包。
├── README.md (项目README,请在此处写上项目开发的注意信息,方便团队协同) 2. 本地解压压缩包。
├── core(功能实现项目) 3. Win 在环境变量中系统变量的 path 配置 maven 的环境变量指向 maven 解压目录下的 ` /bin `
│ ├── pom.xml (子项目core的pom.xml文件) 4. 配置完成后打开 cmd 执行 ` mvn -v `,有提示则说明环境安装成功。
│ └── src
│ └── main #### Redis 安装
│ ├── java
│ │ ├── hel 1.[Redis win 官网 ](https://github.com/MSOpenTech/redis/releases)下载最新的 redis 版本的压缩包。
│ │ │ └── core(前面的包名称) 2. 本地解压压缩包。
│ │ │ ├── db(数据表结构,数据初始化入口文件) 3. Win 在解压目录下打开 cmd 执行 ` redis-server.exe redis.windows.conf `,有提示则说明 Redis 已经启动。
│ │ │ │ └── liquibase.groovy 4. Win 平台下如果启动失败,修改 redis.windows.conf 文件中的 maxheap 为 ` maxheap 1024000000 `
│ │ └── resources(项目配置文件目录)
│ │ ├── spring (spring配置文件目录) **注:** 开发需要依赖 Redis 环境,所以在启动后台程序时,请确保 Redis 已经启动,如redis需配置集群,[请参考Redis集群部署](/后端开发/redis.md)
│ │ ├── config.properties * redis GUI 客户端下载 :http://redisdesktop.com/
│ │ └── logback.xml(日志配置文件) * redis 命令手册:http://doc.redisfans.com/
│ └── webapp(Webapp目录) * redis 清空缓存命令:flushall
│ ├── resources(UI 资源库目录)
| | └── demo.js(demo.js样例,可以删除) > Mac, Linux 用户, 请到 http://redis.io 下载源码,编译安装
│ └── WEB-INF
│ └── view(页面文件目录) ### 新建项目 (依赖融租易HEL1.0)
│ └── demo.html(demo.html样例,可以删除) #### 确定项目信息
├── core-db(数据库脚本及初始化数据项目) 1. groupId 本项目的代号,比如融租易项目,代号为 hel
│ ├── pom.xml 2. artifactId 本项目的顶层目录名称,使用项目代号(第一个字母大写) +Parent,如 HelParent
│ └── src 3. package 包名称,使用项目代号 + core ,如 Hel.core
│ └── main 4. archetypeVersion 是指模板项目的版本,可以使用以下版本号
│ └── java > 1.0-RELEASE
│ └── hel
│ └── core 确定上述信息后,可以使用如下命令新建项目:
│ └── db
│ ├── data(数据文件) `注意` maven-archetype-plugin `2.4`及以下版本可以正常使用下面命令
│ │ └── (init-data)
│ └── table(数据库表结构管理) ```
│ └── 2016-06-01-init-migration.groovy mvn archetype:generate -D archetypeGroupId=hel-custom -D archetypeArtifactId=hel-custom-parent-archetype -D archetypeVersion=1.0-RELEASE -D groupId=hel -D artifactId=HelParent -D package=Hel.core -D version=1.0-RELEASE -D archetypeRepository=https://hel.hand-china.com/nexus/content/repositories/Hel-Releases
└── pom.xml
```
```
在maven-archetype-plugin `3.0.0` 版本中,移除了对-D archetypeRepository参数的支持,会报以下错误
### 确定本项目使用的数据库 ![](/assets/mvn_archetype_plugin.png)
> 目前已经测试过支持的数据库有Mysql,Oracle,SqlServer 解决方案:
> 请修改 `HelParent/core/src/main/java/hel/core/db/liquibase.groovy` 以适配不同的数据库 指定使用2.4版本的archetype-plugin插件:
```
确定好数据库后,按照 [Oracle,MySql,Sqlserver数据库配置](database-config.md) 修改项目配置文件。 mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -D archetypeGroupId=hel-custom -D archetypeArtifactId=hel-custom-parent-archetype -D archetypeVersion=1.0-RELEASE -D groupId=hel -D artifactId=HelParent -D package=Hel.core -D version=1.0-RELEASE -D archetypeRepository=https://hel.hand-china.com/nexus/content/repositories/Hel-Releases
修改配置文件后,按照[创建数据库](database-init.md) 中的步骤创建数据库
```
### 编译整个项目
在 HelParent 目录下执行: > 以下内容所指的 `HelParent` 均指上面命令中的参数 `artifactId` 的值,请按实际情况替换
```
mvn clean install -Dmaven.test.skip=true 新的项目目录结构如下:
``` ```
.
<a name="liquibase"> </a> ├── README.md (项目README,请在此处写上项目开发的注意信息,方便团队协同)
├── core(功能实现项目)
### 初始化数据库表结构及基础数据 │ ├── pom.xml (子项目core的pom.xml文件)
在 HelParent 项目录下执行: │ └── src
│ └── main
- MySql │ ├── java
- `mvn process-resources -D skipLiquibaseRun=false -D db.driver=com.mysql.jdbc.Driver -D db.url=jdbc:mysql://127.0.0.1:3306/hel -Ddb.user=hel_dev -Ddb.password=hel_dev` │ │ ├── hel
- SqlServer │ │ │ └── core(前面的包名称)
- `mvn process-resources -D skipLiquibaseRun=false -Ddb.user=hel_dev -Ddb.password=hel_dev-D db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver -D db.url="jdbc:sqlserver://127.0.0.1:1433; DatabaseName=hel"` │ │ │ ├── db(数据表结构,数据初始化入口文件)
- Oracle │ │ │ │ └── liquibase.groovy
- `mvn process-resources -D skipLiquibaseRun=false -D db.driver=oracle.jdbc.driver.OracleDriver -D db.url=jdbc:oracle:thin:@127.0.0.1:1521:hel -Ddb.user=hel_dev -Ddb.password=hel_dev` │ │ └── resources(项目配置文件目录)
│ │ ├── spring (spring配置文件目录)
- 以上命令中,需要按实际情况修改 url,user,password │ │ ├── config.properties
│ │ └── logback.xml(日志配置文件)
### 测试 │ └── webapp(Webapp目录)
1. 在 HelParent 工程目录下执行命令(IntelliJ IDEA 用户可以跳过此步骤) │ ├── resources(UI 资源库目录)
``` | | └── demo.js(demo.js样例,可以删除)
mvn eclipse:eclipse │ └── WEB-INF
``` │ └── view(页面文件目录)
│ └── demo.html(demo.html样例,可以删除)
3. 将所有工程导入 IDE 工具(Eclipse,IntelliJ IDEA)中 ├── core-db(数据库脚本及初始化数据项目)
4. 配置 Server ,配置 JNDI 数据源,参照[多数据库配置](chapter1.1.md) │ ├── pom.xml
- 需要 Tomcat 7+, 不支持 Tomcat 6 │ └── src
5. 将 hel 工程发布到 tomcat/webapps,运行 │ └── main
│ └── java
### 更新HEL依赖 │ └── hel
│ └── core
[更新项目依赖的HEL版本](project-update.md) │ └── db
│ ├── data(数据文件)
│ │ └── (init-data)
│ └── table(数据库表结构管理)
│ └── 2016-06-01-init-migration.groovy
└── pom.xml
```
### 确定本项目使用的数据库
> 目前已经测试过支持的数据库有Mysql,Oracle,SqlServer
> 按照[创建数据库](/后端开发/database-init.md)中的步骤创建数据库
> 请修改 `HelParent/core/src/main/java/hel/core/db/liquibase.groovy` 以适配不同的数据库
### 修改项目配置文件
[修改项目配置文件](/后端开发/database-config.md)
### 编译整个项目
在 HelParent 目录下执行:
```
mvn clean install -Dmaven.test.skip=true
```
### 初始化数据库表结构及基础数据
在 HelParent 项目录下执行:
- MySql
- `mvn process-resources -D skipLiquibaseRun=false -D db.driver=com.mysql.jdbc.Driver -D db.url=jdbc:mysql://127.0.0.1:3306/hel -Ddb.user=hel_dev -Ddb.password=hel_dev`
- SqlServer
- `mvn process-resources -D skipLiquibaseRun=false -Ddb.user=hel_dev -Ddb.password=hel_dev-D db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver -D db.url="jdbc:sqlserver://127.0.0.1:1433; DatabaseName=hel"`
- Oracle
- `mvn process-resources -D skipLiquibaseRun=false -D db.driver=oracle.jdbc.driver.OracleDriver -D db.url=jdbc:oracle:thin:@127.0.0.1:1521:hel -Ddb.user=hel_dev -Ddb.password=hel_dev`
- 以上命令中,需要按实际情况修改 url,user,password
### 测试
1. 在 HelParent 工程目录下执行命令(IntelliJ IDEA 用户可以跳过此步骤)
```
mvn eclipse:eclipse
```
2. 将项目工程导入 IDE 工具(Eclipse,IntelliJ IDEA)中,并配置服务(tomcat等)后启动运行。
### 更新HEL依赖
[更新项目依赖的HEL版本](project-update.md)
# hlsDataSource标签 # hlsDataSource标签(数据源控件)
数据源组件hlsDataSource 数据源组件hlsDataSource
``` ```
<h:hlsDataSource id="hlsDataSource" autoQuery="true" successEnd="successEnd"> <h:hlsDataSource id="hlsDataSource" autoQuery="true" successEnd="successEnd">
<h:transport parameter="parameter"> <h:transport parameter="parameter">
<h:read url="" type="GET" /> <h:read url="" type="GET" />
</h:transport> </h:transport>
</h:hlsDataSource> </h:hlsDataSource>
``` ```
| **属性** | **参数** | **说明** | | **属性** | **参数** | **说明** |
| -------- | -------- | -------- | | -------- | -------- | -------- |
| id | 唯一英文标识 | 数据源唯一标志,返回数据源对象,包含查询返回的数据 | | id | 唯一英文标识 | 数据源唯一标志,返回数据源对象,包含查询返回的数据 |
| autoQuery | true/false | 自动查询标志,默认为true,true代表自动发送查询请求,false代表不发送查询请求 | | autoQuery | true/false | 自动查询标志,默认为true,true代表自动发送查询请求,false代表不发送查询请求 |
| successEnd | function | 异步请求成功的回调函数,参数:data\(查询返回的数据\) | | successEnd | function | 异步请求成功的回调函数,参数:data\(查询返回的数据\) |
| parameter | function | 函数返回一个对象,会自动封装到查询条件中 | | parameter | function | 函数返回一个对象,会自动封装到查询条件中 |
| url | 查询字符串 | 查询字符串,对应后台的数据接口 | | url | 查询字符串 | 查询字符串,对应后台的数据接口 |
| type | GET/POST | 对应发送GET请求跟POST请求 | | type | GET/POST | 对应发送GET请求跟POST请求 |
# hlsDatePicker标签 # hlsDatePicker标签(时间控件)
日期选择器(不包含时分秒) 日期选择器(不包含时分秒)
......
## Grid ## hlsGrid
#### 表格 #### 表格
对于API文档中的所有属性,考虑实际需要,有些属性没必要实现,本文档若未列出,就代表并未实现 对于API文档中的所有属性,考虑实际需要,有些属性没必要实现,本文档若未列出,就代表并未实现
#### xml配置 #### xml配置
```xml ```xml
<!--h:为命名空间,必须要加的,grid为组件名;id可写可不写--> <!--h:为命名空间,必须要加的,grid为组件名;id可写可不写-->
<h:grid id="grid"/> <h:hlsGrid id="grid"/>
``` ```
```xml ```xml
<!--grid--> <!--grid-->
<h:grid dataSource="dataSource" selectable="multiple, rowbox" editable="true"> <h:hlsGrid dataSource="dataSource" selectable="multiple, rowbox" editable="true">
<h:pageable pageSizes="5, 10, 20, 50" buttonCount="5" refresh="true"> <h:pageable pageSizes="5, 10, 20, 50" buttonCount="5" refresh="true">
</h:pageable> </h:pageable>
<h:columns> <h:columns>
<h:column field="moduleCode" title='' width="100"/> <h:column field="moduleCode" title='' width="100"/>
<h:column field="functionCode" title='' width="180"/> <h:column field="functionCode" title='' width="180"/>
</h:columns> </h:columns>
</h:grid> </h:hlsGrid>
``` ```
--- ---
对于所有属性,无论是直接属性,还是子标签的属性,都遵循以下原则: 对于所有属性,无论是直接属性,还是子标签的属性,都遵循以下原则:
1.若是简单的属性,就添加到当前标签上,若是对象,就创建子标签,这里的简单属性是指能直接被描述在当前标签上的属性,如字符串,函数,\(函数只是一个引用\),布尔类型,数字类型等等,对象是指这个属性又包含了子属性,所以我们不得不向下创建子标签才能将其子属性描述出来。 1.若是简单的属性,就添加到当前标签上,若是对象,就创建子标签,这里的简单属性是指能直接被描述在当前标签上的属性,如字符串,函数,\(函数只是一个引用\),布尔类型,数字类型等等,对象是指这个属性又包含了子属性,所以我们不得不向下创建子标签才能将其子属性描述出来。
2.对于String和Function类型,必须用fn:前缀加以区分, 2.对于String和Function类型,必须用fn:前缀加以区分,
3.对于数组,有些数组是字符串数组,这种直接当作简单的属性处理,用逗号分隔每个字符串即可,有些数组是list集合数组,这种必须先创建属性子标签,再创建item子标签来描述集合,详情可参考子标签columns 3.对于数组,有些数组是字符串数组,这种直接当作简单的属性处理,用逗号分隔每个字符串即可,有些数组是list集合数组,这种必须先创建属性子标签,再创建item子标签来描述集合,详情可参考子标签columns
--- ---
### **一般属性 ** ### **一般属性 **
> **提示:** > **提示:**
> >
> * 属性用法请参考kendoui API文档的grid: [http:\/\/docs.telerik.com\/kendo-ui\/api\/javascript\/ui\/gird](http://docs.telerik.com/kendo-ui/api/javascript/ui/gird) > * 属性用法请参考kendoui API文档的grid: [http:\/\/docs.telerik.com\/kendo-ui\/api\/javascript\/ui\/gird](http://docs.telerik.com/kendo-ui/api/javascript/ui/gird)
| 属性名 | 类型 | 描述 | | 属性名 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| allowCopy | Boolean | 允许复制 | | allowCopy | Boolean | 允许复制 |
| altRowTemplate | String & Function | 呈现交替表行的模板 | | altRowTemplate | String & Function | 呈现交替表行的模板 |
| autoBind | Boolean | 绑定数据源 | | autoBind | Boolean | 绑定数据源 |
| columnResizeHandleWidth | Integer | 设置列宽度 | | columnResizeHandleWidth | Integer | 设置列宽度 |
| columnMenu | Boolean | 设置列菜单 | | columnMenu | Boolean | 设置列菜单 |
| dataSource | kendo.data.DataSource\(Function\) | 数据源 | | dataSource | kendo.data.DataSource\(Function\) | 数据源 |
| detailTemplate | String & Function | 呈现详细的模板 | | detailTemplate | String & Function | 呈现详细的模板 |
| editable | Boolean & String | 设置是否可编辑 | | editable | Boolean & String | 设置是否可编辑 |
| groupable | Boolean | 设置分组 | | groupable | Boolean | 设置分组 |
| height | Integer & String | 设置高度 | | height | Integer & String | 设置高度 |
| mobile | Boolean & String | 设置网格 | | mobile | Boolean & String | 设置网格 |
| navigatable | Boolean | 导航栏 | | navigatable | Boolean | 导航栏 |
| noRecords | Boolean | 显示类似“没有记录”的标记默认为false | | noRecords | Boolean | 显示类似“没有记录”的标记默认为false |
| pageable | Boolean | 显示网格默认为false | | pageable | Boolean | 显示网格默认为false |
| reorderable | Boolean | 拖动标题排序默认为false | | reorderable | Boolean | 拖动标题排序默认为false |
| resizable | Boolean | 拖动表格边缘来调大小 | | resizable | Boolean | 拖动表格边缘来调大小 |
| rowTemplate | String & Function | 呈现一个行 | | rowTemplate | String & Function | 呈现一个行 |
| scrollable | Boolean | 出现滚动条 | | scrollable | Boolean | 出现滚动条 |
| selectable | Boolean & String | 可以选择默认为false | | selectable | Boolean & String | 可以选择默认为false |
| sortable | Boolean | 可以分组 | | sortable | Boolean | 可以分组 |
| toolbar | String & Function | 表格上面设置按钮 | | toolbar | String & Function | 表格上面设置按钮 |
| cancel | Function | 取消事件 | | cancel | Function | 取消事件 |
| change | Function | 改变事件 | | change | Function | 改变事件 |
| columnHide | Function | 列隐藏函数 | | columnHide | Function | 列隐藏函数 |
| columnMenuInit | Function | 列菜单初始化触发事件 | | columnMenuInit | Function | 列菜单初始化触发事件 |
| columnReorder | Function | 更改列触发事件 | | columnReorder | Function | 更改列触发事件 |
| columnResize | Function | 可以调整列 | | columnResize | Function | 可以调整列 |
| columnShow | Function | 展示列 | | columnShow | Function | 展示列 |
| dataBinding | Function | 数据源绑定 | | dataBinding | Function | 数据源绑定 |
| dataBound | Function | 数据加载完之后触发 | | dataBound | Function | 数据加载完之后触发 |
| detailCollapse | Function | 折叠表行时触发 | | detailCollapse | Function | 折叠表行时触发 |
| detailExpand | Function | 展开表行时触发 | | detailExpand | Function | 展开表行时触发 |
| detailInit | Function | 表行初始化时触发 | | detailInit | Function | 表行初始化时触发 |
| edit | Function | 编辑时触发 | | edit | Function | 编辑时触发 |
| excelExport | Function | excel导出 | | excelExport | Function | excel导出 |
| filter | Function | 过滤 | | filter | Function | 过滤 |
| group | Function | 分组 | | group | Function | 分组 |
| page | Function | 分页 | | page | Function | 分页 |
| pdfExport | Function | pdf导出 | | pdfExport | Function | pdf导出 |
| filterMenuInit | Function | 第一次打开筛选器时触发 | | filterMenuInit | Function | 第一次打开筛选器时触发 |
| remove | Function | 点击删除按钮触发 | | remove | Function | 点击删除按钮触发 |
| save | Function | 点击保存时触发 | | save | Function | 点击保存时触发 |
| saveChanges | Function | 点击保存时触发 | | saveChanges | Function | 点击保存时触发 |
| sort | Function | 排序 | | sort | Function | 排序 |
| columnLock | Function | 锁定列时触发 | | columnLock | Function | 锁定列时触发 |
| columnUnlock | Function | 接触列锁定触发 | | columnUnlock | Function | 接触列锁定触发 |
| navigate | Function | 开启导航栏 | | navigate | Function | 开启导航栏 |
用法示例: 用法示例:
```javascript ```javascript
//注意这是写在script标签里的内容 //注意这是写在script标签里的内容
var dataSource = new kendo.data.DataSource({ var dataSource = new kendo.data.DataSource({
data: [ data: [
{ name: "Jane Doe", age: 30 }, { name: "Jane Doe", age: 30 },
{ name: "John Doe", age: 33 } { name: "John Doe", age: 33 }
] ]
}); });
function edit(){ function edit(){
//... //...
} }
function rowTemplate(){ function rowTemplate(){
//... //...
} }
``` ```
```xml ```xml
<h:grid id="grid" dataSource="dataSource" resizable= "true" height= "100%" edit ="edit" rowTemplate="fn:rowTemplate"/> <h:grid id="grid" dataSource="dataSource" resizable= "true" height= "100%" edit ="edit" rowTemplate="fn:rowTemplate"/>
``` ```
> **提示:** > **提示:**
> >
> * 上述所有属性直接添加在标签内即可,(**\[\*\***属性名\]**\*\* = "..."**),对于类型是函数的属性,需要另外在script标签中具体定义函数,这里只是一个引用,对于类型**既是函数又是字符串**类型的属性,一定要加**fn:** 来区分,加fn:的代表这是一个函数,对于**既是字符串又是布尔类型**的属性,照常输入就行了。 > * 上述所有属性直接添加在标签内即可,(**\[\*\***属性名\]**\*\* = "..."**),对于类型是函数的属性,需要另外在script标签中具体定义函数,这里只是一个引用,对于类型**既是函数又是字符串**类型的属性,一定要加**fn:** 来区分,加fn:的代表这是一个函数,对于**既是字符串又是布尔类型**的属性,照常输入就行了。
#### **子标签** #### **子标签**
| 属性名 | 类型 | 描述 | | 属性名 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| allowCopy | Object | 允许复制 | | allowCopy | Object | 允许复制 |
| columns | Array | 列 | | columns | Array | 列 |
| columnMenu | Object | 列菜单 | | columnMenu | Object | 列菜单 |
| editable | Object | 是否可编辑 | | editable | Object | 是否可编辑 |
| messages | Object | 提示 信息 | | messages | Object | 提示 信息 |
| scrollable | Object | 出现滚动条 | | scrollable | Object | 出现滚动条 |
| sortable | Object | 可以排序 | | sortable | Object | 可以排序 |
| toolbar | Array | 按钮 | | toolbar | Array | 按钮 |
#### **allowCopy**子标签 #### **allowCopy**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| delimeter | String & Object | 同一行之间的分节符 | | delimeter | String & Object | 同一行之间的分节符 |
```xml ```xml
<!--delimeter是Object类型--> <!--delimeter是Object类型-->
<h:grid> <h:hlsGrid>
<h:allowCopy> <h:allowCopy>
<h:delimeter /> <h:delimeter />
</h:allowCopy> </h:allowCopy>
</h:grid> </h:hlsGrid>
<!--delimeter是String类型--> <!--delimeter是String类型-->
<h:grid> <h:hlsGrid>
<h:allowCopy delimeter=","> <h:allowCopy delimeter=",">
</h:allowCopy> </h:allowCopy>
</h:grid> </h:hlsGrid>
``` ```
#### **columns**子标签 #### **columns**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| attributes | Object | 属性 | | attributes | Object | 属性 |
| command | Object | 显示命令按钮 | | command | Object | 显示命令按钮 |
| editor | Function | 编辑时触发 | | editor | Function | 编辑时触发 |
| encoded | Boolean | 设置编码 | | encoded | Boolean | 设置编码 |
| field | String | 字段id | | field | String | 字段id |
| footerTemplate | String & Function | 页脚表单 | | footerTemplate | String & Function | 页脚表单 |
| format | String | 格式化 | | format | String | 格式化 |
| sortable | Object | 可排序 | | sortable | Object | 可排序 |
| template | String & Function | 离开某个输入单元触发 | | template | String & Function | 离开某个输入单元触发 |
| title | String | 标题 | | title | String | 标题 |
| width | Integer & String | 宽度 | | width | Integer & String | 宽度 |
| hidden | Boolean | 隐藏 | | hidden | Boolean | 隐藏 |
| menu | Boolean | 菜单 | | menu | Boolean | 菜单 |
| locked | Boolean | 锁定 | | locked | Boolean | 锁定 |
| columns | Object | 列 | | columns | Object | 列 |
| filterable | Object | 可过滤 | | filterable | Object | 可过滤 |
| groupable | Boolean | 可分组 | | groupable | Boolean | 可分组 |
| values | Array | 设置值 | | values | Array | 设置值 |
#### **columns-filterable**子标签 #### **columns-filterable**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| cell | Object | 设置为行时头单元格的选项 | | cell | Object | 设置为行时头单元格的选项 |
| dataSource | Function | 数据源 | | dataSource | Function | 数据源 |
| itemTemplate | Function | 允许制定逻辑 | | itemTemplate | Function | 允许制定逻辑 |
| operators | Object | 单元格过滤默认运算符 | | operators | Object | 单元格过滤默认运算符 |
| search | Boolean | 查询 | | search | Boolean | 查询 |
| ui | Object | ui | | ui | Object | ui |
**attributes**用法: **attributes**用法:
```xml ```xml
<h:grid> <h:hlsGrid>
<h:columns> <h:columns>
<h:column> <h:column>
<h:attributes "style"="text-align:center"/> <h:attributes "style"="text-align:center"/>
</h:column> </h:column>
</h:columns> </h:columns>
</h:grid> </h:hlsGrid>
``` ```
**command**用法: **command**用法:
```xml ```xml
<!--对于数组来说,有两种形式,一种是直接用逗号分隔,放在标签上的,如 aggregates;另一种是创建子标签,再创建item子标签,再将数组内的内容整合到item子标签上,如command,先创建command子标签,再创建item子标签,再将数组中的每一个集合放在item标签上--> <!--对于数组来说,有两种形式,一种是直接用逗号分隔,放在标签上的,如 aggregates;另一种是创建子标签,再创建item子标签,再将数组内的内容整合到item子标签上,如command,先创建command子标签,再创建item子标签,再将数组中的每一个集合放在item标签上-->
<h:grid> <h:hlsGrid>
<h:columns aggregates="count,min,max"> <h:columns aggregates="count,min,max">
<h:column template="fn:template"/> <h:column template="fn:template"/>
<h:column field="functionId" width="30px/> <h:column field="functionId" width="30px/>
<h:column title="列头" locked="true"> <h:column title="列头" locked="true">
<h:command> <h:command>
<h:item name="edit"></h:item> <h:item name="edit"></h:item>
<h:item name="destroy"></h:item> <h:item name="destroy"></h:item>
</h:command> </h:command>
</h:column> </h:column>
</h:columns> </h:columns>
</h:grid> </h:hlsGrid>
``` ```
**editor**用法: **editor**用法:
```javascript ```javascript
function editor(){ function editor(){
//... //...
} }
``` ```
```xml ```xml
<h:grid> <h:hlsGrid>
<h:columns> <h:columns>
<h:column editor="editor"> <h:column editor="editor">
</h:column> </h:column>
</h:coulmns> </h:coulmns>
</h:grid> </h:hlsGrid>
``` ```
**filterable**用法: **filterable**用法:
```xml ```xml
<!--以filterable举例 遇到对象就向下添加子标签--> <!--以filterable举例 遇到对象就向下添加子标签-->
<h:grid> <h:hlsGrid>
<h:columns> <h:columns>
<h:column> <h:column>
<h:filterable> <h:filterable>
<h:cell dataTextField="name"/> <h:cell dataTextField="name"/>
</h:filterable> </h:filterable>
</h:column> </h:column>
</h:columns> </h:columns>
</h:grid> </h:hlsGrid>
``` ```
**headerAtrributes**用法: **headerAtrributes**用法:
```xml ```xml
<h:grid> <h:hlsGrid>
<h:columns> <h:columns>
<h:column> <h:column>
<h:headerAttributes "style"="color:red"> <h:headerAttributes "style"="color:red">
</h:column> </h:column>
</h:columns> </h:columns>
</h:grid> </h:hlsGrid>
``` ```
#### **ColumnMenu**子标签 #### **ColumnMenu**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| columns | Boolean | 列 | | columns | Boolean | 列 |
| filterable | Boolean | 允许过滤 | | filterable | Boolean | 允许过滤 |
| sortable | Boolean | 允许排序 | | sortable | Boolean | 允许排序 |
| messages | Object | 消息内容 | | messages | Object | 消息内容 |
用法: 用法:
```xml ```xml
<h:grid id="grid"> <h:hlsGrid id="grid">
<h:columnMenu columns="true" fileterable="false"> <h:columnMenu columns="true" fileterable="false">
<h:messages columns="choose columns"/> <h:messages columns="choose columns"/>
</h:columnMenu> </h:columnMenu>
</h:grid > </h:hlsGrid >
``` ```
#### **editable**子标签 #### **editable**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| confirmation | Object | 执行销毁命令时弹出提示框 | | confirmation | Object | 执行销毁命令时弹出提示框 |
| cancelDelete | String | 执行销毁命令时的提示框用于取消 | | cancelDelete | String | 执行销毁命令时的提示框用于取消 |
| confirmDelete | String | 执行销毁命令提示框用于确定 | | confirmDelete | String | 执行销毁命令提示框用于确定 |
| destroy | Boolean | 设置删除数据项 | | destroy | Boolean | 设置删除数据项 |
| mode | String | 设置编辑模式 | | mode | String | 设置编辑模式 |
| template | String & Function | 弹出编辑器的模板 | | template | String & Function | 弹出编辑器的模板 |
| update | Boolean | 设为true可以编辑数据项 | | update | Boolean | 设为true可以编辑数据项 |
用法: 用法:
```xml ```xml
<h:grid id="grid"> <h:hlsGrid id="grid">
<h:columnMenu columns="true" fileterable="false"> <h:columnMenu columns="true" fileterable="false">
<h:messages columns="choose columns"/> <h:messages columns="choose columns"/>
</h:columnMenu> </h:columnMenu>
</h:grid > </h:hlsGrid >
``` ```
#### **pageable**子标签 #### **pageable**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| pageSize | Integer | 设置页大小 | | pageSize | Integer | 设置页大小 |
| previousNext | Boolean | 可以选择上一页 | | previousNext | Boolean | 可以选择上一页 |
| numeric | Boolean | 显示默认按钮 | | numeric | Boolean | 显示默认按钮 |
| buttonCount | Integer | 按钮总数 | | buttonCount | Integer | 按钮总数 |
| input | Boolean | 提供输入任意页码的框 | | input | Boolean | 提供输入任意页码的框 |
| pageSizes | Boolean & Array | 选择每页显示大小 | | pageSizes | Boolean & Array | 选择每页显示大小 |
| refresh | Boolean | 刷新 | | refresh | Boolean | 刷新 |
| info | Boolean | 显示分页情况 | | info | Boolean | 显示分页情况 |
| messages | Object | 显示文本信息 | | messages | Object | 显示文本信息 |
用法: 用法:
```xml ```xml
<!--pageSizes 为array时--> <!--pageSizes 为array时-->
<h:grid> <h:hlsGrid>
<h:pageable pageSizes="all,5,10,20,50" buttonCount="5" refresh="true"> <h:pageable pageSizes="all,5,10,20,50" buttonCount="5" refresh="true">
<h:messages display="show"/> <h:messages display="show"/>
</h:pageable> </h:pageable>
</h:grid> </h:hlsGrid>
``` ```
#### **messages**子标签 #### **messages**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| commands | Object | 显示命令按钮的文本,主要用于本地化 | | commands | Object | 显示命令按钮的文本,主要用于本地化 |
| noRecords | String | 定义没有数据时的视图 | | noRecords | String | 定义没有数据时的视图 |
用法: 用法:
```xml ```xml
<h:grid> <h:hlsGrid>
<h:messages noRecords="no data"> <h:messages noRecords="no data">
<h:commands cancel="cancel"/> <h:commands cancel="cancel"/>
</h:messages > </h:messages >
</h:grid> </h:hlsGrid>
``` ```
#### **noRecords**子标签 #### **noRecords**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| template | String & Function | 当前视图无记录时的展示 | | template | String & Function | 当前视图无记录时的展示 |
用法: 用法:
```xml ```xml
<h:grid> <h:hlsGrid>
<h:noRecords template="no records"> <h:noRecords template="no records">
</h:noRecords> </h:noRecords>
</h:grid> </h:hlsGrid>
``` ```
#### **scrollable**子标签 #### **scrollable**子标签
| 属性名 | 类型 | 描述 | | 属性名 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| virtual | String | 显示单页数据 | | virtual | String | 显示单页数据 |
用法: 用法:
```xml ```xml
<h:grid> <h:hlsGrid>
<h:scrollable virtual="true"/> <h:scrollable virtual="true"/>
</h:grid> </h:hlsGrid>
``` ```
#### **sortable**子标签 #### **sortable**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| allowUnsort | Boolean | 设置单行或者多行排序 | | allowUnsort | Boolean | 设置单行或者多行排序 |
| mode | String | 设置单行或者多行排序 | | mode | String | 设置单行或者多行排序 |
用法: 用法:
```xml ```xml
<h:grid> <h:hlsGrid>
<h:sortable allowUnsort="true" mode="multiple"/> <h:sortable allowUnsort="true" mode="multiple"/>
</h:grid> </h:hlsGrid>
``` ```
#### **toolbar**子标签 #### **toolbar**子标签
| 属性 | 类型 | 描述 | | 属性 | 类型 | 描述 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| name | String | 名字 | | name | String | 名字 |
| template | String & Function | 按钮展示模板 | | template | String & Function | 按钮展示模板 |
| text | String | 设置名称 | | text | String | 设置名称 |
```javascript ```javascript
function template(){ function template(){
//... //...
} }
``` ```
```xml ```xml
<!--toolbar是数组 所以属性都是针对于数组内的集合来说的--> <!--toolbar是数组 所以属性都是针对于数组内的集合来说的-->
<h:grid> <h:hlsGrid>
<h:toolbar> <h:toolbar>
<h:item name="create"> <h:item name="create">
<!--当template为String时,由于xml会对标签的封闭符号敏感,所以可以采取下面的方式--> <!--当template为String时,由于xml会对标签的封闭符号敏感,所以可以采取下面的方式-->
<h:template> <h:template>
<![CDATA[<span class=" btn btn-primary k-grid-add">#=text#</span>]]> <![CDATA[<span class=" btn btn-primary k-grid-add">#=text#</span>]]>
</h:template> </h:template>
</h:item> </h:item>
</h:toolbar> </h:toolbar>
</h:grid> </h:hlsGrid>
``` ```
> **提示**: > **提示**:
> >
> * 遇到**object**类型 就向下添加子标签,当遇到普通类型时,就添加到当前的标签上,就像处理一般属性那样。 > * 遇到**object**类型 就向下添加子标签,当遇到普通类型时,就添加到当前的标签上,就像处理一般属性那样。
## hlsMaskedTextBox(文本框) ## hlsMaskedTextBox(文本框)
格式框 格式框
##### xml配置 ##### xml配置
```xml ```xml
<!--h:为命名空间,必须要加的;maskedTextBox为组件名;id可写可不写--> <!--h:为命名空间,必须要加的;maskedTextBox为组件名;id可写可不写-->
<h:hlsMaskedTextBox id="hlsMaskedTextBox"/> <h:hlsMaskedTextBox id="hlsMaskedTextBox"/>
``` ```
#### **一般属性** #### **一般属性**
> **提示:** > **提示:**
> >
> * 属性用法请参考kendoui API文档的maskedTextBox:[http:\/\/docs.telerik.com\/kendo-ui\/api\/javascript\/ui\/maskedtextbox](http://docs.telerik.com/kendo-ui/api/javascript/ui/maskedtextbox) > * 属性用法请参考kendoui API文档的maskedTextBox:[http:\/\/docs.telerik.com\/kendo-ui\/api\/javascript\/ui\/maskedtextbox](http://docs.telerik.com/kendo-ui/api/javascript/ui/maskedtextbox)
| 属性名 | 类型 | 说明 | | 属性名 | 类型 | 说明 |
| --- | --- | --- | | --- | --- | --- |
| id | String | 唯一英文标识 | | id | String | 唯一英文标识 |
| promptColspan | number | 该数字将会与col-sm-?进行拼接,替代问号,生成对应bootstrap的css样式,渲染描述的样式 | | promptColspan | number | 该数字将会与col-sm-?进行拼接,替代问号,生成对应bootstrap的css样式,渲染描述的样式 |
| promptClassName | String | 描述的样式名称,会将对应的样式添加到描述中 | | promptClassName | String | 描述的样式名称,会将对应的样式添加到描述中 |
| promptImage | String | 描述前面的一个文本图像,在设置为必填的时候会出现一个红色的* | | promptImage | String | 描述前面的一个文本图像,在设置为必填的时候会出现一个红色的* |
| prompt | String | 中文描述 || colspan| number | 该数字会与col-sm-?进行拼接,替代问号,生成对应bootStrap的css样式,渲染文本框的样式 | | prompt | String | 中文描述 || colspan| number | 该数字会与col-sm-?进行拼接,替代问号,生成对应bootStrap的css样式,渲染文本框的样式 |
| hlsClassName | String | 标签的样式名称 | | hlsClassName | String | 标签的样式名称 |
| placeholder | String | 占位符 | | placeholder | String | 占位符 |
| bind | expressions | 绑定数据 | | bind | expressions | 绑定数据 |
用法示例: 用法示例:
```xml ```xml
<h:hlsMaskedTextBox id="hlsMaskedTextBox" required="true" placeholder="hlsMaskedTextBox" /> <h:hlsMaskedTextBox id="hlsMaskedTextBox" required="true" placeholder="hlsMaskedTextBox" />
``` ```
> **提示:** > **提示:**
> >
> * 上述所有属性直接添加在标签内即可,(**\[\*\***属性名\]**\*\* = "..."**) > * 上述所有属性直接添加在标签内即可,(**\[\*\***属性名\]**\*\* = "..."**)
#### **子标签** #### **子标签**
| 属性名 | 类型 | | 属性名 | 类型 |
| --- | --- | | --- | --- |
| rules | Object | | rules | Object |
```javascript ```javascript
function rules(){ function rules(){
//... //...
} }
``` ```
```xml ```xml
<h:hlsMaskedTextBox id="hlsMaskedtTextBox" placeholder="hlsMaskedTextBox" prompt="hlsMaskedTextBox" <h:hlsMaskedTextBox id="hlsMaskedtTextBox" name="hlsMaskedtTextBox" placeholder="hlsMaskedTextBox" prompt="hlsMaskedTextBox"
bind="model" bind="enabled: isEnabled, value:data.textBox"> bind="enabled: isEnabled, value:data.hlsMaskedtTextBox">
</h:hlsMaskedTextBox> </h:hlsMaskedTextBox>
``` ```
> **提示**: > **提示**:
> >
> * 遇到**object**类型 就向下添加子标签,当遇到普通类型时,就添加到当前的标签上。 > * 遇到**object**类型 就向下添加子标签,当遇到普通类型时,就添加到当前的标签上。
# hlsPage # hlsPage(分页控件)
代码示例 代码示例
```xml ```xml
<h:hlsPage dataSource="pageDataSource" pageSize="3" titleSearchId="search" inputPlaceholder="项目信息" titleSearchInputId="searchId" id="pageFirst" titleImg="${contextPath!}/resources/images/CONT/contract.png" title="项目"> <h:hlsPage dataSource="pageDataSource" pageSize="3" titleSearchId="search" inputPlaceholder="项目信息" titleSearchInputId="searchId" id="pageFirst" titleImg="${contextPath!}/resources/images/CONT/contract.png" title="项目">
<h:columns> <h:columns>
<h:column field="divisionDesc" title='<@spring.message "业务模式"/>' > <h:column field="divisionDesc" title='<@spring.message "业务模式"/>' >
</h:column> </h:column>
<h:column field="projectStatusDesc" title='<@spring.message "审批状态"/>'> <h:column field="projectStatusDesc" title='<@spring.message "审批状态"/>'>
</h:column> </h:column>
<h:column field="tenantName" title='<@spring.message "承租人"/>' > <h:column field="tenantName" title='<@spring.message "承租人"/>' >
</h:column> </h:column>
<h:column field="systemFlag" title='<@spring.message "系统级"/>' template="fn:businessTypeTemplate"> <h:column field="systemFlag" title='<@spring.message "系统级"/>' template="fn:businessTypeTemplate">
</h:column> </h:column>
</h:columns> </h:columns>
</h:hlsPage> </h:hlsPage>
``` ```
属性说明 属性说明
| **属性** | **参数** | **说明** | | **属性** | **参数** | **说明** |
| -------- | -------- | -------- | | -------- | -------- | -------- |
| id | 唯一标志id | 返回一个名为id的分页对象 | | id | 唯一标志id | 返回一个名为id的分页对象 |
| dataSource | object | 数据源对象,参考标签hlsPageDataSource | | dataSource | object | 数据源对象,参考标签hlsPageDataSource |
| pageSize | number | 每页的分页数量,可设置每页显示数据条数 | | pageSize | number | 每页的分页数量,可设置每页显示数据条数 |
| titleSearchId | 唯一标志id | 分页标签title查询框的id,可通过改标志获取数据或其它操作 | | titleSearchId | 唯一标志id | 分页标签title查询框的id,可通过改标志获取数据或其它操作 |
| inputPlaceholder | text | 查询框的提示信息 | | inputPlaceholder | text | 查询框的提示信息 |
| titleSearchInputId | 唯一标志id | 查询图片的标准id | | titleSearchInputId | 唯一标志id | 查询图片的标准id |
| titleImg | String | 标题栏的图片路劲 | | titleImg | String | 标题栏的图片路劲 |
| title | String | 标题栏名称 | | title | String | 标题栏名称 |
| field | String | 字段的英文标注 | | field | String | 字段的英文标注 |
| title(2) | String | 字段的中文标注 | | title(2) | String | 字段的中文标注 |
| template | function | 渲染函数,可将返回的html字符串渲染到对应的字段 | | template | function | 渲染函数,可将返回的html字符串渲染到对应的字段 |
\ No newline at end of file
## hlsTlEdit ## hlsTlEdit(多语言控件)
多语言编辑 多语言编辑
##### xml配置 ##### xml配置
```xml ```xml
<!--h:为命名空间,必须要加的;hlsTlEdit为组件名;id可写可不写--> <!--h:为命名空间,必须要加的;hlsTlEdit为组件名;id可写可不写-->
<h:hlsTlEdit id="hlsTlEdit"/> <h:hlsTlEdit id="hlsTlEdit"/>
``` ```
#### **一般属性** #### **一般属性**
| 属性名 | 类型 | 说明 | | 属性名 | 类型 | 说明 |
| --- | --- | --- | | --- | --- | --- |
| id | String | 唯一英文标识 | | id | String | 唯一英文标识 |
| promptColspan | number | 该数字将会与col-sm-?进行拼接,替代问号,生成对应bootstrap的css样式,渲染描述的样式 | | promptColspan | number | 该数字将会与col-sm-?进行拼接,替代问号,生成对应bootstrap的css样式,渲染描述的样式 |
| promptClassName | String | 描述的样式名称,会将对应的样式添加到描述中 | | promptClassName | String | 描述的样式名称,会将对应的样式添加到描述中 |
| promptImage | String | 描述前面的一个文本图像,在设置为必填的时候会出现一个红色的* | | promptImage | String | 描述前面的一个文本图像,在设置为必填的时候会出现一个红色的* |
| prompt | String | 中文描述 | | prompt | String | 中文描述 |
| colspan| number | 该数字会与col-sm-?进行拼接,替代问号,生成对应bootStrap的css样式,渲染文本框的样式 | | colspan| number | 该数字会与col-sm-?进行拼接,替代问号,生成对应bootStrap的css样式,渲染文本框的样式 |
| hlsClassName | String | 标签的样式名称 | | hlsClassName | String | 标签的样式名称 |
| placeholder | String | 占位符 | | placeholder | String | 占位符 |
| bind | expressions | 绑定数据 | | bind | expressions | 绑定数据 |
用法示例: 用法示例:
```xml ```xml
<h:hlsTlEdit id="tl" placeholder="多语言" bind="value:data.name" idField="id" field="name" dto="com.hand.hap.function.dto.Resource" model="viewModel.data"> <h:hlsTlEdit id="tl" placeholder="多语言" bind="value:data.name" idField="id" field="name" dto="com.hand.hap.function.dto.Resource" model="viewModel.data">
</h:hlsTlEdit> </h:hlsTlEdit>
``` ```
> **提示:** > **提示:**
> >
> * 以上所有属性都直接可以添加到tlEdit标签上,用法皆为\[**属性名**\]="\[**属性值**\]" > * 以上所有属性都直接可以添加到tlEdit标签上,用法皆为\[**属性名**\]="\[**属性值**\]"
# Oracle,MySql,Sqlserver数据库配置
## 配置文件
1. 服务数据源配置
* 融租易默认使用 JNDI 来配置数据源。数据源的配置独立于项目配置
* 默认使用的 JNDI name 为 `jdbc/hel_dev`
* tomcat 需要配置 context.xml:
- Mysql
```
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/hel" name="jdbc/hel_dev" type="javax.sql.DataSource" username="hel_dev" password="hel_dev"/>
```
- Oracle
```
<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" name="jdbc/hel_dev" type="javax.sql.DataSource" url="jdbc:oracle:thin:@127.0.0.1:1521:hel" username="hel_dev" password="hel_dev"/>
```
- SqlServer
```
<Resource auth="Container" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://127.0.0.1:1433; DatabaseName=hel" name="jdbc/hel_dev" type="javax.sql.DataSource" username="hel_dev" password="hel_dev"/>
```
* 其他[应用服务器weblogic](/框架功能描述/deployment.md)等,需要按其配置方法 配置 JNDI
2. 数据库数据源配置
> 融租易项目根目录的pom.xml中默认包含了 `Oracle`,`Mysql`,`SqlServer` 的 JDBC 驱动,一般不需要改动
* 修改 resources/config.properties
* 当数据库为 oracle 时
```
db.type=oracle
db.jndiName=java:comp/env/jdbc/hel_dev
mybatis.identity=SEQUENCE
```
* 当数据库为mysql时
```
db.type=mysql
db.jndiName=java:comp/env/jdbc/hel_dev
```
* 修改完毕后复制一份放到 resources/profiles/dev (覆盖)
3. redis服务配置
修改resources/config.properties:
* 配置单个redis的时候只需配置
```
redis.ip=172.20.0.115
redis.port=6379
redis.db=1
```
* 当配置redis集群时需配置
```
redis.useSentinel=true --为true时单个redis配置熟悉失效
redis.sentinel=\
10.86.20.183:26379,\
10.86.20.184:26379
```
# 新建数据库
# 1. 创建数据库-Mysql
> 在开始之前最好修改一下 MySQL的配置文件 my.cnf (or my.ini)
,在 [mysqld] 下添加
```
lower_case_table_names=1
character_set_server=utf8
max_connections=500
```
* 用管理员登陆mysql
* 创建数据库hel_dev
```sql
create schema hel_dev default character set utf8;
```
* 创建用户hel_dev,并将密码设置为hel_dev
```sql
CREATE USER hel_dev@'%' IDENTIFIED BY 'hel_dev';
CREATE USER hel_dev@'localhost' IDENTIFIED BY 'hel_dev';
```
* 将上面新建的hel_dev权限赋予用户hel
```sql
GRANT ALL PRIVILEGES ON hel_dev.* TO hel_dev@'%';
GRANT ALL PRIVILEGES ON hel_dev.* TO hel_dev@'localhost';
flush privileges;
```
# 2. 创建数据库-Oracle
* 使用管理员登陆
* 创建表空间
```sql
CREATE BIGFILE TABLESPACE tbs_perm_hel
DATAFILE 'tbs_perm_hel.dat'
SIZE 200M
AUTOEXTEND ON NEXT 20M MAXSIZE 500M;
```
```sql
CREATE TEMPORARY TABLESPACE tbs_temp_hel
TEMPFILE 'tbs_temp_hel.dbf'
SIZE 200M
AUTOEXTEND ON NEXT 20M MAXSIZE 500M;
```
* 创建用户 schema
```sql
CREATE USER hel_dev
IDENTIFIED BY hel_dev
DEFAULT TABLESPACE tbs_perm_hel
TEMPORARY TABLESPACE tbs_temp_hel
QUOTA 200M on tbs_perm_hel;
```
* 授权
```sql
GRANT create session TO hel_dev;
GRANT create table TO hel_dev;
GRANT create view TO hel_dev;
GRANT create any trigger TO hel_dev;
GRANT create any procedure TO hel_dev;
GRANT create sequence TO hel_dev;
GRANT create synonym TO hel_dev;
```
# 3. 创建数据库-sql server
* 使用管理员登陆
* 创建数据库
```sql
CREATE DATABASE hel_dev COLLATE Chinese_PRC_CI_AS;
```
* 创建用户 hel 并授权
```sql
sp_addlogin 'hel','hel_dev';
use hel_dev
go
sp_adduser 'hel_dev','hel_dev'
go
sp_addrolemember 'db_owner','hel'
go
```
\ No newline at end of file
## Excel文件导入 ## Excel文件导入
使用poi解析xml方式进行导入,只支持单表导入。 使用poi解析xml方式进行导入,只支持单表导入。
数据库批量导入默认batch为100. 数据库批量导入默认batch为100.
支持多sheet导入,sheet1从第三行开始读取数据,其他sheet页从第一行导入数据。 支持多sheet导入,sheet1从第三行开始读取数据,其他sheet页从第一行导入数据。
使用方法: 使用方法:
1. Excel文件上传 1. Excel文件上传
```javascript ```javascript
$("#files").kendoUpload({ $("#files").kendoUpload({
async: { async: {
saveUrl: "${base.contextPath}/hls/excel/import?${_csrf.parameterName}=${_csrf.token}&templateCode=HLS_FIN_STATEMENT_LN", saveUrl: "${base.contextPath}/hls/excel/import?${_csrf.parameterName}=${_csrf.token}&templateCode=HLS_FIN_STATEMENT_LN",
removeUrl: "remove" removeUrl: "remove"
}, },
showFileList: false, showFileList: false,
upload: onUpload, upload: onUpload,
success: onSuccess success: onSuccess
}); });
``` ```
| 参数名 | 描述 | | 参数名 | 描述 |
| :--: | :--: | | :--: | :--: |
| _csrf.token | 防跨域token | | _csrf.token | 防跨域token |
| templateCode | 作为模块标识,会出现先在fnd_interface_header中,供后续业务逻辑进行处理 | | templateCode | 作为模块标识,会出现先在fnd_interface_header中,供后续业务逻辑进行处理 |
2. 处理数据 2. 处理数据
经过第一步的文件上传,后台会在fnd_interface_header表中生成一条数据,其中包含了传递的templateCode参数作为code,并且,在fnd_interface_lines表中按照顺序,将Excel文件中的每一行数据保存为一条数据,数据的第一列保存在attributes_1上,依次类推。 经过第一步的文件上传,后台会在fnd_interface_header表中生成一条数据,其中包含了传递的templateCode参数作为code,并且,在fnd_interface_lines表中按照顺序,将Excel文件中的每一行数据保存为一条数据,数据的第一列保存在attributes_1上,依次类推。
![ExcelImport](/assets/excelImport.png) ![ExcelImport](/assets/excelImport.png)
## Excel文件批量导出 ## Excel文件批量导出
本系统支持Excel文件导出排队处理,支持超大数据量,能实时查询文件生成情况,支持取消导出。 本系统支持Excel文件导出排队处理,支持超大数据量,能实时查询文件生成情况,支持取消导出。
#### 前端使用方法 #### 前端使用方法
调用js方法 调用js方法
* 方法一(针对grid)
```javascript ```javascript
Hel.exportExcel=function(opts){ Hel.exportExcel=function(opts){
var contextPath =opts.contextPath, var contextPath =opts.contextPath,
id=opts.id, id=opts.id,
view_model=opts.viewModel, view_model=opts.viewModel,
viewModelData=opts.viewModelData, viewModelData=opts.viewModelData,
controller_name = opts.controller, controller_name = opts.controller,
fileName = opts.fileName, fileName = opts.fileName,
temp_div_id=opts.tempDivId, temp_div_id=opts.tempDivId,
dataSourceId = opts.dataSourceId, dataSourceId = opts.dataSourceId,
_csrf_token = opts._csrf_token; _csrf_token = opts._csrf_token;
``` ```
| 参数名 | 描述 | | 参数名 | 描述 |
| :--: | :--: | | :--: | :--: |
| contextPath | 项目的url路径 | | contextPath | 项目的url路径 |
| id | 页面上grid的id | | id | 页面上grid的id |
| view_model | grid绑定的model数据模型 | | view_model | grid绑定的model数据模型 |
| viewModelData | model模型中的数据 | | viewModelData | model模型中的数据 |
| controller_name | 后端控制器名称 | | controller_name | 后端控制器名称 |
| fileName | excel文件名 | | fileName | excel文件名 |
| temp_div_id | 临时div的id | | temp_div_id | 临时div的id |
| dataSourceId | 数据源id | | dataSourceId | 数据源id |
| _csrf_token | 防跨域的token | | _csrf_token | 防跨域的token |
#### 后端使用方法 * 方式二(针对hlsPage)
1. 在代码中注入Excel导出Service
```javascript
```java Hel.exportPageExcel({
@AutoWired contextPath:basePath,
private ExcelExportServiceImpl excelService; param:{},
``` controller:"/acr/inf/index/excel/export",
2. 在自己的controller中调用方法 fileName:"产品线",
pageConfig:[
```java {"name":"documentNumber","title":"单据编 号","width":260,"align":"","type":"string"},
excelService.saveExportInfo(sqlId,iRequest,config,rowMaxNumber); {"name":"invoiceDate","title":"开票日期","align":"","type":"string"},
``` {"name":"invoiceKindDesc","title":"发票种类","width":160,"align":"center","type":"boolean"},
{"name":"bpName","title":"购货单位"},
| 参数名 | 类型 | 描述 | ]
| :--: | :--: | :--: | });
| sqlId | String | mybatis对应的数据库查询语句的ID |
| iRequest | IRequest | 带有上下文信息的reuqest对象 | ```
| config | ExportConfig | 包含Excel各列信息的对象,由前台传递json对象转换而来 |
| rowMaxNumber | int | 生成Excel的最大行数,可使用重载方法,不包含次参数默认为1,000,000 | | 参数名 | 描述 |
| --- | --- |
3. 运行Excel导出程序(获取该程序,请联系部门相关负责人) | contextPath | 项目上的url |
| param| 配合controller添加查询条件 |
```shell | controller | 对应查询url |
java -jar hel-batch-parent.jar & | fileName | 文件名 |
``` | pageConfig | 导出字段名称及样式|
4. Excel导出情况查询
用户若是为管理员身份,则查询全部人的导出情况,否则只显示当前用户的导出数据 #### 后端使用方法
1. 在代码中注入Excel导出Service
```java
excelService.queryExportInfo(status, iRequest); ```java
``` @AutoWired
private ExcelExportServiceImpl excelService;
| 参数名 | 类型 | 描述 | ```
| :--: | :--: | :--: | 2. 在自己的controller中调用方法
| status | String | 指定Excel导出的状态,该参数可为空查询全部状态数据<br><ul><li>new->等待</li><li>generating->文件导出中</li><li>finished->导出完成</li><li>failed-> 导出失败</li></ul> |
| iRequest | IRequest | 带有上下文信息的reuqest对象 | ```java
excelService.saveExportInfo(sqlId,iRequest,config,rowMaxNumber);
5. 下载已完成的Excel文件 ```
```java | 参数名 | 类型 | 描述 |
excel.downloadExcel(filePath, fileName, request, response); | :--: | :--: | :--: |
``` | sqlId | String | mybatis对应的数据库查询语句的ID |
| iRequest | IRequest | 带有上下文信息的reuqest对象 |
| 参数名 | 类型 | 描述 | | config | ExportConfig | 包含Excel各列信息的对象,由前台传递json对象转换而来 |
| :--: | :--: | :--: | | rowMaxNumber | int | 生成Excel的最大行数,可使用重载方法,不包含次参数默认为1,000,000 |
| filePath | String | 需要下载的文件的路径 |
| fileName | String | 想要保存的文件的名称 | 3. 运行Excel导出程序(获取该程序,请联系部门相关负责人)
| request | HttpServletRequest | 用户的请求对象 |
| response | HttpServletResponse | 用户的响应对象 | ```shell
java -jar hel-batch-parent.jar &
```
4. Excel导出情况查询
用户若是为管理员身份,则查询全部人的导出情况,否则只显示当前用户的导出数据
```java
excelService.queryExportInfo(status, iRequest);
```
| 参数名 | 类型 | 描述 |
| :--: | :--: | :--: |
| status | String | 指定Excel导出的状态,该参数可为空查询全部状态数据<br><ul><li>new->等待</li><li>generating->文件导出中</li><li>finished->导出完成</li><li>failed-> 导出失败</li></ul> |
| iRequest | IRequest | 带有上下文信息的reuqest对象 |
5. 下载已完成的Excel文件
```java
excel.downloadExcel(filePath, fileName, request, response);
```
| 参数名 | 类型 | 描述 |
| :--: | :--: | :--: |
| filePath | String | 需要下载的文件的路径 |
| fileName | String | 想要保存的文件的名称 |
| request | HttpServletRequest | 用户的请求对象 |
| response | HttpServletResponse | 用户的响应对象 |
**下载前,需要检查config.properties文件中的export.offerUrl配置项是否配置正确,且为hel-batch-parent.jar提供的文件下载url** **下载前,需要检查config.properties文件中的export.offerUrl配置项是否配置正确,且为hel-batch-parent.jar提供的文件下载url**
\ No newline at end of file
# 融租易开发手册 # 融租易开发手册
* [GitBook使用](/gitbook.md) * [GitBook使用](/gitbook.md)
--- ---
* I. 开发环境准备
* I. 开发环境准备
* [1.1 Git 使用](/git-guide.md "git指令")
* [1.2 Maven 使用](/maven.md "maven使用") * [1.1 Git 使用](/git-guide.md "git指令")
* [1.3 开发环境搭建](/project-create.md) * [1.2 Maven 使用](/maven.md "maven使用")
* [1.4 更新项目的HEL依赖版本](/project-update.md) * [1.3 开发环境搭建](/project-create.md)
* [1.5 Liquibase](/liquibase-use.md) * [1.4 更新项目的HEL依赖版本](/project-update.md)
* [1.5 Liquibase](/liquibase-use.md)
* II. 项目开发规范
* II. 项目开发规范
* [2.1 项目开发规范](/codeStyle.md#backEndDev)
* [2.2 编码规范](/codeStyle.md#backEndName) * [2.1 项目开发规范](/codeStyle.md#backEndDev)
* 2.3 Checkstyle * [2.2 编码规范](/codeStyle.md#backEndName)
* 2.3 Checkstyle
* III. 后端开发
* [3.1 后端开发说明(1.0)](/后端开发/dev-flow.md) * III. 后端开发
* [3.2 用户安全策略](/后端开发/user-security-strategy.md)
* [3.3 审计](/后端开发/audit.md) * [3.1 后端开发说明\(1.0\)](/后端开发/dev-flow.md)
* [3.4 锁机制](/后端开发/lock.md) * [3.2 用户安全策略](/后端开发/user-security-strategy.md)
* [3.5 日志管理](/后端开发/elk.md) * [3.3 审计](/后端开发/audit.md)
* [3.6 代码生成器](/后端开发/code-generator.md) * [3.4 锁机制](/后端开发/lock.md)
* [3.7 跨域访问](/后端开发/3.24-cors.md) * [3.5 日志管理](/后端开发/elk.md)
* [3.6 代码生成器](/后端开发/code-generator.md)
* IV. 前端JavaScript开发 * [3.7 跨域访问](/后端开发/3.24-cors.md)
* [3.8 消息机制](/后端开发/消息机制.md)
* [4.1 前端开发说明 \(1.0\)](/front-kendoui.md)
* [4.2 字段级通用方法](/common-field-javascript.md) * IV. 前端JavaScript开发
* [4.3 窗口级通用方法](/common-window-javascript.md)
* [4.4 锁屏和解屏通用方法](/common-mask-javascript.md) * [4.1 前端开发说明 \(1.0\)](/front-kendoui.md)
* [4.2 字段级通用方法](/common-field-javascript.md)
* V. 前端UI开发 * [4.3 窗口级通用方法](/common-window-javascript.md)
* [4.4 锁屏和解屏通用方法](/common-mask-javascript.md)
* [5.1 hlsCombobox(下拉框)](/前端组件/hlsCombobox.md)
* [5.2 hlsDataSource](/前端组件/hlsDataSource.md) * V. 前端UI开发
* [5.3 hlsMaskedTextBox](/前端组件/hlsMaskedTextBox.md)
* [5.4 hlsPage](/前端组件/hlsPage.md) * [5.1 hlsCombobox\(下拉框\)](/前端组件/hlsCombobox.md)
* [5.5 hlsTextArea](/前端组件/hlsTextArea.md) * [5.2 hlsDataSource\(数据源\)](/前端组件/hlsDataSource.md)
* [5.6 hlsTlEdit](/前端组件/hlsTlEdit.md) * [5.3 hlsMaskedTextBox\(文本框\)](/前端组件/hlsMaskedTextBox.md)
* [5.7 hlsDatePicker(日期选择框)](/前端组件/hlsDatePicker.md) * [5.4 hlsPage\(分页控件\)](/前端组件/hlsPage.md)
* [5.8 hlsDateTimePicker(时间选择框)](/前端组件/HlsDateTimePicker.md) * [5.5 hlsTextArea\(文本域\)](/前端组件/hlsTextArea.md)
* [5.9 hlsLov(lov选择框)](/前端组件/HlsLov.md) * [5.6 hlsTlEdit\(多语言\)](/前端组件/hlsTlEdit.md)
* [5.10 hlsToolBar(底部菜单栏)](/前端组件/HlsToolBar.md) * [5.7 hlsDatePicker\(日期选择框\)](/前端组件/hlsDatePicker.md)
* [5.11 TabStrip(sheet页切换卡)](/前端组件/TabStrip.md) * [5.8 hlsDateTimePicker\(时间选择框\)](/前端组件/hlsDateTimePicker.md)
* [5.12 hlsForm(表单)](/前端组件/hlsForm.md) * [5.9 hlsLov\(lov选择框\)](/前端组件/hlsLov.md)
* [5.13 hlsCombobox](/前端组件/HlsCombobox.md) * [5.10 hlsToolBar\(底部菜单栏\)](/前端组件/hlsToolBar.md)
* [5.14 hlsCheckBox(复选框)](/前端组件/HlsCheckBox.md) * [5.11 TabStrip\(sheet页切换卡\)](/前端组件/tabStrip.md)
* [5.15 Grid](/前端组件/Grid.md) * [5.12 hlsForm\(表单\)](/前端组件/hlsForm.md)
* [5.16 DataSource](/前端组件/DataSource.md) * [5.13 hlsCombobox\(下拉框\)](/前端组件/hlsCombobox.md)
* [5.17 hlsGridBox](/前端组件/hlsGridBox.md) * [5.14 hlsCheckBox\(复选框\)](/前端组件/hlsCheckBox.md)
* [5.18 NumericTextBx](/前端组件/NumericTextBox.md) * [5.15 hlsGrid\(表格\)](/前端组件/hlsGrid.md)
* [5.19 HlsNavigationBar](/前端组件/HlsNavigationBar.md) * [5.16 dataSource\(数据源\)](/前端组件/dataSource.md)
* [5.17 hlsGridBox\(表格\)](/前端组件/hlsGridBox.md)
* VI. 框架功能描述 * [5.18 hlsNumericTextBox\(数字框\)](/前端组件/hlsNumericTextBox.md)
* [5.19 hlsNavigationBar\(导航栏\)](/前端组件/hlsNavigationBar.md)
* [6.1 计划任务](/框架功能描述/计划任务.md)
* [6.2 RabbitMq消息队列](/后端开发/RabbitMq消息队列.md) * VI. 框架功能描述
* [6.3 应用服务部署(tomcat/weblogic)](/框架功能描述/deployment.md)
* [6.4 合同文本生成](/框架功能描述/docx4j.md) * [6.1 计划任务](/框架功能描述/计划任务.md)
* [6.5 Excel导入导出](/框架功能描述/jad.md) * [6.2 RabbitMq消息队列](/后端开发/RabbitMq消息队列.md)
* [6.6 redis安装和部署](/后端开发/redis.md) * [6.3 应用服务部署\(tomcat/weblogic\)](/框架功能描述/deployment.md)
* [6.4 合同文本生成](/框架功能描述/docx4j.md)
* [6.5 Excel导入导出](/框架功能描述/jad.md)
* [6.6 redis安装和部署](/后端开发/redis.md)
* [6.7 工作流功能说明](/后端开发/activiti-helper.md)
* [6.8 工作流开发指南](/后端开发/activiti.md)
* [6.9 工作流demo](/后端开发/activiti_demo.md)
* [6.10 流程设计](/后端开发/activiti_editor_helper.md)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment