第四天培训内容

4 周四培训内容 4 周四培训内容

4.1 后端介绍 4.1 后端介绍

4.1.1 后端目录结构【单系统】 4.1.1 后端目录结构【单系统】

1.后端代码的文件存放路径
周四培训-后端目录1
2.平台生成的例子。例子业务对象TestExam3201及子对象TestExam3201Detail。
参考一对多主从案例链接
周四培训-后端目录2

4.1.1.1 后端框架简介

4.1.1.1 后端框架简介 4.1.1.1 后端框架简介

  1. 后端的框架为springMVC+MyBatis
  2. springMVC即我们平时学习的框架,下面地址仅为参考例子。
    参考例子

4.1.2 后端的MyBatis常用查询操作4.1.2 后端的MyBatis常用查询操作

#####后端的MyBatis常用查询操作后端的MyBatis常用查询操作
1. 查询操作之and()
周四培训-mybatis1
2. 查询操作之EQ
周四培训-mybatis2
周四培训-mybatis3

  1. 查询操作之IN
    周四培训-mybatis4

  2. 其他的见参考文档:吉联物流云应用平台(GLPaaS)Mybatis数据操作.ppt

4.1.3前后端交互例子

4.1.3前后端交互例子4.1.3前后端交互例子

前后端交互例子前后端交互例子
  1. 下文将以TestExam3401例子的批量删除按钮为例子讲解。
    周四培训-前后端交互1
    先来看下html中的查询按钮代码:其中ng-click=”deleteTestExam3401s()”其点击事件。
       <button id="testExam3401.deleteTestExam3401s" 
               type="button" 
               ng-click="deleteTestExam3401s()" 
               g-per="/testExam3401/deletes" class="button-primary" >
     批量删除
       </button>

根据查询方法,我们在对应的js文件中查看批量删除的方法定义。在方法定义中可以看到,在方法中发送了个http请求。且将勾选的主键的ids作为参数传递到了后端。

            $http.post($config.ct + '/testExam3401/deletes', {ids: ids}).success(function (data) {
                if (data.success != undefined && data.success == true) {
                    $scope.getTestExam3401Pages();
                    if ($scope._pageState) $scope._pageState.resetDataState();
                    var gridVerifyArr = [{scope: "$scope", grid: ["testExam3401"]}, {
                        scope: "$scope",
                        property: "testExam3401FreightArs",
                        grid: ["testExam3401FreightAr"],
                        loadOneToOneSubBoData: false
                    }, {
                        scope: "$scope",
                        property: "testExamAttachment3401s",
                        grid: ["testExamAttachment3401"],
                        loadOneToOneSubBoData: false
                    }, {
                        scope: "$scope",
                        property: "testExam3401FreightAps",
                        grid: ["testExam3401FreightAp"],
                        loadOneToOneSubBoData: false
                    }, {
                        scope: "$scope",
                        property: "testExam3401Details",
                        grid: ["testExam3401Detail"],
                        loadOneToOneSubBoData: false
                    }, {
                        scope: "$scope",
                        property: "testExam3401Freights",
                        grid: ["testExam3401Freight"],
                        loadOneToOneSubBoData: false
                    }];
                    _this.gridVerify({boName: "TestExam3401", scope: $scope, settings: gridVerifyArr});
                    GillionMsg.alert("提示", data.msg);

                    $timeout(function () {
                        if ($scope._pageState) $scope._pageState.resetDataState();
                    });
                }

            });
        }

接着我们到控制器中查看对应的操作。在控制器中,批量删除deletes根据传递过来的主键值数组,调用的服务类中的批量删除方法进行删除数据。然后返回了一个【删除成功】的消息。

    public void deletes(@RequestBody String params, HttpServletResponse response) throws Exception {
        Map<String, String> parmMaps = JsonMapper.MAPPER.fromJson(params, Map.class);
        String idStr = parmMaps.get("ids");
        String[] ids = idStr.split(",");
        testExam3401Service.deletes(ids);
        ResponseUtils.flushSuccess(response, "删除成功!");

    }

为服务类上的批量删除deletes方法内容。

    public void deletes(String[] ids)
    {
        List<String> testExam3401Ids = Lists.newArrayList(ids);
        TestExam3401Example testExam3401Example = TestExam3401Example.create();
        testExam3401Example.and().andCreateCondition(TestExam3401.TESTEXAM3401ID,"testExam3401Id",Operation.IN,Arrays.asList(ids));
        if (!testExam3401Ids.isEmpty())
        {
            testExam3401FreightArService.deleteWithParent(testExam3401Ids);
        }
        if (!testExam3401Ids.isEmpty())
        {
            testExamAttachment3401Service.deleteWithParent(testExam3401Ids);
        }
        if (!testExam3401Ids.isEmpty())
        {
            testExam3401FreightApService.deleteWithParent(testExam3401Ids);
        }
        if (!testExam3401Ids.isEmpty())
        {
            testExam3401DetailService.deleteWithParent(testExam3401Ids);
        }
        if (!testExam3401Ids.isEmpty())
        {
            testExam3401FreightService.deleteWithParent(testExam3401Ids);
        }
        this.deleteByExample(testExam3401Example);
    }

在前端接收后台返回的消息。

            $http.post($config.ct + '/testExam3401/deletes', {ids: ids}).success(function (data) {
                if (data.success != undefined && data.success == true) {


                    _this.gridVerify({boName: "TestExam3401", scope: $scope, settings: gridVerifyArr});
                    GillionMsg.alert("提示", data.msg);

                    $timeout(function () {
                        if ($scope._pageState) $scope._pageState.resetDataState();
                    });
                }

            });
        }

4.2自定义扩展介绍 4.2自定义扩展介绍

自定义扩展介绍 自定义扩展介绍

  1. 自定义扩展service服务 参考配置
  2. 自定义扩展controller 参考配置
    【后端扩展】参考视频:http://training.gillion.com.cn/app.php/course/30/task/434/show

4.4 自定义习题布置4.3 自定义习题布置

自定义习题布置 自定义习题布置

  1. 例子:TestExam3401。要求为:界面要查询3301的主表字段和子表明细字段信息。界面和3301管理页的一样,但是表格上还需要展示订单明细表的,商品名称、待入库数量、已入库数量。界面上的新增按钮点击后跳转到3301案例的新增界面,编辑按钮点击后跳转到3301界面的编辑页面。
    参考配置

  2. 在1的基础上,界面上有个自定义按钮,批量删除,点击批量删除,如果主表中只有一条明细表数据,则删除主表,扩展表,明细表数据。如果主表中有多条明细,则删除本条明细数据,其他数据不删除。

  3. 在3301例子上,主表保存的时候要给字段收货人赋值当前用户信息
    参考配置

4.3101例子上,配置导入导出。参考配置
【Excel导入】参考视频:http://training.gillion.com.cn/app.php/course/30/task/440/show
【Excel导出】参考视频:http://training.gillion.com.cn/app.php/course/30/task/442/show