基于springMVC+angular+bootstrap+mysql的简易购物网站搭建

  介绍

  前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(angular大法好), 项目一共包含了7个静态界面, 静态界面的数据展示都使用了angularJS , 后端是基于java的spring, 容器为tomcat, 项目代码分享到 https://pan.baidu.com/s/1qYGqI2w, 这个项目的优势是, 所有的显示都是在前端完成, 数据交互也是通过ajax完成, 没有频繁的页面跳转;先上两张商城的主图

  图一:

    、  

  图2:

  

  该页面可以完成商品的评价, 添加商品, 商品的搜索等功能 , 界面JSP代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
  <head>
    <title>detail.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <link rel="stylesheet" type="text/css" href="./css/bootstrap-3.2.0/dist/css/bootstrap.min.css"/>
    <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="http://cdn.bootcss.com/angular.js/1.3.15/angular.min.js"></script>
    <style>
        .commodity{
            margin:10px;
        }
        .content{
            margin:80px;
        }
        .commentBody{
            max-heiht:200px;
        }
    </style>
  </head>
  <body ng-app="app">
  
      <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
          <div class="row">
            <ul class="nav navbar-nav">
                <li>
                    <c:if test="${name!=null}">
                        <a href="###">
                            欢迎${name}
                        </a>
                    </c:if>
                </li>
               <li>
                       <a href="./index.do">首页</a>
                   </li>
               <li>
                       <a href="./detail.do">分类页</a>
               </li>
               <li>
                      <a href="./cart.do">
                          购物车
                      </a>
               </li>
               <li>
                      <a href="./list.do">
                      列表页
                      </a>
               </li>
               <li><a href="./user.do">用户</a></li>
             </ul>
          </div>
      </div>
    </nav>
    
      <div class="container content">
          <div class="row">
              <p>
                  <span class="glyphicon glyphicon-cd" aria-hidden="true"></span>
                  <input class="form-control" id="keyword" placeholder="输入搜索关键词"><br>
                  <button id="search" class="btn btn-primary">搜索</button>
              </p>
          </div>
          <div id="groups" class="row" ng-controller="groups">
              <div  ng-repeat="coms in groups">
                <h3>
                    <span class="glyphicon glyphicon-fire" aria-hidden="true"></span>
                    <span class="label label-default">
                        {{coms[0].type}}
                    </span>
                </h3>
                  <div class="panel panel-default pull-left commodity" ng-repeat="com in coms">
                    <div class="panel-heading panel-primary">
                        <p>{{com.name}}</p>
                    </div>
                    <div class="panel-body">
                        <p>产品介绍š{{com.depict}}</p>
                        <p>厂商š{{com.manufacturer}}</p>
                        <p>金额š{{com.price}}</p>
                        <p>产品图片š<img ng-src={{com.img}} width=50 height=50 /></p>
                        <button class="btn btn-default" ng-click="addToCart(com.id)">
                            添加到购物测 
                        </button>
                        <button class="btn btn-default" ng-click="showDetail(com)">
                            查看详细†
                        </button>
                    </div>
                </div>
                <div class="clearfix "></div>
            </div>
          </div>
          <div class="row">
              <a href="./cart.do" class="btn btn-default" role="button">去结账</a>
          </div>
      </div>
          
    <!-- Modal --start  -->
    <div class="modal fade" id="detail" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" ng-controller="detail">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="myModalLabel">
                产品信息
            </h4>
          </div>
          <div class="modal-body">
                  <p>产品名字{{com.name}}</p>
                <p>产品描述š{{com.depict}}</p>
                <p>产品公司{{com.manufacturer}}</p>
                <p>æ产品金额š{{com.price}}</p>
                <p>产品缩略图š<img ng-src={{com.img}} width=50 height=50 /></p>
                <div class="commentBody">
                    <div ng-repeat="c in comments">
                        <span class="glyphicon glyphicon-user" aria-hidden="true"></span>
                        {{c.userName}}
                        <div class="alert" role="alert">
                            {{c.comment}}
                        </div>
                    </div>
                    <form>
                        <label for="text"></label>
                        <input type="text" name="text" id="text" placehoder="评论内容" ng-model="comment"/>
                        <button id="submit" class="btn btn-success" ng-click="appendComment(com.id)">评论</button>
                    </form>
                </div>
          </div>
        </div>
      </div>
    </div>
    <!-- Modal ---end  -->

  </body>
  
  <script>
    var userId = "${id}";
      var app = angular.module("app", []);
      app.controller("groups", function( $scope ) {
      
          $scope.groups = {};
          
        $scope.addToCart = function( comId ) {
            ajaxModule.addOrder(userId, comId);
        };
        
        $scope.showDetail = function( com ) {

            $("#detail").modal('show');
            $("#detail").scope().com = com;
            ajaxModule.getCommentById(com.id, function(res) {
                $("#detail").scope().comments = res;
                $("#detail").scope().$apply();
            });
            
        };
        
        
      });
      
      app.controller("detail",function($scope) {
          $scope.comments = [];
          
          //添加评论
        $scope.appendComment = function( commodityID ) {
            if($scope.comment) {
                ajaxModule.addComment( commodityID, $scope.comment , function() {
                    $scope.comments.push({
                        userName : "${name}",
                        commment : $scope.comment
                    });
                    $scope.$apply();
                });
            };
        };
      });
            
      function updateIndex() {
          ajaxModule.getAllCom(function( res ) {
              var result = util.groupByType(res);
              $("#groups").scope().groups = result;
              $("#groups").scope().$apply();
              
          });
      };
      
      function bind() {
          $("#search").click(function() {
              ajaxModule.search($("#keyword").val(), function(res) {
                  var result = util.groupByType(res);
                  $("#groups").scope().groups = result;
                  $("#groups").scope().$apply();
              });
          });
      };
      
      /**
      *@desc
      */
      var util = {
          /**
          *@desc 
          *@return Object;
          */
          groupByType : function( res ) {
              var obj = {};
              for(var i=0; i<res.length; i++ ) {
                  obj[res[i].type] = obj[res[i].type] || [];
                  obj[res[i].type].push( res[i] );
              };
              return obj;
          }
      };
      
      /**
      *@desc ajax
      */
      var ajaxModule = {
      
          getAllCom : function(cb) {
              $.post("admin/getAllCom.do", cb);
         },
        addOrder : function(userId, commodityIds ,cb) {
            $.post("addOrder.do",{userId:userId, commodityIds:commodityIds, commodityCounts:"1"}, function(res) {
                console.log("addOrder.do response is "+ res);
                if(res) {
                    alert("添加成功");
                }else{
                    alert("添加失败");
                };
            });
        },
        search : function(keyword, cb) {
            $.post("search.do", {keyword:keyword}, cb);
        },
        getCommentById : function(id, cb) {
            $.post("admin/getCommentById.do",{commodityId:id}, cb);
        },
        addComment : function(commodityID, comment ,cb) {
            $.post("./addComment.do", {userId : '${id}', userName : '${name}',commodityID : commodityID, comment: comment}, function( res ) {
                if(res) {
                    cb&&cb();
                }else{
                    alert("评论添加失败");
                }
            });
        }
      };
      
      $(function() {
          updateIndex();
          bind();
      });
  </script>
