品優購 第三天

品優購 第三天

規格及模板管理

1.前端分層開發

1.1 需求分析

我們在上次課學習了angularJS並完成的品牌管理的增刪改查功能。但是我們看代碼,JS和html都放在一起,並不利於我們後期的維護。我們可以在前端代碼中也運用MVC的設計模式,將代碼進行分離,提高程序的可維護性。

1.2 自定義服務

在 AngularJS 中,服務是一個函數或對象,可在你的 AngularJS 應用中使用。我們在上次課中使用了內置服務$http .其實我們也可以自己來定義服務,而服務會封裝一些操作。我們在不同的控制器中可以調用同一個服務,這樣服務的代碼將會被重用。

我們現在就修改一下我們的品牌管理代碼,使用自定義服務。

var app=angular.module('pinyougou', ['pagination']);//定義模塊

//品牌服務層

app.service('brandService',function($http){

//讀取列表數據綁定到表單中

this.findAll=function(){

return $http.get('../brand/findAll.do');

}

//其它方法省略.......

});

//品牌控制層

app.controller('brandController' ,function($scope,brandService){

//讀取列表數據綁定到表單中

$scope.findAll=function(){

brandService.findAll().success(

function(response){

$scope.list=response;

}

);

}

//其它方法省略........

});

1.3代碼分離

我們剛才已經將與後端交互的部分放入自定義服務,目的是不同的控制層都可以重複調用服務層方法。所以我們還需要將代碼分離出來,以便調用。

1.3.1 前端基礎層

在pinyougou-manager-web工程js下創建base.js

var app=angular.module('pinyougou',[]);

創建base_pagination.js

var app=angular.module('pinyougou',['pagination']);

一個用於不需要分頁功能的頁面,一個用於需要分頁功能的頁面.

1.3.2 前端服務層

在pinyougou-manager-web工程js下創建service文件夾。創建brandService.js

//品牌服務層

app.service('brandService',function($http){

//讀取列表數據綁定到表單中

this.findAll=function(){

return $http.get('../brand/findAll.do');

}

//其它方法省略........

});

1.3.3 前端控制層

在pinyougou-manager-web的js文件夾下創建brandController.js

//品牌控制層

app.controller('brandController' ,function($scope,brandService){

//讀取列表數據綁定到表單中

$scope.findAll=function(){

brandService.findAll().success(

function(response){

$scope.list=response;

}

);

}

//其它方法省略........

});

1.3.4 修改頁面

去掉brand.html原來的JS代碼,引入剛才我們建立的JS

(3) 選擇數據庫類型為 MYSQL ,輸入用戶名和密碼後點擊“測試連接”按鈕,提示連接成功後選擇數據庫,點擊“下一步”。

品優購 第三天

(4)選擇模板為SSM+dubbox+angularJS(服務層+WEB層)

品優購 第三天

這個模板不會生成數據訪問層和實體類,因為我們之前已經用逆向工程完成了數據訪問層與實體類的生成。

(5)點擊生成代碼按鈕,提示成功後,到生成路徑去找生成的代碼,並拷貝到我們的工程中。

3.2代碼拷貝

將商家商品相關代碼拷貝到工程。

(1) 拷貝服務接口

品優購 第三天

(2) 拷貝服務實現類

品優購 第三天

(3) 拷貝控制器

品優購 第三天

(4) 拷貝JS

品優購 第三天

3.3安裝到本地倉庫

執行maven命令install ,將最新的品優購代碼安裝到本地倉庫

4.規格管理

4.1需求及表結構分析

4.1.1 需求

實現規格管理功能

品優購 第三天

4.1.2 表結構

tb_specification 規格表

字段

類型

長度

含義

Id

Bigint

主鍵

Spec_name

Varchar

255

規格名稱

tb_specification_option 規格選項表

字段

類型

長度

含義

Id

Bigint

主鍵

Option_name

Varchar

200

規格選項名稱

Spec_id

Bigint

30

規格ID

Orders

Int

11

排序

4.2規格列表

4.2.1 引入JS

修改pinyougou-manager-web工程的specification.html

4.2.3 指令與表達式

在body元素指定模塊名和控制器名

ng-app="pinyougou" ng-controller="specificationController" >

循環表格行

{{entity.id}}

{{entity.specName}}

4.3新增規格

4.3.1 新增行的實現

修改specificationController.js 新增以下代碼

//新增選項行

