基本介绍Halo项目定义了一些实体类,用于存储博客中的相关信息,如用户信息,文章信息等。在详细了解设计理念和之前Halo的实现过程,最好了解一下一个完整的博客系统由哪些元素组成。实体类Halo中除了BaseEntity之外的每个实体类都对应一个数据表。以User类为例,每个User对象对应users表中的一条记录,每个对象属性的值也等于数据表中的值。相应字段的值。User类定义如下:@Data//Lombok注解,自动生成get()、set()、toString()等方法@Entity//JPA注解,声明该类为实体类,必须使用with@Id@Table(name="users")//JAP注解,声明该类映射到数据库的users数据表@ToString(callSuper=true)//Lombok注解,callSuper=true表示该属性调用toString()方法时输出父类的@EqualsAndHashCode(callSuper=true)//自动生成equals()和hashCode()方法,默认callSuper为false,true表示调用equals()方法比较equals()方法时会调用父类publicclassUserextendsBaseEntity{@Id//JPA注解,声明主键@GeneratedValue(strategy=GenerationType.IDENTITY)//JPA注解,声明主键生成策略,IDENTITY表示使用自增id@Column(name="id")//JPA注解,声明实体类属性id映射到数据表中的字段idprivateIntegerid;/***用户名。*/@Column(name="username",columnDefinition="varchar(50)notnull")privateString用户名;/***用户昵称,用于页面显示。*/@Column(name="昵称",columnDefinition="varchar(255)notnull")privateS昵称;/***密码。*/@Column(name="password",columnDefinition="varchar(255)notnull")privateStringpassword;/***用户邮箱。*/@Column(name="email",columnDefinition="varchar(127)default''")privateStringemail;/***用户头像。*/@Column(name="avatar",columnDefinition="varchar(1023)default''")privateStringavatar;/***用户描述。*/@Column(name="description",columnDefinition="varchar(1023)default''")privateStringdescription;/***过期时间。*/@Column(name="expire_time",columnDefinition="timestampdefaultCURRENT_TIMESTAMP")@Temporal(TemporalType.TIMESTAMP)privateDateexpireTime;@OverridepublicvoidprePersist(){super.prePersist();编号=空;如果(电子邮件==null){电子邮件="";}if(avatar==null){avatar="";}if(description==null){description="";}if(expireTime==null){expireTime=DateUtils.now();注解说明:@Data:Lombok注解,自动生成get()、set()、toString()等方法@Entity:JPA注解,声明类为实体类,必须与@Id配合使用。@Table:JAP注解,声明该类对应数据库中的一张数据表,name表示表名。@ToString:lombok注解,callSuper=true表示调用toString()方法时会输出父类的属性。@EqualsAndHashCode:自动生成equals()和hashCode()方法。默认callSuper为false,即equals()在方法比较时会调用父类的equals()(如果父类的equals()返回false,则直接返回false,否则继续比较).@Id:JPA注解,声明主键。@GeneratedValue:JPA注解,声明主键的生成策略,IDENTITY表示使用自增id。@Column:JPA注解,声明实体对象的属性映射到数据表中的哪个字段,name指定字段名,columnDefinition指定字段的定义。用户名、昵称和电子邮件地址等用户数据在User类中定义。Halo使用JPA将实体对象持久化到数据库中,即在数据表users的各个字段中存储User对象的各个属性。JPA支持自动创建数据表,所以在启动项目之前不需要创建表。JPA的使用可以参考SpringBoot集成SpringDataJPA。User类继承自BaseEntity。BaseEntity类定义了一些常用的属性,如createTime、updateTime、deleted,分别表示创建时间、修改时间、是否删除用户。用户表中有相应的字段。另外,BaseEntity类定义了三个方法,分别是prePersist()、preUpdate()和preRemove():prePersist()方法在对象被持久化到数据库之前被调用。preUpdate()方法在对象的某个属性发生变化时被调用,比如更新实体的update_time。在从数据库中删除对象之前调用preRemove()方法。BaseEntity不对应某个数据表,通过@MappedSuperclass修饰,@MappedSuperclass是一个JPA注解,作用于实体类的父类,受注解影响的类不会映射到数据表,但是它的属性会映射到子类对应的数据表中。也就是说,不同实体类的公共属性可以定义在同一个父类中。子类继承父类后,父类中的这些公共属性会持久化到子类对应的数据表中。BaseEntity类定义如下:@Data@ToString@MappedSuperclass//JPA注解,作用于实体类的父类,注解影响的类不会映射到数据表,但会映射其属性到子类的数据表@EqualsAndHashCodepublicclassBaseEntity{/***创建时间。*/@Column(name="create_time",columnDefinition="timestampdefaultCURRENT_TIMESTAMP")@Temporal(TemporalType.TIMESTAMP)privateDatecreateTime;/***更新时间。*/@Column(name="update_time",columnDefinition="timestampdefaultCURRENT_TIMESTAMP")@Temporal(TemporalType.TIMESTAMP)privateDateupdateTime;/***删除标志。*/@Column(name="deleted",columnDefinition="TINYINTdefault0")privateBooleandeleted=false;@PrePersist//当实体对象被插入数据库时??发生@PrePersist事件protectedvoidprePersist(){deleted=false;现在日期=DateUtils.now();如果(createTime==null){createTime=现在;}如果(更新时间==null){更新时间=现在;}}@PreUpdate//@PreUpdate事件在实体状态同步到数据库之前触发protectedvoidpreUpdate(){updateTime=newDate();}@PreRemove//@PreRemove事件从数据库触发实体TriggerprotectedvoidpreRemove(){updateTime=newDate();}}在删除之前。数据表项目启动成功后,JPA会自动为实体类生成对应的数据表。可以用Navicat查看MySQL中名为'halodb'的数据库(自己配置的库名),发现自动创建了如下数据表:下面介绍不同数据表的作用和含义对应的字段。由于很多实体类继承自BaseEntity,所以不同的数据表中会有一些共同的字段。如:id:主键(虽然在BaseEntity中没有定义,但是存在于各个子类中)。crate_time:创建时间。deleted:是否被删除。update_time:更新时间。下面介绍各个数据表中具体字段的具体含义:1.attachments:附件表,用于存放图片和文件。file_key:文件的key,根据file_key可以删除文件。高度:图像的高度。media_type:媒体类型,例如text/html、image/jpeg等。name:附件的名称。path:附件的存放路径。大小:附件的大小。suffix:附件的后缀,如png、html等。thumb_path:缩略图的访问路径,该路径指定的资源可以作为封面图片。type:附件的上传类型,比如上传到本地(type为0)、阿里云(type为4)。宽度:图像宽度。2.Categories:文章分类表,发布文章时,可以设置文章所属的分类。解密:描述。名称:类别名称。parent_id:父目录id。密码:密码。蛞蝓:别名。slug_name:项目中未使用。缩略图:类别的封面图像。3、comment_black_list:评论黑名单表,用于禁止某个ip评论。ban_time:禁止时间。ip_address:禁止的ip。4.评论:评论表单,可以评论文章、回复评论、评论页面(友情链接、图库、日志等)。type:评论文章时type为0,评论页面时type为1。allow_notification:是否允许通知。author:评论者姓名。author_url:评论者的url。内容:评论内容。电子邮件:评论者的电子邮件。gravatar_md5:评论者头像。ip_address:评论者的ip。is_admin:评论者是否博主。parent_id:如果是回复评论,parent_id就是评论的id;如果评论一篇文章,parent_id为0。post_id:评论在哪个帖子或哪个页面。status:评论的状态,0表示已发布,1表示待处理,2表示已加入回收站。top_priority:是否坚持到最前面。user_agent:用户代理,例如浏览器。5.Journals:用户日志表。在Halo中,用户可以共享日志(记录生活日志),日志信息存储在journals表中。内容:日志内容。喜欢:喜欢的数量。source_content:原始内容。type:日志类型,公共日志类型为0,私人日志类型为1。6.links:友情链接列表,用于访问其他博客或资源。描述:描述。标志:标志。姓名:姓名。优先级:排序编号。team:它所属的组。网址:链接。7.logs:系统日志表,记录用户操作。内容:日志内容。ip_address:运营商的ip。log_key:log_key一般是操作对象的标识,比如发布文章时log_key是文章id,log_key是登录时用户的userName。type:日志类型,比如发布文章时article,type为5,登录时type为25。8.menus:菜单表,博客首页有多个菜单,每个菜单可以是多级菜单。图标:图标。name:名称parent_id:父菜单的id。priority:优先级,用于博客首页的菜单排序。target:可选_self和_blank,_self表示打开当前页面菜单指向的链接;_blank表示在新页面打开链接。team:它所属的组。url:菜单指向的链接。9.metas:元数据表,用于设置文章或页面的属性,发布文章或页面时可在“高级”选项中操作。type:设置文章的元数据时,type为0,设置页面的元数据时,type为1。mate_key:元数据key,可以设置文章是否支持点赞,是否支持复制等。mate_value:keypost_id对应的值:文章或页面的id。10.options:博客设置表,或称options表,用于存放系统设置信息。用户可以在Dashboard界面的“系统”->“博客设置”中进行配置。option_key:博客的选项,如博客标题blog_title、主题theme、is_installed等。type:类型为0表示博客内部选项,1表示自定义选项。option_value:选项对应的值。11.photos:图片表,Halo可以设置一个图库,图库页面上的图片存放在photos表中。描述:描述。喜欢:喜欢的数量。location:拍摄地点。姓名:姓名。take_time:拍摄日期。team:它所属的组。缩略图:缩略图地址。url:图片链接。12.post_categories:文章-类别关系表,记录每篇文章属于哪个类别。category_id:类别id。post_id:帖子编号。13.post_tags:文章标签表,记录了文章的标签。post_id:帖子编号。tag_id:标签id。14.posts:article表也是用来存放页面的。type:文章类型为0,页面类型为1。disallow_comment:是否禁止评论。edit_time:编辑时间。editor_type:编辑器类型。format_content:格式化内容。喜欢:喜欢的数量。meta_description:自定义描述。meta_keywords:自定义关键字。original_content:原创内容。密码:密码。蛞蝓:别名。status:状态,0表示已发布,1表示已发布,2表示在回收站,3表示私人文章或页面。摘要:文章的摘要。template:自定义模板,可以在添加新页面时设置。缩略图:封面图片。标题:标题。top_priority:是否坚持到最前面。网址:链接。访问:拜访。word_count:字数统计。15.tags:标签表,发布文章时,可以为文章设置标签。名称:标签名称。蛞蝓:别名。slug_name:项目中未使用。缩略图:标签的封面图片。16.theme_settings:主题设置表,设置博客主题。setting_key:主题中可以设置的选项,比如文章标题是否大写post_title_uppper,博客首页的邮箱地址等。theme_id:主题的id。setting_value:setting_key对应的值。17.users:用户表,记录用户信息。化身:化身。描述:描述。电子邮件:电子邮件地址。expire_time:过期时间。严格来说,应该叫账户的初始生效时间。当当前时间超过expire_time时,账号可以正常登录。maf_key:两步验证码的key。maf_type:是否启用两步验证码,0表示不启用(默认),1表示启用。绰号:昵称。密码:密码。用户名:用户名。
