errors
Failed to load YAML frontmatter: (<unknown>): mapping values are not allowed in this context at line 2 column 6

基于元模型驱动的引擎,核心在于不用理会机械的CRUD,而只需要将主要经历专注在业务领域建模上,当模型建完后,crud的能力会自动具备。以下是三个demo模型:

2.6.1.1. 组织

通过@Model注解定义模型名称,@Property声明属性, @ManyToOne和@OneToMany声明er关系:

@Model(name = "TestOrg",description = "测试组织")
public class TestOrg extends BaseModel {

	@Property(displayName = "名称",displayForModel=true )
	private String name;

	@ManyToOne
	@JoinColumn(name = "parent_id")
	private TestOrg parent;

    @OneToMany
    private List<TestUser> userList;

    public TestOrg getParent() {
        return (TestOrg) this.get("parent");
    }

    public TestOrg setParent(TestOrg parent) {
        this.set("parent", parent);
        return this;
    }


    public List<TestUser> getUserList() {
        return (List<TestUser>) this.get("userList");
    }

    public TestOrg setUserList(List<TestUser> userList) {
        this.set("userList", userList);
        return this;
    }

    public String getName() {
        return (String) this.get("name");
    }

    public TestOrg setName(String name) {
        this.set("name", name);
        return this;
    }
}

2.6.1.2. 用户

也可以只增加@Model,引擎会将类名作为模型名称以及表名。通过@Validate可以增加各类校验,get和set方法可以通过idea模板自动生成:

@Model
public class TestUser extends BaseModel {

    @Property(columnName = "name", displayName = "名称",displayForModel = true)
    //@Validate.NotBlank
    private String name;

    @Validate.Email(message = "邮箱格式不正确")
    @Property(columnName = "email", displayName = "邮箱",dataType = DataType.TEXT)
    private String email;


    @Property(columnName = "status", displayName = "状态", dataType = DataType.ENUM, values = {
            @ModelEnum(label = "启用", value = "1"),
            @ModelEnum(label = "禁用", value = "0")}, defaultValue = "1")
    private Boolean status;

    @Property(columnName = "phone", displayName = "电话号码")
    @Validate.Phone(message = "手机号格式不正确")
    private String phone;

    @Validate.Max(110)
    @Property(columnName = "age", displayName = "年龄")
    private Integer age;

    @Validate.NotBlank
    @Property(columnName = "password", displayName = "密码")
    private String password;

    @Property(columnName = "test", displayName = "测试")
    private String test;

    @Property(columnName = "method", computeMethod = "method", displayName = "计算方法")
    private String method;

    @Property(columnName = "script", computeScript = "3+100", displayName = "计算脚本")
    private String script;

    @ManyToOne(displayName = "组织机构", cascade = {CascadeType.DEL_SET_NULL})
    @JoinColumn(name = "org_id", referencedColumnName = "id")
    private TestOrg org;


	@Property(displayName = "selectStatus", defaultValue = "1")
	@Selection(values = { @Option(label = "启用", value = "1"), @Option(label = "禁用", value = "2"), @Option(label = "已删除", value = "3") })
	private String selectStatus;

	@Property(displayName = "selectMetod")
	@Selection(method = "selectMetod")
	private String selectMetod;

	@Property(displayName = "selectModel")
	@Selection(model = "TestOrg", properties = "name", orderBy = "name desc")
	private String selectModel;


    public Date getCreate() {
        return getDate("create");
    }

    public void setCreate(Date create) {
        this.set("create", create);
    }

    public String getPhone() {
        return getStr("phone");
    }

    public void setPhone(String phone) {
        this.set("phone", phone);
    }

    public String getEmail() {
        return getStr("email");
    }

    public void setEmail(String email) {
        this.set("email", email);
    }

    public void setPassword(String password) {
        this.set("password", password);
    }

    public String getPassword() {
        return getStr("password");
    }


    public String getName() {
        return getStr("name");
    }

    public void setName(String name) {
        this.set("name", name);
    }

    public Integer getAge() {
        return getInt("age");
    }

    public void setAge(Integer age) {
        this.set("age", age);
    }

    public TestOrg getOrg() {
        return (TestOrg) this.get("org");
    }

    public TestUser setOrg(TestOrg org) {
        this.set("org", org);
        return this;
    }
}

get模板为:

#if($field.modifierStatic)
static ##
#end    
$field.type ##
#if($field.recordComponent)
    ${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
  is##
#else
  get##
#end
${name}##
#end
() {
  #if($field.type == "java.util.Date")
    return getDate("$field.name");
  #elseif($field.type == "java.sql.Timestamp")
    return getTimestamp("$field.name");
  #elseif($field.type == "java.time.LocalDateTime")
    return getLocalDateTime("$field.name");
  #elseif($field.type == "java.sql.Time")
    return getTime("$field.name");
  #elseif($field.type == "java.lang.Integer")
    return getInt("$field.name");
  #elseif($field.type == "java.lang.Long")
    return getLong("$field.name");
  #elseif($field.type == "java.lang.Double")
    return getDouble("$field.name");
  #elseif($field.type == "java.lang.Float")
    return getFloat("$field.name");
  #elseif($field.type == "java.lang.Short")
    return getShort("$field.name");
  #elseif($field.type == "java.lang.Byte")
    return getByte("$field.name");
  #elseif($field.type == "java.lang.Boolean")
    return getBoolean("$field.name");
  #elseif($field.type == "java.lang.String")
    return getStr("$field.name");
  #elseif($field.type == "java.lang.Number")
    return getNumber("$field.name");
  #elseif($field.type == "java.math.BigDecimal")
    return getBigDecimal("$field.name");
  #elseif($field.type == "java.math.BigInteger")
    return getBigInteger("$field.name");
  #else
    return ($field.type)this.get("$field.name");
  #end
}

set模板为:

#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
$classname set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) {
#if ($field.name == $paramName)
    #if (!$field.modifierStatic)
    this.##
    #else
        $classname.##
    #end
#end
set("$field.name", $paramName);
return this;
}

2.6.2. 属性校验说明

TestUser的password通过@Validate.NotBlank设置不能为空的校验 ,呈现效果:

img

TestUser的email通过@Validate.Phone(message = "手机号格式不正确")设置手机格式的校验,呈现效果:

img

2.6.3. ER关系说明

​ ● OneToMany 一对多

@OneToMany
private List<TestUser> userList;

​ ● ManyToOne 多对一

@ManyToOne(displayName = "组织机构")@JoinColumn(name = "org_id", referencedColumnName = "id")
private TestOrg org;

​ ● ManyToMany 多对多

@ManyToMany
@JoinTable(name = "role_user", joinColumns = @JoinColumn(name = "role_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "user_id", nullable = false))
private List<TestUser> userList;