Commit 65a4d748 authored by 高洋's avatar 高洋

Track 24 files into repository.

- untracked assets/edit_schedule.png
- untracked assets/job_change_status.png
- untracked assets/job_create.png
- untracked assets/job_create2.png
- untracked assets/job_infomation.png
- untracked assets/job_status.png
- untracked assets/schedule_edit.png
- untracked assets/task_authority.png
- untracked assets/task_define.png
- untracked assets/task_maintain.png
- untracked assets/task_parameter.png
- modified codeStyle.md
- untracked frontCodeStyle.md
- untracked 前端组件/box.md
- untracked 前端组件/HlsCheckBox.md
- modified 前端组件/hlsCombobox.md
- modified 前端组件/hlsDatePicker.md
- untracked 前端组件/HlsDateTimePicker.md
- untracked 前端组件/hlsForm.md
- untracked 前端组件/HlsLov.md
- untracked 前端组件/HlsToolBar.md
- untracked 前端组件/TabStrip.md
- untracked 框架功能描述/计划任务.md
- modified 融租易开发手册.md

Auto commit by GitBook Editor
parent efd2a779
## [一、后端开发规范](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命名规则,以**DTO**结尾,如:
- **SysUserDTO** - **SysUserDTO**
- **SysRoleDTO** - **SysRoleDTO**
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)`
--- ---
## [三、前端开发规范](id:frontEndDev)
#### 目录划分
按照web目录规范,前端文件存放在如下目录
```
webapp
├─lib
│ ├─bootstrap-3.3.7
│ ├─font-awesome-4.6.3
│ └─kendoui
├─resources
│ ├─css
│ ├─font
│ ├─images
│ ├─js
│ ├─upload
└─WEB-INF
├─web.xml
└─view
```
资源文件目录
资源文件按照类型划分为两个目录:**`lib`****`resources`**
- **`lib`**目录存放kendoui的所有文件
- **`resources`**目录存放程序通用的资源文件
功能文件目录
功能文件存放在**`view`**目录下,目录的命名规则按照
> **[模块代码]**/**[功能项代码]**
例如:用户管理的功能代码是SYS001,那么用户管理相关的界面文件都存放在
```
src/main/webapp/WEB-INF/view/sys/sys001/
```
--- ---
## [四、前端命名规范](id:frontEndName)
#### 文件命名约定
界面文件按照如下格式:
>[模块代码]<u> </u>[业务对象]<u> </u>[功能操作].html
例如:用户查询界面: sys_user_query.html
#### url命名约定
对于系统中提交的url地址,按照以下格式命名
>[contextPath]/[模块代码]/[业务对象]/[操作类型]
对于常见的几种操作类型定义如下
查询URL
>[模块代码]/[业务对象]/query
批量提交
>[模块代码]/[业务对象]/submit
批量删除
> [模块代码]/[业务对象]/remove
例如用户的查询: sys/user/query
#### 脚本变量
变量命名原则是减少变量冲突,采用Camel命名法。
>var [开发项ID]_[具体业务含义] = {}
例如:用户管理界面中用户查询的grid数据
>var d_um_002_grid = $('#d_um_002_grid').data("kendoGrid");
#### 脚本函数名
函数命名也采用Camel命名法.
>function [开发项ID]_[具体业务含义](){...}
例如用户查询函数
```javascript
function d_um_002_query(){
....
}
## [一、前端开发规范](id:frontEndDev)
#### 目录划分
按照web目录规范,前端文件存放在如下目录
```
webapp
├─resources
│ ├─css
│ ├─images
│ ├─js
└─WEB-INF
├─web.xml
└─view
```
资源文件目录
资源文件按照类型划分为:**`resources`**
- **`resources`**目录存放程序通用的资源文件
功能文件目录
功能文件存放在**`view`**目录下,目录的命名规则按照
> **[模块代码]**/**[功能项代码]**
例如:用户管理的功能代码是SYS001,那么用户管理相关的界面文件都存放在
```
src/main/webapp/WEB-INF/view/sys/sys001/
```
--- ---
## [二、前端命名规范](id:frontEndName)
#### 文件命名约定
界面文件按照如下格式:
>[模块代码]<u> </u>[业务对象]<u> </u>[功能操作].html
例如:用户查询界面: sys_user_query.html
#### url命名约定
对于系统中提交的url地址,按照以下格式命名
>[contextPath]/[模块代码]/[业务对象]/[操作类型]
对于常见的几种操作类型定义如下
查询URL
>[模块代码]/[业务对象]/query
批量提交
>[模块代码]/[业务对象]/submit
批量删除
> [模块代码]/[业务对象]/remove
例如用户的查询: sys/user/query
#### 脚本变量
变量命名原则是减少变量冲突,采用Camel命名法。
>var [开发项ID]_[具体业务含义] = {}
例如:用户管理界面中用户查询的grid数据
>var d_um_002_grid = $('#d_um_002_grid').data("kendoGrid");
#### 脚本函数名
函数命名也采用Camel命名法.
>function [开发项ID]_\[具体业务含义\](){...}
例如用户查询函数
```javascript
function d_um_002_query(){
....
}
\ No newline at end of file
# hlsCheckbox 标签
hlsCheckbox框,一般与<h:hlsForm><h:hlsHBox>一起使用,定义一个带文字说明的选择框。
```xml
<h:hlsCheckbox id="testCheckbox" bind="value:data.testValue" readonly="false" checkedValue="Y" uncheckedValue="N" />
```
### **主要属性**
| 属性名 | 类型 | 描述 |
| --- | --- | --- |
|promptColspan | String | 文字说明盒子的长度|
|promptClassName | String | 文字说明盒子的样式|
|promptImage|String|文字说明部分的图标(要求是一个完整的img标签)|
| prompt | String | 文字说明 |
| bind | String | 该选择框绑定关系 |
| required | String & Boolean & 不填 | 必选|
| checkedValue | String | 选中时input框的值 |
| uncheckedValue | String | 未选中时input框的值 |
| readonly | Boolean | 是否是可点击的 |
### **用法示例**
```xml
var viewModel = kendo.observable({
enabled: true,
isEnabled: false,
data: {},
});
<h:hlsForm title="hlsFormTitle" id="hlsFormTitleId" width="100%">
<h:hlsHBox>
<h:hlsCheckbox name="testCheckboxName" id="testCheckbox"
bind="enabled: enabled,value:model.testValue"
checked="checked" checkedValue="Y" prompt="hlsCheckbox测试:" uncheckedValue="N"
promptColspan="1" style="width:100%"/>
</h:hlsHBox>
</h:hlsForm>
```
# HlsDateTimePicker标签
时间选择器(带时分秒)
### **主要属性**
属性名 | 类型
-------- | -----
promptColspan | Integer
promptClassName | className
id | String
promptImage | String
prompt | String
colspan | String
hlsClassName | String
animation | Boolean
ARIATemplate| String
culture | String
depth| String
footer| String & Function
format| String
max| String
min| String
start| String
value | String
name | String
bind | Function
required | Boolean
change | Function
close| Function
open | Function
placeholder | String
interval |Integer
timeFormat |String
> **提示:** 属性用法请参考kendoui API文档 http://docs.telerik.com/kendo-ui/api/javascript/ui/datetimepicker
### **用法示例**
```javascript
//注意是写在script标签内的
var viewModel = kendo.observable({
data:{},
isEnabled:true
});
function open(){
//...
}
function change(e){
//...
}
```
```xml
<h:hlsDateTimePicker name="hlsDateTimePicker" id="hlsDateTimePicker"
colspan="3"
bind="enabled:isEnabled,value:data.hlsDateTimePicker"
prompt="上会时间"
promptColspan="1"
required="true"
style="width:100%"
max="2016-6-6"
open="open"
/>
id:可写可不写
bind:属性里面包含配置两个选项:
(1)enabled配置日期选择器是否可以编辑,值为Boolean类型的变量,在viewModel里面配置
(2)value配置日期选择器与变量关联,默认是在ViewModel下面的变量
max:可选择日期的上限值
style可改变该控件的样式
open:点击控件调用的方法
change:选择日期之后的事件
prompt:为控件添加一个label,该属性一般和<h:hlsForm><h:hlsHBox>一起使用
colspan:时间选择器的宽度(按照bootstrap,列12等分来计算)
promptColspan:label的宽度
```
> **提示:**
> - 上述所有属性直接添加在标签内即可,(**[属性名] = "..."**),对于既是**String**类型又是**Function**类型的属性,只需要加**fn:**前缀区分即可,(**fn:函数名**)
> - 对于**max min**等本该是**时间类型**的属性,改为日期字符串,且连接符号为"**-**"
# hlsLOV标签
#### lov标签的数据源和展示由功能定义,因此在写LOV之前需要在lov配置功能处配好相关信息,可配置项包括:
##### 1.lov框的具体样式、结构;
##### 2.lov框的数据来源
```xml
//code、locale、contenxtPath为必须的参数,其中code为所需lov在lov定义时的code的值
<h:hlsLov name="lov" id="lov" code="LOV_CON_CONTRACT_TENANT" contextPath="${base.contextPath}" locale="${base.locale}"/>
```
#### **必须参数**
参数名|类型/值
----|----
code|String
locale|String (一般为${base.locale})
contextPath|String(一般为${base.contextPath})
#### **一般属性**
属性名|类型
----|----
promptColspan | String
promptClassName | String
promptImage | String
prompt | String
name|String
enabled|Boolean
valuePrimitive|Boolean
text|String
dataTextField|String
dataValueField|String
open|function
close|function
select|function
query|function
用法示例:
```javascript
var viewModel = kendo.observable({
enabled: true,
isEnabled: false,
data: {},
});
//以下代码写在script标签内
//lov查询时触发
function lovQuery(e) {
//lov查询拼上条件
e.param['contractId'] = 1237;
};
//选中lov行数据后触发
function lovSelect(e) {
//选中lov行数据后
//options是
viewModel.data.set("contractId", e.item.contractId);
};
```
```xml
<!--xml代码-->
<h:hlsLov name="lov" id="lov" code="LOV_ROLE" colspan="3" contextPath="${base.contextPath}" data-bind="enabled: enabled, locale="${base.locale}" placeholder="承租人名称" prompt="lov:" promptColspan="1" select="lovSelect" query="lovQuery" style="width: 100%"/>
```
> **提示:**
> - 上述所有属性直接添加在标签内即可,(**[属性名] = "..."**),对于既是**String**类型又是**Function**类型的属性,只需要加**fn:**前缀区分即可,(**fn:函数名**)
# hlsToolBar
-------------
hlsToolBar菜单栏标签,通常与<h:hlsButton>一起使用,固定于页面的底部,不随滚动条变化而变化。
##### xml配置
```xml
<!--h:为命名空间,必须要加的;treeList为组件名;id可写可不写-->
<h:hlsToolBar>
<h:hlsButton click="TEST5" text="测试" />
</h:hlsToolBar>
```
#### **一般属性**
> **提示:**
该标记通常作为一个容器,固定于页面底部,一般只对其样式进行修改。
属性名 | 类型
-------- | ---
hlsStyle| String
hlsClassName | String
用法示例:
```javascript
//注意是写在script标签里的内容
function TEST5(){
...
}
```
```xml
<h:hlsToolBar hlsStyleClassName="test-class" hlsStyle="backgroud-color:blue">
<h:hlsButton click="TEST5" text="测试" />
</h:hlsToolBar>
hlsStyleClassName:css类样式名字
hlsStyle:css样式
click:点击事件调用的方法名
text:按钮的文字说明
```
> **提示:**
> - 每个hls开头的标签都有hlsClassName和hlsStyle属性,因为有的标签主要说明其功能,所以没强调。
tabStrip
-------------
#### **tabStrip标签页**
```xml
<!--h:为命名空间,必须要加的;id可写可不写;value为默认打开的标签页,属性值对应tab页的title的值;animation表示是否启用动画,值类型为布尔值-->
<h:tabStrip id="tabstrip" value="Paris" animation="false">
<h:tabs>
//title为标签页的标题
<h:tab title="Paris">
//此标签的html内容
...
</h:tab>
<h:tab title="New York">
...
</h:tab>
</h:tabs>
</h:tabStrip>
```
#### **一般属性**
> **提示:**
> - 属性用法请参考kendoui API文档的tabStrip:http://docs.telerik.com/kendo-ui/api/javascript/ui/tabstrip
属性名|类型
----|----
animation|Boolean
collapsible|Boolean
dataContentField|String
dataSource | kendo.data.DataSource(Function)
dataTextField|String
navigatable|true
scrollable|Boolean
tabPosition|String
value|String
activate|function
contentLoad|function
error|function
select|function
change| Function
dataBound | Function
dataBinding|function
用法示例:
```xml
<h:tabStrip value="标签2" collapsible="true" tabPosition="top">
<h:tabs>
<h:tab title="标签1">
<h:button text="hello1" className="btn-primary" click="test" enable="true" icon="cancel"/>
<h:button text="hello2" className="btn-primary" click="test" enable="true" icon="cancel"/>
</h:tab>
<h:tab title="标签2">
<h:button text="hello3" className="btn-primary" click="test" enable="true" icon="cancel"/>
<h:button text="hello4" className="btn-primary" click="test" enable="true" icon="cancel"/>
</h:tab>
</h:tabs>
</h:tabStrip>
<!--或者 将tabStrip与dataSource绑定,-->
<h:dataSource id="dataSourceTabStrip">
<h:data>
<h:item name="tab1" content="tab1content"/>
<h:item name="tab2" content="tab2content"/>
</h:data>
</h:dataSource>
<h:tabStrip dataSource="dataSourceTabStrip" dataTextField="name" dataContentField="content" />
```
> **提示:**
> - 上述所有属性直接添加在标签内即可,(**[属性名] = "..."**),对于既是**String**类型又是**Function**类型的属性,只需要加**fn:**前缀区分即可,(**fn:函数名**)
## 抽屉通用方法
### 1.打开抽屉
> Hel.openBox()函数接收一个对象,对象属性含义如下:
属性名 | 类型 | 含义
-------- | ----- | -----
winId | String(必填) | html元素标签的id
functionCode | String(必填) | 抽屉的唯一标识,用以确定该抽屉的相关信息
params | Object | 需传递的参数,将自动拼到url上
closeFunction | function | 关闭抽屉调用的方法
```javascript
function test(e){
...
}
Hel.openBox({
winId:"domId",
functionCode:"CSH200B",
params:{
contractId:1327,
conContractCashflowId:4321
},
closeFunction:test
});
```
#### 注意:
> - winId和functionCode必须有字符串类型的值
> - params可以没有,表示不拼接条件;
> - closeFunction可以没有,表示关闭抽屉不进行操作
# hlsCombobox标签
# hlsCombobox标签
hlsCombobox 下拉列表组件
ComboBox下拉列表组件,通常数据源以code - meaning形式出现,用户操作的是meaning,实际保存的是code。
```xml
<h: hlsCombobox placeholder="hlsCombobox" ```xml
valuePrimitive="true"
dataTextField="text" <h:hlsCombobox name="hlsCombobox" id="hlsCombobox"
dataValueField="value" bind="enabled: isEnabled,source: sdDataSource, value:data.code"
bind="enabled: isEnabled, source: comboboxSource, value:data.productId" colspan="3"
style="width: 100%;"/> dataTextField="meaning"
``` dataValueField="code"
placeholder="hlsCombobox"
### **主要属性** prompt="hlsCombobox"
promptColspan="1"
| 属性名 | 类型 | valuePrimitive="true"
| --- | --- | style="width:100%"
| animation | Boolean | />
| autoBind | Boolean |
| autoWidth | Boolean | ```
| cascadeFrom | String |
| cascadeFromField | String | ### **主要属性**
| clearButton | Boolean | 属性名 | 类型
| dataSource | DataSource | -------- | ---
| dataTextField | String | id | String
| dataValueField | String | promptColspan | String
| delay | Number | promptClassName | String
| enable | Boolean | promptImage | String
| enforceMinLength | Boolean | prompt | String
| filter | String | colspan | String
| fixedGroupTemplate | String \| Function | hlsClassName | String
| footerTemplate | String \| Function | animation | Boolean
| groupTemplate | String \| Function | autoBind | Boolean
| height | Number | autoWidth | Boolean
| highlightFirst | Boolean | cascadeFrom| String
| ignoreCase | Boolean | cascadeFromField | String
| index | Number | clearButton| Boolean
| minLength | Number | dataSource | DataSource
| noDataTemplate | String \| Function | dataTextField | String
| placeholder | String | dataValueField| String
| suggest | Boolean | delay | Number
| headerTemplate | String \| Function | enable | Boolean
| template | String \| Function | enforceMinLength| Boolean
| text | String | filter | String
| value | String | fixedGroupTemplate| String \| Function
| valuePrimitive | Boolean | footerTemplate| String \| Function
| virtual | Boolean | groupTemplate| String \| Function
| change | Function | height| Number
| close | Function | highlightFirst| Boolean
| dataBound | Function | ignoreCase| Boolean
| filtering | Function | index| Number
| open | Function | minLength| Number
| select | Function | noDataTemplate| String \| Function
| cascade | Function | placeholder | String
suggest| Boolean
> 属性用法请参考KendoUI文档 [http:\/\/docs.telerik.com\/kendo-ui\/api\/javascript\/ui\/combobox](http://docs.telerik.com/kendo-ui/api/javascript/ui/combobox) headerTemplate| String \| Function
template| String \| Function
### **用法示例** text| String
value| String
```xml valuePrimitive| Boolean
<h: hlsCombobox id="hlsCombobox" dataSource="dataSource" clearButton="true" placeholder="test" enable="false" template="fn:itemTemplate" change="onComboboxChange"/> virtual| Boolean
``` change| Function
close| Function
> **提示:** 某些属性类型为**String \| Function** 时,表明它可以定义为字符串或者函数。因此当需要定义为Function时需要增加前缀**fn:**来区分\(例如函数template="fn:itemTemplate" \) dataBound | Function
filtering| Function
### **主要子节点** open| Function
select| Function
* animation cascade| Function
* popup > 属性用法请参考KendoUI文档 [http://docs.telerik.com/kendo-ui/api/javascript/ui/combobox](http://docs.telerik.com/kendo-ui/api/javascript/ui/combobox)
* virtual
### **animation** ### **用法示例*
主要用来定义动画效果,例如打开关闭效果 ```javascript
* open 打开效果
* close 关闭效果
//对于系统定义好的数据源
| 属性 | 类型 | <script src="${base.contextPath}/common/code?sdDataSource=FND.CODING_RULE_TYPE" type="text/javascript"></script>
| --- | --- |
| effects | String |
| duration | Number | //自定义静态数据源sdDataSource
var sdDataSource= new kendo.data.DataSource({
```xml data:["one","two"]
<h: hlsCombobox id=" hlsCombobox "> });
<h:animation>
<h:close effects="zoom:out" duration="300"/> //自定义动态查询到的数据源sdDataSource
<h:open effects="zoom:in" duration="300"/> $.ajax({
</h:animation> type : 'GET',
</h: hlsCombobox > url : url,
``` async: false,
contentType : "application/json; charset=utf-8",
### **popup** success : function(datas) {
viewModel.set("sdDataSource,",datas.rows);
弹出窗口设置 }
});
| 属性 | 类型 |
| --- | --- | //需要注意,bind中写dataSource,需要在viewModel中定义
| appendTo | String | var viewModel = kendo.observable({
| origin | String | enabled: true,
| position | String | isEnabled: false,
data: {},
```xml sdDataSource:sdDataSource,
<h: hlsCombobox id="combobox"> });
<h:popup appendTo="container" origin="top left" position="top left"/>
</h: hlsCombobox > //下拉列表渲染函数
``` var itemTemplate = function (){
//...
### **virtual** }
动态加载相关设置 //选中某一个列表选项后触发
function onComboboxChange(e){
| 属性 | 类型 | var value = this.value();
| --- | --- | // Use the value of the widget.
| itemHeight | Number | }
| mapValueTo | String | //以上两种函数定义方法皆可
| valueMapper | Function | ```
```javascript ```xml
function valueMapper(){ <h:hlsCombobox name="hlsCombobox" id="hlsCombobox"
$.ajax({ bind="enabled: isEnabled,source: sdDataSource, value:data.code"
url: "http://demos.telerik.com/kendo-ui/service/Orders/ValueMapper", colspan="3"
type: "GET", dataTextField="meaning"
dataType: "jsonp", dataValueField="code"
data: convertValues(options.value), placeholder="hlsCombobox"
success: function(data) { prompt="hlsCombobox"
//the **data** is either index or array of indices. promptColspan="1"
//Example: valuePrimitive="true"
// 10258 -> 10 (index in the Orders collection) style="width:100
// [10258, 10261] -> [10, 14] (indices in the Orders collection) change="onComboboxChange"
options.success(data); template="fn:itemTemplate"
}
}) />
} ```
``` #### 特别注意 valuePrimitive="true" 如果该值为false,选中的值将不会匹配给dataTextField和dataValueField
dataValueField
```xml > **提示:** 某些属性类型为**String \| Function** 时,表明它可以定义为字符串或者函数。因此当需要定义为Function时需要增加前缀**fn:**来区分(例如函数template="fn:itemTemplate" )
<h: hlsCombobox id="combobox">
<h:virtual itemHeight ="20" mapValueTo="index" valueMapper="valueMapper"/>
</h: hlsCombobox >
```
# hlsDatePicker标签
# hlsDatePicker标签
日期选择器
日期选择器(不包含时分秒)
```xml
<h:hlsDatePicker id="hlsDatePicker xml配置
``` ```
<!--基本用法-->
### **主要属性** <h:hlsDatePicker id="hlsDatePickerId" bind="enabled:isEnabled,value:data.value" placeholder="hlsDatePicker"/>
```
| 属性名 | 类型 | ### **主要属性**
| --- | --- |
| culture | String | 属性名 | 类型
| depth | String | -------- | -----
| footer | String \| Function | promptColspan | Integer
| format | String | promptClassName | String
| max | String | promptImage | String
| min | String | prompt | String
| start | String | colspan | Integer
| value | String | hlsClassName | String
| name | String | animation | Boolean
| bind | Function | ARIATemplate| String
| required | Boolean | culture | String
| change | Function | depth| String
| close | Function | footer| String & Function
| open | Function | format| String
| placeholder | String | max| String
min| String
> **提示:** 属性用法请参考kendoui API文档 [http:\/\/docs.telerik.com\/kendo-ui\/api\/javascript\/ui\/datepicker](http://docs.telerik.com/kendo-ui/api/javascript/ui/datepicker) start| String
value | String
### **用法示例** name | String
bind | Function
```xml required | Boolean
<h:hlsDatePicker id="hlsDatePicker" change | Function
max="2016-10-14" close| Function
name="datepicker" open | Function
placeholder="datepicker" placeholder | String
bind="value:data.birthday" interval |Integer
required="true" open="open" footer="fn:footer"/> timeFormat |String
``` > **提示:** 属性用法请参考kendoui API文档 http://docs.telerik.com/kendo-ui/api/javascript/ui/datetimepicker
### **用法示例**
> **提示**:
> ```javascript
> * 遇到**object**类型 就向下添加子标签,当遇到普通类型时,就添加到当前的标签上。 //注意是写在script标签内的
var viewModel = kendo.observable({
data:{},
isEnabled:true
});
function open(){
//...
}
function change(e){
//...
}
```
```xml
<h:hlsDatePicker id="hlsDatePickerId"bind="enabled: isEnabled,value:data.value"
style="width:200px;"
max="2016-6-6"
placeholder="hlsDatePicker"
open="open"
required="true"
change="change"
prompt="日期选择器:"
/>
id:可写可不写;
bind:属性里面包含配置两个选项:
(1)enabled配置日期选择器是否可以编辑,值为Boolean类型的变量,在viewModel里面配置。
(2)value配置日期选择器与变量关联,默认是在ViewModel下面的变量;
max:可选择日期的上限值;
style可改变该控件的样式;
open:点击控件调用的方法;
change:选择日期之后的事件;
prompt:为控件添加一个label,该属性一般和<h:hlsForm><h:hlsHBox>一起使用;
```
> **提示:**
> - 上述所有属性直接添加在标签内即可,(**[属性名] = "..."**),对于既是**String**类型又是**Function**类型的属性,只需要加**fn:**前缀区分即可,(**fn:函数名**)
> - 对于**max min**等本该是**时间类型**的属性,改为日期字符串,且连接符号为"**-**"
hlsForm表单
-----------------
<h:hlsForm>包括两个titile部分和body部分,body通常由<h:hlsBox><h:hlsMaskedTextBox><h:hlshlsNumericTextBox>等标记组成。
#### 一般用法
```html
<!-- hlsForm子标签的使用请参见相应文档,这里不再说明-->
<h:hlsForm title="hlsForm" width="100%">
<h:hlsHBox>
<h:hlsDatePicker name="transactionDate" id="transactionDate" bind="enabled: enabled,value:data.transactionDate" colspan="4" style="width:50%" placeholder="退款日期" prompt="退款日期:" promptColspan="2" required="true"/>
<h:hlsCombobox name="paymentMethod" id="paymentMethod" bind="enabled: enabled, source:cshPayments , value:data.paymentMethod" colspan="4" dataTextField="description" dataValueField="value" placeholder="退款方式" prompt="退款方式:" promptColspan="2" required="true" valuePrimitive="true" style="width:50%"/>
</h:hlsHBox>
<h:hlsHBox>
<h:hlsNumericTextBox name="returnDueAmount" id="returnDueAmount" bind="enabled: enabled, value:data.returnDueAmount" style="width:50%" colspan="4" prompt="退款金额:" promptColspan="2" required="true" validationMessage="Enter {0}"/>
<h:hlsMaskedTextBox name="bankSlipNum" id="bankSlipNum" bind="enabled: enabled, value:data.bankSlipNum" colspan="4" prompt="银行流水号:" promptColspan="2" style="width:50%"/>
</h:hlsHBox>
<h:hlsHBox>
<h:hlsLov name="bankAccountName" id="bankAccountName" code="BANK_ACCOUNT_INFO" colspan="4" contextPath="${base.contextPath}" data-bind="enabled: enabled, value:data.bankAccountId,text:data.bankAccountName" locale="${base.locale}" placeholder="退款账户" prompt="退款账户:" promptColspan="2" query="bankAccountNameQuery" change="bankAccountNameChange" select="bankAccountNameSelect" required="true" style="width:50%" />
<h:hlsMaskedTextBox name="bankAccountNum" id="bankAccountNum" bind="enabled: isEnabled, value:data.bankAccountNum" colspan="4" prompt="账号:" promptColspan="2" style="width:50%" />
</h:hlsHBox>
</h:hlsForm>
```
### **主要属性**
| 属性名 | 类型 | 描述 |
| --- | --- | --- |
| width | String | form组件的宽度|
|hlsClassName | String |组件的类样式|
| title | String | 标题文字|
> **注意:**
```javascript
$('#query-form input').keydown(function (e) {
if (e.keyCode == 13) {
e.target.blur();
viewModel.queryResource(e);
}
});
```
>**详解:**
> - query-form 是表单id,input指表单内所有输入框 (样式选择器选到input)
> - viewModel.queryResource(e)当按下回车按钮时都执行查询方法
---------------
#### viewModel在多处出现,这里粗略的介绍一下
```
viewModel用法
Kendo MVVM是一种MVVM的实现,当然可以跟Kendo 组件(widgets)和数据源(datasource)进行无缝结合
```javascript
var viewModel = kendo.observable({
model: {
//model 中可设置绑定初值
id:5
},
//可以自定义函数方法 :如saveFunction方法
saveFunction: function () {
$('#grid').data('kendoGrid').saveChanges();
},
queryResource: function (e) {
$('#grid').data('kendoGrid').dataSource.page(1);
}
});
```
使用:(**注意data-bind**)
```html
<div id="view">
<input data-bind="value: model.id" />
<button data-bind="click: saveFunction">Display</button>
</div>
```
关于绑定
```html
<div id="view" data-bind="value: model.name"></div>
<script>
var viewModel = kendo.observable({
model: {
name: "John Doe"
}
});
kendo.bind($("#view"), viewModel);
</script>
```
> **注意:**
> - viewModel中绑定是实时的,即viewModel中的name字段发生变化,则input中的value会一起变化,反之,当input中的value值变化,则viewModel中的name字段也会一同发生变化
> - viewModel中的所有字段属性都是可自定义的
> - 绑定需要input中data-bind 和kendo-bind两次绑定 第一是将数值绑定到model上,第二次是将此div绑定到viewModel上,这样才能访问到viewModel的model属性,也就是第一次绑定才有效
重置按钮
```javascript
resetForm : function(e) {
var formData = viewModel.model.toJSON();
for ( var k in formData) {
viewModel.model.set(k, null);
}
}
```
```html
<span class="btn btn-default" data-bind="click:resetForm" type="button"><@spring.message "hap.reset"/></span>
```
> **注意:**
> - viewModel与表单绑定后,model里面的字段变化,input框里的value里一起变化,所以在清空viewModel的同时,清空了表单里的数据
# 计划任务
### 1、任务周期定义
![](/assets/task_define.png)
新建一条计划任务后,可点击任务计划修改,打开计划修改页面:
![](/assets/schedule_edit.png)
计划任务可以定义五种频率,分别是:月、周、日、时、分。
* 月:可定义每几个月的第几天(可选择多个,使用逗号隔开)执行,同时可以指定执行的具体时分。
* 周:可定义每几个周的周几执行,同时可指定执行的具体时分。
* 日:可定义每几天执行一次,同时可指定执行的具体时分。
* 时:可定义每几个小时执行一次。
* 分:可定义每几分钟执行一次。
### 2、任务维护
可在任务维护主界面进行新增、修改、删除操作。
![](/assets/task_maintain.png)
新增一条任务记录之后可以对该任务进行参数配置和权限控制:
#### 2.1 任务配置
点击任务配置,打开任务配置明细弹窗,可在此处添加、删除、修改任务所需参数。 ![](/assets/task_parameter.png)
#### 2.2 权限控制
点击权限设置,打开权限控制明细弹窗,可在此处对任务权限人进行添加、删除、修改操作:
角色代码为权限人的代码,角色名称为权限人的名字,起始日期和结束日期控制该人员可对该任务操作的时间。 ![](/assets/task_authority.png)
#### 2.3 任务类的编写
想要自定义一个job,必须要继承一个抽象类AbstractJob,然后在`safeExecute()`方法中执行业务代码,示例代码如下:
```java
public class demoJob extends AbstractJob{
@Autowired
private xxxService service;//业务类
@Override
public void safeExecute(JobExecutionContext jobExecutionContext) throws Exception {
//map中可以获取上方定义的参数,key为参数名称,value为参数值
JobDataMap map = jobExecutionContext.getMergedJobDataMap();
try {
service.dosomething();
} catch (Exception e) {
if (logger.isErrorEnabled()) {
logger.error(e.getMessage(), e);
}
exception = e;
throw e;
}
if (exception != null) {
setExecutionSummary(exception.getClass().getName() + ":" + exception.getMessage());
} else {
setExecutionSummary("执行完成!" );
}
}
@Override
public boolean isRefireImmediatelyWhenException() {
//任务发生异常时候进行的动作
//false 挂起当前JOB等待处理
//true 继续执行
return false;
}
}
```
注意:
* 调用`setExecutionSummary()`方法可以在执行记录中,记录你的业务数据的记录,或者抛出的异常的具体信息。
* 在上下文中获取JobDataMap可以拿到你在任务配置中定义的参数
### 3、计划任务工作台
#### 3.1 新建任务
1.点击左上角的新建任务按钮,可以进入以下界面创建一个新的任务:
![](/assets/job_create.png)
此处任务名称必须唯一,在lov中选择对应的任务代码。
2.下拉滚动条,可以看到如下所示的界面:
![](/assets/job_create2.png)
周期性:表示一个cron任务,可以在计划名称的lov中选定自己定义的一个周期,然后计划任务可以根据任务周期定义功能中的执行频率,以及执行的开始和结束时间,进行执行。
制定时间:选择执行的时间,然后计划任务可以根据选中的执行时间,开始执行。
立即执行:可以直接出发你定义的计划任务。
以上三种方式,在定义时只能选择一种,点击保存后,任务会自动开始进行调度。
注意:
* 在集群环境中,请确保各个节点的机器的时间一致,否则会造成job的调度出现问题。
* 在集群环境中,请不要用节点外的机器操作job。
* 在开发环境中,在config.properties中调度器自动启动的状态应该默认设置为false,在正式环境中应该设置为true(设置为true,表示调度器随着服务器启动而启动):
在开发环境中,由于隐藏了调度的启动和关闭按钮,所以如果想打开调度器,必须要手动输入url:/job/scheduler/start,否则你的计划任务将不会执行。
#### 3.2 任务状态
1.任务执行时,状态不同,颜色也不同:
![](/assets/job_status.png)
状态说明:
* 正在执行,颜色显示为绿色。
* 发生异常,颜色显示为红色。
* 任务暂停,颜色显示为橙色。
* 任务完成,颜色显示为灰色。
* 任务阻塞,颜色显示为黑色。
2.想要修改任务的状态,或者删除任务,可以勾选对应的计划任务进行操作:
![](/assets/job_change_status.png)
备注:执行完成的任务无法恢复到执行状态。
### 4、执行记录
#### 4.1 查看任务的执行记录
![](/assets/job_infomation.png)
参数说明:
* 任务名称:计划任务名称
* 任务组:计划任务所属组别
* 任务状态:任务完成状态,正常执行完为FINISH,执行出错为FAILED,任务被禁止为VETOED
* 执行概要:任务执行过程中的信息,如执行结果,异常信息等(既setExecutionSummary方法中所设置的值)。
* 上次执行时间:上一次任务预计执行的时间点。
* 计划执行时间:预计完成上一次任务后,根据指定的执行间隔推算的本次任务执行的时间。
* 下次执行时间:预计执行完本次任务后,根据指定的执行间隔推算的下一次执行时间点。
* 实际执行时间:本次任务实际执行的时间点。
# 融租易开发手册 # 融租易开发手册
* [GitBook使用](/gitbook.md) * [GitBook使用](/gitbook.md)
--- ---
* I. 开发环境准备 * I. 开发环境准备
* [1.1 Git 使用](/git-guide.md "git指令") * [1.1 Git 使用](/git-guide.md "git指令")
* [1.2 Maven 使用](/maven.md "maven使用") * [1.2 Maven 使用](/maven.md "maven使用")
* [1.3 开发环境搭建](/project-create.md) * [1.3 开发环境搭建](/project-create.md)
* [1.4 更新项目的HEL依赖版本](/project-update.md) * [1.4 更新项目的HEL依赖版本](/project-update.md)
* [1.5 Liquibase](/liquibase-use.md) * [1.5 Liquibase](/liquibase-use.md)
* II. 项目开发规范 * II. 项目开发规范
* [2.1 项目开发规范](/codeStyle.md#backEndDev) * [2.1 项目开发规范](/codeStyle.md#backEndDev)
* [2.2 编码规范](/codeStyle.md#backEndName) * [2.2 编码规范](/codeStyle.md#backEndName)
* 2.3 Checkstyle * 2.3 Checkstyle
* III. 后端开发 * III. 后端开发
* [3.2 部署](/后端开发/deployment.md) * IV. 前端开发
* IV. 前端开发 * 4.1 前端开发说明 \(1.0\)
* [4.2 hlsCombobox](/前端组件/hlsCombobox.md)
* 4.1 前端开发说明 \(1.0\) * [4.3 hlsDataSource](/前端组件/hlsDataSource.md)
* [4.2 hlsCombobox](/前端组件/hlsCombobox.md) * [4.4 hlsMaskedTextBox](/前端组件/hlsMaskedTextBox.md)
* [4.3 hlsDataSource](/前端组件/hlsDataSource.md) * [4.5 hlsPage](/前端组件/hlsPage.md)
* [4.4 hlsMaskedTextBox](/前端组件/hlsMaskedTextBox.md) * [4.6 hlsTextArea](/前端组件/hlsTextArea.md)
* [4.5 hlsPage](/前端组件/hlsPage.md) * [4.7 hlsTlEdit](/前端组件/hlsTlEdit.md)
* [4.6 hlsTextArea](/前端组件/hlsTextArea.md) * [4.8 hlsDatePicker](/前端组件/hlsDatePicker.md)
* [4.7 hlsTlEdit](/前端组件/hlsTlEdit.md)
* [4.8 hlsDatePicker](/前端组件/hlsDatePicker.md)
* V. 框架功能描述
* V. 框架功能描述 * 5.1 计划任务功能描述
* [5.2 消息机制](/框架功能描述/消息机制.md)
* 5.1 计划任务功能描述 * [5.3 部署](/后端开发/deployment.md)
* [5.2 消息机制](/框架功能描述/消息机制.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