我们使用的是 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
像这样:)
接下来,我们试试在 IDEA 中打开这个 backend 这个目录:)
嗯, 看起来没啥问题, 来,跑起来看看, 不出意外的话,应该不会出意外的:)
ok , 到这里,问题不大的话应该已经初始化好了项目,那么接下来,我们来尝试写一个 供应商 的相关 api 服务吧:)
要求按下表实现供应商的 创建 修改 查询,但 不允许删除。
开始之前, 我们先把 供应商 这个模块的字段定义一下:
字段 key | 字段名称 | 字段类型 | 其他说明 |
---|---|---|---|
code | 供应商编码 | 字符串 | 唯一不重复 |
name | 供应商名称 | 字符串 | 必填 |
level | 供应商级别 | 数字 | 必填, 只能选枚举 1,2,3 |
phone | 手机号 | 字符串 | 非必填,但填就需要验证格式 |
实体: 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 接口了,跑起来看看:)
用测试工具分别测了一下,没有问题,但是除了 供应商编码 有唯一约束之外, 还不满足需求中的一些约定。
我们得按需求中的一些要求来一个个实现约束:)
这个简单,继承控制器的时候,注解一下:
@Extends(exclude = Api.Delete)
public class SupplierController extends RootEntityController<SupplierService, SupplierEntity> {
}
当然,这里是排除了继承的 Delete 接口,使用的黑名单机制,当然你也可以手动去白名单放出需要继承的接口。
其实吧,不嫌麻烦的话,你也可以手动去处理下 delete 这个方法,当然,我这里的方式有点懒。
这个也很简单,直接在 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;
测试一下,没问题。
好了,验证也加上了,之后的文章我们来加更多的验证,今天就到这吧:)
当然,上面只是实现了非常简单的几个接口,目的是为下一篇前端的文章提供服务。 后续如果有机会,我们再来深入的实现一些功能,再说吧。
上面所有的代码都在 Github 欢迎食用。
欢迎关注下一篇前端的文:)
文中提到几个开源地址:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.