Commit 2930ca97 authored by 高洋's avatar 高洋

Track 9 files into repository.

- modified codeStyle.md
- modified common-window-javascript.md
- untracked 前端组件/HlsBarChart.md
- untracked 前端组件/hlsChart.md
- untracked 前端组件/头行保存.md
- modified 后端开发/activiti_demo.md
- modified 后端开发/RabbitMq消息队列.md
- modified 框架功能描述/计划任务.md
- modified 融租易开发手册.md

Auto commit by GitBook Editor
parent c4422981
...@@ -67,9 +67,9 @@ if(user.getStatus() == EXPIRED_USER_STATUS){ ...@@ -67,9 +67,9 @@ if(user.getStatus() == EXPIRED_USER_STATUS){
- **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**
......
...@@ -72,7 +72,7 @@ winId | String(必填) | html元素标签的id ...@@ -72,7 +72,7 @@ winId | String(必填) | html元素标签的id
functionCode | String(必填) | 抽屉的唯一标识,用以确定该抽屉的相关信息 functionCode | String(必填) | 抽屉的唯一标识,用以确定该抽屉的相关信息
params | Object | 需传递的参数,将自动拼到url上 params | Object | 需传递的参数,将自动拼到url上
closeFunction | function | 关闭抽屉调用的方法 closeFunction | function | 关闭抽屉调用的方法
width | Number | 自定义宽度 width | Number/字符串(100% , 100px) | 自定义宽度
```javascript ```javascript
......
## HlsBarChart
```xml
<h:hlsChart chartType="BAR" style="margin-top:5px;margin-left:6px;" barSourceData="barSourceData" titleBgColor="red"
title="商业伙伴" modify="modifyFunc" add="addFunc" color="#ed4e2a"></h:hlsChart>
```
**常用的属性**
| 属性名 | 类型 | 作用 | 是否必输|
|:---: | :---: | :---: | :---: |
| id | string | 唯一标识 |
| chartType | string | 组件类型 | Y
| style | string | 组件box样式 |
| barSourceData | object | 组件数据源 | Y
| titleBgColor | string | 组件标题背景颜色 |
| title | string | 组件标题 |
| modify | function | 编辑icon触发的事件 |
| add | function | 新增icon触发的事件 |
|color|string |字体颜色|
**下面是一个例子**
```javascript
var datas = function (url) {
var odatas = [],
$.ajax({
type: 'GET',
url: "${base.contextPath}/hls/bp/master/home/secord/query",
async: false,
contentType: "application/json; charset=utf-8",
success: function (datas) {
odatas = datas.rows;
}
});
return odatas;
}();
var statisticalData = function () {
var o = {};
$.ajax({
type: 'GET',
url: "${base.contextPath}/hls/bp/master/count/query",
async: false,
contentType: "application/json; charset=utf-8",
success: function (datas) {
o.allCount = datas.rows[0].allCount;
o.monthAddCount = datas.rows[0].monthAddCount;
}
});
return o;
}();
//数据源
var barSourceData = {
barModel: {
xkey: 'description',
ykeys: 'count',
data: datas,
labels: '数值', //鼠标经过柱子图显示的描述
barColors: 'green',
barSizeRatio: 0.5,
},
statisticalModel: {
statisticalTitle: {
allCount: "总数",
monthAddCount: "本月新增"
},
statisticalData: statisticalData
}
};
function modifyFunc(e) {
alert("modifyFunc");
}
function addFunc(e) {
alert("addFunc");
}
```
#### 注意: 数据源中的属性名,需要固定,这样做是考虑到将不同的查询结果整合成统一的数据格式,方便组件渲染。
> - barModel:柱形图
| 属性名 | 类型 | 作用 |
|:---: | :---: | :---: | :---: |
| xkey | string | x轴标题对应的属性名
| ykeys | string | y轴数据对应的属性名 |
| data | Array | 数据集 |
| labels | string | 鼠标经过柱状图时ykeys对应的值的描述 |
| barColors | string | 柱子颜色 |
| barSizeRatio | Number | 柱子和数据的比例 |
> - statisticalModel:上方的统计框
| 属性名 | 类型 | 作用 |
|:---: | :---: | :---: |
| statisticalTitle | object | 统计框的属性名以及属性描述 |
| statisticalData | object | 数据源 (注意statisticalData的属性名和statisticalTitle中的属性名要对应上)
```xml
<h:hlsChart chartType="BAR" style="margin-top:5px;margin-left:6px;" barSourceData="barSourceData" titleBgColor="red"
title="商业伙伴" modify="modifyFunc" add="addFunc" color="#ed4e2a"></h:hlsChart>
```
\ No newline at end of file
## hlsChart 图表
### 环状图(CIRCULAR)
使用方法:
```xml
<h:hlsChart
chartType="CIRCULAR"
style="position: relative;"
url="${base.contextPath}/con/conHomepage/ApprovalQuantity/query"
color="#FFCD55,#2EC3E8,#FA6A4D,#A0D469"
labels="新建,审批中,审批拒绝,审批通过"
values="newCount,approvingCount,rejectedCount,approvedCount"
selectedChanged="select">
</h:hlsChart>
<script>
var select = function(arg,item){
console.log('label:'+item.label);
}
</script>
```
| 属性名 | 类型 | 描述 |
| :--- | :--- | :--- |
| chartType | String | 图表类型 |
| style | String | 图表外层的style样式 |
| url | String | 图表数据源的获取地址 |
| color | String | 图表各数据块所对应的颜色,多个数据块之间使用“,”分隔 |
| labels | String | 图表中各数据块所对应的标签,多个数据块之间使用“,”分隔 |
| values | String | 图表中各数据块所对应响应数据中的字段,多个数据块之间使用“,”分隔 |
| selectedChanged | String | 图表中各数据块的点击回调事件 |
## HlsBarChart 图表
### 柱状图(BAR)
```xml
<h:hlsChart chartType="BAR" style="margin-top:5px;margin-left:6px;" barSourceData="barSourceData" titleBgColor="red"
title="商业伙伴" modify="modifyFunc" add="addFunc" color="#ed4e2a"></h:hlsChart>
```
**常用的属性**
| 属性名 | 类型 | 作用 | 是否必输|
|:---: | :---: | :---: | :---: |
| id | string | 唯一标识 |
| chartType | string | 组件类型 | Y
| style | string | 组件box样式 |
| barSourceData | object | 组件数据源 | Y
| titleBgColor | string | 组件标题背景颜色 |
| title | string | 组件标题 |
| modify | function | 编辑icon触发的事件 |
| add | function | 新增icon触发的事件 |
|color|string |字体颜色|
**下面是一个例子**
```javascript
var datas = function (url) {
var odatas = [],
$.ajax({
type: 'GET',
url: "${base.contextPath}/hls/bp/master/home/secord/query",
async: false,
contentType: "application/json; charset=utf-8",
success: function (datas) {
odatas = datas.rows;
}
});
return odatas;
}();
var statisticalData = function () {
var o = {};
$.ajax({
type: 'GET',
url: "${base.contextPath}/hls/bp/master/count/query",
async: false,
contentType: "application/json; charset=utf-8",
success: function (datas) {
o.allCount = datas.rows[0].allCount;
o.monthAddCount = datas.rows[0].monthAddCount;
}
});
return o;
}();
//数据源
var barSourceData = {
barModel: {
xkey: 'description',
ykeys: 'count',
data: datas,
labels: '数值', //鼠标经过柱子图显示的描述
barColors: 'green',
barSizeRatio: 0.5,
},
statisticalModel: {
statisticalTitle: {
allCount: "总数",
monthAddCount: "本月新增"
},
statisticalData: statisticalData
}
};
function modifyFunc(e) {
alert("modifyFunc");
}
function addFunc(e) {
alert("addFunc");
}
```
#### 注意: 数据源中的属性名,需要固定,这样做是考虑到将不同的查询结果整合成统一的数据格式,方便组件渲染。
> - barModel:柱形图
| 属性名 | 类型 | 作用 |
|:---: | :---: | :---: | :---: |
| xkey | string | x轴标题对应的属性名
| ykeys | string | y轴数据对应的属性名 |
| data | Array | 数据集 |
| labels | string | 鼠标经过柱状图时ykeys对应的值的描述 |
| barColors | string | 柱子颜色 |
| barSizeRatio | Number | 柱子和数据的比例 |
> - statisticalModel:上方的统计框
| 属性名 | 类型 | 作用 |
|:---: | :---: | :---: |
| statisticalTitle | object | 统计框的属性名以及属性描述 |
| statisticalData | object | 数据源 (注意statisticalData的属性名和statisticalTitle中的属性名要对应上)
```xml
<h:hlsChart chartType="BAR" style="margin-top:5px;margin-left:6px;" barSourceData="barSourceData" titleBgColor="red"
title="商业伙伴" modify="modifyFunc" add="addFunc" color="#ed4e2a"></h:hlsChart>
```
\ No newline at end of file
## 头行保存
头行保存在实用中经常用到,头行保存指的是头表和行表(一对多)的数据同时插入,如中途失败则这次事务不进行提交。
假设我们有两张表
**hls_person(头表)**
| pid | name | age |
|:---: | :---: | :---: |
| 1 | 张三 | 21 |
| 2 | 李四| 36 |
**hls_hobby(行表)**
| hid | pid | hobby | cause |
|:---: | :---: | :---: | :---:|
| 1 | 1 | 篮球 |因为篮球好玩|
| 2 | 1| 游泳 | 因为游泳好玩|
| 3 | 1 |动画片 | 最爱看大头儿子|
| 4 | 2 |画画| 因为画画好玩|
需求是新增一个人的信息以及它的爱好(向hls_person和hls_hobby表新增记录)
下面是一个头行保存的列子:
#### 准备工作
1. 建表,主键默认自增长
2. 搭建数据模型,根据表建立相应的DTO,即HlsPerson.java和HlsHobby.java,注意HlsPerson.java中应存在List \<HlsHobby\> hlsHobbyList属性。
3. 搭建控制层,建立controller
4. 搭建业务逻辑,建立service及其实现类。
5. 搭建数据持久化层,新建mapper.java和mapper.xml
>- 先建立结构,在具体实现功能,以免疏漏。
#### 前台
```javascript
<script><![CDATA[
//提交数据用到的容器
var viewModel = kendo.observable({
isEnabled: true,
data: {},
mySubmit: function (e) {
if (e) {
e.preventDefault();
}
Hap.submitForm({
url: '${base.contextPath}/hls/test/hdLnSave',
formModel: viewModel.data,
asArray: false,
grid: {
"hlsHobbyList": $("#grid")
},
success: function () {
viewModel.showInfoDialog("保存成功!");
$('#grid').data('kendoGrid').dataSource.page(1);
},
error:function(){
viewModel.showInfoDialog("保存失败!");
}
});
},
showInfoDialog: function(pMessage)
{
kendo.ui.showInfoDialog({
title: $l('提示'),
message: pMessage
});
}
});
//请求处理方法
function parameterMap(options, type){
if (type !== "read" && options.models) {
var datas = options.models
if (type == 'create' || type == 'update') {
datas = options.models.map(function(data) {
data['__status'] = (type == 'create' ? 'add' : 'update');
return data;
})
}
return kendo.stringify(datas);
} else if (type === "read") {
var map = {};
map.page = options.page || 1;
map.pagesize = options.pageSize|| 5;
return kendo.stringify(map);
}
}
//属性列是否可编辑
function dsEditable(field){
return true;
}
]]></script>
```
```xml
<!--头-->
<h:hlsForm title="个人信息" width="100%">
<h:hlsHBox>
<h:hlsMaskedTextBox name="name" id="name" bind="enabled: isEnabled, value:data.name" colspan="3" prompt="姓名:" required="true" style="width:100%;"/>
<h:hlsMaskedTextBox name="age" id="age" bind="enabled: isEnabled, value:data.age" colspan="3" prompt="年龄:" required="true" style="width:100%;"/>
</h:hlsHBox>
</h:hlsForm>
<!--行-->
<h:dataSource id="dataSource" batch="true" pageSize="10" serverPaging="true">
<h:transport parameterMap="parameterMap">
<h:read url="${base.contextPath}/hls/test/ln/query" type="GET" dataType="json"/>
<h:destroy url="${base.contextPath}/hls/test/ln/remove" type="POST" contentType="application/json" />
</h:transport>
<h:schema data="rows" total="total" errors="schemaError">
<h:model id="pid" editable="dsEditable">
<h:fields>
</h:fields>
</h:model>
</h:schema>
</h:dataSource>
<h:hlsGridBox hlsGridId="grid" hlsBtnType="add">
<h:hlsGrid id="grid" dataSource="dataSource" selectable="" hlsBtnType="ADD,DELETE" editable="true" height="240">
<h:pageable pageSizes="5,10,20,50" buttonCount="2" refresh="true">
</h:pageable>
<h:columns>
<h:column field="hobby" title='爱好' width="150">
<h:headerAttributes style="text-align:center"/>
<h:attributes style="text-align:center"/>
</h:column>
<h:column field="cause" title='原因'>
<h:headerAttributes style="text-align:center"/>
<h:attributes style="text-align:center"/>
</h:column>
</h:columns>
</h:hlsGrid>
</h:hlsGridBox>
<!--按钮-->
<h:hlsToolBar>
<h:hlsButton click="viewModel.mySubmit" text="保存"></h:hlsButton>
</h:hlsToolBar>
```
#### 后台
保存按钮注册了点了事件,点击保存将数据提交到'${base.contextPath}/hls/test/hdLnSave'
> 在后端controller通过定义 @RequestMapping("/hls/test/hdLnSave") 注解映射到对应的url,捕获到对应请求。
后端收到前台传过来的数据,调用service层对数据进行持久化。
HlsTESTController.java
```java
@Controller
public class HlsTESTController extends BaseController {
@Autowired
private HlsPersonService hlsPersonService;
@Autowired
private HlsHobbyService hlsHobbyService;
@RequestMapping(value = "/hls/test/query")
@ResponseBody
public ResponseData hdQuery(final HlsPerson hlsPerson, @RequestParam(defaultValue = DEFAULT_PAGE) final int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) final int pagesize, final HttpServletRequest request) {
IRequest requestContext = createRequestContext(request);
return new ResponseData(hlsPersonService.select(requestContext,hlsPerson,page,pagesize));
}
@RequestMapping(value="/hls/test/hdLnSave",method=RequestMethod.POST)
@ResponseBody
public ResponseData hdLnSave(HttpServletRequest request,@RequestBody HlsPerson hlsPerson, @RequestParam(defaultValue = DEFAULT_PAGE) final int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) final int pagesize){
IRequest iRequest = createRequestContext(request);
hlsPersonService.batchChildUpdate(iRequest, hlsPerson);
return new ResponseData();
}
@RequestMapping(value = "/hls/test/ln/query")
@ResponseBody
public ResponseData lnQuery(final HlsHobby hlsHobby, @RequestParam(defaultValue = DEFAULT_PAGE) final int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) final int pagesize, final HttpServletRequest request) {
IRequest requestContext = createRequestContext(request);
return new ResponseData(hlsHobbyService.select(requestContext,hlsHobby,page,pagesize));
}
@RequestMapping(value="/hls/test/ln/remove",method=RequestMethod.POST)
@ResponseBody
public ResponseData delete(HttpServletRequest request, @RequestBody List<HlsHobby> hlsHobbyList) {
hlsHobbyService.batchDelete(hlsHobbyList);
return new ResponseData();
}
}
```
> **提示:**
>* 通常头行结构还会涉及对头行数据的删和查,根据需要在controller中加入入口。
>* bathUpdate会根据传入的List对象中单个对象的属性值__status判断,如为update即做更新操作,add为插入操作, __status的值由前端paramter函数决定。
>* 这里的select()、batchDelete()和batchUpdate()由相应的service继承自IBaseService,自己无需实现,类似方法还有许多,请自行练习使用。
HlsPersonService.java
```java
public interface HlsPersonService extends IBaseService<HlsPerson>,ProxySelf<HlsPersonService>{
void batchChildUpdate(IRequest iRequest, HlsPerson hlsPerson);
}
```
接口实现类HlsPersonServiceImpl定义了batchChildUpdate方法:
HlsPersonServiceImpl.java
```java
@Service
@Transactional
public class HlsPersonServiceImpl extends BaseServiceImpl<HlsPerson> implements HlsPersonService {
@Autowired
private HlsHobbyService hlsHobbyService;
@Override
public void batchChildUpdate(IRequest iRequest, HlsPerson hlsPerson) {
if(hlsPerson != null ){
hlsPerson.set__status("add");
List<HlsPerson> tempHlsPerson = new ArrayList<HlsPerson>();
tempHlsPerson.add(hlsPerson);
self().batchUpdate(iRequest,tempHlsPerson);
Long pid = hlsPerson.getPid();
List<HlsHobby> hlsHobbyList = hlsPerson.getHlsHobbyList();
for(HlsHobby hh : hlsHobbyList){
hh.setPid(pid);
}
hlsHobbyService.batchUpdate(iRequest,hlsHobbyList);
}
}
}
...@@ -22,7 +22,8 @@ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种 ...@@ -22,7 +22,8 @@ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种
### 2.1 定义交换机 ### 2.1 定义交换机
在接口管理的消息队列定义模块中,首先进行交换机的定义,界面如图:![](/assets/exchange.png)注意: 在接口管理的消息队列定义模块中,首先进行交换机的定义,界面如图:![](/assets/exchange.png)
注意:
交换机名称不可以重复定义,一个交换机可以对应多个队列。 交换机名称不可以重复定义,一个交换机可以对应多个队列。
...@@ -34,7 +35,9 @@ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种 ...@@ -34,7 +35,9 @@ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种
### 2.2 定义队列和路由键 ### 2.2 定义队列和路由键
定义完交换机后,你还需要定义你的队列和相应的匹配模式(既路由键)界面如图:![](/assets/queue.png)注意: 定义完交换机后,你还需要定义你的队列和相应的匹配模式(既路由键)界面如图:![](/assets/queue.png)
注意:
队列名称不可以重复,但是一个队列可以对应多个交换机。 队列名称不可以重复,但是一个队列可以对应多个交换机。
...@@ -137,3 +140,6 @@ public class ConsumerDemoServiceImpl implements IRabbitMessageConsumerService { ...@@ -137,3 +140,6 @@ public class ConsumerDemoServiceImpl implements IRabbitMessageConsumerService {
``` ```
### ###
This diff is collapsed.
...@@ -40,14 +40,14 @@ ...@@ -40,14 +40,14 @@
#### 2.3 任务类的编写 #### 2.3 任务类的编写
想要自定义一个job,必须要继承一个抽象类AbstractJob,然后在`safeExecute()`方法中执行业务代码,示例代码如下: 想要自定义一个job,必须要继承一个抽象类AbstractJob或者AbstractJobWithIRequest,然后在`safeExecute()`方法中执行业务代码,示例代码如下:
```java ```java
public class demoJob extends AbstractJob{ public class demoJob extends AbstractJob{
@Autowired @Autowired
private xxxService service;//业务类 private xxxService service;//业务类
@Override @Override
public void safeExecute(JobExecutionContext jobExecutionContext) throws Exception { public void safeExecuteWithIRequest(JobExecutionContext jobExecutionContext) throws Exception {
//map中可以获取上方定义的参数,key为参数名称,value为参数值 //map中可以获取上方定义的参数,key为参数名称,value为参数值
JobDataMap map = jobExecutionContext.getMergedJobDataMap(); JobDataMap map = jobExecutionContext.getMergedJobDataMap();
try { try {
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
* [4.2 字段级通用方法](/common-field-javascript.md) * [4.2 字段级通用方法](/common-field-javascript.md)
* [4.3 窗口级通用方法](/common-window-javascript.md) * [4.3 窗口级通用方法](/common-window-javascript.md)
* [4.4 锁屏和解屏通用方法](/common-mask-javascript.md) * [4.4 锁屏和解屏通用方法](/common-mask-javascript.md)
* [4.5 头行保存](/前端组件/头行保存.md)
* V. 前端UI开发 * V. 前端UI开发
...@@ -57,6 +59,7 @@ ...@@ -57,6 +59,7 @@
* [5.17 hlsGridBox\(表格\)](/前端组件/hlsGridBox.md) * [5.17 hlsGridBox\(表格\)](/前端组件/hlsGridBox.md)
* [5.18 hlsNumericTextBox\(数字框\)](/前端组件/hlsNumericTextBox.md) * [5.18 hlsNumericTextBox\(数字框\)](/前端组件/hlsNumericTextBox.md)
* [5.19 hlsNavigationBar\(导航栏\)](/前端组件/hlsNavigationBar.md) * [5.19 hlsNavigationBar\(导航栏\)](/前端组件/hlsNavigationBar.md)
* [5.20 hlsChart\(图表\)](/前端组件/hlsChart.md)
* VI. 框架功能描述 * VI. 框架功能描述
...@@ -66,10 +69,7 @@ ...@@ -66,10 +69,7 @@
* [6.4 合同文本生成](/框架功能描述/docx4j.md) * [6.4 合同文本生成](/框架功能描述/docx4j.md)
* [6.5 Excel导入导出](/框架功能描述/jad.md) * [6.5 Excel导入导出](/框架功能描述/jad.md)
* [6.6 redis安装和部署](/后端开发/redis.md) * [6.6 redis安装和部署](/后端开发/redis.md)
* [6.7 工作流功能说明](/后端开发/activiti-helper.md) * [6.9 工作流开发指南](/后端开发/activiti_demo.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