WebsiteProject.java 4.3 KB
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;

/**
 * 网站项目实体类
 * 对应数据库表:ai_website_projects
 *
 * 管理企业网站项目的完整生命周期,包括:
 * - 项目创建和基本信息管理
 * - 状态跟踪和进度监控
 * - 域名和SEO配置
 * - 统计数据收集和分析
 *
 * @author AIGEO Team
 * @since 1.0.0
 */
@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "ai_website_projects", indexes = {
    @Index(name = "idx_website_projects_company", columnList = "company_id"),
    @Index(name = "idx_website_projects_user", columnList = "user_id"),
    @Index(name = "idx_website_projects_status", columnList = "status"),
    @Index(name = "idx_website_projects_created", columnList = "created_at")
})
public class WebsiteProject {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Integer id;

    /**
     * 公司ID(多租户字段)
     */
    @NotNull(message = "公司ID不能为空")
    @Column(name = "company_id", nullable = false)
    private Integer companyId;

    /**
     * 用户ID(创建者)
     */
    @NotNull(message = "用户ID不能为空")
    @Column(name = "user_id", nullable = false)
    private Integer userId;

    /**
     * 项目名称
     */
    @NotBlank(message = "项目名称不能为空")
    @Column(name = "project_name", nullable = false)
    private String projectName;

    /**
     * 网站名称(显示名称)
     */
    @Column(name = "site_name")
    private String siteName;

    /**
     * 项目状态
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", length = 20)
    private WebsiteProjectStatus status;

    /**
     * 域名
     */
    @Column(name = "domain", length = 255)
    private String domain;

    /**
     * 网站类型
     */
    @Column(name = "type", length = 50)
    private String type;

    /**
     * 访问量统计
     */
    @Column(name = "view_count")
    @Builder.Default
    private Integer viewCount = 0;

    /**
     * 页面浏览量统计
     */
    @Column(name = "page_views")
    @Builder.Default
    private Integer pageViews = 0;

    /**
     * 配置快照(JSON格式)
     */
    @Column(name = "config_snapshot", columnDefinition = "json")
    private String configSnapshot;

    /**
     * 创建时间
     */
    @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;

    /**
     * 获取项目名称
     * @return 项目名称
     */
    public String getName() {
        return this.projectName;
    }

    /**
     * 获取域名
     * @return 域名
     */
    public String getDomain() {
        return this.domain != null ? this.domain : this.siteName;
    }

    /**
     * 设置域名
     * @param domain 域名
     */
    public void setDomain(String domain) {
        this.domain = domain;
    }

    /**
     * 设置访问量
     * @param viewCount 访问量
     */
    public void setViewCount(Integer viewCount) {
        this.viewCount = viewCount;
    }

    /**
     * 设置页面浏览量
     * @param pageViews 页面浏览量
     */
    public void setPageViews(Integer pageViews) {
        this.pageViews = pageViews;
    }

    /**
     * 检查项目是否已发布
     * @return 是否已发布
     */
    public boolean isPublished() {
        return WebsiteProjectStatus.LIVE.equals(this.status);
    }

    /**
     * 检查项目是否处于开发中
     * @return 是否处于开发中
     */
    public boolean isUnderDevelopment() {
        return WebsiteProjectStatus.DEVELOPMENT.equals(this.status) ||
               WebsiteProjectStatus.TESTING.equals(this.status);
    }
}