Springboot+Mybatis+Layui前后端分离模式开发,实现增删查改、分页、批量删除功能。轻松入门。

前言

在这篇文章介绍并记录关于Springboot+Mybatis后端集成Layui后台管理,实现前后端分离模式开发。
主要实现增加、删除、查询、修改、分页、批量删除等功能。一看就明白
不说别的,就直接贴上代码实现Demo例子。

1. 后台管理新增页面代码---add.html

注: 页面只贴跟后端代码实现的相关代码有关,主要参考使用ajax方法向后端传递参数,实现前后端分离开发模式。



    
        
        
        
                
            
        
        
        
        
    
    
        

2.2 后台管理列表页面代码--list.html

注意:列表页面实现的功能主要有查询、表格分页、修改、删除、批量删除。



    
        
        
        
               
        
        
        
        
    
    
              
        

3. 后端Springboot+Mybatis代码实现功能

注意:后端使用Springboot+Mybatis,使用了通用mapper以及pagehelper插件。

3.1 使用maven项目构建,先贴上pom.xml依赖

    
        
            org.springframework.boot
            spring-boot-starter-web

        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        

        
        
            tk.mybatis
            mapper-spring-boot-starter
            2.0.2
        

        
        
            mysql
            mysql-connector-java
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
        
            com.github.pagehelper
            pagehelper-spring-boot-starter
            1.2.5
        
        
            com.google.code.gson
            gson
        

        
            org.projectlombok
            lombok
            true
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
   
        
            commons-codec
            commons-codec
            1.9
        
        
        
            org.apache.commons
            commons-collections4
            4.0
        
    

3.2 Springboot yml配置文件

server:
  servlet:
    context-path: /自己的路径
  port: 自己的端口
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 自己密码
    url: jdbc:mysql://自己的地址/数据库名字?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  type-aliases-package: com.mi.entity
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count==countSql
  page-size-zero: true
logging:
  level:
    com.mi.mapper: trace

3.3 贴上工具类

3.3.1 keyUtil 生成唯一主键

public class keyUtil {
    /**
     * 生成唯一的主键
     * 格式:时间+随机数
     * @return
     */
    public static  synchronized  String genUniqueKey(){
        Random random = new Random();
        Integer number = random.nextInt(900000)+100000;
        return System.currentTimeMillis() + String.valueOf(number);
    }
}

3.3.2 TimeUtil 转化时间工具类

public class TimeUtil {
    public static Date getNowDate(Date currentTime) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(currentTime);
        ParsePosition pos = new ParsePosition(0);
        Date currentTime_2 = formatter.parse(dateString, pos);
        return currentTime_2;
    }
}

