- 1. 概述
- 2. App
- 3. Portal 侧
- 4. Admin Service 侧
- 666. 彩蛋
1. 概述
本文分享 Portal 创建 App 的流程,整个过程涉及 Portal、Admin Service ,如下图所示:
流程
下面,我们先来看看 App 的实体结构
老艿艿:因为 Portal 是管理后台,所以从代码实现上,和业务系统非常相像。也因此,本文会略显啰嗦。
2. App
在 apollo-common 项目中,
com.ctrip.framework.apollo.common.entity.App ,继承 BaseEntity 抽象类,应用信息实体。代码如下:
@Entity @Table(name = "App") @SQLDelete(sql = "Update App set isDeleted = 1 where id = ?") @Where(clause = "isDeleted = 0") public class App extends BaseEntity { /** * App 名 */ @Column(name = "Name", nullable = false) private String name; /** * App 编号 */ @Column(name = "AppId", nullable = false) private String appId; /** * 部门编号 */ @Column(name = "OrgId", nullable = false) private String orgId; /** * 部门名 * * 冗余字段 */ @Column(name = "OrgName", nullable = false) private String orgName; /** * 拥有人名 * * 例如在 Portal 系统中,使用系统的管理员账号,即 UserPO.username 字段 */ @Column(name = "OwnerName", nullable = false) private String ownerName; /** * 拥有人邮箱 * * 冗余字段 */ @Column(name = "OwnerEmail", nullable = false) private String ownerEmail; }
- ORM 选用 Hibernate 框架。
- @SQLDelete(…) + @Where(…) 注解,配合 BaseEntity.extends 字段,实现 App 的逻辑删除。
- 字段比较简单,胖友看下注释。
2.1 BaseEntity
com.ctrip.framework.apollo.common.entity.BaseEntity ,基础实体抽象类。代码如下:
@MappedSuperclass @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class BaseEntity { /** * 编号 */ @Id @GeneratedValue @Column(name = "Id") private long id; /** * 是否删除 */ @Column(name = "IsDeleted", columnDefinition = "Bit default '0'") protected boolean isDeleted = false; /** * 数据创建人 * * 例如在 Portal 系统中,使用系统的管理员账号,即 UserPO.username 字段 */ @Column(name = "DataChange_CreatedBy", nullable = false) private String dataChangeCreatedBy; /** * 数据创建时间 */ @Column(name = "DataChange_CreatedTime", nullable = false) private Date dataChangeCreatedTime; /** * 数据最后更新人 * * 例如在 Portal 系统中,使用系统的管理员账号,即 UserPO.username 字段 */ @Column(name = "DataChange_LastModifiedBy") private String dataChangeLastModifiedBy; /** * 数据最后更新时间 */ @Column(name = "DataChange_LastTime") private Date dataChangeLastModifiedTime; /** * 保存前置方法 */ @PrePersist protected void prePersist() { if (this.dataChangeCreatedTime == null) dataChangeCreatedTime = new Date(); if (this.dataChangeLastModifiedTime == null) dataChangeLastModifiedTime = new Date(); } /** * 更新前置方法 */ @PreUpdate protected void preUpdate() { this.dataChangeLastModifiedTime = new Date(); } /** * 删除前置方法 */ @PreRemove protected void preRemove() { this.dataChangeLastModifiedTime = new Date(); } // ... 省略 setting / getting 方法 }
- @MappedSuperclass 注解,见 《Hibernate 中 @MappedSuperclass 注解的使用说明》 文章。
- @Inheritance(…) 注解,见 《Hibernate(11)映射继承关系二之每个类对应一张表(@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)》 文章。
- id 字段,编号,Long 型,全局自增。
- isDeleted 字段,是否删除,用于逻辑删除的功能。
- dataChangeCreatedBy 和 dataChangeCreatedTime 字段,实现数据的创建人和时间的记录,方便追踪。
- dataChangeLastModifiedBy 和 dataChangeLastModifiedTime 字段,实现数据的更新人和时间的记录,方便追踪。
- @PrePersist、@PreUpdate、@PreRemove 注解,CRD 操作前,设置对应的时间字段。
- 在 Apollo 中,所有实体都会继承 BaseEntity ,实现公用字段的统一定义。这种设计值得借鉴,特别是创建时间