</html>
View Code

   主页2:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
  <head>
    <title>index</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   
    <link rel="stylesheet" type="text/css" href="./css/bootstrap-3.2.0/dist/css/bootstrap.min.css"/>
    <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="http://cdn.bootcss.com/angular.js/1.3.15/angular.min.js"></script>
  </head>
  <style>
      .com{
          margin:20px;
          height:240px;
          overflow:hidden;
      }
      .padding20{
          padding:20px;
      }
      #index{
          margin-top:100px;
      }
  </style>
  <body ng-app="app">
      <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
          <div class="row">
            <ul class="nav navbar-nav">
                <li>
                    <c:if test="${name!=null}">
                        <a href="###">
                            欢迎${name}
                        </a>
                    </c:if>
                </li>
               <li>
                       <a href="./index.do">首页</a>
                   </li>
               <li>
                       <a href="./detail.do">类型页</a>
               </li>
               <li>
                      <a href="./cart.do">
                          购物车
                      </a>
               </li>
               <li>
                      <a href="./list.do">
                          订单页
                      </a>
               </li>
               <li><a href="./user.do">用户信息</a></li>
             </ul>
          </div>
      </div>
    </nav>
    
      <div class="container">
          <div id="index" class="row" ng-controller="index">
            <div class="panel panel-default">
              <div class="panel-body">
                <div class="thumbnail pull-left com" ng-repeat="com in coms">
                  <img ng-src="{{com.img}}"  width="40" height="40">
                  <div class="caption">
                    <h3>{{com.name}}</h3>
                    <p>{{com.depict}}</p>
                    <p>
                        <a href="#" class="btn btn-primary" role="button" ng-click="addToCart(com.id)">添加商品</a>
                    </p>
                    <p>
                        <button class="btn btn-default" ng-click="showDetail(com)">
                               查看详细†
                           </button>
                       </p>
                  </div>
                </div>
              </div>
            </div>
          </div>
              <div class="row">
                  <a href="./cart.do" class="btn btn-default" role="button">去购物车</a>
              </div>
          </div>
      </div>
      
    <!-- Modal --start  -->
    <div class="modal fade" id="detail" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" ng-controller="detail">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="myModalLabel">
                产品信息
            </h4>
          </div>
          <div class="modal-body">
                  <p>产品名字{{com.name}}</p>
                <p>产品描述š{{com.depict}}</p>
                <p>产品公司{{com.manufacturer}}</p>
                <p>æ产品金额š{{com.price}}</p>
                <p>产品缩略图š<img ng-src={{com.img}} width=50 height=50 /></p>
                <div class="commentBody">
                    <div ng-repeat="c in comments">
                        <span class="glyphicon glyphicon-user" aria-hidden="true"></span>
                        {{c.userName}}
                        <div class="alert" role="alert">
                            {{c.comment}}
                        </div>
                    </div>
                    <form>
                        <label for="text"></label>
                        <input type="text" name="text" id="text" placehoder="评论内容" ng-model="comment"/>
                        <button id="submit" class="btn btn-success" ng-click="appendComment(com.id)">评论</button>
                    </form>
                </div>
          </div>
        </div>
      </div>
    </div>
    <!-- Modal ---end  -->
    
      <script>
          var userId = "${id}";
          var app = angular.module("app", []);
          
          app.controller("index", function( $scope ) {
              $scope.coms = [];
              $scope.addToCart = function( comId ) {
                  ajaxModule.addOrder(userId, comId);
              };
            $scope.showDetail = function( com ) {
    
                $("#detail").modal('show');
                $("#detail").scope().com = com;
                ajaxModule.getCommentById(com.id, function(res) {
                    $("#detail").scope().comments = res;
                    $("#detail").scope().$apply();
                });
                
            };
          });
          
          app.controller("detail",function($scope) {
              $scope.comments = [];
              
              //添加评论
            $scope.appendComment = function( commodityID ) {
                if($scope.comment) {
                    ajaxModule.addComment( commodityID, $scope.comment , function() {
                        $scope.comments.push({
                            userName : "${name}",
                            commment : $scope.comment
                        });
                        $scope.$apply();
                    });
                };
            };
          });
          
          var ajaxModule = {
              getAllCom : function( cb ) {
                  $.post("admin/getAllCom.do",cb);
              },
              addOrder : function(userId, commodityIds ,cb) {
                  $.post("addOrder.do",{userId:userId, commodityIds:commodityIds, commodityCounts:"1"}, function(res) {
                      console.log("addOrder.do response is "+ res);
                    if(res) {
                        alert("添加成功");
                    }else{
                        alert("添加失败");
                    };
                  });
              },
            getCommentById : function(id, cb) {
                $.post("admin/getCommentById.do",{commodityId:id}, cb);
            },
            addComment : function(commodityID, comment ,cb) {
                $.post("./addComment.do", {userId : '${id}', userName : '${name}',commodityID : commodityID, comment: comment}, function( res ) {
                    if(res) {
                        cb&&cb();
                    }else{
                        alert("评论添加失败");
                    }
                });
            }
          };
          
          function index() {
              ajaxModule.getAllCom(function( res ) {
                  $("#index").scope().coms = res;
                  $("#index").scope().$apply();
              });
          };
          
          $(function() {
              index();
          });
          
      </script>
  </body>