$scope.addTableRow=function(){

$scope.entity.specificationOptionList.push({});

}

specification.html “新建選項”按鈕

注意:要修改specification.html “新建”按鈕,彈出窗口時對entity進行初始化,否則向集合添加數據時會報錯!

4.3.2 刪除行的實現

實現思路:在每一行將索引值傳遞給集合,在集合中刪除。

修改specificationController.js 新增以下代碼

//批量選項刪除

$scope.deleTableRow=function(index){

$scope.entity.specificationOptionList.splice(index,1);//刪除

}

修改每行的刪除按鈕

$index 用於獲取ng-repeat指令循環中的索引。

4.3.3 提交保存

實現思路:我們將規格和規格選項數據合併成一個對象來傳遞,這時我們需要用一個對象將這兩個對象組合起來。在業務邏輯中,得到組合對象中的規格和規格選項列表,插入規格返回規格ID,然後循環插入規格選項。

(1) 我們要增加規格選項,必須要知道新增規格的ID, 所以我們在修改pinyougou-dao 的TbSpecificationMapper.xml ,在insert節點後添加如下配置

SELECT LAST_INSERT_ID() AS id

insert into tb_specification (id, spec_name)

values (#{id,jdbcType=BIGINT}, #{specName,jdbcType=VARCHAR})

(2)在pinyougou-pojo 建立com.pinyougou.pojogroup包,包下建立Specification類

package com.pinyougou.pojogroup;

import java.io.Serializable;

import java.util.List;

import com.pinyougou.pojo.TbSpecification;

import com.pinyougou.pojo.TbSpecificationOption;

/**

* 規格組合實體類

* @author Administrator

*

*/

public class Specification implements Serializable {

private TbSpecification specification;

private List specificationOptionList;

public TbSpecification getSpecification() {

return specification;

}

public void setSpecification(TbSpecification specification) {

this.specification = specification;

}

public List getSpecificationOptionList() {

return specificationOptionList;

}

public void setSpecificationOptionList(List specificationOptionList) {

this.specificationOptionList = specificationOptionList;

}

}

(%1) 修改pinyougou-sellergoods-interface的SpecificationService.java

/**

* 增加

*/

public void add(Specification specification);

(%1) 修改pinyougou-sellergoods-service的SpecificationServiceImpl.java

/**

* 增加

*/

@Override

public void add(Specification specification) {

specificationMapper.insert(specification.getSpecification());//插入規格

//循環插入規格選項

for(TbSpecificationOption specificationOption:specification.getSpecificationOptionList()){ specificationOption.setSpecId(specification.getSpecification().getId());//設置規格ID specificationOptionMapper.insert(specificationOption);

}

}

(5)修改pinyougou-manager-web的SpecificationController.java

/**

* 增加

* @param specification

* @return

*/

@RequestMapping("/add")

public Result add(@RequestBody Specification specification){

try {

specificationService.add(specification);

return new Result(true, "增加成功");

} catch (Exception e) {

e.printStackTrace();

return new Result(false, "增加失敗");

}

}

(%1) 修改頁面specification.html

綁定規格名稱

規格名稱

綁定保存按鈕事件

4.4修改規格

4.4.1 獲取規格數據

實現思路:通過規格ID,到後端查詢規格和規格選項列表,然後通過組合實體類返回結果

(1)修改pinyougou-sellergoods-interface的SpecificationService.java

/**

* 根據ID獲取實體

* @param id

* @return

*/

public Specification findOne(Long id);

(2)修改pinyougou-sellergoods-service的SpecificationServiceImpl.java

/**

* 根據ID獲取實體

* @param id

* @return

*/

@Override

public Specification findOne(Long id){

//查詢規格

TbSpecification tbSpecification = specificationMapper.selectByPrimaryKey(id);

//查詢規格選項列表

TbSpecificationOptionExample example=new TbSpecificationOptionExample();

Criteria criteria = example.createCriteria();

criteria.andSpecIdEqualTo(id);//根據規格ID查詢

List optionList = specificationOptionMapper.selectByExample(example);

//構建組合實體類返回結果

Specification spec=new Specification();

spec.setSpecification(tbSpecification);

spec.setSpecificationOptionList(optionList);

return spec;

}

(3)修改pinyougou-manager-web的SpecificationController.java

@RequestMapping("/findOne")

public Specification findOne(Long id){

return specificationService.findOne(id);

}

(%1) 修改頁面specification.html 中列表的修改按鈕

4.4.2 保存修改結果

(1)修改pinyougou-sellergoods-interface的SpecificationService.java

/**

* 修改

*/

public void update(Specification specification);

(2)修改pinyougou-sellergoods-service的SpecificationServiceImpl.java

/**

* 修改

*/

@Override

public void update(Specification specification){

//保存修改的規格

specificationMapper.updateByPrimaryKey(specification.getSpecification());//保存規格

//刪除原有的規格選項

TbSpecificationOptionExample example=new TbSpecificationOptionExample();

com.pinyougou.pojo.TbSpecificationOptionExample.Criteria criteria = example.createCriteria();

criteria.andSpecIdEqualTo(specification.getSpecification().getId());//指定規格ID為條件

specificationOptionMapper.deleteByExample(example);//刪除

//循環插入規格選項

for(TbSpecificationOption specificationOption:specification.getSpecificationOptionList()){

specificationOption.setSpecId(specification.getSpecification().getId());

specificationOptionMapper.insert(specificationOption);

}

}

(3)修改pinyougou-manager-web的SpecificationController.java

/**

* 修改

* @param specification

* @return

*/

@RequestMapping("/update")

public Result update(@RequestBody Specification specification){

try {

specificationService.update(specification);

return new Result(true, "修改成功");

} catch (Exception e) {

e.printStackTrace();

return new Result(false, "修改失敗");

}

}

(4)修改specification.js的save方法

//保存

$scope.save=function(){

var serviceObject;//服務層對象

if($scope.entity.specification.id!=null){//如果有ID

serviceObject=specificationService.update( $scope.entity ); //修改

}else{

serviceObject=specificationService.add( $scope.entity );//增加

}

serviceObject.success(

function(response){

if(response.success){

//重新查詢

$scope.reloadList();//重新加載

}else{

alert(response.message);

}

}

);

}

4.5刪除規格

實現思路:我們要刪除規格的同時,還要記得將關聯的規格選項刪除掉。

4.5.1 後端代碼

修改pinyougou-sellergoods-service的SpecificationServiceImpl.java

/**

* 批量刪除

*/

@Override

public void delete(Long[] ids) {

for(Long id:ids){

specificationMapper.deleteByPrimaryKey(id);

//刪除原有的規格選項

TbSpecificationOptionExample example=new TbSpecificationOptionExample();

com.pinyougou.pojo.TbSpecificationOptionExample.Criteria criteria = example.createCriteria();

criteria.andSpecIdEqualTo(id);//指定規格ID為條件

specificationOptionMapper.deleteByExample(example);//刪除

}

}

4.5.2 前端代碼

修改pinyougou-manager-web的specification.html

列表的複選框

刪除按鈕

5.模板管理

5.1 需求及表結構分析

5.1.1 需求分析

首選我們需要理解模板的作用。模板主要有兩個:

1是用於關聯品牌與規格

2定義擴充屬性

5.1.2 表結構分析

tb_type_template 模板表

字段

類型

長度

含義

Id

Bigint

主鍵

name

Varchar

80

模板名稱

Spec_ids

Varchar

1000

關聯規格(json格式)

brand_ids

Varchar

1000

關聯品牌(json格式)

custom_attribute_items

Varchar

2000

擴展屬性

5.2 模板列表

5.2.1 引入JS

修改type_template.html ,引入JS

5.2.3 指令與表達式

{{entity.id}}

{{entity.name}}

{{entity.brandIds}}

{{entity.specIds}}

{{entity.customAttributeItems}}

5.3 品牌下拉列表

在彈出窗口中有個品牌下拉列表,要求品牌是可以選擇多個,這與我們之前的單選的下拉列表是不同的。我們要想實現這個功能,需要使用select2 組件來完成。

品優購 第三天

5.2.1 認識select2

我們來看例子:我們需要的就是這樣可以多選的下拉框

品優購 第三天

5.2.2 顯示品牌下拉列表(靜態)

(1)修改 type_template.html 引入JS

multiple 表示可多選

Config用於配置數據來源

select2-model用於指定用戶選擇後提交的變量

最終實現效果如下:

品優購 第三天

5.2.3 後端數據支撐

我們現在讓這個下拉列表的數據從數據庫中提取,修改後端代碼

(1)pinyougou-dao 工程 ,在TbBrandMapper.xml中添加SQL語句配置