Commit 8af1ef6d authored by custom's avatar custom

Merge origin/master into master

parents d13519f4 4e445dbf
...@@ -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**
......
...@@ -2,17 +2,68 @@ ...@@ -2,17 +2,68 @@
本章节将引导您从零开始,创建一个可以运行的 Demo 工程。此工程基于HEL融租易标准版,包含一个 demo 实例。 本章节将引导您从零开始,创建一个可以运行的 Demo 工程。此工程基于HEL融租易标准版,包含一个 demo 实例。
## 后端项目 ## 开发工具准备
- JDK 1.8 及以上
- IntelliJ IDEA 或 Eclipse
### 确定项目信息 - Git
- redis 3.0 及以上
- maven 3.3 及以上
- Tomcat 7+ (**不支持 Tomcat 6**)
- 数据库(任选)
- Mysql server 5.6 及以上
- SqlServer 2012 及以上
- Oracle 9 以上
- Navicat Premium(或其他)
### 软件安装
#### Java 安装
1.[Oracle 官网 ](https://nodejs.orghttp://www.oracle.com/technetwork/cn/java/javase/downloads/index.html)下载对应平台的 JDK 1.8 以上的环境。
2. 本地执行安装文件,安装 JDK 环境。
3. Win 在环境变量系统变量中 path 配置 JDK 的环境变量指向 JDK 安装目录下 ` JDK/bin `
4. 配置完成后打开 cmd 执行 ` javac `,有提示则说明环境安装成功。
> eclipse 中 JRE 的配置需要指定 JDK 目录,不能是 JRE。(maven 需要 JDK)
#### Git 安装
1.[Git 官网 ](https://git-scm.com/download/)下载对应平台的 Git。
2. 本地执行安装文件, 安装 Git 环境。
3. Win 在环境变量中系统变量的 path 配置 Git 的环境变量指向 Git 安装目录下的 ` /bin `
4. 配置完成后打开 cmd 执行 ` git `,有提示则说明环境安装成功。
[Git简明教程](git_guide.md)
> 对于 Windows,安装 Git 以后,你可以在任意目录右键,`Git Bash Here`
> 打开的 MINGW 命令窗口可以执行 **兼容 linux 系统** 的命令,如`rm`,`ls` 等
#### Maven 安装
1.[Maven 官网 ](http://mirror.bit.edu.cn/apache/maven/)下载对应平台的合适的 maven 版本的压缩包。
2. 本地解压压缩包。
3. Win 在环境变量中系统变量的 path 配置 maven 的环境变量指向 maven 解压目录下的 ` /bin `
4. 配置完成后打开 cmd 执行 ` mvn -v `,有提示则说明环境安装成功。
#### Redis 安装
1.[Redis win 官网 ](https://github.com/MSOpenTech/redis/releases)下载最新的 redis 版本的压缩包。
2. 本地解压压缩包。
3. Win 在解压目录下打开 cmd 执行 ` redis-server.exe redis.windows.conf `,有提示则说明 Redis 已经启动。
4. Win 平台下如果启动失败,修改 redis.windows.conf 文件中的 maxheap 为 ` maxheap 1024000000 `
**注:** 开发需要依赖 Redis 环境,所以在启动后台程序时,请确保 Redis 已经启动,如redis需配置集群,[请参考Redis集群部署](/后端开发/redis.md)
* redis GUI 客户端下载 :http://redisdesktop.com/
* redis 命令手册:http://doc.redisfans.com/
* redis 清空缓存命令:flushall
> Mac, Linux 用户, 请到 http://redis.io 下载源码,编译安装
### 新建项目 (依赖融租易HEL1.0)
#### 确定项目信息
1. groupId 本项目的代号,比如融租易项目,代号为 hel 1. groupId 本项目的代号,比如融租易项目,代号为 hel
2. artifactId 本项目的顶层目录名称,使用项目代号(第一个字母大写) +Parent,如 HelParent 2. artifactId 本项目的顶层目录名称,使用项目代号(第一个字母大写) +Parent,如 HelParent
3. package 包名称,使用项目代号 + core ,如 Hel.core 3. package 包名称,使用项目代号 + core ,如 Hel.core
4. archetypeVersion 是指模板项目的版本,可以使用以下版本号 4. archetypeVersion 是指模板项目的版本,可以使用以下版本号
> 1.0-RELEASE > 1.0-RELEASE
### 新建项目 (融租易HEL1.0)
确定上述信息后,可以使用如下命令新建项目: 确定上述信息后,可以使用如下命令新建项目:
...@@ -77,11 +128,13 @@ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -D archetypeGr ...@@ -77,11 +128,13 @@ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -D archetypeGr
### 确定本项目使用的数据库 ### 确定本项目使用的数据库
> 目前已经测试过支持的数据库有Mysql,Oracle,SqlServer > 目前已经测试过支持的数据库有Mysql,Oracle,SqlServer
> 按照[创建数据库](/后端开发/database-init.md)中的步骤创建数据库
> 请修改 `HelParent/core/src/main/java/hel/core/db/liquibase.groovy` 以适配不同的数据库 > 请修改 `HelParent/core/src/main/java/hel/core/db/liquibase.groovy` 以适配不同的数据库
确定好数据库后,按照 [Oracle,MySql,Sqlserver数据库配置](database-config.md) 修改项目配置文件。 ### 修改项目配置文件
修改配置文件后,按照[创建数据库](database-init.md) 中的步骤创建数据库
[修改项目配置文件](/后端开发/database-config.md)
### 编译整个项目 ### 编译整个项目
...@@ -90,8 +143,6 @@ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -D archetypeGr ...@@ -90,8 +143,6 @@ mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -D archetypeGr
mvn clean install -Dmaven.test.skip=true mvn clean install -Dmaven.test.skip=true
``` ```
<a name="liquibase"> </a>
### 初始化数据库表结构及基础数据 ### 初始化数据库表结构及基础数据
在 HelParent 项目录下执行: 在 HelParent 项目录下执行:
...@@ -109,11 +160,7 @@ mvn clean install -Dmaven.test.skip=true ...@@ -109,11 +160,7 @@ mvn clean install -Dmaven.test.skip=true
``` ```
mvn eclipse:eclipse mvn eclipse:eclipse
``` ```
2. 将项目工程导入 IDE 工具(Eclipse,IntelliJ IDEA)中,并配置服务(tomcat等)后启动运行。
3. 将所有工程导入 IDE 工具(Eclipse,IntelliJ IDEA)中
4. 配置 Server ,配置 JNDI 数据源,参照[多数据库配置](chapter1.1.md)
- 需要 Tomcat 7+, 不支持 Tomcat 6
5. 将 hel 工程发布到 tomcat/webapps,运行
### 更新HEL依赖 ### 更新HEL依赖
......
## 头行保存
头行保存在实用中经常用到,头行保存指的是头表和行表(一对多)的数据同时插入,如中途失败则这次事务不进行提交。
假设我们有两张表
**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表新增记录)
下面是一个头行保存的列子:
```javascript
<script><![CDATA[
//提交数据用到的容器
var viewModel = kendo.observable({
isEnabled: true,
data:{},
mySubmit:function(e){
if(e){
e.preventDefault();
}
Hap.submitForm({
url : '${base.contextPath}/hls/test/save',
formModel : viewModel.data,
asArray:false,
grid: { "hobby": $("#grid")
},
success:function(){
showInfoDialog("保存成功!");
}
});
},
function:showInfoDialog(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;
map.pagesize = options.pageSize;
for (var k in map) {
if (map[k] === '' || map[k] === null || map[k] === undefined)
delete map[k]
}
return Hap.prepareQueryParameter(viewModel.model.toJSON(), options);
}
}
//属性列是否可编辑
function dsEditable(field){
return true;
}
]]></script>
```
```xml
<!--头-->
<h:hlsForm title="个人信息" width="100%">
<h:hlsHBox>
<h:hlsMaskedTextBox name="name" id="name" bind="enabled: isEnabled, value:model.name" colspan="3" prompt="姓名:" required="true" style="width:100%;"/>
<h:hlsMaskedTextBox name="age" id="age" bind="enabled: isEnabled, value:model.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/query" type="GET" dataType="json"/>
<h:create url="${base.contextPath}/hls/test/create" type="POST" contentType="application/json" />
<h:update url="${base.contextPath}/hls/test/save" 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="mySubmit" text="保存"></h:hlsButton>
</h:hlsToolBar>
```
保存按钮注册了点了事件,点击保存将数据提交到'${base.contextPath}/hls/test/save'
> 在后端controller通过定义 @RequestMapping("/hls/test/save") 注解映射到对应的url,捕获到对应请求。
后端收到前台传过来的数据,调用service层对数据进行持久化。
controller
```java
@RequestMapping("/hls/test/save")
@ResponseBody
public ResponseData save(HttpServletRequest request,@RequestBody HlsPerson hlsPerson, @RequestParam(defaultValue = DEFAULT_PAGE) final int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) final int pagesize){
IRequest iRequest = createRequestContext(request);
testService.batchChildUpdate(iRequest, hlsPerson ,hlsPerson.getHlsHobby());
return new ResponseData();
}
```
testService的实现类testServiceImpl定义了batchChildUpdate方法:
```java
@Override
public void batchChildUpdate(IRequest iRequest, HlsPerson hlsPerson, List<HlsHobby> hlsHobbyList) {
List<HlsPerson> tempHlsPerson = new ArrayList<HlsPerson>();
if(hlsPerson != null ){
tempHlsPerson.add(hlsPerson);
hlsPersonService.batchUpdate(iRequest,tempHlsPerson);
Long pid = tempHlsPerson.get(0).getPid();
for(HlsHobby hh : hlsHobbyList){
hh.setPid(pid);
}
hlsHobbyService.batchUpdate(iRequest,hlsHobbyList);
}
}
```
> bathUpdate会根据传入的List对象中单个对象的属性值__status判断,如为update即做更新操作,add为插入操作, __status的值由前端paramter函数决定。
\ No newline at end of file
# 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
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,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 头行保存](/前端组件/头行保存.md)
* VI. 框架功能描述 * VI. 框架功能描述
......
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