作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服

Demo中使用的工具可以在百度云下载:

    Eclipse: http://pan.baidu.com/s/1c4f5zo

    Tomcat:  http://pan.baidu.com/s/1c1KGqPE

    Maven:   http://pan.baidu.com/s/1kVeKHDl

    MySql服务器: http://pan.baidu.com/s/1b7ThBg

    MySql客户端(sqlyog):  http://pan.baidu.com/s/1hs5Vmbq

    JDK1.7:    http://pan.baidu.com/s/1pLBMCHH

         

为了更好的学习,下面先简单介绍下AngularJs

1.AngularJS

    AngularJS是一个开源Web应用程序框架。它最初是由MISKO Hevery和Adam Abrons于2009年开发。现在是由谷歌维护。它的最新版本是1.3.14。项目中对AngularJS进行了集成,下载demo后可以查看, 也可以到官网: https://angularjs.org/ 进行下载


   1.1AngularJs开发js库的引入: 

<script type="text/javascript" src="<%=contextPath%>/jsLib/angular/angularjs.js"></script>

   1.2AngularJs在html中的申明

<div ng-app='shopCarApp' ng-controller="carShopController">

        一个html页面中只能有一个ng-app, 却可以有多个ng-controller

        js中对ng-app和ng-controller的初始化


var appShopCar = angular.module("shopCarApp", [], function($provide){
        });


appShopCar.controller("carShopController", function ($scope, $http) {
        });

   1.3数据双向绑定:

    AngularJs最大的特性便是双向绑定,也就是Js中的数据变动时,可以实时动态将数据结果根据预先写好的规则反应到界面上

    比如: $scope.data = 1; 

          <td>{{item.data}}</td> 则页面中应该显示为1;

          如果$scope.data被动态修改为 2,页面会动态显示为 2

    双向绑定带来的好处是开发人员只需要专注于业务逻辑的处理,页面上元素的变化不需要过多的关注与处理

   1.4数据通讯:

         POST方法:

$http.post("/AngularJs/goods/saveGoods.htm",                  //后台URL地址
      {                     
      goodsList : JSON.stringify($scope.carShop),  //请求参数
      })
          .success(function (data, header, config, status) {
              if(data.stateCode == 0){                                 //结果处理
              alert(data.desc);
              }
          })
          .error(function (data, header, config, status) {
              console.log(data);
          });


          GET方法:

$http.get("/AngularJs/user/get.htm",                   //后台URL地址
            {params: {param: $scope.param}})                      //请求参数
            .success(function (data, header, config, status) {
                console.log(data);                                //结果处理
            })
            .error(function (response) {
                console.log(response);
            });

   好了,有关更多的AngularJs的信息可以到网上进行查阅

    

2 运行效果

  启动项目,访问地址: http://localhost:8080/AngularJs/jsp/shopCar.jsp

  效果图:

  blob.png


 2.1  点击清空购物车,则商品会被全部清空

 2.2  点击添加商品按钮,弹出商品编辑对话框,编辑产品编辑,产品名称,购买数量,产品单价

      blob.png

 2.3 点击提交商品按钮,将前台商品信息传到后台进行保存

 2.4 点击购买数量上的+-按钮时,商品数量会相应的+1,-1, 对应的产品总价进行变化,总购买价也会进行变化 


3. 代码介绍:

   代码框架如图:

   blob.png

 3.1 数据库表:

     创建数据表:t_goods