</html>
View Code

 

 

 

  后台管理界面, 这个界面只允许用户role值为1用户查看, 用户角色是数据库的用户表关联的,  也就是说是管理员的时候, 才能进入后台页编辑商品,编辑评论等高级功能:

    

  界面代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <title>admin.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <link rel="stylesheet" type="text/css" href="../css/bootstrap-3.2.0/dist/css/bootstrap.min.css"/>
    <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="http://cdn.bootcss.com/angular.js/1.3.15/angular.min.js"></script>
    <style>
        .bs-example {
            position: relative;
            padding: 45px 15px 15px;
            margin: 0 -15px 15px;
            border-color: #E5E5E5 #EEE #EEE;
            border-style: solid;
            border-width: 1px 0;
            -webkit-box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.05);
            box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.05);
        }
    </style>
</head>

<body>
    <div class="container" ng-app="app">
        <div class="row">
            <h2>
                  <a href="../index.do">首页</a>
            </h2>
        </div>
        <div class="row">
            <div class="bs-example bs-example-tabs" data-example-id="togglable-tabs">
                <ul id="myTabs" class="nav nav-tabs" role="tablist">
                    <li role="presentation" class="active">
                        <a id="tab0" href="#orderform" id="home-tab" role="tab" data-toggle="tab" aria-controls="orderform" aria-expanded="true">所有订单</a>
                    </li>
                    <li role="presentation">
                        <a id="tab1" href="#types" id="types-tab" role="tab" data-toggle="tab" aria-controls="types" aria-expanded="true">商品类型编辑†</a>
                    </li>
                    <li role="presentation">
                        <a id="tab2" href="#pro" role="tab" id="pro-tab" data-toggle="tab" aria-controls="pro">商品编辑†</a>
                    </li>
                    <li role="presentation">
                        <a id="tab3" href="#about" role="tab" id="about-tab" data-toggle="tab" aria-controls="about">所有评论</a>
                    </li>
                </ul>

                <div id="myTabContent" class="tab-content">
                    <div role="tabpanel" class="tab-pane fade in active orderform" id="orderform" aria-labelledby="home-tab"   ng-controller="orderform">
                        <table class="table table-hover table-bordered">
                          <thead>
                            <tr>
                              <th>订单id</th>
                              <th>地址</th>
                              <th>总金额</th>
                              <th>手机</th>
                              <th>详细信息</th>
                            </tr>
                          </thead>
                          <tbody>
                            <tr ng-repeat="item in orderforms">
                              <th scope="row">{{item.id}}</th>
                              <td>{{item.address}}</td>
                              <td>{{item.totalPrice}}</td>
                              <td>{{item.phone}}</td>
                              <th>
                                  <a ng-click="showInfo(item.orderlist)" href="###">
                                    查看订单详细信息
                                  </a>
                              </th>
                            </tr>
                            <tr>
                          </tbody>
                        </table>
                        <div class="row">
                            <ul class="list-group">
                                <li  class="list-group-item" ng-repeat="com in commoditys">
                                    <p>第{{$index+1}}条: 商品id为{{com.commodityId}}, 的总数是为{{com.commodityCount}}</p>
                                    <div commodity-directive id="{{com.commodityId}}">
                                        <p>商品名字š{{res.name}}</p>
                                        <p>商品描述š{{res.depict}}</p>
                                        <p>商品厂商{{res.manufacturer}}</p>
                                        <p>商品价格š{{res.price}}</p>
                                        <p>商品logoš<img ng-src={{res.img}}  width=50 height=50/></p>
                                    </div>
                                </li>
                            </ul>
                        </div>
                    </div>
                    <div role="tabpanel" class="tab-pane fade types" id="types" aria-labelledby="type-tab" ng-controller="types">
                        <div class="row">
                            <ul class="list-group">
                                <li  class="list-group-item">类型</li>
                                <li  class="list-group-item" ng-repeat="type in types">
                                    <div >
                                        <p>
                                            {{type.name}}
                                             <button class="btn btn-default pull-right" ng-click="delType( type.id )">删除该类型</button>
                                        </p>
                                    </div>
                                </li>
                            </ul>
                        </div>
                        <div class="row">
                            <input placeholder="新类型名字" id="new_type" ng-model="new_type">
                            <button class="btn btn-default" ng-click="new_type_fn()">创建新类型ž‹</button>
                        </div>
                    </div>
                    <div id="pro" role="tabpanel" class="tab-pane fade" id="pro" aria-labelledby="pro-tab" ng-controller="pros">
                           <br>
                        <p>
                            <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
                                  创建新商品“
                            </button>
                        </p>
                        <ul class="list-group">
                            <li class="list-group-item" ng-repeat="com in coms">
                                <p>商品名{{com.name}}</p>
                                <p>商品描述š{{com.depict}}</p>
                                <p>商品公司{{com.manufacturer}}</p>
                                <p>商品价格š{{com.price}}</p>
                                <p>商品logoš<img ng-src={{com.img}} width=50 height=50 /></p>
                                <p>
                                    <button class="btn btn-default" ng-click="removePro(com.id)">
                                        删除该商品“
                                    </button>
                                </p>
                            </li>
                        </ul>
                    </div>
                    <div  role="tabpanel" class="comments tab-pane fade" id="about" aria-labelledby="about-tab" ng-controller="comments">
                        <ul class="list-group">
                            <li class="list-group-item" ng-repeat="comment in comments">
                                <p>评论列表:</p>
                                <div commodity-directive id="{{comment.commodityId}}">
                                    <p>商品名字{{res.name}}</p>
                                    <p>商品描述š{{res.depict}}</p>
                                </div>
                                <div>
                                    <strong>{{comment.userName}} <b>说</b></strong>
                                    <span>{{comment.comment}}</span>
                                </div>
                            </li>
                        </ul>
                </div>
            </div>
        </div>
    </div>
    
    
    <!-- Modal start -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="myModalLabel">创建商品</h4>
          </div>
          <div class="modal-body">
            <form>
              <div class="form-group">
                <label for="name">name</label>
                <input type=text class="form-control" id="name" placeholder="商品名">
              </div>
              <div class="form-group">
                <label for="depict">depict</label>
                <input type=text class="form-control" id="depict" placeholder="商品描述">
              </div>
              <div class="form-group">
                <label for="price">price</label>
                <input type=text class="form-control" id="price" placeholder="商品价格">
              </div>
              <div class="form-group">
                <label for="amount">amount</label>
                <input type="text" class="form-control" id="amount" placeholder="商品个数">
              </div>
              <div class="form-group">
                <label for="manufacturer">manufacturer</label>
                <input type="text" class="form-control" id="manufacturer"" placeholder="商品厂商">
              </div>
              <div class="form-group">
                <label for="img">img</label>
                <input type="text" class="form-control" id="img" readonly=true placeholder="图片路径">
                <input type="file" value=上传文件 id="upload">
              </div>
              <select id="select" ng-controller="select">
                  <option ng-repeat="type in types" value="{{type.name}}">
                      {{type.name}}
                  </option>
              </select>
            </form>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button id="submit"  type="button" class="btn btn-primary">Save changes</button>
          </div>
        </div>
      </div>
    </div>
    <!-- Modal end-->
    
    <script>
        var app = angular.module("app", []);
        app.directive("commodityDirective", function() {
            return {
                restrict : "EA",
                scope : true,
                link : function( $scope ,$el, $iattrs) {
                    $.post("../getComById.do", {id:$iattrs.id},function( res ) {
                        $scope.res = res[0];
                        $scope.$apply();
                    });
                }
            }
        });
        

        app.controller("orderform", function($scope) {
        
            $scope.orderforms = [];
            $scope.commoditys = [];
            $scope.showInfo = function( info ) {
                $scope.commoditys = JSON.parse(info);
            };
            
        });

        $("#tab0").click(function() {
            ajaxModule.getFormAllList(".orderform");
        });
        
        app.controller("types",function($scope) {
            $scope.types = [];
            $scope.new_type = "";
            $scope.delType = function(id) {
                ajaxModule.delType(id, function(res) {
                    if(res === true) {
                        $("#tab1").click();
                    }else{
                        alert("删除失败ŠŸ");
                    };
                });
            };
            $scope.new_type_fn = function() {
                ajaxModule.addType($scope.new_type, function(res) {
                    if(res === true) {
                        $("#tab1").click();
                    }else{
                        alert("创建失败");
                    };
                });
            };
        });
        $("#tab1").click(function() {
            ajaxModule.getTypes(".types");
        });
        
        

        app.controller("pros", function($scope) {
            $scope.coms = [];
            $scope.removePro = function(id) {
                ajaxModule.delPro(id, function(res) {
                    if(res) {
                        $("#tab2").click();
                    }else{
                        alert("删除成功");
                    };
                });
            };
        });
        app.controller("select", function($scope) {
            $scope.types = [];
        })
        
        $("#tab2").click(function() {
            ajaxModule.getAllCom("#pro");
            ajaxModule.getTypes("#select");
        });
        
        $("#submit").click(function() {
            ajaxModule.addPro({
                name:$("#name").val(),
                depict:$("#depict").val(),
                price:$("#price").val(),
                amount:$("#amount").val(),
                manufacturer:$("#manufacturer").val(),
                img:$("#img").val(),
                type:$("#select").val()
            },function(res) {
                if(res) {
                    $('#myModal').modal('hide');
                    $("#tab2").click();
                }else{
                    alert("添加成功");
                    $('#myModal').modal('hide')
                };    
            });
        });
        
        app.controller("comments", function($scope) {
            $scope.comments = [];
        });
        $("#tab3").click(function() {
            ajaxModule.getComments(function( res ) {
                $(".comments").scope().comments = res;
                $(".comments").scope().$apply();
            })
        });
        
        $("#upload").change(function(ev) {
            formData = new FormData();
            formData.append("name", ev.target.files[0]);
            var oReq = new XMLHttpRequest();
            oReq.open("POST", "../upload.do");
            oReq.onreadystatechange = function() {
                if( oReq.readyState === 4 ) {
                    $("#img").val(  oReq.responseText  );
                };
            };
            oReq.send(formData);
            
        });
        
        $(function() {
            $("#tab0").click();
        });
        
        var ajaxModule = function() {
            return {
                getFormAllList : function( el ) {
                    $.post("../getFormAllList.do", function(res) {
                        $(el).scope().orderforms = res;
                        $(el).scope().$apply();
                    })
                },
                getTypes : function(el) {
                    $.post("getTypes.do", function(res) {
                        $(el).scope().types = res;
                        $(el).scope().$apply();
                    })
                },
                addType : function( type ,callback) {
                    $.post("addType.do", {type:type}, function(res) {
                        callback(res);
                    });
                },
                delType : function( id ,callback) {
                    $.post("delType.do", {id:id}, function(res) {
                        callback(res);
                    });
                },
                getAllCom : function(el) {
                    $.post("./getAllCom.do", function( res ) {
                        $(el).scope().coms = res;
                        $(el).scope().$apply();
                    });
                },
                delPro : function(id ,callback) {
                           $.post("./delPro.do",{id:id} , function( res ) {
                        callback(res);
                    });
                    
                },
                addPro : function(json, callback) {
                    $.post("./addPro.do",json, function(res) {
                        callback(res);
                    });
                },
                getComments : function( callback ) {
                    $.post("./getComments.do", function(res) {
                        callback(res);
                    });
                },
                getCommentById : function( id, callback ) {
                    $.post("./getCommentById.do",{commodityId:id}, callback);
                }
            };
        }();
    </script>
