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

前言

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

第一章 分布式框架-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
地址:http://code.alibabatech.com/schema/dubbo/dubbo.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="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.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 stub
        return "xxx";
    }
}

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.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的注解,调用外部服务
    @Reference
    UserService userService;

    @RequestMapping("/getName")
    @ResponseBody
    public 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:registry
			address="zookeeper://ip地址:2181" />

	<!-- 需要提供服务的包名 -->
	<dubbo:annotation
			package="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积分,有点过分了。。。
https://download.csdn.net/download/a5f4s6f4a65f4a6sf/10990133

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="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.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="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.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="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.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="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.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 {
	@Autowired
	private TbBrandMapper brandMapper;
	@Override
	public List<TbBrand> findAll() {
		return brandMapper.selectByExample(null);
	}
}

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

@RestController
@RequestMapping("/brand")
public class BrandController {
	@Reference
	private 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新增方法实现

    /**
	 * 修改
	 */
	@Override
	public void update(TbBrand brand){
		brandMapper.updateByPrimaryKey(brand);
	}	
	
	/**
	 * 根据ID获取实体
	 * @param id
	 * @return
	 */
	@Override
	public 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){//如果有ID
			methodName='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实现该方法

    /**
	 * 批量删除
	 */
	@Override
	public 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实现该方法

@Override
	public 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);				
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值