1.先创建一pom个项目
2.在pom项目下面在创建三个子项目
注册中心pom.xml
<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>
<parent>
<groupId>cn.ps</groupId>
<artifactId>SPRINGCLOUD</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SPRINGCLOUD_CRETER</artifactId>
<dependencies>
<!-- 引入注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!-- 不加此依赖打出来的jar包不可用,因为没有第三方面的包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注册中心main方法
package cn.ps;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class CenterController {
public static void main(String[] args) {
new SpringApplicationBuilder(CenterController.class).web(true).run(args);
}
}
注册中心application.yml文件
server:
#注册中心端口号
port: 8761
eureka:
instance:
#本机ip地址
hostname: localhost
#将来注册到注册中心的微服务包括注册中心都是用ip地址
preferIpAddress: true
client:
#是否注册到注册中心 注册中心自己不需要注册
registerWithEureka: false
#是否抓取注册中心的注册信息
fetchRegistry: false
serviceUrl:
#是微服务和客户端用来注册和发现的地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
Service微服务pom.xml
<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>
<parent>
<groupId>cn.ps</groupId>
<artifactId>SPRINGCLOUD</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SPRINGCLOUD_SERVICE</artifactId>
<dependencies>
<!-- 引入微服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- 引入mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入数据源 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 引入mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!-- 引入分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
<!-- 引入小辣椒 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
入口ServiceMain
package cn.ps;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
//启动feign
@EnableFeignClients
@RestController
public class EmpService {
public static void main(String[] args) {
new SpringApplicationBuilder(EmpService.class).web(true).run(args);
}
}
Service微服务application.yml文件
eureka:
instance:
#将来注册到注册中心的微服务包括注册中心都是用ip地址
preferIpAddress: true
client:
#是否注册到注册中心 注册中心自己不需要注册
registerWithEureka: true
#是否抓取注册中心的注册信息
fetchRegistry: true
serviceUrl:
defaultZone: http://192.168.153.132:8761/eureka/
spring:
application:
name: empservice
datasource:
url: jdbc:mysql://localhost/unit02
username: root
password: ps123456
driver-class-name: com.mysql.jdbc.Driver
server:
port: 8899
控制层Controller
package cn.ps.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import cn.ps.entity.Emp;
import cn.ps.entity.Result;
import cn.ps.service.EmpService;
@RestController
public class EmpController {
@Autowired
EmpService es;
@GetMapping(value="/emps")
public Result queryEmp(String ename,String page,String limit) {
try {
Result queryEmp = es.queryEmp(ename, page, limit);
return queryEmp;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@PostMapping(value="/emp")
public Result addEmp(@RequestBody Emp emp) {
Result result = new Result();
try {
es.addEmp(emp);
} catch (Exception e) {
result.setCode(1);
result.setMsg("新增出错:"+e.getMessage());
}
return result;
}
@DeleteMapping(value="/emp/{empno}")
public Result delEmp(@PathVariable("empno") String empno) {
Result result = new Result();
try {
es.delEmp(empno);
} catch (Exception e) {
result.setCode(1);
result.setMsg("删除出错:"+e.getMessage());
}
return result;
}
@PutMapping(value="/emp")
public Result update(@RequestBody Emp emp) {
Result result=new Result();
try{
es.update(emp);
}catch (Exception e){
result.setCode(1);
result.setMsg("修改出错:"+e.getMessage());
}
return result;
}
}
实体类entiry
Emp
package cn.ps.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
//表名
@TableName("epm")
public class Emp {
//mysql主键自动生成,不加可能会报读取超时
@TableId(type=IdType.AUTO)
private String empno;
private String ename;
private String sal;
private String phone;
private String email;
}
Result
package cn.ps.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
//表名
@TableName("epm")
public class Emp {
//mysql主键自动生成,不加可能会报读取超时
@TableId(type=IdType.AUTO)
private String empno;
private String ename;
private String sal;
private String phone;
private String email;
}
自动写sql语句Mapper
package cn.ps.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.ps.entity.Emp;
@Mapper
public interface EmpMapper extends BaseMapper<Emp>{
}
接口实现ServiceImpl
package cn.ps.service.impl;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cn.ps.entity.Emp;
import cn.ps.entity.Result;
import cn.ps.mapper.EmpMapper;
import cn.ps.service.EmpService;
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
EmpMapper em;
@GetMapping(value="/emps")
public Result queryEmp(String ename, String page,String limit) {
if(StringUtils.isEmpty(ename)) {
ename="";
}
//拼接like查询条件
QueryWrapper<Emp> qw=new QueryWrapper();
qw.like("ename", ename);
//当前页数
int curPageI=Integer.parseInt(page);
//当前条数
int pageNumI=Integer.parseInt(limit);
//进行分页和条件查询
IPage<Emp> pageData=em.selectPage(new Page(curPageI,pageNumI), qw);
Result result =new Result();
result.setCode(0);
result.setCount((int)pageData.getTotal());
result.setData(pageData.getRecords());
return result;
}
@PostMapping(value="/emp")
public void addEmp(@RequestBody Emp emp) {
em.insert(emp);
}
@DeleteMapping(value="/emp/{empno}")
public void delEmp(@PathVariable("empno") String empno) {
em.deleteById(empno);
}
@PutMapping(value="/emp")
public void update(@RequestBody Emp emp) {
em.updateById(emp);
}
}
工具类utils
分页扫描
package cn.ps.utils;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("cn.ps.controller.*.*")
public class ConfBean {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
View微服务pom.xml
<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>
<parent>
<groupId>cn.ps</groupId>
<artifactId>SPRINGCLOUD</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SPRINGCLOUD_EMPVIEW</artifactId>
<dependencies>
<!-- 引入微服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- 引入小辣椒 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- 引入feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
入口ViewMain
package cn.ps;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication
//扫描Feign
@EnableFeignClients
public class EmpView {
public static void main(String[] args) {
SpringApplication.run(EmpView.class, args);
}
}
View微服务application.yml
eureka:
instance:
#将来注册到注册中心的微服务包括注册中心都是用ip地址
preferIpAddress: true
client:
#是否注册到注册中心 注册中心自己不需要注册
registerWithEureka: true
#是否抓取注册中心的注册信息
fetchRegistry: true
serviceUrl:
defaultZone: http://192.168.153.132:8761/eureka/
spring:
application:
name: empview
server:
#程序入口使用80端口
port: 80
控制层Controller
package cn.ps.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.ps.entity.Emp;
import cn.ps.entity.Result;
import cn.ps.feign.EmpFeign;
@RestController
public class EmpController {
@Autowired
EmpFeign ef;
@GetMapping(value="/emps")
public Result queryEmp(String ename,String page,String limit){
Result queryEmp = ef.queryEmp(ename,page,limit);
return queryEmp;
}
@PostMapping(value="/emp")
public Result addEmp(Emp emp) {
Result result = new Result();
ef.addEmp(emp);
return result;
}
@DeleteMapping(value="/emp/{empno}")
public Result delEmp(@PathVariable("empno") String empno) {
Result result = new Result();
ef.delEmp(empno);
return result;
}
@PutMapping(value="/emp/{empno}")
public Result updEmp(@PathVariable("empno") String empno, Emp emp) throws Exception {
Result result=new Result();
emp.setEmpno(empno);
ef.update(emp);
return result;
}
}
Feign调用Service微服务的控制层
注意:必须加注解不加调用不了
package cn.ps.feign;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import cn.ps.entity.Emp;
import cn.ps.entity.Result;
关联Service微服务
@FeignClient(name = "EMPSERVICE")
public interface EmpFeign {
@GetMapping(value="/emps")
public Result queryEmp(@RequestParam("ename") String ename,@RequestParam("page") String page,@RequestParam("limit") String limit);
@PostMapping(value="/emp")
public void addEmp(@RequestBody Emp emp);
@DeleteMapping(value="/emp/{empno}")
public void delEmp(@PathVariable("empno") String empno);
@PutMapping(value="/emp")
public void update(@RequestBody Emp emp);
}
实体类对应Service服务的实体类可不加@TableId
前端layui
在resources下
创建一个static文件(可以是static或者public)
在static下创建一个html放入一下代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="resources/layui/css/layui.css">
<script src="resources/layui/layui.js"></script>
<script type="text/javascript" src="jquery-3.3.1.js"></script>
<script>
layui.use('form',function () {
var form = layui.form;
form.on('submit(myForm)', function(data){
layui.table.reload('empTable', {
url: 'emps'
,where: data.field
,page: curr = 1
});
return false;
});
form.on('submit(addForm)', function(data){
$.ajax({
url:'emp',
dataType:'json',
type:'post',
data:data.field,
success:function (da) {
if(da.code==0){
alert("新增成功");
layer.close(addWindow);
layui.table.reload('empTable', {
url: 'emps'
});
}else{
alert(da.msg);
}
}
})
return false;
});
form.on('submit(updateForm)', function(data){
data.field["_method"]="put";
$.ajax({
url:'emp/'+data.field.empno,
dataType:'json',
type:'post',
data:data.field,
success:function (da) {
if(da.code==0){
alert("修改成功");
layer.close(addWindow);
layui.table.reload('empTable', {
url: 'emps'
});
}else{
alert(da.msg);
}
}
})
return false;
});
})
layui.use('table', function(){
var table = layui.table;
//第一个实例
table.render({
elem: '#empTable'
,height: 312
,url: 'emps' //数据接口
,page: true //开启分页
,cols: [[ //表头
{field: 'empno', title: '雇员编号', width:160, sort: true, fixed: 'left'}
,{field: 'ename', title: '名称', width:160}
,{field: 'sal', title: '薪水', width:160}
,{field: 'email', title: '邮箱', width: 160}
,{field: 'phone', title: '手机号码', width: 160, sort: true}
,{field: 'dle', title: '操作', width: 160, sort: true,templet: function(d){
var data = JSON.stringify(d);
return "<button onclick='empDelete("+d.empno+")' >删除</button> " +
"<button onclick=\"empUpdate(this)\" data='"+data+"' >修改</button>" ;
}}
]]
});
});
function empUpdate(_this) {
var data = JSON.parse($(_this).attr("data"));
// var source = JSON.parse(event.srcElement.getAttribute("data"));
layui.use('layer', function() {
addWindow = layer.open({
type: 1,
area:['500px','450px'],
content: $("#updateForm")
});
});
layui.form.val("updateForm",data);
}
var addWindow = null;
function empAdd() {
layui.use('layer', function() {
addWindow = layer.open({
type: 1,
area:['500px','450px'],
content: $("#addForm")
});
});
}
function empDelete(empno) {
$.ajax({
url:'emp/'+empno,
dataType:'json',
type:'post',
data:{
"_method":"delete"
},
success:function (da) {
if(da.code==0){
alert("删除成功");
layui.table.reload('empTable', {
url: 'emps'
});
}else{
alert(da.msg);
}
}
})
return false;
}
</script>
</head>
<body>
<form class="layui-form" action="">
<div class="layui-inline">
<label class="layui-form-label">雇员名称</label>
<div class="layui-input-inline" style="width: 200px;">
<input type="text" name="ename" autocomplete="off" class="layui-input">
</div>
<div class="layui-input-inline" style="width: 100px;">
<button class="layui-btn" lay-submit lay-filter="myForm">查询</button>
</div>
<div class="layui-input-inline" style="width: 100px;">
<a href="javascript:empAdd()" class="layui-btn" >新增</a>
</div>
</div>
</form>
<table id="empTable" lay-filter="test"></table>
</body>
</html>
<form id="addForm" class="layui-form" style="display: none" >
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="ename" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">薪水</label>
<div class="layui-input-block">
<input type="text" name="sal" lay-verify="number" placeholder="请输入薪水" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="text" name="email" lay-verify="email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">手机号码</label>
<div class="layui-input-block">
<input type="text" name="phone" lay-verify="phone" placeholder="请输入标题" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="addForm">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
<!-- 修改 -->
<form id="updateForm" class="layui-form" lay-filter="updateForm" style="display: none" >
<input type="hidden" name="empno">
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="ename" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">薪水</label>
<div class="layui-input-block">
<input type="text" name="sal" lay-verify="number" placeholder="请输入薪水" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="text" name="email" lay-verify="email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">手机号码</label>
<div class="layui-input-block">
<input type="text" name="phone" lay-verify="phone" placeholder="请输入标题" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="updateForm">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>