</body>
</html>
View Code

 

  用户信息管理界面, 默认查看当前用户信息, 如果点击编辑按钮, 会切显示一个编辑的DIV, 可以直接更改用户的新信息然后提交,  如果是管理员的话, 会有一个后台管理的入口按钮:

  查看:

         

  编辑:

      

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
  <head>
    <title>user.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <link rel="stylesheet" type="text/css" href="./css/bootstrap-3.2.0/dist/css/bootstrap.min.css"/>
    <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="http://cdn.bootcss.com/angular.js/1.3.15/angular.min.js"></script>
  </head>
  <body ng-app="app">
          <div class="container">
          
              <div class="row">
                <ul class="nav navbar-nav">
                    <li>
                        <c:if test="${name!=null}">
                            <a href="###">
                                欢迎${name}
                            </a>
                        </c:if>
                    </li>
                   <li>
                           <a href="./index.do">首页</a>
                       </li>
                   <li>
                           <a href="./detail.do">类型页</a>
                   </li>
                   <li>
                          <a href="./cart.do">
                              购物车
                          </a>
                   </li>
                   <li>
                          <a href="./list.do">
                              订单页
                          </a>
                   </li>
                 </ul>
              </div>
              <div class="row">
                  <c:if test="${name==null}" >
                      <a href="login.do">登录</a>
                  </c:if>
                  
                  <c:if test='${role==1}' >
                      <a class="btn btn-default" href="admin/admin.do">进入管理界面</a>
                  </c:if>
                  
              </div>
              <br>
              <c:if test="${name!=null}" >
              <div id="user" class="row" ng-controller="user">
                  <button class="btn btn-success" ng-click="edit=!edit">
                    {{edit?"查看用户信息":"更新用户信息"}}
                </button>
                <br>
                <br>
                  <div ng-show="!edit" ng-init="edit=false">
                      <p>用户名:{{user.name}}</p>
                      <p>默认收货地址:{{user.defaultAddress}}</p>
                      <p>默认手机:{{user.defaultAddress}}</p>
                      <p>用户邮箱:{{user.mail}}</p>
                  </div>
                  <div ng-show="edit">
                      <form>
                      <div class="form-group">
                        <label for="name">用户名—</label>
                        <input type="text" class="form-control" id="name" placeholder="name" ng-model="user.name" >
                      </div>
                      <div class="form-group">
                        <label for="password">密码</label>
                        <input type="text" class="form-control" id="password" placeholder="Password"  ng-model="user.password" >
                      </div>
                      <div class="form-group">
                        <label for="defaultAddress">默认收货地址</label>
                        <input type="text" class="form-control" name="defaultAddress" id="defaultAddress"  ng-model="user.defaultAddress" >
                      </div>
                      <div class="form-group">
                        <label for="defaultPhone">默认手机</label>
                        <input type="text" class="form-control" name="defaultPhone" id="defaultPhone" ng-model="user.defaultPhone" >
                      </div>
                      <div class="form-group">
                        <label for="mail">用户邮箱</label>
                        <input type="text" class="form-control" name="mail" id="mail"  ng-model="user.mail" >
                        <div>
                          金额: {{user.money}}RMB
                        </div>
                      </div>
                          <button id="submit" type="submit" class="btn btn-default">Submit</button>
                    </form>
                  </div>
              </div>
              </c:if>
          </div>
        <script>
        
            var userId = "${id}";
            var app = angular.module("app", []);
            
            app.controller("user", function( $scope ) {
            
                //默认数据
                $scope.user = {
                    name : "name",
                    password : "password",
                    defaultAddress : "defaultAddress",
                    defaultPhone : "defaultPhone",
                    mail : "mail"
                };
                
            });
            
            $("#submit").click(function( ev ) {
            
                $.post("updateInfo.do", $.extend({},$("#user").scope().user,{userId:userId}), function( res ) {
                    if( res ) {
                        alert("更新成功!");
                    }else{
                        alert("更新失败");
                    };
                });
                
            });
            
            $(function() {
            
                if( userId ) {
                    $.post("getInfo.do",{userId:userId},function( res ) {
                        var scope = $("#user").scope();
                        scope.user = res;
                        $("#user").scope().$apply()
                    });
                };
                
            });
            
        </script>
  </body>
