WebsiteArticle.java 3.7 KB
// website/entity/WebsiteArticle.java
package com.aigeo.website.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.time.LocalDateTime;
import com.aigeo.common.enums.ArticleStatus;

/**
 * 网站文章实体类
 * 对应数据库表:ai_website_articles
 * 
 * 存储网站生成的文章内容,包括:
 * - 文章基本信息和内容
 * - 关联的项目和频道
 * - 发布状态和时间管理
 * 
 * @author AIGEO Team
 * @since 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ai_website_articles", indexes = {
    @Index(name = "idx_website_articles_project", columnList = "project_id"),
    @Index(name = "idx_website_articles_channel", columnList = "channel_id"),
    @Index(name = "idx_website_articles_status", columnList = "status")
})
public class WebsiteArticle {
    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Integer id;

    /**
     * 关联的网站项目ID
     */
    @NotNull(message = "项目ID不能为空")
    @Column(name = "project_id", nullable = false)
    private Integer projectId;

    /**
     * 关联的频道ID
     */
    @NotNull(message = "频道ID不能为空")
    @Column(name = "channel_id", nullable = false)
    private Integer channelId;

    /**
     * 文章标题
     */
    @NotBlank(message = "文章标题不能为空")
    @Column(name = "title", nullable = false, length = 500)
    private String title;

    /**
     * 文章摘要
     */
    @Column(name = "summary", length = 1000)
    private String summary;

    /**
     * 文章内容
     */
    @Column(name = "content", columnDefinition = "LONGTEXT")
    private String content;

    /**
     * 文章状态
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", length = 20)
    @Builder.Default
    private ArticleStatus status = ArticleStatus.DRAFT;

    /**
     * 发布时间
     */
    @Column(name = "published_at")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime publishedAt;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_at", updatable = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_at")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;

    /**
     * 实体创建前的处理
     */
    @PrePersist
    protected void onCreate() {
        if (status == null) status = ArticleStatus.DRAFT;
    }

    /**
     * 检查是否已发布
     */
    public boolean isPublished() {
        return ArticleStatus.PUBLISHED.equals(status);
    }

    /**
     * 发布文章
     */
    public void publish() {
        this.status = ArticleStatus.PUBLISHED;
        this.publishedAt = LocalDateTime.now();
    }

    /**
     * 撤回发布
     */
    public void unpublish() {
        this.status = ArticleStatus.DRAFT;
        this.publishedAt = null;
    }

    /**
     * 获取内容长度
     */
    public int getContentLength() {
        return content != null ? content.length() : 0;
    }

    /**
     * 检查是否为长文章(超过5000字符)
     */
    public boolean isLongArticle() {
        return getContentLength() > 5000;
    }
}