在前期的開發中,我們有了前觀的C,V層,也對后臺進行了初步的開發,獲取了原始數據。本節中,讓我們共同開發前臺的M層,以實現與后臺及前臺C層的對接。
# 新建M層
```
panjiedeMacBook-Pro:WebApp panjie$ yo angular:service klass
create app/scripts/services/klass.js
create test/spec/services/klass.js
```
有了前面teacher的經驗。klass.js相對就變得簡單一些了。我們稍加改動:
klass.js
```
'use strict';
/**
* @ngdoc service
* @name webAppApp.klass
* @description
* # klass
* Service in the webAppApp.
*/
angular.module('webAppApp')
.service('klass', function(server) {
/**
* 獲取當前頁的教師
* @param {string} name 查詢教師的名字
* @param {int} page 第幾頁
* @param {int} pageSize 每頁多少條
* @param {Function} callback 回調函數
* @return {[type]}
* @author 夢云智 http://www.mengyunzhi.com
* @DateTime 2017-01-21T19:05:55+0800
*/
var paginate = function(name, page, pageSize, callback) {
// 進行http POST請求.
// 由于是post請求方式,所以即便是我們在項目中存在paginate.json文件
// 但如果我們查看控制臺,仍然會發現有錯誤產生,同時,沒有正確的接收到數據
server.http({
method: 'POST',
url: '/Klass.json',
data: {
name: name,
page: page,
pageSize: pageSize
}
}, function(response) {
callback(response);
});
};
// Public API here
return {
// 獲取全部教師信息
paginate: function(name, page, pageSize, callback) {
return paginate(name, page, pageSize, callback);
},
};
});
```
單元測試:
當我們有了后臺做支撐時,在進行資源請求時,完全可以直接對接后臺。從而省略在單元測試中手動輸入返回值。
所以:單元測試中我們僅進行語法測試:
```
'use strict';
describe('Service: klass', function() {
// load the service's module
beforeEach(module('webAppApp'));
// 注入config ,直接引用config中的api地址。
var klass, $httpBackend, config;
beforeEach(inject(function(_klass_, _$httpBackend_, _config_) {
klass = _klass_;
config = _config_; // 引用項目配置
$httpBackend = _$httpBackend_;
// 定義請求 URL
var url = config.apiRootPath + '/Klass.json';
// 定義返回數據, 僅定義正確的返回碼。
var data = {code:200};
// 進行模似數據請求配置.當請求方法為post,資源名為url時, 返回data數據.
$httpBackend.when('POST', url).respond(data);
}));
it('檢測語法是否出現錯誤', function() {
// 調用方法
klass.paginate('', 1, 2, function() {});
// 模擬數據請求
$httpBackend.flush();
});
});
```
保存文件后,沒有出現異常信息,即為代碼書寫正正確.
# C與M對接
```
'use strict';
/**
* @ngdoc function
* @name webAppApp.controller:KlassIndexCtrl
* @description
* # KlassIndexCtrl
* Controller of the webAppApp
*/
angular.module('webAppApp')
.controller('KlassIndexCtrl', function($scope, config, klass) {
// 初始化
var klasses = [];
$scope.page = 1; // 第幾頁
$scope.pageSize = 3; // 每頁大小
$scope.totalCount = 10; // 總條數
$scope.name = ''; // 查詢條件
$scope.isDebug = config.isDebug; // 開發模式
// 為當前頁增加active樣式
var activeClass = function(index) {
if ($scope.page === index) {
return 'active';
} else {
return '';
}
};
// 用戶點擊分頁觸發
var changePage = function (index) {
$scope.page = index;
paginate();
};
// 分頁查詢
var paginate = function() {
klass.paginate($scope.name, $scope.page, $scope.pageSize, function(response) {
$scope.page = response.page;
$scope.klasses = response.klasses;
$scope.totalcount = response.totalCount;
});
};
// 初始化
var int = function() {
paginate();
};
int();
$scope.query = paginate;
$scope.klasses = klasses;
$scope.activeClass = activeClass;
$scope.changePage = changePage;
});
```
此時,我們按開發規范,進行測試。
<table>
<tr>
<th>name</th>
<th>page</th>
<th>pageSize</th>
<th>code</th>
<th>klasses</th>
<th>page</th>
<th>totalCount</th>
<td>說明</td>
</tr>
<tr>
<td>""</td>
<td>1</td>
<td>3</td>
<td>200</td>
<td>大小為3的數組</td>
<td>1</td>
<td>7</td>
<td></td>
</tr>
<tr>
<td>一</td>
<td>2</td>
<td>2</td>
<td>200</td>
<td>大小為2的數組,且每項中班級名均包含有 一 的字樣</td>
<td>2</td>
<td>4</td>
<td></td>
</tr>
</table>

