V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Hamm
V2EX  ›  Java

用 AirPower4J,我们来写个后端服务吧:)

  •  1
     
  •   Hamm · 2023-08-14 21:54:17 +08:00 · 1207 次点击
    这是一个创建于 496 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一、 初始化项目

    我们使用的是 Java SpringBoot JPA IDEA 这套装备来写后端服务, 代码版本使用 Git 来管理。

    那么,首先我们来用 AirPower4J 初始化一个后端项目吧:)

    # 先把宿主项目和依赖项目都拉下来
    
    # 0. 先创建个 backend 的目录
    
    mkdir backend && cd backend
    
    # 1. clone 宿主项目
    git clone https://github.com/HammCn/AirPowerJavaDemo.git MyNewProject
    
    # 2. clone 依赖项目
    git clone https://github.com/HammCn/AirPower4J.git
    

    像这样:)

    截屏 2023-08-07 21.05.59.png

    接下来,我们试试在 IDEA 中打开这个 backend 这个目录:)

    截屏 2023-08-07 21.15.39.png

    嗯, 看起来没啥问题, 来,跑起来看看, 不出意外的话,应该不会出意外的:)

    image.png

    ok , 到这里,问题不大的话应该已经初始化好了项目,那么接下来,我们来尝试写一个 供应商 的相关 api 服务吧:)

    二、 开始编码

    1. 需求梳理

    要求按下表实现供应商的 创建 修改 查询,但 不允许删除

    开始之前, 我们先把 供应商 这个模块的字段定义一下:

    字段 key 字段名称 字段类型 其他说明
    code 供应商编码 字符串 唯一不重复
    name 供应商名称 字符串 必填
    level 供应商级别 数字 必填, 只能选枚举 1,2,3
    phone 手机号 字符串 非必填,但填就需要验证格式

    2. 编写相关的文件

    实体: SupplierEntity

    @EqualsAndHashCode(callSuper = true)
    @Accessors(chain = true)
    @Entity
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @DynamicInsert
    @DynamicUpdate
    @Table(name = "supplier")
    @Description("供应商")
    public class SupplierEntity extends BaseEntity<SupplierEntity> {
        @Description("供应商编码")
        @Column(columnDefinition = "varchar(255) default '' comment '供应商编码'", unique = true)
        private String code;
    
        @Description("供应商名称")
        @Column(columnDefinition = "varchar(255) default '' comment '供应商名称'")
        private String name;
    
        @Description("供应商级别")
        @Column(columnDefinition = "int default 3 comment '供应商级别'")
        private Integer level;
    
        @Description("手机号")
        @Column(columnDefinition = "varchar(255) default '' comment '手机号'")
        private String phone;
    

    数据源: SupplierRepository

    @Repository
    public interface SupplierRepository extends RootRepository<SupplierEntity> {
    }
    

    服务: SupplierService

    @Service
    public class SupplierService extends RootService<SupplierEntity, SupplierRepository> {
    }
    

    控制器: SupplierController

    @RestController
    @RequestMapping("supplier")
    @Description("供应商")
    @Permission(login = false)
    public class SupplierController extends RootEntityController<SupplierService, SupplierEntity> {
    }
    

    ok ,可以看到上面的除了实体字段声明和枚举声明外,全是我从其他包里复制出来改改的,当然,你可以选择一些好玩的自动生成。

    不管了,现在这个 SupplierController 应该是已经完整继承了增删改查的一些 api 接口了,跑起来看看:)

    用测试工具分别测了一下,没有问题,但是除了 供应商编码 有唯一约束之外, 还不满足需求中的一些约定。

    image.png

    3. 添加约束代码

    我们得按需求中的一些要求来一个个实现约束:)

    3.1 不允许删除

    这个简单,继承控制器的时候,注解一下:

    @Extends(exclude = Api.Delete)
    public class SupplierController extends RootEntityController<SupplierService, SupplierEntity> {
    }
    

    当然,这里是排除了继承的 Delete 接口,使用的黑名单机制,当然你也可以手动去白名单放出需要继承的接口。

    image.png

    其实吧,不嫌麻烦的话,你也可以手动去处理下 delete 这个方法,当然,我这里的方式有点懒。

    3.2 必填验证/枚举验证/手机验证

    这个也很简单,直接在 SupplierEntity 里标记一下:

    @Description("供应商编码")
    @NotNull(groups = {WhenUpdate.class, WhenAdd.class}, message = "供应商编码不能为空")
    @Column(columnDefinition = "varchar(255) default '' comment '供应商编码'", unique = true)
    private String code;
    
    @Description("供应商名称")
    @NotNull(groups = {WhenUpdate.class, WhenAdd.class}, message = "供应商名称不能为空")
    @Column(columnDefinition = "varchar(255) default '' comment '供应商名称'")
    private String name;
    
    @Description("供应商级别")
    @Column(columnDefinition = "int default 3 comment '供应商级别'")
    @NotNull(groups = {WhenUpdate.class, WhenAdd.class}, message = "供应商级别不能为空")
    @Dictionary(value = SupplierLevel.class, message = "供应商级别不在允许范围")
    private Integer level;
    
    @Description("手机号")
    @Column(columnDefinition = "varchar(255) default '' comment '手机号'")
    @MobilePhone
    private String phone;
    

    测试一下,没问题。

    image.png

    好了,验证也加上了,之后的文章我们来加更多的验证,今天就到这吧:)

    三、 收尾

    当然,上面只是实现了非常简单的几个接口,目的是为下一篇前端的文章提供服务。 后续如果有机会,我们再来深入的实现一些功能,再说吧。

    上面所有的代码都在 Github 欢迎食用。

    欢迎关注下一篇前端的文:)

    文中提到几个开源地址:

    依赖仓库: https://github.com/HammCn/AirPower4J

    宿主项目: https://github.com/HammCn/AirPowerJavaDemo

    第 1 条附言  ·  2023-08-14 22:43:12 +08:00

    主要是给下面的文章写一些接口测试

    https://www.v2ex.com/t/965280

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6088 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:11 · PVG 10:11 · LAX 18:11 · JFK 21:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.