</html>
View Code

 

 

    当用户点击界面的添加商品, 那么对应用户的购物车数据会发生改变;

  购物车显示的是所有的选购商品, 在购物车里面也能随意的增加或者减少商品的个数, 金额会根据商品的个数,实时更新, 非常方便, 点击提交信息的话,那么这些购物车的商品就转换为用户的订单, 订单包含了收货人的地址和收货人手机号码 (前端的手机验证没有弄):

      

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
  <head>
    <title>cart.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <link rel="stylesheet" type="text/css" href="./css/bootstrap-3.2.0/dist/css/bootstrap.min.css"/>
    <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="http://cdn.bootcss.com/angular.js/1.3.15/angular.min.js"></script>
  </head>
  <style>
      .commodity{
          margin:10px;
      }
      #cart{
          margin-top:100px;
      }
  </style>
  <body ng-app="app">
      
      <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
          <div class="row">
            <ul class="nav navbar-nav">
                <li>
                    <c:if test="${name!=null}">
                        <a href="###">
                            欢迎${name}
                        </a>
                    </c:if>
                </li>
               <li>
                       <a href="./index.do">首页</a>
                   </li>
               <li>
                       <a href="./detail.do">分类页</a>
               </li>
               <li>
                      <a href="./list.do">
                      列表页
                      </a>
               </li>
               <li><a href="./user.do">
                       用户信息
                </a></li>
             </ul>
          </div>
      </div>
    </nav>
      <div class="container">
          <div id="cart" class="row" ng-controller="cart">
              <ul class="list-group">
                  <li class="list-group-item pull-left commodity" ng-repeat="order in list">
                     <p>商品</p>
                    <div commodity-directive id="{{order.commodityId}}">
                        <p>商品名š{{res.name}}</p>
                        <p>商品描述{{res.depict}}</p>
                        <p>商品厂商{{res.manufacturer}}</p>
                        <p>商品价格š{{res.price}}</p>
                        <p>商品logoï<img ng-src={{res.img}}  width=50 height=50/></p>
                        <p>
                            购买商品个数‡
                            <span class="badge">
                                {{order.commodityCount}}
                            </span>

                            <p style="display:none">{{order.price=res.price}}</p>
                        </p>
                        <button class="btn btn-danger" ng-click="comCount(-1, order.commodityId)">少买一个</button>
                        <button class="btn btn-warning"  ng-click="comCount(1, order.commodityId)">再来一个</button>
                    </div>
                  </li>
              </ul>
              <div class="clearfix">
                <p>总金额{{sum}}</p>
              </div>
              <input type="hidden" value="${id}" class="form-control" id="userId">
              <br>
              <label  class="clearfix">
                  输入用户地址š
                  <input type="text" class="form-control" id="address">
              </label>
              <br>
              <label  class="clearfix">
                输入收货人手机
                  <input type="number" class="form-control" id="phone">
              </label>
              <br>
              <button id="submit" class="btn btn-success">
                提交信息
            •</button>
          </div>
      </div>
      
      <script>
          var userId = "${id}";
          
          var app = angular.module("app", []);
          
        app.directive("commodityDirective", function() {
            return {
                restrict : "EA",
                scope : true,
                link : function( $scope ,$el, $iattrs) {
                    $.post("./getComById.do", {id:$iattrs.id},function( res ) {
                        $scope.res = res[0];
                        $scope.$apply();
                    });
                }
            }
        });
        
          app.controller("cart", function( $scope ) {
              var list = [];//[{"id":1,"userId":19,"commodityId":1,"commodityCount":1},{"id":2,"userId":19,"commodityId":2,"commodityCount":5},{"id":3,"userId":19,"commodityId":3,"commodityCount":2},{"id":4,"userId":19,"commodityId":5,"commodityCount":4},{"id":5,"userId":19,"commodityId":4,"commodityCount":3}]
              $scope.list = list;
              $scope.scope= 0;

              $scope.comCount = function( constant, commodityId) {
                  $.each($scope.list, function(i, e) {
                      if( e.commodityId == commodityId ) {
                          $scope.list[i].commodityCount+=constant;
                      };
                      if(e.commodityCount<=0) {
                          e.commodityCount = 0;
                      };
                  });
                  $scope.upDateSum();
              };
              $scope.upDateSum = function() {
                  $scope.sum = util.calcSum( $scope.list );
              };
          });
          var util = {
              calcSum : function( list ) {
                  var sum = 0;
                  $.each(list, function(i, e) {
                      sum += (e.commodityCount*e.price);
                  });
                  return sum;
              }
          };
          if( userId ) {
              $.post("./getOrderList.do", {userId: userId }, function( res ) {
                  $("#cart").scope().list = JSON.parse(res);
                  setInterval(function() {
                      $("#cart").scope().upDateSum();
                      $("#cart").scope().$apply();
                  },1000);
              });
          };
          $("#submit").click(function() {
              $.post("./addForm.do", {
                  userId : $("#userId").val(),
                  address : $("#address").val(),
                  phone : $("#phone").val(),
                  totalPrice : $("#cart").scope().sum,
                  orderList : JSON.stringify($("#cart").scope().list)
              },function(res) {
                if(res === true) {
                    location.href="list.do";
                }else{
                    alert("购买失败");
                };
              });
          });
          //addForm
      </script>
  </body>