至此,前臺班級列表,開發完畢,等待后臺開發完畢后,進行集成測試。
<hr />
> git checkout -f step12.1.4
- README
- 第一章:準備
- 第二章:Hello World!
- 第一節:查看工程文件
- 第二節:JDK、JRE與環境變量
- 第三節:index.jsp
- 第三章:Hello Struts
- 第一節:Web.xml
- 第二節:單入口
- 第三節:Hello Struts
- 第四節:觸發C層
- 第四章:建立數據表
- 第一節:建立實體類
- 第二節:測試一
- 第三節:測試二
- 第四節:引入Hibernate
- 第五節:配置Hibernate
- 第六節:建立連接
- 第七節:實體類映射數據表
- 第八節:完善數據表
- 第五章:教師管理
- 第一節:增加數據--add
- 第二節:增加數據--save
- 1 獲取傳入數據數據
- 2 數據寫入測試
- 3 對接C層
- 第三節:數據列表
- 1 獲取數據
- 2 重構代碼
- 3 C層對接--初始化
- 4 C層添加數據
- 5 V層顯示數據
- 6 獲取數據庫中數據
- 7 顯示性別
- 8 分頁
- 9 條件查詢
- 第四節:修改數據
- 1 edit
- 2 update
- 第五節:刪除數據
- 第六節:總結
- 第六章:重構C層
- 第一節:繼承ActionSupport類
- 第二節:數據驗證
- 第七章:前臺分離(前臺)
- 第一節:環境搭建
- 第二節:運行環境
- 第三節:共享開發環境
- 第四節:生產環境
- 第八章:前臺開發(前臺)
- 第一節:本地化
- 第二節:教師列表
- 1 引入M層
- 2 模擬后臺返回數據
- 3 C與M對接
- 4 C與V對接
- 第九章:前后臺對接(前后臺)
- 第一節:后臺輸出json(后臺)
- 第二節:對接前臺(全棧)
- 第二節:對接API(前臺)
- 第二節:跨域請求(后臺)
- 第三節:重構代碼(前臺)
- 第十章:重構后臺M層
- 第一節:數據訪問DAO層
- 第二節:項目整體重構
- 第十一章:用戶登陸(前后臺)
- 第一節:制定規范
- 第二節:定制測試用例
- 第三節:后臺輸入測試代碼(后臺)
- 第四節:postman(后臺)
- 第五節:新建用戶登陸模塊(前臺)
- 第六節:代碼重構(前臺)
- 第十二章:班級管理(前后臺)
- 第一節:班級列表
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第二節:Add
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第三節:Save
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第四節:Edit
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第五節:Update
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第六節:Delete
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第七節:小結
- 第十三章:班級管理(API)
- 第一節:ER圖
- 第二節:create
- 1 實體層
- 2 dao層
- 3 service(server)層
- 4 action層
- 第三節:ManyToOne
- 第四節:Read
- 1 service(server)層
- 2 action層
- 第五節:update
- 1 service(server)層
- 2 action層
- 第六節:update
- 第十四章:重構服務層