rebase and resubmit

Change-Id: I840888ad5aadceaacb5cd64c6472614cd82ffe17
diff --git a/src/main/java/entity/Appeal.java b/src/main/java/entity/Appeal.java
new file mode 100644
index 0000000..36816c4
--- /dev/null
+++ b/src/main/java/entity/Appeal.java
@@ -0,0 +1,35 @@
+package entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "Appeal")
+public class Appeal {
+    @Id
+    @Column(name = "appeal_id", length = 64, nullable = false)
+    public String appealid;
+
+    @Column(name = "user_id", length = 36, nullable = false)
+    public String appealuserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_appeal_user"), insertable = false, updatable = false)
+    public User user;
+
+    @Lob
+    @Column(name = "content", nullable = false)
+    public String content;
+
+    @Column(name = "file_url", length = 255)
+    public String fileURL;
+
+    @Column(name = "status", nullable = false)
+    public int state; // 0: pending, 1: approved, 2: rejected
+}
diff --git a/src/main/java/entity/BegInfo.java b/src/main/java/entity/BegInfo.java
new file mode 100644
index 0000000..fe3174d
--- /dev/null
+++ b/src/main/java/entity/BegInfo.java
@@ -0,0 +1,31 @@
+package entity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "BegSeed")
+public class BegInfo {
+    @Id
+    @Column(name = "beg_id", length = 64, nullable = false)
+    public String begid;
+
+    @Column(name = "beg_count", nullable = false)
+    public int begnumbers;
+
+    @Column(name = "reward_magic", nullable = false)
+    public int magic;
+
+    @Column(name = "deadline", nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    public Date endtime;
+
+    @Column(name = "has_match", nullable = false)
+    public boolean hasseed;
+}
diff --git a/src/main/java/entity/Notice.java b/src/main/java/entity/Notice.java
new file mode 100644
index 0000000..24ef954
--- /dev/null
+++ b/src/main/java/entity/Notice.java
@@ -0,0 +1,29 @@
+package entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "Announcement")
+public class Notice {
+    @Id
+    @Column(name = "announce_id", length = 64, nullable = false)
+    public String noticeid;
+
+    @Lob
+    @Column(name = "content", nullable = false)
+    public String noticecontent;
+
+    @Column(name = "is_public", nullable = false)
+    public boolean state;
+
+    @Column(name = "tag", length = 100)
+    public String posttag;
+    
+    // 添加默认无参构造函数,JPA规范要求
+    public Notice() {
+    }
+}
diff --git a/src/main/java/entity/Post.java b/src/main/java/entity/Post.java
new file mode 100644
index 0000000..1593ca0
--- /dev/null
+++ b/src/main/java/entity/Post.java
@@ -0,0 +1,46 @@
+package entity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "Post")
+public class Post {
+    @Id
+    @Column(name = "post_id", length = 64, nullable = false)
+    public String postid;
+
+    @Column(name = "title", length = 255, nullable = false)
+    public String posttitle;
+
+    @Lob
+    @Column(name = "content", nullable = false)
+    public String postcontent;
+
+    @Column(name = "author_id", length = 36, nullable = false)
+    public String postuserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "author_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_post_user"), insertable = false, updatable = false)
+    public User author;
+
+    @Column(name = "created_at", nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    public Date posttime;
+
+    @Column(name = "reply_count", nullable = false)
+    public int replytime;
+
+    @Column(name = "view_count", nullable = false)
+    public int readtime;
+}
diff --git a/src/main/java/entity/PostReply.java b/src/main/java/entity/PostReply.java
new file mode 100644
index 0000000..2845f10
--- /dev/null
+++ b/src/main/java/entity/PostReply.java
@@ -0,0 +1,38 @@
+package entity;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Entity
+@Table(name = "PostReply")
+public class PostReply {
+    @Id
+    @Column(name = "reply_id", length = 64, nullable = false)
+    public String replyid;
+
+    @Column(name = "post_id", length = 64, nullable = false)
+    public String postid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "post_id", referencedColumnName = "post_id", 
+                foreignKey = @ForeignKey(name = "fk_pr_post"), 
+                insertable = false, updatable = false)
+    public Post post;
+
+    @Column(name = "author_id", length = 36, nullable = false)
+    public String authorid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "author_id", referencedColumnName = "user_id", 
+                foreignKey = @ForeignKey(name = "fk_pr_user"), 
+                insertable = false, updatable = false)
+    public User author;
+
+    @Lob
+    @Column(name = "content", nullable = false)
+    public String content;
+
+    @Column(name = "created_at", nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    public Date createdAt;
+}
\ No newline at end of file
diff --git a/src/main/java/entity/Profile.java b/src/main/java/entity/Profile.java
new file mode 100644
index 0000000..2ff6979
--- /dev/null
+++ b/src/main/java/entity/Profile.java
@@ -0,0 +1,46 @@
+package entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+@Entity
+@Table(name = "UserMigration")
+public class Profile {//迁移信息
+    @Id
+    @Column(name = "migration_id", length = 64, nullable = false)
+    public String profileurl;
+
+    @Column(name = "user_id", length = 36, nullable = false)
+    public String userid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_um_user"), insertable = false, updatable = false)
+    public User user;
+
+    @Column(name = "approved", nullable = false)
+    public boolean exampass;
+
+    @Column(name = "pending_magic", nullable = false)
+    public String magictogive;
+
+    @Column(name = "pending_uploaded", nullable = false)
+    public String uploadtogive;
+
+    @Transient
+    public String downloadtogive;
+
+    @Column(name = "granted_magic", nullable = false)
+    public String magicgived;
+
+    @Column(name = "granted_uploaded", nullable = false)
+    public String uploadgived;
+
+    @Transient
+    public String downloadgived;
+}
diff --git a/src/main/java/entity/Seed.java b/src/main/java/entity/Seed.java
new file mode 100644
index 0000000..eabf49d
--- /dev/null
+++ b/src/main/java/entity/Seed.java
@@ -0,0 +1,53 @@
+package entity;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "Seed")
+public class Seed {
+    @Id
+    @Column(name = "seed_id", length = 64, nullable = false)
+    public String seedid;
+
+    @Column(name = "owner_user_id", length = 36, nullable = false)
+    public String seeduserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "owner_user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_seed_user"), insertable = false, updatable = false)
+    public User user;
+
+    @Column(name = "fake_hits", nullable = false)
+    public int faketime;
+
+    @Column(name = "last_fake_check")
+    @Temporal(TemporalType.TIMESTAMP)
+    public Date lastfakecheck;
+
+    @Column(name = "external_url")
+    public String outurl;
+
+    @Column(name = "title", length = 255, nullable = false)
+    public String title;
+
+    @Column(name = "subtitle", length = 255)
+    public String subtitle;
+
+    @Column(name = "size", length = 50, nullable = false)
+    public String seedsize;
+
+    @Column(name = "tags")
+    public String seedtag;
+
+    @Column(name = "popularity", nullable = false)
+    public int downloadtimes;
+}
diff --git a/src/main/java/entity/SubmitSeed.java b/src/main/java/entity/SubmitSeed.java
new file mode 100644
index 0000000..2cec77d
--- /dev/null
+++ b/src/main/java/entity/SubmitSeed.java
@@ -0,0 +1,34 @@
+package entity;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "SubmitSeed")
+public class SubmitSeed {
+
+    @EmbeddedId
+    private SubmitSeedId id;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "beg_id", referencedColumnName = "beg_id", foreignKey = @ForeignKey(name = "fk_ss_beg"))
+    private BegInfo begInfo;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", foreignKey = @ForeignKey(name = "fk_ss_seed"))
+    private Seed seed;
+
+    @Column(name = "votes", nullable = false)
+    private int votes;
+
+    public SubmitSeed() {}
+
+    public SubmitSeedId getId() {
+        return id;
+    }
+
+    public void setId(SubmitSeedId id) {
+        this.id = id;
+    }
+
+    // getters and setters for begInfo, seed, and votes
+}
diff --git a/src/main/java/entity/SubmitSeedId.java b/src/main/java/entity/SubmitSeedId.java
new file mode 100644
index 0000000..f071ac3
--- /dev/null
+++ b/src/main/java/entity/SubmitSeedId.java
@@ -0,0 +1,47 @@
+package entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class SubmitSeedId implements Serializable {
+    private String begId;
+    private String seedId;
+
+    public SubmitSeedId() {}
+
+    public SubmitSeedId(String begId, String seedId) {
+        this.begId = begId;
+        this.seedId = seedId;
+    }
+
+    // 重写 equals 和 hashCode 方法
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SubmitSeedId that = (SubmitSeedId) o;
+        return begId.equals(that.begId) && seedId.equals(that.seedId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(begId, seedId);
+    }
+
+    // getters and setters
+    public String getBegId() {
+        return begId;
+    }
+
+    public void setBegId(String begId) {
+        this.begId = begId;
+    }
+
+    public String getSeedId() {
+        return seedId;
+    }
+
+    public void setSeedId(String seedId) {
+        this.seedId = seedId;
+    }
+}
diff --git a/src/main/java/entity/TTorent.java b/src/main/java/entity/TTorent.java
new file mode 100644
index 0000000..167e853
--- /dev/null
+++ b/src/main/java/entity/TTorent.java
@@ -0,0 +1,5 @@
+package entity;
+
+public class TTorent{
+    
+}
\ No newline at end of file
diff --git a/src/main/java/entity/TransRecord.java b/src/main/java/entity/TransRecord.java
new file mode 100644
index 0000000..cf7ac7f
--- /dev/null
+++ b/src/main/java/entity/TransRecord.java
@@ -0,0 +1,54 @@
+package entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "Transport")
+@IdClass(TransportId.class)
+public class TransRecord{
+    @Id
+    @Column(name = "task_id", length = 64, nullable = false)
+    public String taskid;
+
+    @Id
+    @Column(name = "uploader_id", length = 36, nullable = false)
+    public String uploaduserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "uploader_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_tr_user_up"), insertable = false, updatable = false)
+    public User uploader;
+
+    @Id
+    @Column(name = "downloader_id", length = 36, nullable = false)
+    public String downloaduserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "downloader_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_tr_user_down"), insertable = false, updatable = false)
+    public User downloader;
+
+    @Column(name = "seed_id", length = 64, nullable = false)
+    public String seedid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", foreignKey = @ForeignKey(name = "fk_tr_seed"), insertable = false, updatable = false)
+    public Seed seed;
+
+    @Column(name = "uploaded", nullable = false)
+    public long upload;
+
+    @Column(name = "downloaded", nullable = false)
+    public long download;
+
+    @Column(name = "upload_peak", nullable = false)
+    public long maxupload;
+
+    @Column(name = "download_peak", nullable = false)
+    public long maxdownload;
+}
\ No newline at end of file
diff --git a/src/main/java/entity/TransportId.java b/src/main/java/entity/TransportId.java
new file mode 100644
index 0000000..f79962f
--- /dev/null
+++ b/src/main/java/entity/TransportId.java
@@ -0,0 +1,38 @@
+package entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class TransportId implements Serializable {
+    private String taskid;
+    private String uploaduserid;
+    private String downloaduserid;
+
+    public TransportId() {}
+
+    public TransportId(String taskid, String uploaduserid, String downloaduserid) {
+        this.taskid = taskid;
+        this.uploaduserid = uploaduserid;
+        this.downloaduserid = downloaduserid;
+    }
+
+    public String getTaskid() { return taskid; }
+    public void setTaskid(String taskid) { this.taskid = taskid; }
+    public String getUploaduserid() { return uploaduserid; }
+    public void setUploaduserid(String uploaduserid) { this.uploaduserid = uploaduserid; }
+    public String getDownloaduserid() { return downloaduserid; }
+    public void setDownloaduserid(String downloaduserid) { this.downloaduserid = downloaduserid; }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TransportId that = (TransportId) o;
+        return Objects.equals(taskid, that.taskid) && Objects.equals(uploaduserid, that.uploaduserid) && Objects.equals(downloaduserid, that.downloaduserid);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(taskid, uploaduserid, downloaduserid);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java
new file mode 100644
index 0000000..603ec85
--- /dev/null
+++ b/src/main/java/entity/User.java
@@ -0,0 +1,57 @@
+package entity;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import com.querydsl.core.annotations.QueryEntity;
+
+@QueryEntity
+@Entity(name="User")
+@Table(name = "User")
+public class User {
+    @Id
+    @Column(name = "user_id", length = 36, nullable = false)
+    private String userid;
+
+    @Column(name = "email", nullable = false, length = 255, unique = true)
+    private String email;
+
+    @Column(name = "username", length = 100, nullable = false)
+    public String username;
+
+    @Column(name = "password", length = 255, nullable = false)
+    public String password;
+
+    @Column(name = "gender", nullable = false)
+    public String sex;
+
+    @Transient
+    public String age;
+
+    @Column(name = "school")
+    public String school;
+
+    @Column(name = "avatar_url")
+    public String pictureurl;
+
+    @Column(name = "bio")
+    public String profile;
+
+    @Column(name = "account_status", nullable = false)
+    public boolean accountstate;
+
+    @Column(name = "invite_left", nullable = false)
+    public int invitetimes;
+
+    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
+    public UserPT userPT;
+
+    // Constructors, getters, setters
+    public User() {}
+}
diff --git a/src/main/java/entity/UserId.java b/src/main/java/entity/UserId.java
new file mode 100644
index 0000000..bc25675
--- /dev/null
+++ b/src/main/java/entity/UserId.java
@@ -0,0 +1,36 @@
+package entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class UserId implements Serializable {
+    private String userid;
+    private String email;
+
+    public UserId() {}
+
+    public UserId(String userid, String email) {
+        this.userid = userid;
+        this.email = email;
+    }
+
+    // getters and setters
+    public String getUserid() { return userid; }
+    public void setUserid(String userid) { this.userid = userid; }
+
+    public String getEmail() { return email; }
+    public void setEmail(String email) { this.email = email; }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        UserId userId = (UserId) o;
+        return Objects.equals(userid, userId.userid) && Objects.equals(email, userId.email);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(userid, email);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/entity/UserPT.java b/src/main/java/entity/UserPT.java
new file mode 100644
index 0000000..bc5d455
--- /dev/null
+++ b/src/main/java/entity/UserPT.java
@@ -0,0 +1,46 @@
+package entity;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.MapsId;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import com.querydsl.core.annotations.QueryEntity;
+
+@QueryEntity
+@Entity(name="UserPT")
+@Table(name = "UserPT")
+public class UserPT {
+    @Id
+    @Column(name = "user_id", length = 36, nullable = false)
+    public String userid;
+
+    @OneToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @MapsId
+    @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "fk_pt_user"))
+    public User user;
+
+    @Column(name = "magic", nullable = false)
+    public int magic;
+
+    @Column(name = "uploaded", nullable = false)
+    public long upload;
+
+    @Column(name = "downloaded", nullable = false)
+    public long download;
+
+    @Column(name = "ratio", nullable = false, precision = 5, scale = 2)
+    public double share;
+
+    @Column(name = "default_seed_path")
+    public String farmurl;
+
+    @Column(name = "vip_downloads", nullable = false)
+    public int viptime;
+}
diff --git a/src/main/java/entity/UserVotes.java b/src/main/java/entity/UserVotes.java
new file mode 100644
index 0000000..af28e3c
--- /dev/null
+++ b/src/main/java/entity/UserVotes.java
@@ -0,0 +1,44 @@
+package entity;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Entity
+@Table(name = "UserVotes")
+public class UserVotes {
+
+    @EmbeddedId
+    private UserVotesId id;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", 
+                foreignKey = @ForeignKey(name = "fk_user_votes_user"))
+    private User user;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "beg_id", referencedColumnName = "beg_id", 
+                foreignKey = @ForeignKey(name = "fk_user_votes_beg"))
+    private BegInfo begInfo;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", 
+                foreignKey = @ForeignKey(name = "fk_user_votes_seed"))
+    private Seed seed;
+
+    @Column(name = "created_at", nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date createdAt;
+
+    public UserVotes() {}
+
+    // getter and setter for the composite key and other fields
+    public UserVotesId getId() {
+        return id;
+    }
+
+    public void setId(UserVotesId id) {
+        this.id = id;
+    }
+
+    // getters and setters for user, begInfo, seed, createdAt
+}
diff --git a/src/main/java/entity/UserVotesId.java b/src/main/java/entity/UserVotesId.java
new file mode 100644
index 0000000..4c0ce5f
--- /dev/null
+++ b/src/main/java/entity/UserVotesId.java
@@ -0,0 +1,57 @@
+package entity;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class UserVotesId implements Serializable {
+    private String userId;
+    private String begId;
+    private String seedId;
+
+    public UserVotesId() {}
+
+    public UserVotesId(String userId, String begId, String seedId) {
+        this.userId = userId;
+        this.begId = begId;
+        this.seedId = seedId;
+    }
+
+    // 重写 equals 和 hashCode 方法
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        UserVotesId that = (UserVotesId) o;
+        return userId.equals(that.userId) && begId.equals(that.begId) && seedId.equals(that.seedId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(userId, begId, seedId);
+    }
+
+    // getters and setters
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getBegId() {
+        return begId;
+    }
+
+    public void setBegId(String begId) {
+        this.begId = begId;
+    }
+
+    public String getSeedId() {
+        return seedId;
+    }
+
+    public void setSeedId(String seedId) {
+        this.seedId = seedId;
+    }
+}
diff --git a/src/main/java/entity/config.java b/src/main/java/entity/config.java
new file mode 100644
index 0000000..0cf39c1
--- /dev/null
+++ b/src/main/java/entity/config.java
@@ -0,0 +1,14 @@
+package entity;
+
+public class config {
+    public String TrackerURL;
+    public int FarmNumber;
+    public int FakeTime;
+    public int BegVote;
+    // 请根据实际环境修改为可达的地址
+    public String SqlURL = "192.168.5.9:3306";
+    public String Database = "pt_database";
+    public String TestDatabase = "pt_database_test";
+    public String SqlPassword = "123456";
+    public String SqlUsername = "root";
+}