</html>
View Code

 

 

  用户的订单页,该节目包含了用户“已支付”“待支付”的订单:

      

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
  <head>
    <title>list.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <link rel="stylesheet" type="text/css" href="./css/bootstrap-3.2.0/dist/css/bootstrap.min.css"/>
    <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="http://cdn.bootcss.com/angular.js/1.3.15/angular.min.js"></script>
    <style>
        .list{
            margin:20px;
        }
        .margin80{
            margin-top:80px;
        }
    </style>
  </head>
  <body ng-app="app">
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
            <ul class="nav navbar-nav">
                <li>
                    <c:if test="${name!=null}">
                        <a href="###">
                            欢迎${name}
                        </a>
                    </c:if>
                </li>
               <li><a href="./index.do">首页</a></li>
               <li><a href="./detail.do">类型页</a></li>
               <li><a href="./cart.do">购物车</a></li>
               <li><a href="./user.do">用户信息</a></li>
             </ul>
      </div>
    </nav>
    <div id="form" class="container margin80" ng-controller="form">
        <div class="row">
            <h1>未支付列表</h1>
            <ul class="list-group">
                <li class="list-group-item" ng-repeat="item in items" ng-if="item.pay==0">
                        <p>
                            <span class="glyphicon glyphicon-hand-right" aria-hidden="true"></span>
                            收货人地址{{item.address}}
                        </p>
                        <p>
                            <span class="glyphicon glyphicon-hand-right" aria-hidden="true"></span>
                            收货人手机š{{item.phone}}
                        </p>
                        <p>
                            <span class="glyphicon glyphicon-hand-right" aria-hidden="true"></span>
                            商品总价格š{{item.totalPrice}}
                        </p>
                        <div parse id={{item.orderlist}}>
                            <div class="list pull-left" ng-repeat="order in  orderlist">
                                <div commodity-directive id="{{order.commodityId}}">
                                    <p>商品名š{{res.name}}</p>
                                    <p>商品描述š{{res.depict}}</p>
                                    <p>商品厂商{{res.manufacturer}}</p>
                                    <p>商品价格š{{res.price}}</p>
                                    <p>商品logoš<img ng-src={{res.img}}  width=50 height=50/></p>
                                    <p>
                                        购买的商品个数‡
                                        <span class="badge">
                                            {{order.commodityCount}}
                                        </span>
                                    </p>
                                </div>
                            </div>
                        </div>
                    
                        <button class="btn btn-default" ng-click="pay(item.id)"> 支付 </button>
                    <div class="clearfix"></div>
                </li>
            </ul>
            <br>
            <h1>已支付列表</h1>
            <ul>
                <li class="list-group-item" ng-repeat="item in items" ng-if="item.pay==1">
                        <p>
                            <span class="glyphicon glyphicon-hand-right" aria-hidden="true"></span>
                            收货人地址{{item.address}}
                        </p>
                        <p>
                            <span class="glyphicon glyphicon-hand-right" aria-hidden="true"></span>
                            收货人手机š{{item.phone}}
                        </p>
                        <p>
                            <span class="glyphicon glyphicon-hand-right" aria-hidden="true"></span>
                            商品总价格š{{item.totalPrice}}
                        </p>
                        <div parse id={{item.orderlist}}>
                            <div class="list pull-left" ng-repeat="order in  orderlist">
                                <div commodity-directive id="{{order.commodityId}}">
                                    <p>商品名š{{res.name}}</p>
                                    <p>商品描述š{{res.depict}}</p>
                                    <p>商品厂商{{res.manufacturer}}</p>
                                    <p>商品价格š{{res.price}}</p>
                                    <p>商品logoš<img ng-src={{res.img}}  width=50 height=50/></p>
                                    <p>
                                        购买的商品个数‡
                                        <span class="badge">
                                            {{order.commodityCount}}
                                        </span>
                                    </p>
                                </div>
                            </div>
                        </div>
                    <div class="clearfix"></div>
                </li>
            </ul>
        </div>
    </div>
    <script>
        var userId = "${id}";
        var app = angular.module("app", []);
        app.directive("commodityDirective", function() {
            return {
                restrict : "EA",
                scope : true,
                link : function( $scope ,$el, $iattrs) {
                    ajaxModule.getComById($iattrs.id, function( res ) {
                        $scope.res = res[0];
                        $scope.$apply();
                    });
                }
            }
        });
        app.directive("parse", function() {
            return {
                restrict : "EA",
                scope : true,
                link : function( $scope ,$el, $iattrs) {
                    $scope.orderlist = JSON.parse($iattrs.id);
                }
            }
        });
        
        
        app.controller("form", function( $scope ) {
            $scope.items = [];
            $scope.pay = function( orderformId ) {
                ajaxModule.pay(userId , orderformId, function( res ) {
                    if(res) {
                        location.reload();
                    }else{
                        alert("支付失败");
                    };
                });
            };
        });
        
        var ajaxModule = {
            getFormList : function( userId,  cb ) {
                $.post("getFormList.do",{userId:userId}, cb);
            },
            pay : function( userId, orderformId, cb) {
                $.post("pay.do", {userId : userId, orderformId : orderformId }, cb);
            },
            getComById : function(id , cb) {
                $.post("./getComById.do", {id:id}, cb);
            }
        };
        
        if(userId) {
            $(function() {
                ajaxModule.getFormList(userId, function( res ) {
                    $("#form").scope().items = res;
                    $("#form").scope().$apply();
                });
            });
        };
    </script>
  </body>
