目 录CONTENT

文章目录

base-controller

半糖
2024-09-11 / 0 评论 / 1 点赞 / 29 阅读 / 12096 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-09-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

概述

base-controller旨在提高开发者的开发效率,开发者只需要使业务Controller继承BaseController,业务Service继承BaseService,业务Mapper继承BaseMapper,就能拥有单表增删改查等七个接口。

项目地址https://gitee.com/yan_shuai_jie/base-controller.git

项目结构

描述

annotation

注解

api

定义了数据的返回结构,可根据业务自行修改

business

核心业务包,定义了三层开发结构,也是用户直接继承使用的内容

enums

枚举类

exception

异常,可根据业务自行修改

pojo

实体类

util

工具包

技术栈

技术

版本

java泛型+反射

jdk 8

springboot

2.6.13

hutool-all

5.7.22

mybatis-plus

3.5.7

mybatis-plus-join

1.4.4.1

pagehelper

2.1.0

springfox-swagger2

2.9.2

validation

2.6.13

注意:

  • 以上框架为了不和业务项目中使用的版本冲突,maven依赖作用域使用的是provided。pagehelper因为在项目中要用到,所以作用域不为provided。

  • 如果引入项目后出现找不到方法的异常,可以将本项目对应的框架换成业务项目中的版本。

使用方法

1. 使用idea克隆项目到本地并打开。

2. 如果旨在本地安装,在maven处install,如果要在私库安装,在maven处deploy。

3. 打开需要使用的项目,这里以芋道源码的yudao-cloud项目为例,将项目的maven仓库地址和刚才安装的地址保持一致。


4. 项目的pom.xml中引入base-controller

<dependency>
    <groupId>cn.ysj</groupId>
    <artifactId>base-controller</artifactId>
    <version>${base-controller.version}</version>
</dependency>

5. 在合适的位置创建base-controller泛型上需要指定的dto、po等实体类。

package cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo;

import lombok.Data;

@Data
public class GoodsDTO  {

    /**
     * 商品id*
     */
    private Long goodsId;

    /**
     * 产品名称*
     */
    private String productName;

    /**
     * 上架状态*【0:未上架;1:上架;2:下架】
     */
    private Integer saleStatus;

    /**
     * 删除标识*【0:未删除;1:已删除】
     */
    private Boolean delFlag;

}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo;

import cn.ysj.basecontroller.annotation.BaseFlag;
import cn.ysj.basecontroller.enums.BaseFlagEnum;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("goods")
public class GoodsPO extends Model<GoodsPO> {

    private static final long serialVersionUID = 1L;

    /**
     * 商品id*
     */
    @TableId(value = "goods_id", type = IdType.ASSIGN_ID)
    private Long goodsId;

    /**
     * 产品名称*
     */
    @BaseFlag(BaseFlagEnum.NON_REPEAT)
    private String productName;

    /**
     * 上架状态*【0:未上架;1:上架;2:下架】
     */
    @BaseFlag(BaseFlagEnum.STATUS)
    private Integer saleStatus;

    /**
     * 删除标识*【0:未删除;1:已删除】
     */
    @BaseFlag(BaseFlagEnum.DEL_FLAG)
    private Boolean delFlag;

}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo;

import lombok.Data;

@Data
public class GoodsPageReq extends PageReq{

    /**
     * 产品名称*
     */
    private String productName;

}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo;

import lombok.Data;

@Data
public class GoodsListReq {
    /**
     * 产品名称*
     */
    private String productName;
}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo;

import lombok.Data;

@Data
public class GoodsSaveReq {
    /**
     * 产品名称*
     */
    private String productName;

    /**
     * 上架状态*【0:未上架;1:上架;2:下架】
     */
    private Integer saleStatus;
}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo;

import lombok.Data;

@Data
public class GoodsUpdateReq {
    /**
     * 商品id*
     */
    private Long goodsId;
    /**
     * 产品名称*
     */
    private String productName;

    /**
     * 上架状态*【0:未上架;1:上架;2:下架】
     */
    private Integer saleStatus;
}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo;

import lombok.Data;

@Data
public class GoodsUpdateStatusReq {
    /**
     * 商品id*
     */
    private Long goodsId;

    /**
     * 上架状态*【0:未上架;1:上架;2:下架】
     */
    private Integer saleStatus;
}

6. 在合适的位置创建业务Controller、service、serviceImpl、mapper,一般是逆向工程自动生成,只需要修改他们的继承类就是,业务controller继承BaseController,service和mapper类似。需要注意的是BaseController最后一个泛型service使用业务serviceImpl。

package cn.iocoder.yudao.module.product.controller.admin.brand.baseController;


import cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo.*;
import cn.ysj.basecontroller.business.controller.BaseController;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "管理后台 - 商品")
@RestController
@RequestMapping("/product/goods")
@Validated
public class GoodsController extends BaseController<GoodsDTO, GoodsPO, GoodsPageReq, GoodsListReq, GoodsSaveReq, GoodsUpdateReq, GoodsUpdateStatusReq,GoodsServiceImpl> {

}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController;


import cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo.*;
import cn.ysj.basecontroller.business.service.BaseService;

public interface GoodsService extends BaseService<GoodsDTO, GoodsPO, GoodsPageReq, GoodsListReq, GoodsSaveReq, GoodsUpdateReq, GoodsUpdateStatusReq> {

}
package cn.iocoder.yudao.module.product.controller.admin.brand.baseController;

import cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo.*;
import cn.iocoder.yudao.module.product.dal.mysql.GoodsMapper;
import cn.ysj.basecontroller.business.service.BaseServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class GoodsServiceImpl extends BaseServiceImpl<GoodsDTO, GoodsPO, GoodsPageReq, GoodsListReq, GoodsSaveReq, GoodsUpdateReq, GoodsUpdateStatusReq, GoodsMapper> implements GoodsService {
}
package cn.iocoder.yudao.module.product.dal.mysql;


import cn.iocoder.yudao.module.product.controller.admin.brand.baseController.pojo.GoodsPO;
import cn.ysj.basecontroller.business.dao.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface GoodsMapper extends BaseMapper<GoodsPO> {
}

7. 如果配置有swagger,可以在swagger页面上看到这些接口,并且swagger的接口元数据链接依然可以导入Apifox等接口工具中进行调试

8. 从上图可以看到,总共有7个接口,满足一般的单表业务需求,接下来我们测试一下。

调用page接口,参数中除了分页参数,还有个筛选条件productName为demo1,String默认模糊匹配,可以看到返回的参数正确

调用list接口,参数中productName为de,返回数据中有两条且都模糊匹配

当我们调用save的时候,保存一个名称为demo111的商品,返回数据为系统异常(如下图),这是为什么呢?其实原因很简单,打开GoodsPO我们可以看到三个注解,他们的值分别对应着“不能重复标记”、“删除标记”、“状态”,用于处理一些特殊字段如唯一、逻辑删除标记、状态,这个标记可自行扩展更多功能。

扩展

关于base-controller的基础功能就是这些,一些附加功能如参数校验、swagger也是有的,只需照常配置即可。引入了mybatis-plus-join,可以在base-controller基础上通过重写对应的Base类方法,实现自定义联表操作(联表查询、联表修改等)。由于笔者之前写这个项目的时候公司所用的权限系统不是在接口处添加注解的形式,所以暂时还没扩展,后期有时间会把这部分加上。还有就是base-controller目前还缺少一个代码逆向工具,去根据数据库表生成对应的业务层和dto等实体类,逆向功能或许会考虑可视化,有兴趣的小伙伴欢迎到代码仓库提交更新。

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区