1. 搭建项目
在blog父工程里面,新建maven工程 blog-admin
在resource下添加yaml文件
server:
port: 8777
spring:
application:
name: admin_blog
redis:
host: 8.136.84.238
port: 6379
password: 18081736467xr
datasource:
url: jdbc:mysql://8.136.84.238:3306/blog?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: mydb
password: 18081736467xr
driver-class-name: com.mysql.jdbc.Driver
druid:
filters: stat,wall,slf4j
stat-view-servlet:
enabled: true
login-password: 18081736467xr
login-username: mydb
reset-enable: false
web-stat-filter:
enabled: true
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
url-pattern: /*
aop-patterns: com.atguigu.boot.*
filter:
stat:
slow-sql-millis: 1000
log-slow-sql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false
# 查看sql日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:com.example.blog.dao.mapper/*.xml
# config-location: classpath:mybatisPlus/mybatis-config.xml
global-config: # 逻辑删除配置
db-config:
# 代表数据库前缀为ms_
table-prefix: ms_
logic-delete-field: flag #全局逻辑删除字段值
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 排除 默认使用的logback -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<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>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
添加启动类
package com.example.admin;
import com.alibaba.fastjson.annotation.JSONField;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AdminApp {
public static void main(String[] args) {
SpringApplication.run(AdminApp.class,args);
}
}
MP配置类
package com.example.admin.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.example.admin.mapper")
public class MybatisPlusConfig {
//分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
查询:
前端传递的参数为:
pagination: {//分页相关模型数据
currentPage: 1,//当前页码
pageSize:2,//每页显示的记录数
total:0,//总记录数
queryString:null//查询条件
},
需要的参数为:不仅需要数据,还需要对应的总条数
findPage() {
axios.post("/admin/permission/permissionList",this.pagination).then((res)=>{
if (res.data.success){
this.dataList = res.data.data.list;
this.pagination.total = res.data.data.total;
}
}).catch((error)=>{
if (error == "Error: Request failed with status code 403"){
this.$message.error("无操作权限");
}
});
},
后端用pageParam接收
package com.example.admin.vo.params;
import lombok.Data;
@Data
public class PageParam
{
private Integer currentPage;
private Integer pageSize;
private String queryString;
}
返回的是PermissionResult
package com.example.admin.vo.params;
import lombok.Data;
import java.util.List;
@Data
public class PermissionResult<T>
{
private List<T> list;
private Long total;
}
因此,后端需要使用到MP的分页器
AdminController:
package com.example.admin.controller;
import com.example.admin.service.PermissionService;
import com.example.admin.vo.Result;
import com.example.admin.vo.params.PageParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("admin")
public class AdminController
{
@Autowired
private PermissionService permissionService;
@PostMapping("permission/permissionList")
public Result listPermission(@RequestBody PageParam pageParam)
{
return permissionService.listPermission(pageParam);
}
}
PermissionServiceImpl:
package com.example.admin.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.admin.mapper.PermissionMapper;
import com.example.admin.pojo.Permission;
import com.example.admin.vo.Result;
import com.example.admin.vo.params.PageParam;
import com.example.admin.vo.params.PermissionResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PermissionServiceImpl implements PermissionService
{
@Autowired
private PermissionMapper permissionMapper;
@Override
public Result listPermission(PageParam pageParam)
{
Page<Permission> page = new Page(pageParam.getCurrentPage(),pageParam.getPageSize());
LambdaQueryWrapper<Permission> queryWrapper = new LambdaQueryWrapper<>();
if(StringUtils.isNotEmpty(pageParam.getQueryString()))
{
queryWrapper.eq(Permission::getName,pageParam.getQueryString());
}
Page<Permission> permissionPage = permissionMapper.selectPage(page, queryWrapper);
PermissionResult<Permission> PermissionResult = new PermissionResult<>();
PermissionResult.setList(permissionPage.getRecords());
PermissionResult.setTotal(permissionPage.getTotal());
return Result.success(PermissionResult);
}
}
CRUD就比较简单了:
AdminController:
package com.example.admin.controller;
import com.example.admin.pojo.Permission;
import com.example.admin.service.PermissionService;
import com.example.admin.vo.Result;
import com.example.admin.vo.params.PageParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("admin")
public class AdminController
{
@Autowired
private PermissionService permissionService;
@PostMapping("permission/permissionList")
public Result listPermission(@RequestBody PageParam pageParam)
{
return permissionService.listPermission(pageParam);
}
@PostMapping("permission/add")
public Result add(@RequestBody Permission permission){
return permissionService.add(permission);
}
@PostMapping("permission/update")
public Result update(@RequestBody Permission permission){
return permissionService.update(permission);
}
@GetMapping("permission/delete/{id}")
public Result delete(@PathVariable("id") Long id){
return permissionService.delete(id);
}
}
PermissionServiceImpl:
package com.example.admin.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.admin.mapper.PermissionMapper;
import com.example.admin.pojo.Permission;
import com.example.admin.vo.Result;
import com.example.admin.vo.params.PageParam;
import com.example.admin.vo.params.PermissionResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PermissionServiceImpl implements PermissionService
{
@Autowired
private PermissionMapper permissionMapper;
@Override
public Result listPermission(PageParam pageParam)
{
Page<Permission> page = new Page(pageParam.getCurrentPage(),pageParam.getPageSize());
LambdaQueryWrapper<Permission> queryWrapper = new LambdaQueryWrapper<>();
if(StringUtils.isNotEmpty(pageParam.getQueryString()))
{
queryWrapper.eq(Permission::getName,pageParam.getQueryString());
}
Page<Permission> permissionPage = permissionMapper.selectPage(page, queryWrapper);
PermissionResult<Permission> PermissionResult = new PermissionResult<>();
PermissionResult.setList(permissionPage.getRecords());
PermissionResult.setTotal(permissionPage.getTotal());
return Result.success(PermissionResult);
}
@Override
public Result add(Permission permission)
{
permissionMapper.insert(permission);
return Result.success(null);
}
@Override
public Result update(Permission permission)
{
permissionMapper.updateById(permission);
return Result.success(null);
}
@Override
public Result delete(Long id)
{
permissionMapper.deleteById(id);
return Result.success(null);
}
}
不过前端的分页查询出现了一点问题。
在最后一页,删除最后一个数据的时候,该页面会显示无数据的状态,所以需要进行一个判断
handleDelete(row){
console.log("1",this.pagination)
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
axios.get("/admin/permission/delete/"+row.id).then((res)=>{
if (res.data.success){
this.$message.success("删除成功");
if(this.pagination.currentPage === parseInt((this.pagination.total/this.pagination.pageSize)+1) && Number(this.pagination.total%this.pagination.pageSize) ===1)
{
console.log("this.pagination.currentPage",this.pagination.currentPage)
this.handleCurrentChange(this.pagination.currentPage-1)
}else
{
this.findPage();
}
}
}).catch((error)=>{
if (error == "Error: Request failed with status code 403"){
this.$message.error("无操作权限");
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
});
});
如果当前总的记录数/每页的记录数+1等于当前页,说明当前页是最后一页
并且,当前总的记录数%每页的记录数为1,说明是最后一页只有一个数据
合并起来就是,当前页是最后一页,并且最后一页只有一个数据,就将当前页-1,再重新查询
//切换页码
handleCurrentChange(currentPage) {
this.pagination.currentPage = currentPage;
this.findPage();
},