</html>
View Code 

  项目是基于tomcat的服务器, 以及spring框架 (spring大法好),  数据库是mysql;  spring:http://spring.io/projects

  

  数据库的设计

  既然是购物网站,那么必须有个 ==》》 商品表:

CREATE TABLE `commodity` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT '',
  `depict` longtext,
  `price` int(11) DEFAULT '0',
  `amount` int(11) DEFAULT '0',
  `manufacturer` varchar(50) DEFAULT '',
  `img` varchar(100) DEFAULT '',
  `type` varchar(20) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
View Code

 

  因为商品有类型之分,所以也要有 ==》》 类型表:

CREATE TABLE `types` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;
View Code

 

  当有多个商品的时候,就存在了例外一个表==》》 购物车表:

CREATE TABLE `orderlist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL DEFAULT '0',
  `commodityId` int(11) DEFAULT '0',
  `commodityCount` int(11) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
View Code

 

  把购物车的表添加上用户的收货地址和收货手机就变成了==》》订单表:

CREATE TABLE `orderform` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT '0',
  `address` varchar(50) DEFAULT '0',
  `phone` varchar(20) DEFAULT '0',
  `totalPrice` int(11) DEFAULT '0',
  `pay` int(2) DEFAULT '0',
  `orderlist` longtext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
View Code

 

  登录的用户可以为商品添加评论, 所以就有了另外一个关联表, 用户评论表:

CREATE TABLE `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL DEFAULT '0',
  `userName` varchar(20) DEFAULT '0',
  `commodityId` int(11) NOT NULL DEFAULT '0',
  `comment` varchar(400) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
