Commit 43df0dab by 郭旭

教案修改

parent 9fd7e92e
assets/images/gjjs-common2.png

142 KB | W: | H:

assets/images/gjjs-common2.png

132 KB | W: | H:

assets/images/gjjs-common2.png
assets/images/gjjs-common2.png
assets/images/gjjs-common2.png
assets/images/gjjs-common2.png
  • 2-up
  • Swipe
  • Onion skin
## 后端项目下载运行 ## 后端项目下载运行
...@@ -141,11 +141,6 @@ mirrors元素中配置如下 ...@@ -141,11 +141,6 @@ mirrors元素中配置如下
![](../assets/images/backendinstall1.png) ![](../assets/images/backendinstall1.png)
贴张图供大家理解
com.ceb.gjjs.mda包下
![](../assets/images/hdmljg1.png)
bd模型转换做完再到后端工程,如果都是老交易此时再编译项目可以正常编译通过(如果有新增交易,则需要进行相应报错代码的修改,因为bd模型工具转换成java代码后编译层面有一些无法解决的错误需要开发人员手工去改bd源码,后面开发操作指引文档会做详细说明) bd模型转换做完再到后端工程,如果都是老交易此时再编译项目可以正常编译通过(如果有新增交易,则需要进行相应报错代码的修改,因为bd模型工具转换成java代码后编译层面有一些无法解决的错误需要开发人员手工去改bd源码,后面开发操作指引文档会做详细说明)
![](../assets/images/backendinstall2.png) ![](../assets/images/backendinstall2.png)
......
## 后端项目开发文档
## 后端项目开发文档
### 模型转换代码结构介绍(gjjs-business)
***视频说明***
http://114.115.138.98:9497/gjjs-book/assets/videos/rear-end-file.mp4
com.brilliance.mda包下
开发人员手写代码,包含了注解、引擎类、核心接口、码表、工具类等内容,对于td函数的翻译位于com.brilliance.mda.runtime.mda.util包下的MdaUtils和MdaUtilsEx两个类。
com.ceb.gjjs.mda包下
![](../assets/images/hdmljg1.png)
### 配置文件说明
| codeTable | 码表,select中的可选项 |
| ---------------- | ----------------------------------------------- |
| defaultRule | 某些情况下数据字段改变触发相关default方法的码表 |
| i18n | 提示信息码表 |
| mapper | 获取数据库码表信息相关的mapper |
| META-INF/orm/mda | Bo实体类对应的mapper |
| moduleInfo | Bo实体类对应的数据库配置信息 |
| template | 用户面函中相关PDF生成的模板 |
| application.yml | 应用程序配置信息 |
### Spring/Mybatis运行时开发介绍
#### SpringMVC简介
SpringMVC就是一个Spring内置的MVC框架。
MVC框架,它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化等等),而且使用简单,与Spring无缝集成。支持 RESTful风格的URL请求。
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
```
M:Model,模型层,指工程中的JavaBean,作用是处理数据
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
```
#### mybatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射,MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型为数据库中的记录。
#### 项目相关依赖
在gjjs-business模块下的pom.xml文件中引入相关依赖
![dependency](../assets/images/dependency.png)
**注意:**新增依赖需要在gjjs-common项目的pom.xml中指定依赖版本
![dependencyManagement](../assets/images/dependencyManagement.png)
### 模型转换开发步骤
#### 1.使用BD工具生成后端代码
打开bd工具勾选需要转换的交易后,点击Compile & Deploy编译。
**注意:**第一次使用需要参考模型转换工具使用教程对bd工具进行配置。
![compile](../assets/images/compile.png)
2.将生成的VO复制到gjjs-common工程下并覆盖原有的文件。
![vo](../assets/images/vo1.png)
![vo2](../assets/images/vo2.png)
#### 2.将生成的前端代码复制到vue-gjjs项目中
gjjs-bdproject/build/VueSpring/front/frontProject/views/Business目录下交易名的文件夹
![vue1](../assets/images/vue1.png)
gjjs-bdproject/build/VueSpring/front/frontProject/model目录下交易名的文件夹
![vue2](../assets/images/vue2.png)
复制到vue-gjjs/src/views/Business目录下
![vue3](../assets/images/vue3.png)
复制到vue-gjjs/src/model目录下
![vue4](../assets/images/vue4.png)
修改路由配置文件BusRouter.js,添加新增交易配置。
![busRouter](../assets/images/busRouter.png)
**注意:**后续前端页面开发工作参照前端开发文档资料。
#### 3.修改菜单配置文件
修改gjjs-common/workroot/INI目录下后缀为.dof的配置文件
具体哪一个配置文件需要根据新增交易的入口交易确定
![image-20230223160003227](C:/Users/17617/AppData/Roaming/Typora/typora-user-images/image-20230223160003227.png)
在SUBMENU-FILE-1这一列后面新增交易入口
同时修改本地的rootPath(修改内容同上)
![image-20230223160907200](C:/Users/17617/AppData/Roaming/Typora/typora-user-images/image-20230223160907200.png)
#### 4.进入交易页面
运行Bt2poinnewApplication启动后端
![backendrun0](../assets/images/backendrun0.png)
运行前端vue项目
![front](D:\IdeaProjects\gjjs-course\assets\images\front.png)
## 后端项目整体介绍 ## 后端项目整体介绍
## 后端项目整体介绍 ## 后端项目整体介绍
#### 项目框架 #### 项目结构介绍
后端项目是一个springboot工程项目,持久化框架用的是mybatis. gjjs-business模块文件结构
![backenddev1](../assets/images/backenddev1.png)
#### 项目流程介绍 #### 项目流程介绍
...@@ -12,13 +14,16 @@ ...@@ -12,13 +14,16 @@
![image-20210918165941920](../assets/images/gjjs-common2.png) ![image-20210918165941920](../assets/images/gjjs-common2.png)
##### 2.Service与Rule如何调用 ##### 2.Service与Rule如何调用
1)AbstractRouteService是service层最上层抽象类,对一些基本公共方法(init、executeRule、executeDefault等,这些方法基本每个交易都会去调用)做了实现,保证执行流程的统一,通过getEmitter这个抽象方法来实现多态(子类通过实现这个方法来处理不同业务逻辑,不用去关心具体的执行流程) 1)AbstractRouteService是service层最上层抽象类,对一些基本公共方法(init、executeRule、executeDefault等,这些方法基本每个交易都会去调用)做了实现,保证执行流程的统一,通过getEmitter这个抽象方法来实现多态(子类通过实现这个方法来处理不同业务逻辑,不用去关心具体的执行流程)
2)AbstractCommonProcess是service层二级抽象类,对一些非公共方法(某个交易需要的方法,例如ditopn相关的executeDocpan方法、Trnrel交易相关的reJrow方法)做了实现 2)AbstractCommonProcess是service层二级抽象类,对一些非公共方法(某个交易需要的方法,例如ditopn相关的executeDocpan方法、Trnrel交易相关的reJrow方法)做了实现
3)具体交易service通过接口向resource层暴露服务,这里用ICommonService将常用公共接口方法做了封装,具体交易service不再进行业务方法的实现(已在抽象类进行了实现),只是持有自己交易对应的emitter实例,实现getEmitter方法 3具体交易service通过接口向resource层暴露服务,这里用ICommonService将常用公共接口方法做了封装,具体交易service不再进行业务方法的实现(已在抽象类进行了实现),只是持有自己交易对应的emitter实例,实现getEmitter方法
4)AbstractRuleEmitter是emitter的抽象父类,对基本公共方法(executeRule、executeDefault等)做了实现,交易emitter实现executeInit方法,并对一系列rule按照执行顺序做了封装,根据rule名字缓存到map里,通过反射去调用对应的方法 4)AbstractRuleEmitter是emitter的抽象父类,对基本公共方法(executeRule、executeDefault等)做了实现,交易emitter实现executeInit方法,并对一系列rule按照执行顺序做了封装,根据rule名字缓存到map里,通过反射去调用对应的方法
...@@ -49,9 +54,6 @@ executeCheck (参数、数据校验类rule) ...@@ -49,9 +54,6 @@ executeCheck (参数、数据校验类rule)
{ {
"didgrp_rec_ownref": "", "didgrp_rec_ownref": "",
"mtabut_coninf_conexedat": "", "mtabut_coninf_conexedat": "",
.
.
.
"pageId": "c39e4675-1cc0-4169-bcf6-e6f8d659e4ff", "pageId": "c39e4675-1cc0-4169-bcf6-e6f8d659e4ff",
"params": {} "params": {}
} }
...@@ -75,9 +77,6 @@ executeCheck (参数、数据校验类rule) ...@@ -75,9 +77,6 @@ executeCheck (参数、数据校验类rule)
"data": { "data": {
"params": {}, "params": {},
"pageId": "c39e4675-1cc0-4169-bcf6-e6f8d659e4ff", "pageId": "c39e4675-1cc0-4169-bcf6-e6f8d659e4ff",
.
.
.
"didgrp_rec_conno": "", "didgrp_rec_conno": "",
"didgrp_rec_dkflg": "N" "didgrp_rec_dkflg": "N"
} }
...@@ -111,5 +110,70 @@ VO类是前后端数据请求和响应的实体类,VO有一个共同父类VO ...@@ -111,5 +110,70 @@ VO类是前后端数据请求和响应的实体类,VO有一个共同父类VO
VO按照交易进行划分,一个交易对应一个VO(比如信用证开证交易对应VO是DitopnVO),VO类使用了lombok插件,不需要set get方法,字段用RelPath注解区分是请求字段还是响应字段(默认没有注解,代表dir属性值是DirType.BOTH,及请求和响应都需要该字段;如果只是请求字段,dir属性值是DirType.IN;如果是相应字段,dir属性值是DirType.OUT),如图: VO按照交易进行划分,一个交易对应一个VO(比如信用证开证交易对应VO是DitopnVO),VO类使用了lombok插件,不需要set get方法,字段用RelPath注解区分是请求字段还是响应字段(默认没有注解,代表dir属性值是DirType.BOTH,及请求和响应都需要该字段;如果只是请求字段,dir属性值是DirType.IN;如果是相应字段,dir属性值是DirType.OUT),如图:
![](../assets/images/vogf1.png) ![](../assets/images/vogf1.png)
##### 6.前后台事件关联方式
###### 调用普通Module下事件
例如:
(1) ditopn交易中点击账务面板时,需要触发账务面板的点击事件,该事件对应(Module)setmod下的setpan事件。可用以下方式调用:
```vue
let rule = "setmod.setpan";
let rtnmsg = await this.executeRule(rule)
if (rtnmsg.respCode == SUCCESS) {
//处理响应
}
```
(2) 同样的,账务面板中的”细节”按钮,对应(Module)setmod中的det事件。使用··``` await this.executeRule(“setmod.det”)```方式调用。
###### 调用ModuleList选中行事件
例如:账务 Own Commission/Charges 列表,对应模型setmod/setfeg/setfel(ModuleList)。每行数据对应ModuleList中的一个setfel实例。
![](../assets/images/setfel.png)
前后台对应关系:
| 前台: | VO | Module |
| :---------------------------------------: | :------------------------------------------: | :------------------: |
| Setpan.Vue:账务Own Commission/Charges列表 | DitopnVO:List<Setfel> setmod_setfeg_setfel; | setmod/setfeg/setfel |
Details按钮在后台对应的事件rule 为”del”,当按钮被点击时,应当通过以下方式触发相应事件:
```js
const idx = rowno+1; //rowno为选中行
let rule = "setmod.setfeg.setfel("+idx+").det";
let rtnmsg = await this.executeRule(rule)
if (rtnmsg.respCode == SUCCESS) {
//处理响应
}
```
###### 事件在普通模型下,但实际处理ModuleList选中行
例如:保证金模块中的保证金列表。对应数据模型为:(ModuleList)liaall/liaccv/liaccvg ;但删除操作按钮的对应事件是在(Module)liaall/liaccv模型下的del
![](../assets/images/delete.png)
| 前台: | VO | Module |
| :--------: | :-------------------------------------------: | :-------------------: |
| Ccvpan.vue | DitopnVO:List<Setfel> liaall_liaccv_liaccvg; | liaall/liaccv/liaccvg |
删除按钮事件调用方式:
```js
const selIds = [rowno+1]; //rowno选中行索引,多行选中时通过数组传递多个索引
const selDst = "liaall.liaccv.liaccvg" //列表对应后台模型中的ModuleList
let params = {selDst:selDst,selIds: selIds};
let rtnmsg = await this.executeRule("liaall.liaccv.del",params)
if (rtnmsg.respCode == SUCCESS) {
//处理响应
}
```
###### 事件在普通模型下,但实际处理IStream选中行
此种情况参考"ModuleList选中行"的处理,只需把selDst的值指向IStream即可。
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