3.3.3 统一返回数据封装类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResponse implements Serializable {
    private Integer code;
    private String message;
    private T data;
    public CommonResponse(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

3.3.4 统一返回数据封装工具类

public class ResponseVoUtil {
    public static CommonResponse success(Object object) {
             CommonResponse response = new CommonResponse();
             response.setData(object);
             response.setCode(0);
             response.setMessage("成功");
             return response;
    }
    public static CommonResponse success(){
        return success(null);
    }
    public static CommonResponse error(Integer code,String msg){
        CommonResponse response = new CommonResponse();
        response.setCode(code);
        response.setMessage(msg);
        return response;
    }
}

3.3.5 跨域配置

注意:要是前后端分离跨域不成功,需要配置这个方可配置

@Configuration
public class CorsFilter implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry corsRegistry){
        corsRegistry.addMapping("/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(1800)
                .allowedOrigins("*");
    }
}

3.3.6 Springboot 启动类

@SpringBootApplication
@MapperScan("com.mi.mapper") //自己需要扫描的mapper包名
public class WebApplication {
    public static void main(String args[]){
        SpringApplication.run(WebApplication.class,args);
    }
}

3.4 后端其它需要的类

3.4.1 实体类

注意:该实体类可以自己定义,此处只为了参考

@Data
@Table(name = "appoint_item") //填写自己数据库的表名,最好用下划线声明表,例如appoint_item举例
public class AppointItem  implements Serializable {

    /**服务id**/
    @Id
    @KeySql(useGeneratedKeys = true) //回显
    private String itemId;

    /**服务名称**/
    private String itemName;

    /**服务状态   0 正常 1 关闭**/
    private Integer itemStatus;

    /**服务描述**/
    private String itemDesc;

    /**创建时间**/
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date createTime;

    /**修改时间**/
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date updateTime;

}
3.4.2 实体类form表单

注意:该类是会接受页面传递的值,然后使用转换属性的工具转到具体的对应数据库的实体类,下面会具体实现。

@Data
public class AppointItemForm {

    private String itemId;

    /**服务名称**/
    private String itemName;

    /**服务状态   0 正常 1 关闭**/
    private Integer itemStatus;

    /**服务描述**/
    private String itemDesc;

    /**创建时间**/
    private Timestamp createTime;

    /**修改时间**/
    private Timestamp updateTime;
}
3.4.3 对应Dao层的mapper接口

注意:通过使用通用mapper插件,继续该mapper,就会有增删查改方法。

public interface AItemMapper extends Mapper {
    /**
     * 批量删除
     * @param itemIds
     * @return
     */
    public int batchDelAItem(List itemIds);
}
3.4.4 业务接口类
public interface AItemService {

    public void addAItem(AppointItem item);


    public AppointItem seleceByOne(String appointId);

    public int delectByOne(String appointId);

    public int updateItem(AppointItem item);

    /**
     * 分页
     * @param offset
     * @param pageSize
     * @return
     */
    public PageInfo selectByPages(Integer offset, Integer pageSize,String keywords);

    /**
     * 批量删除
     * @param itemIds
     * @return
     */
    public int batchDelAItem(List itemIds);
}
3.4.4 业务接口实现类
@Service
@Slf4j
public class AItemServiceImpl implements AItemService {

    @Autowired
    private AItemMapper aItemMapper;

    /**
     * 新增
     * @param item
     */
    @Override
    public void addAItem(AppointItem item) {
        aItemMapper.insertSelective(item);
    }


    /**
     * 查询一个Item
     * @param appointId
     * @return
     */
    @Override
    public AppointItem seleceByOne(String appointId) {
        return aItemMapper.selectByPrimaryKey(appointId);
    }

    /**
     * 删除一个Item
     * @param appointId
     */
    @Override
    public int delectByOne(String appointId) {
        return aItemMapper.deleteByPrimaryKey(appointId);
    }

    /**
     * 更新
     * @param item
     * @return
     */
    @Override
    public int updateItem(AppointItem item) {
        return aItemMapper.updateByPrimaryKeySelective(item);
    }

    /**
     *  分页
     * @param offset
     * @param pageSize
     * @param itemName
     * @return
     */
    @Override
    public PageInfo selectByPages(Integer offset, Integer pageSize,String itemName) {
        PageHelper.startPage(offset,pageSize);
        Example example = new Example(AppointItem.class);
        Example.Criteria criteria = example.createCriteria();
        // 1. 查询keywords 关键字
        if (!StringUtils.isEmpty(itemName) && itemName.length() > 0) {
            log.info("itemName = {}",itemName);
            criteria.andLike("itemName","%"+itemName+"%");
        }
        List itemPages = aItemMapper.selectByExample(example);
        PageInfo pageInfo = new PageInfo<>(itemPages);
        return pageInfo;
    }

    /**
     * 批量删除
     * @param itemIds
     * @return
     */
    @Override
    public int batchDelAItem(List itemIds) {
        int isBatch  = aItemMapper.batchDelAItem(itemIds);
        return isBatch;
    }

}

3.4.5 mapper.xml 文件





    
        
        
        
        
        
        
    
    
    
        item_id,item_name,item_status,item_desc,create_time,update_time
    

    
    
        DELETE FROM appoint_item WHERE item_id IN
        
            #{item}
        
    

3.5 控制器实现类-controller

注意:该controller就是后台管理页面通过ajax调用controller的api接口实现前后端分离模式开发。

RestController
@Slf4j
@RequestMapping("/aItem")
public class StoreAItemController {

    @Autowired
    private AItemService aItemService;

    /**
     * 新增
     * @param itemForm
     * @return
     */
    @PostMapping(value = "/addAItem")
    public CommonResponse addAItem(AppointItemForm itemForm){
        log.info("【使用addAItem方法】");
        //1. 创建服务实体类
        AppointItem item = new AppointItem();
        //2. 判断服务名称是否为空
        if (!StringUtils.isEmpty(itemForm.getItemName())){
            itemForm.setItemId(keyUtil.genUniqueKey());
            BeanUtils.copyProperties(itemForm,item);
            item.setCreateTime(TimeUtil.getNowDate(new java.util.Date()));
            aItemService.addAItem(item);
        }
        return ResponseVoUtil.success();
    }

    /**
     * 查询一个Item
     * @param appointId
     * @return
     */
    @GetMapping(value = "/selectAItem/{id}")
    public CommonResponse selectAItem(@PathVariable("id")String appointId){
        log.info("【使用selectAItem 方法】  = {}",appointId);
        // 1.判断appointid是否为空
        if (!StringUtils.isEmpty(appointId)){
            AppointItem item = aItemService.seleceByOne(appointId);
            return ResponseVoUtil.success(item);
        }
        // 2. 为空就返回null
        return null;
    }

    /**
     * 删除一个Item
     * @param appointId
     * @return
     */
    @DeleteMapping(value = "/deletetAItem/{id}")
    public CommonResponse deletetAItem(@PathVariable("id")String appointId){
        log.info("【使用delectAItem】 = {}",appointId);
       
            int isDelete = aItemService.delectByOne(appointId);
            return ResponseVoUtil.success(isDelete);
    }

    /**
     * 分页
     * @param offset
     * @param size
     * @param itemName
     * @return
     */
    @GetMapping(value = "/pagesAItems")
    public CommonResponse pagesAItems(@RequestParam(value = "page",defaultValue = "0")Integer offset,
                                      @RequestParam(value = "size",defaultValue = "10")Integer size
                                     ,  @RequestParam(value = "itemName",required = false) String itemName
    ){
        log.info("【使用pagesAItems】");
        log.info(" itemName = {}",itemName);
        PageInfo pageInfo = aItemService.selectByPages(offset,size,itemName);

          return   ResponseVoUtil.success(pageInfo);
    }

    /**
     * 更新预约服务
     * @param itemForm
     * @return
     */
    @PostMapping(value = "updateAItem")
    public CommonResponse updateAItem(@RequestBody AppointItemForm itemForm){
        log.info("【使用updateAItem】");
        log.info(" item = {}",itemForm);

        AppointItem item = new AppointItem();
        if (!StringUtils.isEmpty(itemForm.getItemName())){
            BeanUtils.copyProperties(itemForm,item);
            item.setUpdateTime(TimeUtil.getNowDate(new java.util.Date()));
            int isUpdate = aItemService.updateItem(item);
            return ResponseVoUtil.success(isUpdate);
        }
        return null;
    }

    /**
     * 批量删除
     * @param itemIds
     * @return
     */
    @PostMapping(value = "/batchDelAItem/{itemIds}")
    public CommonResponse batchDelAItem (@PathVariable("itemIds") String itemIds){
         log.info("【使用batchDelAItem】");
         log.info("itemIds =  {}",itemIds);
         List idsList = new ArrayList();
         String [] strIds = itemIds.split(",");
         for (String str : strIds){
             idsList.add(str);
         }
         log.info("idsList = {}",idsList);
         int isBatch = aItemService.batchDelAItem(idsList);
        return ResponseVoUtil.success(isBatch);
    }
}

4 表格分页效果图展示

4.1 新增页面效果图
image.png
4.2 列表页面效果图
image.png
4.3 查询效果图
image.png
4.4 修改效果图
image.png
4.5 删除效果图
image.png
4.6 批量删除效果图
image.png

5.结语

大致就把一个Demo案例实现了,目前只有增删查改、分页、批量删除功能。需要的同学可以参考该Demo的实例实现自己的相关功能。
如果觉得不错的话就为我点个赞吧。
要是有问题可在留言提问,我们来讨论讨论。

你可能感兴趣的:(Springboot+Mybatis+Layui前后端分离模式开发,实现增删查改、分页、批量删除功能。轻松入门。)