View Code

 

  最后就是贯彻整个系统的用户表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT '0',
  `password` varchar(50) DEFAULT '0',
  `defaultAddress` varchar(50) DEFAULT '0',
  `defaultPhone` varchar(12) DEFAULT '0',
  `mail` varchar(50) DEFAULT '0',
  `money` int(16) DEFAULT '0',
  `regTime` datetime DEFAULT NULL,
  `role` int(11) NOT NULL DEFAULT '0' COMMENT '用户角色',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
View Code

 

 

项目结构

  web应用的基本结构如图:

  

   后台实现就是spring的路由和数据持久, 项目没有对恶意字符进行过滤,所以存在注入问题, 有待加强, 基本的功能都够用了;

      

 

最后

   有个比较坑事情的要说下, 比如写了一小时的博客,保存博客的时候发现没网络了,心塞.... ,

   HTML5有个 window.navigator.onLine判断浏览器是否在线的API, 但是博客园的后台管理界面不能添加自定义JS, 所以也没什么用, 不知道有没有好方法

   整个项目代码在这儿 : https://pan.baidu.com/s/1qYGqI2w

 

作者: NONO
出处:http://www.cnblogs.com/diligenceday/
QQ:287101329 

posted @ 2015-08-25 00:26  方方和圆圆  阅读(21982)  评论(15编辑  收藏  举报

再过一百年, 我会在哪里?