大概是兩個月前,項目組來了一位新的leader,看起來經驗很豐富的亞子。有一天,新Leader對我說:小夥子, 你來做一下這個備註(用戶評論)模塊吧。我一聽,這不是在爲難我胖虎嗎,之前從來沒做過啊。
但是轉念一想,終於可以做點新東西了,心裏還是有些小開心得。OK,在開始之前先先了解一下模塊有哪些需求吧:
用戶可以設置評論評論是否公開。如果該用戶設置了不公開,並且@了其他用戶,該用戶以及被他@的用戶是可以看見這條評論的,否則只有他自己可以看見這條評論。
用戶可以在其他用戶的評論下發表自己的評論。
需求看起來並不困難,那麼按照慣例先進行表字段的設計:
1.評論的實體類
@Entity
@Table(name = "t_discuss")
public class Discuss Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 評論的用戶
@Column(name = "user_name")
private String userName;
// 評論的實體類型
@Column(name = "entity_type")
private EntityType entityType;
// 評論的實體id
@Column(name = "entity_id")
private Long entityId;
// 評論的內容
@Column(name = "discuss_value")
private String discussValue;
// 父級評論的id
@Column(name = "discuss_id")
private Long discussId;
// 評論是否公開
@Column(name = "publicity")
private Boolean publicity;
// 省略 get, set方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Discuss discuss = (Discuss) o;
return Objects.equals(id, discuss.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
簡單說明一下實體類中各個字段。
- userName字段用來記錄是哪位用戶發表的評論,這裏可以改爲User來進行多對一關聯:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
- 實體類型和實體id很好理解,比如說在某一個視頻下方評論,那麼實體類型就是"視頻",實體id就是這個視頻的id。
- discussId存的是上級評論的Id,如果沒有上級評論,那麼discussId置爲null。
- publicity爲ture,表明這是一條公開的評論
接下來在Service層中實現具體業務功能,首先是寫評論:
public interface IDiscussService {
// 創建評論
void createDiscuss(DiscussCreateDTO dto, EntityType entityType, Long entityId);
}
public class DiscussCreateDTO {
// 父評論id
private Long discussId;
// 評論內容
private String value;
// 是否公開
private Boolean publicity;
// 省略 get, set 方法
}