CREATE TABLE `t_goods` (
  `GoodsId` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品主键',
  `GoodsNo` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品编号',
  `GoodsName` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品名字',
  `GoodsNum` int(10) DEFAULT NULL COMMENT '购买数量',
  `GoodsPrice` decimal(10,2) DEFAULT NULL COMMENT '商品单价',
  PRIMARY KEY (`GoodsId`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

 3.2 修改jdbc.properties连接数据库的用户名与密码

     

url=jdbc\:mysql\://127.0.0.1\:3306/t_angular?characterEncoding=utf-8&allowMultiQueries=true
#url=jdbc:mysql://www.ad186.com:3306/hctl?characterEncoding=utf-8
username=root
password=ajqnhwvia

 3.2 前台代码

    3.2.1 前台代码使用了bootstrap进行效果上的渲染, bootstrap下载:  http://v3.bootcss.com/

    3.2.2 商品列表页面代码: 

       

<body ng-app='shopCarApp' ng-controller="carShopController">
    <div class="container">
        <table class="table" ng-show="carShop.length">
            <thead>
                <tr>
                    <th>产品编号</th>
                    <th>产品名字</th>
                    <th>购买数量</th>
                    <th>产品单价</th>
                    <th>产品总价</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <tr ng-repeat="item in carShop">
                    <td>{{item.goodsNo}}</td>
                    <td>{{item.goodsName}}</td>
                    <td>
                    <form class="form-inline">
                    <div class="form-group">
                        <button type="button" ng-click="reduce(item.goodsNo)" class="btn btn-primary">-</button>
                        <input type="text" class="form-control" id="exampleInputName2" value="{{item.goodsNum}}" ng-model="item.goodsNum" >
                        <button type="button" ng-click="add(item.goodsNo)" class="btn btn-primary">+</button>
                        </div>
                        </form>
                    </td>
                    <td>{{item.goodsPrice}}</td>
                    <td>{{item.goodsPrice * item.goodsNum}}</td>
                    <td>
                        <button type="button" ng-click="remove(item.goodsNo)" class="btn btn-danger">移除</button>
                    </td>
                </tr>
                <tr>
                    <td>
                        
                    </td>
                    <td>
                        
                    </td>
                    <td>
                        
                    </td>
                    <td>
                        
                    </td>
                    <td colspan="2">
                        
                    </td>
                </tr>
            </tbody>
        </table>
        <b>总购买价:</b>{{totalPrice()}} &nbsp;&nbsp;&nbsp;<b>总购买数量:</b>{{totalQuantity()}}<br>
        <p ng-show="!carShop.length">您的购物车为空</p>
        <button type="button" ng-click="clearShop()" class="btn btn-danger">清空购物车</button>
        <button type="button" ng-click="addCarShop()" class="btn btn-danger">添加商品</button>
<button type="button" ng-click="saveGoods()" class="btn btn-danger">提交商品</button>
        
    </div>


    3.3 商品编辑框代码:

      

<!-- 添加商品 -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
            <h4 class="modal-title" id="myModalLabel" style="float: left;">新增商品</h4>
                <button type="button" class="close closeModel"  aria-label="Close" onClick="closeMod()"><span
                        aria-hidden="true">&times;</span><tton>
                
            </div>
            
            
            
            <form id="goodsInfoForm" class="form-horizontal" role="form" style="margin-left: 30px; margin:30px;">
     <div class="form-group">
        <label for="goodsNo" class="col-sm-3 control-label"><span class="star_tip">*</span>产品编号:</label>
        <div class="col-sm-8">
           <input ng-model="goods.goodsNo" type="text" class="form-control" id="goodsNo" name="goodsNo"
            value='1111' placeholder="产品编号"/>
        </div>
      </div>
     <div class="form-group">
        <label for="goodsName" class="col-sm-3 control-label"><span class="star_tip">*</span>产品名称:</label>
        <div class="col-sm-8">
           <input ng-model="goods.goodsName" type="text" class="form-control" id="goodsName"  name="goodsName"
            value='iphone8' placeholder="产品名称">
        </div>
      </div>
      
      <div class="form-group">
        <label for="goodsNum" class="col-sm-3 control-label"><span class="star_tip">*</span>购买数量:</label>
        <div class="col-sm-8">
           <input ng-model="goods.goodsNum" type="text" class="form-control" id="goodsNum"  name="goodsNum" 
                                                               value='12' placeholder="购买数量">
        </div>
      </div>
      
      <div class="form-group">
        <label for="goodsPrice" class="col-sm-3 control-label"><span class="star_tip">*</span>产品单价:</label>
        <div class="col-sm-8">
           <input ng-model="goods.goodsPrice" type="text" class="form-control" id="goodsPrice" name="goodsPrice"  
                                                          value='12' placeholder="产品单价">
        </div>
      </div>
      
      <div class="modal-footer" style="text-align:center;">
        <button type="button" class="btn btn-primary" id="save" ng-click="addGoods()">保存<tton>
        <button type="button" class="btn btn-default closeModel" onClick="closeMod()">关闭<tton>
                      </div>
</form>
        </div>
    </div>
</div>

 3.4 js逻辑代码处理

     包括:AngularJs模块初始化,商品信息的加载,商品信息的增加,删除,提交

var appShopCar = angular.module("shopCarApp", [], function($provide){
// 从服务器上获取初始化数据
    $provide.service('carShop',function($http){
    var carShop = [];
        return carShop;
    })
});
appShopCar.controller("carShopController", function ($scope, $http) {
console.log('加载 carShopController');
$http.get("/AngularJs/goods/getGoods.htm")
    .success(function (data, header, config, status) {
        console.log(data);
        $scope.carShop = data.data;
    })
    .error(function (response) {
        console.log(response);
    });
      /**
       * 计算购物总价
       */
      $scope.totalPrice = function () {
          var total = 0;
          angular.forEach($scope.carShop, function (item) {
              total += item.goodsNum * item.goodsPrice;
          })
          return total;
      }
      /**
       * 计算总购买数
       */
      $scope.totalQuantity = function () {
          var total = 0;
          angular.forEach($scope.carShop, function (item) {
              total += parseInt(item.goodsNum);
          })
          return total;
      }
      /**
       * 找一个元素的索引
       */
      var findIndex = function (goodsNo) {
          var index = -1;
          angular.forEach($scope.carShop, function (item, key) {
              if (item.goodsNo === goodsNo) {
                  index = key;
                  return;
              }
          });
          return index;
      }
      /**
       * 为某个产品添加一个数量
       */
      $scope.add = function (goodsNo) {
          var index = findIndex(goodsNo);
          if (index !== -1) {
              ++$scope.carShop[index].goodsNum;
          }
      }
      /**
       * 为某个产品减少一个数量
       */
      $scope.reduce = function (goodsNo) {
          var index = findIndex(goodsNo);
          if (index !== -1) {
              var item = $scope.carShop[index];
              if(item.goodsNum > 1){
                  --item.goodsNum;
              }else{
                  var returnKey = confirm('是否从购物车内删除该产品!');
                  if(returnKey){
                      $scope.remove(goodsNo);
                  }
              }
          }
      }
      /**
       * 移除一项
       */
      $scope.remove = function (goodsNo) {
          var index = findIndex(goodsNo);
          // 如果找到了那个item
          if (index !== -1) {
              $scope.carShop.splice(index, 1);
          }
          // 自动做脏检查
      }
      
      /**
       * 清空购物车
       */
      $scope.clearShop = function(){
      $scope.carShop.length = 0;
      }
      
      /**
       * 添加商品
       */
      $scope.addCarShop = function(){
      addCarShop();
      }
      
      /**
       * 保存商品
       */
      $scope.addGoods = function() {
    //$('#goodsInfoForm').bootstrapValidator('validate');
    var bSuccess = $('#goodsInfoForm').data("bootstrapValidator").isValid();
    if(bSuccess){
    console.log($scope.goods);
          console.log(JSON.stringify($scope.goods)); 
          /*$scope.goods.goodsNum = 4;
          $scope.goods.goodsPrice = 23000;*/
          var goods = {};
          goods.goodsNo = $scope.goods.goodsNo;
          goods.goodsName = $scope.goods.goodsName;
          goods.goodsNum = $scope.goods.goodsNum;
          goods.goodsPrice = $scope.goods.goodsPrice;
          $scope.carShop.push(goods);
          closeMod();
    }
      
      }
      
      /**
       * 提交商品
       */
      $scope.saveGoods = function(){
      if($scope.carShop.length == 0){
      alert('没有商品提交');
      return;
      }
      
      var postCfg = {
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        transformRequest: function (data) {
            return $.param(data);
        }
    };
      $http.post("/AngularJs/goods/saveGoods.htm", 
      {
      goodsList : JSON.stringify($scope.carShop),
      },
      postCfg)
          .success(function (data, header, config, status) {
              if(data.stateCode == 0){
              alert(data.desc);
              }
          })
          .error(function (data, header, config, status) {
              console.log(data);
          });
      }
});
$(function () {
//校验form表单
//校验bootstrap form表单
    $('#goodsInfoForm')
    .bootstrapValidator({
        message: 'This value is not valid',
        feedbackIcons: {
            valid: 'glyphicon glyphicon-ok',
            invalid: 'glyphicon glyphicon-remove',
            validating: 'glyphicon glyphicon-refresh'
        },
        fields: {
            'goodsNo': {
                validators: {
                    notEmpty: {
                        message: '产品编号不能为空'
                    },
                    stringLength: {
                        min: 4,
                        message: '产品编号最少4位'
                    },
                    numeric: {
                    message: '税额只能输入数字'
                    } 
                }
            },
            'goodsName': {
                validators: {
                notEmpty: {
                         message: '产品名称不能为空'
                     }
                }
            },
            'goodsNum': {
                validators: {
                notEmpty: {
                         message: '购买数量不能为空'
                     },
                     numeric: {
                     message: '税额只能输入数字'
                     } 
                }
            },
            'goodsPrice': {
                validators: {
                notEmpty: {
                         message: '产品单价不能为空'
                     },
                     numeric: {
                     message: '税额只能输入数字'
                     } 
                }
            }
        }
    }).on('success.form.bv', function(e) {
    alert('aaaaa');
    });
});
/**
 * 清除控件元素中的内容
 */
function formClear() {
}
//添加数据
function addCarShop() {   
formClear();
//这个modal函数是bootstrap.js中的函数
$("#myModal").modal("show");  
}
/*
*关闭窗口
*/
function closeMod(){
//重置form表单
$('#goodsInfoForm').data('bootstrapValidator').resetForm(true);
$("#myModal").modal("hide");
}

3.5 后台处理,  前台与后台通讯的数据格式为json

    保存商品信息

@RequestMapping("/saveGoods.htm")
	@ResponseBody
    public Result saveGoods(ModelMap map, HttpServletRequest request) 
    {
		String strGoodsList = request.getParameter("goodsList");
		List<Goods> lstGoods = JSON.parseArray(strGoodsList, Goods.class);
		Result result = new Result();
		result.setStateCode("0");
		result.setDesc("提交商品成功");
		int nCount = goodsService.insertBatchGoods(lstGoods);
    	return result;
    }

    查询商品信息

@RequestMapping("/getGoods.htm")
	@ResponseBody
    public Result getGoods(ModelMap map, HttpServletRequest request) 
    {
		Goods goods = new Goods();
		List<Goods> lstGoods = goodsService.selectGoods(goods);
		Result result = new Result();
		result.setStateCode("0");
		result.setDesc("查询成功");
		result.setData(lstGoods);
    	return result;
    }




Home