最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

基于SSM框架大型分布式电商系统开发(1

互联网 admin 4浏览 0评论

基于SSM框架大型分布式电商系统开发(1

前言

开发个人的毕业设计,整个项目的静态页由别人提供,其余功能皆是自己开发,记录下开发流程。

第一章 分布式框架-Dubbox

1.Zookeeper 在Linux系统的安装(第一天)

1.1在Linux下解压缩压缩包
tar -zxvf zookeeper-3.4.6.tar.gz

1.2进入 zookeeper-3.4.6 目录,创建 data 文件夹。
mkdir data

1.3进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
cd conf mv zoo_sample.cfg zoo.cfg

1.4打开zoo.cfg , 修改 data 属性:dataDir=/root/zookeeper-3.4.6/data

1.5 Zookeeper 服务启动
进入bin目录,启动服务输入命令
./zkServer.sh start
输出以下内容表示启动成功

关闭服务输入命令
./zkServer.sh stop

查看状态:
./zkServer.sh status
如果启动状态,提示

如果未启动状态,提示:

2.一个dubbox入门小案例(第二天)

2.1 Dubbox本地JAR包部署与安装
先将dubbo-2.8.4.jar包放到d:\setup, 然后输入命令mvn install:install-file -Dfile=d:\setup\dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar

2.2 配置离线约束
eclipse中 XML Catalog配置dubbo.xsd
地址:.xsd

2.3 服务提供者开发
2.3.1 创建Maven工程(WAR)dubboxdemo-service ,在pom.xml中引入依赖

 <properties><spring.version>4.3.6.RELEASE</spring.version></properties><dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.8.4</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.6</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.11.0.GA</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8081</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins></build>

2.3.1在工程的webapps下创建WEB-INF文件夹,创建web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=""xmlns=""xsi:schemaLocation=" .xsd"version="2.5">	<!-- 加载spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value></context-param><listener>		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>	
</web-app>

2.3.2 创建业务接口

创建包com.xxx.dubbodemo.service,用于存放业务接口,创建接口

public interface UserService {public String getName();
}

创建包com.xxx.dubbodemo.service.impl ,用于存放业务实现类。创建业务实现类:

//引入dubbo的service注解,部署到注册中心
//注意:Service注解与原来不同,需要引入com.alibaba包下的
@Service
public class UserServiceImpl implements UserService {public String getName() {// TODO Auto-generated method stubreturn "xxx";}
}

2.3.3编写配置文件
在src/main/resources下创建applicationContext-service.xml ,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:p=""xmlns:context=""xmlns:dubbo="" xmlns:mvc=""xsi:schemaLocation=" .xsd .xsd .xsd .xsd"><!-- 该项目在注册中心的应用名称 --><dubbo:application name="dubboxdemo-com.xxx.dubbox.service" /><!-- 注册中心的应用地址 --><dubbo:registry address="zookeeper://ip地址:2181" /><!-- 需要提供服务的包名 注意:dubbo:annotation用于扫描@Service注解。 --><dubbo:annotation package="com.xxx.dubbox.service.impl" />
</beans>

2.4 服务消费者开发

2.4.1 在webapps目录下创建WEB-INF 目录,并创建web.xml
Pom.xml文件与上面一致,区别就是把tomcat插件的运行端口改为8082 。

<!-- 解决post乱码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>

2.4.2 拷贝业务接口
将“dubboxdemo-service”工程的com.xxx.dubboxdemo.service 包以及下面的接口拷贝至此工程,不包括impl下面的实现

2.4.3 编写Controller

    //dubbo的注解,调用外部服务@ReferenceUserService userService;@RequestMapping("/getName")@ResponseBodypublic String getName(){return userService.getName();}

2.4.4 编写spring配置文件
在src/main/resources下创建applicationContext-web.xml

<mvc:annotation-driven ><mvc:message-converters register-defaults="false"><bean class="org.springframework.http.converter.StringHttpMessageConverter">  <constructor-arg value="UTF-8" /></bean>  </mvc:message-converters>	</mvc:annotation-driven><!-- 该项目在注册中心的应用名称 --><dubbo:application name="dubboxdemo-web" /><!-- 注册中心的应用地址 --><dubbo:registryaddress="zookeeper://ip地址:2181" /><!-- 需要提供服务的包名 --><dubbo:annotationpackage="com.xxx.dubbox.controller" />

2.4.5 测试运行
tomcat7:run
先运行提供者,在运行消费者
在浏览器输入http://localhost:8082/user/showName.do,查看浏览器输出结果

3.管理中心的部署(第三天)

我们在开发时,需要知道注册中心都注册了哪些服务,以便我们开发和测试。我们可以通过部署一个管理中心来实现。其实管理中心就是一个web应用,部署到tomcat即可。

3.1 管理端安装
3.1.1 下载 dubbox-master.zip:
这个是dubbox的源码,我们可以使用maven命令编译源码得到“管理端”的war包将此压缩包解压,在命令符下进入
dubbo-admin目录 ,输入maven命令
mvn package -Dmaven.skip.test=true
如果你看到如下信息,就说明成功了

3.1.2 进入target文件夹,你会看到一个dubbo-admin-2.8.4.war , 在linux服务器上安装tomcat, 将此war包上传到linux服务器 的tomcat的webapps下。为了访问方便,你可以把版本号去掉。 启动tomcat后自动解压。

3.1.3 如果你部署在zookeeper同一台主机并且端口是默认的2181,则无需修改任何配置。如果不是在一台主机上或端口被修改,需要修改WEB-INF下的dubbo.properties ,修改如下配置:
dubbo.registry.address=zookeeper://127.0.0.1:2181
修改后重新启动tomcat

3.2管理端的使用
3.2.1 打开浏览器,输入http://192.168.25.125:8080/dubbo-admin/ ,登录用户名和密码均为root 进入首页。 (192.168.25.125:)是我部署的linux主机地址,账号密码均为root

3.2.2启动服务提供者工程,即可在服务治理-提供者查看到该服务。

点击其中一条数据后可以查看详情。

3.2.3 启动服务消费者工程,运行页面,观察“消费者”列表

4.项目正式搭建

4.1 工程说明
pinyougou-parent 聚合工程
pinyougou-pojo 通用实体类层
pinyougou-dao 通用数据访问层
pinyougou-xxxxx-interface 某服务层接口
pinyougou-xxxxx-service 某服务层实现
pinyougou-xxxxx-web 某web工程

4.2 创建数据库表
数据语句是想免费提供给大家的,但是这个系统自动设置了5积分,有点过分了。。。

4.3搭建框架
4.3.1父工程
创建Maven工程pinyougou-parent (POM),groupId 为com.pinyougou ,artifactId 为pinyougou-parent , 在pom.xml中添加锁定版本信息dependencyManagement与pluginManagement
4.3.2通用实体类模块
创建通用实体类模块-pinyougou-pojo
4.3.3通用数据访问模块
创建通用数据访问模块pinyougou-dao .添加依赖Mybatis和pinyougou-pojo

<dependencies><!-- Mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId>			</dependency><dependency><groupId>com.github.miemiedev</groupId><artifactId>mybatis-paginator</artifactId></dependency>		<!-- MySql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency>	<dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-pojo</artifactId><version>0.0.1-SNAPSHOT</version></dependency> </dependencies>

4.3.4通用工具类模块
创建通用工具类模块pinyougou-common

4.3.5商家商品服务接口模块
创建maven(jar)模块pinyougou-sellergoods-interface , pom.xml添加依赖

<dependencies><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-pojo</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
</dependencies>

4.3.6商家商品服务模块
创建maven(war)模块pinyougou-sellergoods-service ,pom.xml引入依赖

<dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId>		</dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId>	</dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId>	</dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId>		</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId>		</dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId>	  </dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId>	<scope>provided</scope></dependency>  <dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-dao</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-sellergoods-interface</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>  <build><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><path>/</path><port>9001</port></configuration></plugin></plugins></build>
</project>

在webapps下创建WEB-INF/web.xml ,加载spring容器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=""xmlns=""xsi:schemaLocation=" .xsd"version="2.5">	<!-- 加载spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

创建包com.pinyougou.sellergoods.service.impl
在src/main/resources下创建spring/applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:p=""xmlns:context=""xmlns:dubbo="" xmlns:mvc=""xsi:schemaLocation=" .xsd .xsd .xsd .xsd"><!-- 传输协议为dubbo,端口为20881,一个服务不用加默认为20880--><dubbo:protocol name="dubbo" port="20881"></dubbo:protocol><dubbo:application name="pinyougou-sellergoods-service"/>  <dubbo:registry address="zookeeper://192.168.25.125:2181"/><dubbo:annotation package="com.pinyougou.sellergoods.service.impl" />  
</beans>

4.3.7 运营商管理后台
创建maven(war)模块pinyougou-manager-web,pom.xml引入依赖

<dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId>		</dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId>	</dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId>	</dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId>		</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId>		</dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId>	  </dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId>	<scope>provided</scope></dependency>  <dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-sellergoods-interface</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><build><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><path>/</path><port>9101</port></configuration></plugin></plugins></build>

在webapps下创建WEB-INF/web.xml ,加载spring容器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=""xmlns=""xsi:schemaLocation=" .xsd"version="2.5">	<!-- 解决post乱码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param>  <param-name>forceEncoding</param-name>  <param-value>true</param-value>  </init-param>  </filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>	<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

创建包com.pinyougou.manager.controller
在src/main/resources下创建spring/springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:p=""xmlns:context=""xmlns:dubbo="" xmlns:mvc=""xsi:schemaLocation=" .xsd .xsd .xsd .xsd"><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">  <property name="supportedMediaTypes" value="application/json"/><property name="features"><array><value>WriteMapNullValue</value><value>WriteDateUseDateFormat</value></array></property></bean></mvc:message-converters>  </mvc:annotation-driven><!-- 引用dubbo 服务 --><dubbo:application name="pinyougou-manager-web" /><dubbo:registry address="zookeeper://192.168.25.125:2181"/><dubbo:annotation package="com.pinyougou.manager.controller" />  	
</beans>

4.3.8商家管理后台
构建web模块pinyougou-shop-web 与运营商管理后台的构建方式类似。区别:
(1)定义tomcat的启动端口为9102
(2)springmvc.xml

<!-- 引用dubbo 服务 -->
<dubbo:application name="pinyougou-shop-web" />
<dubbo:registry address="zookeeper://192.168.25.125:2181"/>
<dubbo:annotation package="com.pinyougou.shop.controller" />  

4.4实体类与数据访问层模块
4.4.1 生成代码
利用mybatis的逆向工程实现实体类与数据访问层代码的自动生成

4.4.2 拷贝代码
将com.pinyougou.pojo包拷贝到pojo工程
将com.pinyougou.mapper包和resouce下的com.pinyougou.mapper文件夹拷贝到dao工程

4.4.3 修改实体类代码
修改每个实体类,让其实现Serializable接口,因在网络中传输。

5.品牌列表-后端代码(第四天)
5.1 数据库表
tb_brand 品牌表
字段 类型 长度 含义
Id Bigint 主键
Name Varchar 255 品牌名称
First_char Varchar 1 品牌首字母

5.2 服务层接口
在pinyougou-sellergoods-interface 工程创建BrandService接口

package com.pinyougou.sellergoods.service;
import java.util.List;
import com.pinyougou.pojo.TbBrand;
/*** 品牌服务层接口* @author Administrator**/
public interface BrandService {/*** 返回全部列表* @return*/public List<TbBrand> findAll();
}

5.3 服务实现类
在pinyougou-sellergoods-service 工程创建BrandServiceImpl类

public class BrandServiceImpl implements BrandService {@Autowiredprivate TbBrandMapper brandMapper;@Overridepublic List<TbBrand> findAll() {return brandMapper.selectByExample(null);}
}

5.4 控制层代码
在pinyougou-manager-web工程创建com.pinyougou.manager.controller包,包下创建BrandController类

@RestController
@RequestMapping("/brand")
public class BrandController {@Referenceprivate BrandService brandService;/*** 返回全部列表* @return*/@RequestMapping("/findAll")public List<TbBrand> findAll(){			return brandService.findAll();}
}

5.5 测试
启动pinyougou-sellergoods-service
启动pinyougou-manager-web
地址栏输入http://localhost:9101/brand/findAll.do

可以看到浏览器输出了json数据。

第二章 品牌功能完善(第五天)

1.品牌列表的实现
1.1 需求分析
品牌功能实现较为简单,增 删 改 批量删 条件查询。
前端使用angularjs,后端使用spring springmvc mybatis完成
分布式项目dubbox+zookeeper

1.2 前端代码
静态资源可以联系我,发至邮箱。。。

1.2.1 引入JS
修改brand.html ,引入JS

<script type="text/javascript" src="../plugins/angularjs/angular.min.js"></script>

1.2.2 指定模块和控制器

<body class="hold-transition skin-red sidebar-mini"  ng-app="pinyougou"   ng-controller="brandController">

ng-app 指令中定义的就是模块的名称
ng-controller 指令用于为你的应用添加控制器。
在控制器中,你可以编写代码,制作函数和变量,并使用 scope 对象来访问。

1.2.3 编写JS代码

var app=angular.module('pinyougou', []);//定义模块	app.controller('brandController' ,function($scope,$http){			//读取列表数据绑定到表单中  $scope.findAll=function(){$http.get('../brand/findAll.do').success(function(response){$scope.list=response;}			);}});	

1.2.4 循环显示表格数据

   <tbody><tr ng-repeat="entity in list"><td><input  type="checkbox" ></td>			                              <td>{{entity.id}}</td><td>{{entity.name}}</td>									     <td>{{entity.firstChar}}</td>		                                 <td class="text-center">                                           <button type="button" class="btn bg-olive btn-xs" data-toggle="modal" data-target="#editModal"  >修改</button>                                           </td></tr>									 </tbody>

1.2.5 初始化调用

<body class="hold-transition skin-red sidebar-mini" ng-app="pinyougou" ng-controller="brandController" ng-init="findAll()">

2.品牌列表分页的实现
2.1 后端代码

2.1.2 分页结果封装实体
在pinyougou-pojo工程中创建entity包,用于存放通用实体类,创建类PageResult

package entity;
import java.util.List;
/*** 分页结果封装对象* @author Administrator**/
public class PageResult implements Serializable{private long total;//总记录数private List rows;//当前页结果		public PageResult(long total, List rows) {super();this.total = total;this.rows = rows;}//getter  and setter .....
}

2.1.3 服务接口层
在pinyougou-sellergoods-interface的BrandService.java 增加方法定义

/*** 返回分页列表* @return*/public PageResult findPage(int pageNum,int pageSize);

2.1.4 服务实现层
在pinyougou-sellergoods-service的BrandServiceImpl.java中实现该方法

@Override
public PageResult findPage(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);		Page<TbBrand> page=   (Page<TbBrand>) brandMapper.selectByExample(null);return new PageResult(page.getTotal(), page.getResult());
}

PageHelper为MyBatis分页插件

2.1.5 控制层
在pinyougou-manager-web工程的BrandController.java新增方法

/*** 返回全部列表* @return*/@RequestMapping("/findPage")public PageResult  findPage(int page,int rows){			return brandService.findPage(page, rows);}

2.2 前端代码

2.2.1 HTML
在brand.html引入分页组件

       //重新加载列表数据,刷新作用,封装起来$scope.reloadList = function () {//切换页码$scope.search($scope.paginationConf.currentPage,$scope.paginationConf.itemsPerPage);}//分页控件配置//<tm-pagination conf="paginationConf">保持一致//页面第一次加载分页控件时,会自动加载$scope.paginationConf = {//当前页currentPage: 1,//总记录数totalItems: 10,//每页记录数itemsPerPage: 10,//分页选项perPageOptions: [10, 20, 30, 40, 50],onChange: function () {$scope.reloadList();//重新加载}};//分页,当前页和页面大小$scope.findPage = function (page, rows) {$http.get("../brand/findPage.do?pageNum=" + page + "&&pageSize=" + rows).success(function (response) {$scope.list = response.rows;//更新总记录数$scope.paginationConf.totalItems = response.total;})}

在页面的body元素上去掉ng-init指令的调用

3.增加品牌
3.1 后端代码

3.1.1 服务接口层

/*** 增加
*/
public void add(TbBrand brand);

3.1.2 服务实现层
在com.pinyougou.sellergoods.service.impl的BrandServiceImpl.java实现该方法

@Override
public void add(TbBrand brand) {brandMapper.insert(brand);		
}

3.1.3 执行结果封装实体
在pinyougou-pojo的entity包下创建类Result.java

package entity;
import java.io.Serializable;
/*** 返回结果封装* @author Administrator**/
public class Result implements Serializable{private boolean success;private String message;public Result(boolean success, String message) {super();this.success = success;this.message = message;}//getter and setter.....
}

3.1.4 控制层
在pinyougou-manager-web的BrandController.java中新增方法

@RequestMapping("/add")public Result add(@RequestBody TbBrand brand){try {brandService.add(brand);return new Result(true, "增加成功");} catch (Exception e) {e.printStackTrace();return new Result(false, "增加失败");}}

3.2 前端代码

3.2.1 JS代码

//保存 
$scope.save=function(){$http.post('../brand/add.do',$scope.entity ).success(function(response){if(response.success){//重新查询 $scope.reloadList();//重新加载}else{alert(response.message);}}		);				
}

3.2.2 HTML
绑定表单元素,我们用ng-model指令,绑定按钮的单击事件我们用ng-click

 <div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h3 id="myModalLabel">品牌编辑</h3></div><div class="modal-body">	<table class="table table-bordered table-striped"  width="800px">	<tr><td>品牌名称</td><td><input  class="form-control" ng-model="entity.name" placeholder="品牌名称" >  </td></tr>		      	<tr><td>首字母</td><td><input  class="form-control" ng-model="entity.firstChar" placeholder="首字母">  </td></tr>		      	</table>				</div><div class="modal-footer">						<button class="btn btn-success" data-dismiss="modal" aria-hidden="true" ng-click="save()">保存</button><button class="btn btn-default" data-dismiss="modal" aria-hidden="true">关闭</button></div></div>
</div>

为了每次打开窗口没有遗留上次的数据,我们可以修改新建按钮,对entity变量进行清空操作

<button type="button" class="btn btn-default" title="新建" data-toggle="modal" data-target="#editModal" ng-click="entity={}"><i class="fa fa-file-o"></i> 新建</button>

4.修改品牌
4.1 后端代码
4.1.1 服务接口层
在pinyougou-sellergoods-interface的BrandService.java新增方法定义

/*** 修改*/
public void update(TbBrand brand);
/*** 根据ID获取实体* @param id* @return*/
public TbBrand findOne(Long id);

4.1.2 服务实现层
在pinyougou-sellergoods-service的BrandServiceImpl.java新增方法实现

    /*** 修改*/@Overridepublic void update(TbBrand brand){brandMapper.updateByPrimaryKey(brand);}	/*** 根据ID获取实体* @param id* @return*/@Overridepublic TbBrand findOne(Long id){return brandMapper.selectByPrimaryKey(id);}

4.1.3 控制层

在pinyougou-manager-web的BrandController.java新增方法
/*** 修改* @param brand* @return*/@RequestMapping("/update")public Result update(@RequestBody TbBrand brand){try {brandService.update(brand);return new Result(true, "修改成功");} catch (Exception e) {e.printStackTrace();return new Result(false, "修改失败");}}		/*** 获取实体* @param id* @return*/@RequestMapping("/findOne")public TbBrand findOne(Long id){return brandService.findOne(id);		}

4.2 前端代码
4.2.1 实现数据查询
增加JS代码

//查询实体 
$scope.findOne=function(id){$http.get('../brand/findOne.do?id='+id).success(function(response){$scope.entity= response;					});				
}

修改列表中的“修改”按钮,调用此方法执行查询实体的操作

<button type="button" class="btn bg-olive btn-xs" data-toggle="modal" 
data-target="#editModal" ng-click="findOne(entity.id)" >修改</button>    

4.2.2 保存数据
修改JS的save方法

//保存 
$scope.save=function(){var methodName='add';//方法名称if($scope.entity.id!=null){//如果有IDmethodName='update';//则执行修改方法 }	$http.post('../brand/'+ methodName +'.do',$scope.entity ).success(function(response){if(response.success){//重新查询 $scope.reloadList();//重新加载}else{alert(response.message);}}		);				
}

5.删除品牌
5.1 后端代码
5.1.1 服务接口层
在pinyougou-sellergoods-interface的BrandService.java接口定义方法

/*** 批量删除* @param ids*/public void delete(Long [] ids);

5.1.2 服务实现层
在pinyougou-sellergoods-service的BrandServiceImpl.java实现该方法

    /*** 批量删除*/@Overridepublic void delete(Long[] ids) {for(Long id:ids){brandMapper.deleteByPrimaryKey(id);}		}

5.1.3 控制层
在pinyougou-manager-web的BrandController.java中增加方法

    /*** 批量删除* @param ids* @return*/@RequestMapping("/delete")public Result delete(Long [] ids){try {brandService.delete(ids);return new Result(true, "删除成功"); } catch (Exception e) {e.printStackTrace();return new Result(false, "删除失败");}}

5.2 前端代码
5.2.1 JS
主要思路:我们需要定义一个用于存储选中ID的数组,当我们点击复选框后判断是选择还是取消选择,如果是选择就加到数组中,如果是取消选择就从数组中移除。在点击删除按钮时需要用到这个存储了ID的数组。
这里我们补充一下JS的关于数组操作的知识
(1)数组的push方法:向数组中添加元素
(2)数组的splice方法:从数组的指定位置移除指定个数的元素 ,参数1为位置 ,参数 2位移除的个数
(3)复选框的checked属性:用于判断是否被选中

$scope.selectIds=[];//选中的ID集合 
//更新复选
$scope.updateSelection = function($event, id) {		if($event.target.checked){//如果是被选中,则增加到数组$scope.selectIds.push( id);			}else{var idx = $scope.selectIds.indexOf(id);$scope.selectIds.splice(idx, 1);//删除 }
}			 
//批量删除 
$scope.dele=function(){			//获取选中的复选框			$http.get('../brand/delete.do?ids='+$scope.selectIds).success(function(response){if(response.success){$scope.reloadList();//刷新列表}						}		);				
}

5.2.2 HTML
(1)修改列表的复选框

<input  type="checkbox" ng-click="updateSelection($event,entity.id)">

(2)修改删除按钮

<button type="button" class="btn btn-default" title="删除" ng-click="dele()"><i class="fa fa-trash-o"></i> 删除</button> 

6.品牌条件查询
6.1 品牌条件查询
6.1.1 服务接口层
在pinyougou-sellergoods-interface工程的BrandService.java方法增加方法定义

/*** 分页* @param pageNum 当前页 码* @param pageSize 每页记录数* @return*/
public PageResult findPage(TbBrand brand, int pageNum,int pageSize);

6.1.2 服务实现层
在pinyougou-sellergoods-service工程BrandServiceImpl.java实现该方法

@Overridepublic PageResult findPage(TbBrand brand, int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);		TbBrandExample example=new TbBrandExample();Criteria criteria = example.createCriteria();		if(brand!=null){if(brand.getName()!=null && brand.getName().length()>0){criteria.andNameLike("%"+brand.getName()+"%");}if(brand.getFirstChar()!=null && brand.getFirstChar().length()>0){criteria.andFirstCharEqualTo(brand.getFirstChar());}		}		Page<TbBrand> page= (Page<TbBrand>)brandMapper.selectByExample(example);	return new PageResult(page.getTotal(), page.getResult());}

6.1.3 控制层
在pinyougou-manager-web的BrandController.java增加方法

@RequestMapping("/search")public PageResult search(@RequestBody TbBrand brand, int page, int rows  ){return brandService.findPage(brand, page, rows);		}

6.2 前端代码
修改pinyougou-manager-web的

$scope.searchEntity={};//定义搜索对象 			
//条件查询 
$scope.search=function(page,rows){$http.post('../brand/search.do?page='+page+"&rows="+rows, $scope.searchEntity).success(function(response){$scope.paginationConf.totalItems=response.total;//总记录数 $scope.list=response.rows;//给列表变量赋值 }		);				
}

修改reloadList方法

	//刷新列表 
$scope.reloadList=function(){$scope.search( $scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);				
}

基于SSM框架大型分布式电商系统开发(1

前言

开发个人的毕业设计,整个项目的静态页由别人提供,其余功能皆是自己开发,记录下开发流程。

第一章 分布式框架-Dubbox

1.Zookeeper 在Linux系统的安装(第一天)

1.1在Linux下解压缩压缩包
tar -zxvf zookeeper-3.4.6.tar.gz

1.2进入 zookeeper-3.4.6 目录,创建 data 文件夹。
mkdir data

1.3进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
cd conf mv zoo_sample.cfg zoo.cfg

1.4打开zoo.cfg , 修改 data 属性:dataDir=/root/zookeeper-3.4.6/data

1.5 Zookeeper 服务启动
进入bin目录,启动服务输入命令
./zkServer.sh start
输出以下内容表示启动成功

关闭服务输入命令
./zkServer.sh stop

查看状态:
./zkServer.sh status
如果启动状态,提示

如果未启动状态,提示:

2.一个dubbox入门小案例(第二天)

2.1 Dubbox本地JAR包部署与安装
先将dubbo-2.8.4.jar包放到d:\setup, 然后输入命令mvn install:install-file -Dfile=d:\setup\dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar

2.2 配置离线约束
eclipse中 XML Catalog配置dubbo.xsd
地址:.xsd

2.3 服务提供者开发
2.3.1 创建Maven工程(WAR)dubboxdemo-service ,在pom.xml中引入依赖

 <properties><spring.version>4.3.6.RELEASE</spring.version></properties><dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.8.4</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.6</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.11.0.GA</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8081</port><path>/</path><uriEncoding>UTF-8</uriEncoding><server>tomcat7</server></configuration></plugin></plugins></build>

2.3.1在工程的webapps下创建WEB-INF文件夹,创建web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=""xmlns=""xsi:schemaLocation=" .xsd"version="2.5">	<!-- 加载spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value></context-param><listener>		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>	
</web-app>

2.3.2 创建业务接口

创建包com.xxx.dubbodemo.service,用于存放业务接口,创建接口

public interface UserService {public String getName();
}

创建包com.xxx.dubbodemo.service.impl ,用于存放业务实现类。创建业务实现类:

//引入dubbo的service注解,部署到注册中心
//注意:Service注解与原来不同,需要引入com.alibaba包下的
@Service
public class UserServiceImpl implements UserService {public String getName() {// TODO Auto-generated method stubreturn "xxx";}
}

2.3.3编写配置文件
在src/main/resources下创建applicationContext-service.xml ,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:p=""xmlns:context=""xmlns:dubbo="" xmlns:mvc=""xsi:schemaLocation=" .xsd .xsd .xsd .xsd"><!-- 该项目在注册中心的应用名称 --><dubbo:application name="dubboxdemo-com.xxx.dubbox.service" /><!-- 注册中心的应用地址 --><dubbo:registry address="zookeeper://ip地址:2181" /><!-- 需要提供服务的包名 注意:dubbo:annotation用于扫描@Service注解。 --><dubbo:annotation package="com.xxx.dubbox.service.impl" />
</beans>

2.4 服务消费者开发

2.4.1 在webapps目录下创建WEB-INF 目录,并创建web.xml
Pom.xml文件与上面一致,区别就是把tomcat插件的运行端口改为8082 。

<!-- 解决post乱码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>

2.4.2 拷贝业务接口
将“dubboxdemo-service”工程的com.xxx.dubboxdemo.service 包以及下面的接口拷贝至此工程,不包括impl下面的实现

2.4.3 编写Controller

    //dubbo的注解,调用外部服务@ReferenceUserService userService;@RequestMapping("/getName")@ResponseBodypublic String getName(){return userService.getName();}

2.4.4 编写spring配置文件
在src/main/resources下创建applicationContext-web.xml

<mvc:annotation-driven ><mvc:message-converters register-defaults="false"><bean class="org.springframework.http.converter.StringHttpMessageConverter">  <constructor-arg value="UTF-8" /></bean>  </mvc:message-converters>	</mvc:annotation-driven><!-- 该项目在注册中心的应用名称 --><dubbo:application name="dubboxdemo-web" /><!-- 注册中心的应用地址 --><dubbo:registryaddress="zookeeper://ip地址:2181" /><!-- 需要提供服务的包名 --><dubbo:annotationpackage="com.xxx.dubbox.controller" />

2.4.5 测试运行
tomcat7:run
先运行提供者,在运行消费者
在浏览器输入http://localhost:8082/user/showName.do,查看浏览器输出结果

3.管理中心的部署(第三天)

我们在开发时,需要知道注册中心都注册了哪些服务,以便我们开发和测试。我们可以通过部署一个管理中心来实现。其实管理中心就是一个web应用,部署到tomcat即可。

3.1 管理端安装
3.1.1 下载 dubbox-master.zip:
这个是dubbox的源码,我们可以使用maven命令编译源码得到“管理端”的war包将此压缩包解压,在命令符下进入
dubbo-admin目录 ,输入maven命令
mvn package -Dmaven.skip.test=true
如果你看到如下信息,就说明成功了

3.1.2 进入target文件夹,你会看到一个dubbo-admin-2.8.4.war , 在linux服务器上安装tomcat, 将此war包上传到linux服务器 的tomcat的webapps下。为了访问方便,你可以把版本号去掉。 启动tomcat后自动解压。

3.1.3 如果你部署在zookeeper同一台主机并且端口是默认的2181,则无需修改任何配置。如果不是在一台主机上或端口被修改,需要修改WEB-INF下的dubbo.properties ,修改如下配置:
dubbo.registry.address=zookeeper://127.0.0.1:2181
修改后重新启动tomcat

3.2管理端的使用
3.2.1 打开浏览器,输入http://192.168.25.125:8080/dubbo-admin/ ,登录用户名和密码均为root 进入首页。 (192.168.25.125:)是我部署的linux主机地址,账号密码均为root

3.2.2启动服务提供者工程,即可在服务治理-提供者查看到该服务。

点击其中一条数据后可以查看详情。

3.2.3 启动服务消费者工程,运行页面,观察“消费者”列表

4.项目正式搭建

4.1 工程说明
pinyougou-parent 聚合工程
pinyougou-pojo 通用实体类层
pinyougou-dao 通用数据访问层
pinyougou-xxxxx-interface 某服务层接口
pinyougou-xxxxx-service 某服务层实现
pinyougou-xxxxx-web 某web工程

4.2 创建数据库表
数据语句是想免费提供给大家的,但是这个系统自动设置了5积分,有点过分了。。。

4.3搭建框架
4.3.1父工程
创建Maven工程pinyougou-parent (POM),groupId 为com.pinyougou ,artifactId 为pinyougou-parent , 在pom.xml中添加锁定版本信息dependencyManagement与pluginManagement
4.3.2通用实体类模块
创建通用实体类模块-pinyougou-pojo
4.3.3通用数据访问模块
创建通用数据访问模块pinyougou-dao .添加依赖Mybatis和pinyougou-pojo

<dependencies><!-- Mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId>			</dependency><dependency><groupId>com.github.miemiedev</groupId><artifactId>mybatis-paginator</artifactId></dependency>		<!-- MySql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency>	<dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-pojo</artifactId><version>0.0.1-SNAPSHOT</version></dependency> </dependencies>

4.3.4通用工具类模块
创建通用工具类模块pinyougou-common

4.3.5商家商品服务接口模块
创建maven(jar)模块pinyougou-sellergoods-interface , pom.xml添加依赖

<dependencies><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-pojo</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
</dependencies>

4.3.6商家商品服务模块
创建maven(war)模块pinyougou-sellergoods-service ,pom.xml引入依赖

<dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId>		</dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId>	</dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId>	</dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId>		</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId>		</dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId>	  </dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId>	<scope>provided</scope></dependency>  <dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-dao</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-sellergoods-interface</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>  <build><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><path>/</path><port>9001</port></configuration></plugin></plugins></build>
</project>

在webapps下创建WEB-INF/web.xml ,加载spring容器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=""xmlns=""xsi:schemaLocation=" .xsd"version="2.5">	<!-- 加载spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring/applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

创建包com.pinyougou.sellergoods.service.impl
在src/main/resources下创建spring/applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:p=""xmlns:context=""xmlns:dubbo="" xmlns:mvc=""xsi:schemaLocation=" .xsd .xsd .xsd .xsd"><!-- 传输协议为dubbo,端口为20881,一个服务不用加默认为20880--><dubbo:protocol name="dubbo" port="20881"></dubbo:protocol><dubbo:application name="pinyougou-sellergoods-service"/>  <dubbo:registry address="zookeeper://192.168.25.125:2181"/><dubbo:annotation package="com.pinyougou.sellergoods.service.impl" />  
</beans>

4.3.7 运营商管理后台
创建maven(war)模块pinyougou-manager-web,pom.xml引入依赖

<dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId>		</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId>		</dependency><!-- dubbo相关 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId>	</dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId>	</dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId>		</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId>		</dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId>	  </dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId>	<scope>provided</scope></dependency>  <dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.pinyougou</groupId><artifactId>pinyougou-sellergoods-interface</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><build><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><path>/</path><port>9101</port></configuration></plugin></plugins></build>

在webapps下创建WEB-INF/web.xml ,加载spring容器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=""xmlns=""xsi:schemaLocation=" .xsd"version="2.5">	<!-- 解决post乱码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param>  <param-name>forceEncoding</param-name>  <param-value>true</param-value>  </init-param>  </filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>	<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

创建包com.pinyougou.manager.controller
在src/main/resources下创建spring/springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi="" xmlns:p=""xmlns:context=""xmlns:dubbo="" xmlns:mvc=""xsi:schemaLocation=" .xsd .xsd .xsd .xsd"><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">  <property name="supportedMediaTypes" value="application/json"/><property name="features"><array><value>WriteMapNullValue</value><value>WriteDateUseDateFormat</value></array></property></bean></mvc:message-converters>  </mvc:annotation-driven><!-- 引用dubbo 服务 --><dubbo:application name="pinyougou-manager-web" /><dubbo:registry address="zookeeper://192.168.25.125:2181"/><dubbo:annotation package="com.pinyougou.manager.controller" />  	
</beans>

4.3.8商家管理后台
构建web模块pinyougou-shop-web 与运营商管理后台的构建方式类似。区别:
(1)定义tomcat的启动端口为9102
(2)springmvc.xml

<!-- 引用dubbo 服务 -->
<dubbo:application name="pinyougou-shop-web" />
<dubbo:registry address="zookeeper://192.168.25.125:2181"/>
<dubbo:annotation package="com.pinyougou.shop.controller" />  

4.4实体类与数据访问层模块
4.4.1 生成代码
利用mybatis的逆向工程实现实体类与数据访问层代码的自动生成

4.4.2 拷贝代码
将com.pinyougou.pojo包拷贝到pojo工程
将com.pinyougou.mapper包和resouce下的com.pinyougou.mapper文件夹拷贝到dao工程

4.4.3 修改实体类代码
修改每个实体类,让其实现Serializable接口,因在网络中传输。

5.品牌列表-后端代码(第四天)
5.1 数据库表
tb_brand 品牌表
字段 类型 长度 含义
Id Bigint 主键
Name Varchar 255 品牌名称
First_char Varchar 1 品牌首字母

5.2 服务层接口
在pinyougou-sellergoods-interface 工程创建BrandService接口

package com.pinyougou.sellergoods.service;
import java.util.List;
import com.pinyougou.pojo.TbBrand;
/*** 品牌服务层接口* @author Administrator**/
public interface BrandService {/*** 返回全部列表* @return*/public List<TbBrand> findAll();
}

5.3 服务实现类
在pinyougou-sellergoods-service 工程创建BrandServiceImpl类

public class BrandServiceImpl implements BrandService {@Autowiredprivate TbBrandMapper brandMapper;@Overridepublic List<TbBrand> findAll() {return brandMapper.selectByExample(null);}
}

5.4 控制层代码
在pinyougou-manager-web工程创建com.pinyougou.manager.controller包,包下创建BrandController类

@RestController
@RequestMapping("/brand")
public class BrandController {@Referenceprivate BrandService brandService;/*** 返回全部列表* @return*/@RequestMapping("/findAll")public List<TbBrand> findAll(){			return brandService.findAll();}
}

5.5 测试
启动pinyougou-sellergoods-service
启动pinyougou-manager-web
地址栏输入http://localhost:9101/brand/findAll.do

可以看到浏览器输出了json数据。

第二章 品牌功能完善(第五天)

1.品牌列表的实现
1.1 需求分析
品牌功能实现较为简单,增 删 改 批量删 条件查询。
前端使用angularjs,后端使用spring springmvc mybatis完成
分布式项目dubbox+zookeeper

1.2 前端代码
静态资源可以联系我,发至邮箱。。。

1.2.1 引入JS
修改brand.html ,引入JS

<script type="text/javascript" src="../plugins/angularjs/angular.min.js"></script>

1.2.2 指定模块和控制器

<body class="hold-transition skin-red sidebar-mini"  ng-app="pinyougou"   ng-controller="brandController">

ng-app 指令中定义的就是模块的名称
ng-controller 指令用于为你的应用添加控制器。
在控制器中,你可以编写代码,制作函数和变量,并使用 scope 对象来访问。

1.2.3 编写JS代码

var app=angular.module('pinyougou', []);//定义模块	app.controller('brandController' ,function($scope,$http){			//读取列表数据绑定到表单中  $scope.findAll=function(){$http.get('../brand/findAll.do').success(function(response){$scope.list=response;}			);}});	

1.2.4 循环显示表格数据

   <tbody><tr ng-repeat="entity in list"><td><input  type="checkbox" ></td>			                              <td>{{entity.id}}</td><td>{{entity.name}}</td>									     <td>{{entity.firstChar}}</td>		                                 <td class="text-center">                                           <button type="button" class="btn bg-olive btn-xs" data-toggle="modal" data-target="#editModal"  >修改</button>                                           </td></tr>									 </tbody>

1.2.5 初始化调用

<body class="hold-transition skin-red sidebar-mini" ng-app="pinyougou" ng-controller="brandController" ng-init="findAll()">

2.品牌列表分页的实现
2.1 后端代码

2.1.2 分页结果封装实体
在pinyougou-pojo工程中创建entity包,用于存放通用实体类,创建类PageResult

package entity;
import java.util.List;
/*** 分页结果封装对象* @author Administrator**/
public class PageResult implements Serializable{private long total;//总记录数private List rows;//当前页结果		public PageResult(long total, List rows) {super();this.total = total;this.rows = rows;}//getter  and setter .....
}

2.1.3 服务接口层
在pinyougou-sellergoods-interface的BrandService.java 增加方法定义

/*** 返回分页列表* @return*/public PageResult findPage(int pageNum,int pageSize);

2.1.4 服务实现层
在pinyougou-sellergoods-service的BrandServiceImpl.java中实现该方法

@Override
public PageResult findPage(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);		Page<TbBrand> page=   (Page<TbBrand>) brandMapper.selectByExample(null);return new PageResult(page.getTotal(), page.getResult());
}

PageHelper为MyBatis分页插件

2.1.5 控制层
在pinyougou-manager-web工程的BrandController.java新增方法

/*** 返回全部列表* @return*/@RequestMapping("/findPage")public PageResult  findPage(int page,int rows){			return brandService.findPage(page, rows);}

2.2 前端代码

2.2.1 HTML
在brand.html引入分页组件

       //重新加载列表数据,刷新作用,封装起来$scope.reloadList = function () {//切换页码$scope.search($scope.paginationConf.currentPage,$scope.paginationConf.itemsPerPage);}//分页控件配置//<tm-pagination conf="paginationConf">保持一致//页面第一次加载分页控件时,会自动加载$scope.paginationConf = {//当前页currentPage: 1,//总记录数totalItems: 10,//每页记录数itemsPerPage: 10,//分页选项perPageOptions: [10, 20, 30, 40, 50],onChange: function () {$scope.reloadList();//重新加载}};//分页,当前页和页面大小$scope.findPage = function (page, rows) {$http.get("../brand/findPage.do?pageNum=" + page + "&&pageSize=" + rows).success(function (response) {$scope.list = response.rows;//更新总记录数$scope.paginationConf.totalItems = response.total;})}

在页面的body元素上去掉ng-init指令的调用

3.增加品牌
3.1 后端代码

3.1.1 服务接口层

/*** 增加
*/
public void add(TbBrand brand);

3.1.2 服务实现层
在com.pinyougou.sellergoods.service.impl的BrandServiceImpl.java实现该方法

@Override
public void add(TbBrand brand) {brandMapper.insert(brand);		
}

3.1.3 执行结果封装实体
在pinyougou-pojo的entity包下创建类Result.java

package entity;
import java.io.Serializable;
/*** 返回结果封装* @author Administrator**/
public class Result implements Serializable{private boolean success;private String message;public Result(boolean success, String message) {super();this.success = success;this.message = message;}//getter and setter.....
}

3.1.4 控制层
在pinyougou-manager-web的BrandController.java中新增方法

@RequestMapping("/add")public Result add(@RequestBody TbBrand brand){try {brandService.add(brand);return new Result(true, "增加成功");} catch (Exception e) {e.printStackTrace();return new Result(false, "增加失败");}}

3.2 前端代码

3.2.1 JS代码

//保存 
$scope.save=function(){$http.post('../brand/add.do',$scope.entity ).success(function(response){if(response.success){//重新查询 $scope.reloadList();//重新加载}else{alert(response.message);}}		);				
}

3.2.2 HTML
绑定表单元素,我们用ng-model指令,绑定按钮的单击事件我们用ng-click

 <div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h3 id="myModalLabel">品牌编辑</h3></div><div class="modal-body">	<table class="table table-bordered table-striped"  width="800px">	<tr><td>品牌名称</td><td><input  class="form-control" ng-model="entity.name" placeholder="品牌名称" >  </td></tr>		      	<tr><td>首字母</td><td><input  class="form-control" ng-model="entity.firstChar" placeholder="首字母">  </td></tr>		      	</table>				</div><div class="modal-footer">						<button class="btn btn-success" data-dismiss="modal" aria-hidden="true" ng-click="save()">保存</button><button class="btn btn-default" data-dismiss="modal" aria-hidden="true">关闭</button></div></div>
</div>

为了每次打开窗口没有遗留上次的数据,我们可以修改新建按钮,对entity变量进行清空操作

<button type="button" class="btn btn-default" title="新建" data-toggle="modal" data-target="#editModal" ng-click="entity={}"><i class="fa fa-file-o"></i> 新建</button>

4.修改品牌
4.1 后端代码
4.1.1 服务接口层
在pinyougou-sellergoods-interface的BrandService.java新增方法定义

/*** 修改*/
public void update(TbBrand brand);
/*** 根据ID获取实体* @param id* @return*/
public TbBrand findOne(Long id);

4.1.2 服务实现层
在pinyougou-sellergoods-service的BrandServiceImpl.java新增方法实现

    /*** 修改*/@Overridepublic void update(TbBrand brand){brandMapper.updateByPrimaryKey(brand);}	/*** 根据ID获取实体* @param id* @return*/@Overridepublic TbBrand findOne(Long id){return brandMapper.selectByPrimaryKey(id);}

4.1.3 控制层

在pinyougou-manager-web的BrandController.java新增方法
/*** 修改* @param brand* @return*/@RequestMapping("/update")public Result update(@RequestBody TbBrand brand){try {brandService.update(brand);return new Result(true, "修改成功");} catch (Exception e) {e.printStackTrace();return new Result(false, "修改失败");}}		/*** 获取实体* @param id* @return*/@RequestMapping("/findOne")public TbBrand findOne(Long id){return brandService.findOne(id);		}

4.2 前端代码
4.2.1 实现数据查询
增加JS代码

//查询实体 
$scope.findOne=function(id){$http.get('../brand/findOne.do?id='+id).success(function(response){$scope.entity= response;					});				
}

修改列表中的“修改”按钮,调用此方法执行查询实体的操作

<button type="button" class="btn bg-olive btn-xs" data-toggle="modal" 
data-target="#editModal" ng-click="findOne(entity.id)" >修改</button>    

4.2.2 保存数据
修改JS的save方法

//保存 
$scope.save=function(){var methodName='add';//方法名称if($scope.entity.id!=null){//如果有IDmethodName='update';//则执行修改方法 }	$http.post('../brand/'+ methodName +'.do',$scope.entity ).success(function(response){if(response.success){//重新查询 $scope.reloadList();//重新加载}else{alert(response.message);}}		);				
}

5.删除品牌
5.1 后端代码
5.1.1 服务接口层
在pinyougou-sellergoods-interface的BrandService.java接口定义方法

/*** 批量删除* @param ids*/public void delete(Long [] ids);

5.1.2 服务实现层
在pinyougou-sellergoods-service的BrandServiceImpl.java实现该方法

    /*** 批量删除*/@Overridepublic void delete(Long[] ids) {for(Long id:ids){brandMapper.deleteByPrimaryKey(id);}		}

5.1.3 控制层
在pinyougou-manager-web的BrandController.java中增加方法

    /*** 批量删除* @param ids* @return*/@RequestMapping("/delete")public Result delete(Long [] ids){try {brandService.delete(ids);return new Result(true, "删除成功"); } catch (Exception e) {e.printStackTrace();return new Result(false, "删除失败");}}

5.2 前端代码
5.2.1 JS
主要思路:我们需要定义一个用于存储选中ID的数组,当我们点击复选框后判断是选择还是取消选择,如果是选择就加到数组中,如果是取消选择就从数组中移除。在点击删除按钮时需要用到这个存储了ID的数组。
这里我们补充一下JS的关于数组操作的知识
(1)数组的push方法:向数组中添加元素
(2)数组的splice方法:从数组的指定位置移除指定个数的元素 ,参数1为位置 ,参数 2位移除的个数
(3)复选框的checked属性:用于判断是否被选中

$scope.selectIds=[];//选中的ID集合 
//更新复选
$scope.updateSelection = function($event, id) {		if($event.target.checked){//如果是被选中,则增加到数组$scope.selectIds.push( id);			}else{var idx = $scope.selectIds.indexOf(id);$scope.selectIds.splice(idx, 1);//删除 }
}			 
//批量删除 
$scope.dele=function(){			//获取选中的复选框			$http.get('../brand/delete.do?ids='+$scope.selectIds).success(function(response){if(response.success){$scope.reloadList();//刷新列表}						}		);				
}

5.2.2 HTML
(1)修改列表的复选框

<input  type="checkbox" ng-click="updateSelection($event,entity.id)">

(2)修改删除按钮

<button type="button" class="btn btn-default" title="删除" ng-click="dele()"><i class="fa fa-trash-o"></i> 删除</button> 

6.品牌条件查询
6.1 品牌条件查询
6.1.1 服务接口层
在pinyougou-sellergoods-interface工程的BrandService.java方法增加方法定义

/*** 分页* @param pageNum 当前页 码* @param pageSize 每页记录数* @return*/
public PageResult findPage(TbBrand brand, int pageNum,int pageSize);

6.1.2 服务实现层
在pinyougou-sellergoods-service工程BrandServiceImpl.java实现该方法

@Overridepublic PageResult findPage(TbBrand brand, int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);		TbBrandExample example=new TbBrandExample();Criteria criteria = example.createCriteria();		if(brand!=null){if(brand.getName()!=null && brand.getName().length()>0){criteria.andNameLike("%"+brand.getName()+"%");}if(brand.getFirstChar()!=null && brand.getFirstChar().length()>0){criteria.andFirstCharEqualTo(brand.getFirstChar());}		}		Page<TbBrand> page= (Page<TbBrand>)brandMapper.selectByExample(example);	return new PageResult(page.getTotal(), page.getResult());}

6.1.3 控制层
在pinyougou-manager-web的BrandController.java增加方法

@RequestMapping("/search")public PageResult search(@RequestBody TbBrand brand, int page, int rows  ){return brandService.findPage(brand, page, rows);		}

6.2 前端代码
修改pinyougou-manager-web的

$scope.searchEntity={};//定义搜索对象 			
//条件查询 
$scope.search=function(page,rows){$http.post('../brand/search.do?page='+page+"&rows="+rows, $scope.searchEntity).success(function(response){$scope.paginationConf.totalItems=response.total;//总记录数 $scope.list=response.rows;//给列表变量赋值 }		);				
}

修改reloadList方法

	//刷新列表 
$scope.reloadList=function(){$scope.search( $scope.paginationConf.currentPage, $scope.paginationConf.itemsPerPage);				
}
发布评论

评论列表 (0)

  1. 暂无评论