前言
开发个人的毕业设计,整个项目的静态页由别人提供,其余功能皆是自己开发,记录下开发流程。
第一章 分布式框架-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
<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);
}