1.common(公共大厅,maven项目),相当于三层架构中的dao层(放实体类,dao,dao的映射文件,还有service的接口,service接口也可以放在提供者项目里)
2.provider(提供者,springboot项目),相当于三层架构中的service层(放service实现类,也可以放service接口)
3.consumer(消费者,springboot项目,创建需要选择web中的springWeb),相当于三层架构中的controller层(放controller控制器)
运行项目需要先启动zookeeper,在启动tomcat
1.common(公共大厅,maven项目)
1.pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 自动生成的,但是提供者和消费者要复制的东西-->
<groupId>cn.kgc</groupId>
<artifactId>phone</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
2.pojo实体类(实现序列化,还有注解)
package cn.kgc.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Informations implements Serializable {
private Long id;
private String title;
private String content;
private Integer replyCount;
private Integer viewCount;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date reportTime;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date lastPostTime;
}
2.provider(提供者,springboot项目)
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.kgc</groupId>
<artifactId>phone</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>phone</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- common项目的组名,项目名,复制需要修改-->
<dependency>
<groupId>cn.kgc</groupId>
<artifactId>phone</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.application.yml文件
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/phone?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
dubbo:
application:
name: spring-boot-starter-dubbo-demo-provider
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
scan: cn.kgc.serviceImpl
# provider提供者项目中 service实现类--包路径
# common项目中xxxmapper.xml映射文件的位置
# common项目中(大厅)实体类--包路径
mybatis:
# config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mappering/**.xml
type-aliases-package: cn.kgc.pojo
3.PhoneApplication(启动类)
注:一定要加注解@MapperScan(“cn.kgc.mapper”),扫描common项目中的mapper包下的接口文件
package cn.kgc;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("cn.kgc.mapper")
public class PhoneApplication {
public static void main(String[] args) {
SpringApplication.run(PhoneApplication.class, args);
}
}
4.serviceImpl(实现类)
注:注解
@Component(“InformationsService”)
@Service(interfaceClass = InformationsService.class )(导入的是阿里巴巴的包)
public class InformationsServiceImpl implements InformationsService {
@Resource
private InformationsMapper informationsMapper;
}
package cn.kgc.serviceImpl;
import cn.kgc.mapper.InformationsMapper;
import cn.kgc.pojo.Informations;
import cn.kgc.service.InformationsService;
import cn.kgc.service.RepliesService;
import cn.kgc.until.Page;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component("InformationsService")
@Service(interfaceClass = InformationsService.class )
public class InformationsServiceImpl implements InformationsService {
@Resource
private InformationsMapper informationsMapper;
@Override
public Map findFen(int pageNo) {
int pagesize = Page.PAGESIZE;
List<Informations> fenList = informationsMapper.findFen((pageNo - 1) * pagesize, pagesize);
int count = informationsMapper.findCount();
int countPage=count%3==0 ? count/3 : (count/3)+1; //三目运算
Map<String,Object> phoneMap =new HashMap<>();
phoneMap.put("fenList",fenList);
phoneMap.put("count",count);
phoneMap.put("pageNo",pageNo);
phoneMap.put("countPage",countPage);
return phoneMap;
}
@Override
public int findCount() {
return informationsMapper.findCount();
}
@Override
//根据主键查询
public Informations selectByPrimaryKey(Long aLong) {
return informationsMapper.selectByPrimaryKey(aLong);
}
@Override
//根据主键查询 集合
public List<Informations> selectByPrimaryKey2(Long aLong) {
return informationsMapper.selectByPrimaryKey2(aLong);
}
@Override
//增加
public int insertSelective(Informations informations) {
return informationsMapper.insertSelective(informations);
}
@Override
//修改 查看次数
public int update(Long aLong,int viewCount) {
return informationsMapper.update(aLong,viewCount);
}
@Override
//修改 回复次数
public int updateReplyCount(Long aLong,int replyCount) {
return informationsMapper.updateReplyCount(aLong,replyCount);
}
}
3.consumer(消费者,springboot项目,创建需要选择web中的springWeb)
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.kgc</groupId>
<artifactId>phone</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>phone</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- common项目的组名,项目名,复制需要修改-->
<dependency>
<groupId>cn.kgc</groupId>
<artifactId>phone</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.57</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.20.0-GA</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml(yml文件)
server:
port: 8082
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/phone?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
# thymeleaf 视图的配置
thymeleaf:
cache: false
prefix: classpath:/templates/
suffix: .html
encoding: UTF-8
mode: html5
servlet:
content-type: text/html
dubbo:
application:
name: spring-boot-starter-dubbo-demo-consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
scan: cn.kgc.controller
# controller所在的包路径
mvc:
static-path-pattern: /static/**
#
# 注意点:service的接口,注解:@Reference(import com.alibaba.dubbo.config.annotation.Reference;
# )
1.controller类
@Controller
public class InformationsController {
@Reference //注意这边的注解和提供者的不一样
private InformationsService informationsService;
}
package cn.kgc.controller;
import cn.kgc.pojo.Informations;
import cn.kgc.service.InformationsService;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.Map;
@Controller
public class InformationsController {
@Reference
private InformationsService informationsService;
//分页显示
@RequestMapping("/login")
public String login(){
return "login";
}
@GetMapping("/doLogin")
@ResponseBody
public String findFen(int pageNo){
System.out.println("控制层pageNo====="+pageNo);
Map fen = informationsService.findFen(pageNo);
System.out.println("分页====="+fen);
return JSON.toJSONStringWithDateFormat(fen, "yyyy-MM-dd");
}
}
2.前台页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录显示</title>
<style>
*{
margin: 0;
}
body{
width: 960px;
margin: 0 auto;
}
h1{
font-family: 新宋体;
text-align: center;
margin-top: 2em;
}
#sousuo{
text-align: center;
margin: 0 auto;
margin-top: 2em;
}
table{
font-family: 新宋体;
border-collapse: collapse;
width: 100%;
margin-top: 1em;
}
table, td, th{
border: 2px solid #A5A5A5;
}
th{height: 2em;}
td{
text-align: center;
height: 1.5em;
}
a{
margin: 0 5px;
}
table tr:nth-of-type(even){
background: #dfdfdf;
}
#pageSpan{
text-align: right;
margin-top: 1em;
}
</style>
</head>
<body>
<h1>手机资讯</h1>
<table>
<tr>
<th>序号</th>
<th>标题</th>
<th>回复/查看</th>
<th>创建时间</th>
<th>最新回复</th>
</tr>
</table>
<!--上一页,下一页-->
<div id="pageSpan"></div>
<input type="hidden" value="1" name="pageNo" id="pageNo">
<script type="text/javascript" src="/static/js/jquery-3.4.1.js" th:src="@{/static/js/jquery-3.4.1.js}"></script>
<script type="text/javascript">
$(function () {
var countPage2;
function showinit() {
var pageNo = $("#pageNo").val();
$.getJSON("/doLogin","pageNo="+pageNo,success);
function success(data) {
countPage2= data.countPage;
// 遍历 信息
$("tr:gt(0)").remove();
for(var i=0;i<data.fenList.length;i++){
var $str=$("<tr id='delTr"+data.fenList[i].id+"'></tr>");
$("table").append($str)
$str.append("<td>"+data.fenList[i].id+"</td>")
.append("<td><a href='/addReplies?id="+data.fenList[i].id+"'>"+data.fenList[i].title+"</a></td>")
.append("<td>"+data.fenList[i].replyCount+"/"+data.fenList[i].viewCount+"</td>")
.append("<td>"+data.fenList[i].reportTime+"</td>")
.append("<td>"+data.fenList[i].lastPostTime+"</td>")
}
//展现首页
$("#pageSpan").html(" ");
if(data.pageNo>1){
$("#pageSpan").append("<a href='#' id='firstPage'>首页</a><a href='#' id='prePage'>上一页</a>第<span>"+data.pageNo+"</span>页/第<span>"+data.countPage+"</span>页")
}
if(data.pageNo<data.countPage){
$("#pageSpan").append("<a href='#' id='nextPage'>下一页</a><a href='#' id='lastPage'>末页</a>第<span>"+data.pageNo+"</span>页/第<span>"+data.countPage+"</span>页")
}
// countPage2= data[3];
// // 遍历 信息
// $("tr:gt(0)").remove();
// for (var i = 0;i < data[0].length;i++){
// var $str=$("<tr id='ddd"+data[0][i].id+"'></tr>");
// $( "table").append($str);
// $str.append("<td>"+data[0][i].id+"</td>")
// .append("<td><a href='/addReplies?id="+data[0][i].id+"'>"+data[0][i].title+"</a></td>")
// .append("<td>"+data[0][i].replyCount+"/"+data[0][i].viewCount+"</td>")
// .append("<td>"+data[0][i].reportTime+"</td>")
// .append("<td>"+data[0][i].lastPostTime+"</td>")
// }
// //显示 上一页 下一页
// // 清空上一页、下一页等标签
// $("#pageSpan").html(" ");
// if(data[2]>1){
// $("#pageSpan").append("<a href='#' id='firstPage'>首页</a><a href='#' id='prePage'>上一页</a>")
// }
// if(data[2]<data[3]){
// $("#pageSpan").append("<a href='#' id='nextPage'>下一页</a><a href='#' id='lastPage'>末页</a>")
// }
}
}//end of showinit
//点击换页(循环时候点击上一页,下一页)
$(document).on("click","#firstPage,#prePage,#nextPage,#lastPage",function () {
var clickId = $(this).attr("id");
switch (clickId){
case "firstPage":
$("#pageNo").val(1);
break;
case "prePage":
var currPageNo = $("#pageNo").val();
var newPageNo = parseInt(currPageNo) - 1;
$("#pageNo").val(newPageNo);
break;
case "nextPage":
var currPageNo = $("#pageNo").val();
var newPageNo = parseInt(currPageNo) + 1;
$("#pageNo").val(newPageNo);
break;
case "lastPage":
$("#pageNo").val(countPage2);
}
showinit();
})
showinit();
})//end of all
</script>
</body>
</html>