フルスタックredditクローン-春のブート、反応、電子アプリ-パート2
11711 ワード
フルスタックredditクローン-春のブート、反応、電子アプリ-パート2
導入
第2部に春のブートを使用してRedditのクローンを作成し、反応する.
我々は我々のプロジェクトを初期化し、必要なすべての依存関係を追加しました.この記事では、我々のバックエンドを完了するために必要なエンティティとリポジトリのすべてを作成するカバー!
重要なリンク
Part 1 :ドメインエンティティの作成📝
我々のアプリケーションが持つ異なるドメイン実体の全てをカバーしましょう.インサイドコム.お名前.バックエンドは、モデルと呼ばれる新しいパッケージを作成し、次のクラスを追加します.
注意: Rambokを一部の依存関係としてインストールしました.私たちは開発プロセスを通して様々なロンボク注釈を使用します.これらの注釈にアクセスするには、IDEで注釈処理を有効にする必要があります.詳細については、ここでロンボクガイドを設定することができます.https://www.baeldung.com/lombok-ide
注意:いくつかの場合、POMに次の依存関係を追加する必要があります.フィールド検証のためのXMLファイル
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
package com.maxicb.backend.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import java.time.Instant;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "users")
@Entity
public class User {
@Id
@SequenceGenerator(name = "USER_GEN", sequenceName = "SEQ_USER", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_GEN")
private Long userId;
@NotBlank(message = "Username is required")
private String username;
@NotBlank(message = "Password is required")
private String password;
@Email
@NotBlank(message = "Email is required")
private String email;
private Instant creationDate;
private boolean accountStatus;
}
package com.maxicb.backend.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.lang.Nullable;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.time.Instant;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Post {
@Id
@SequenceGenerator(name = "POST_GEN", sequenceName = "SEQ_POST", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "POST_GEN")
private Long postId;
@NotBlank(message = "Post Title is required")
private String postTitle;
@Nullable
private String url;
@Nullable
@Lob
private String description;
private Integer voteCount;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", referencedColumnName = "userId")
private User user;
private Instant creationDate;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id", referencedColumnName = "id")
private Subreddit subreddit;
}
package com.maxicb.backend.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.time.Instant;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Subreddit {
@Id
@SequenceGenerator(name = "SUB_GEN", sequenceName = "SEQ_SUB", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SUB_GEN")
private Long id;
@NotBlank(message = "Subreddit name is required")
private String name;
@NotBlank(message = "Subreddit description is required")
private String description;
@OneToMany(fetch = FetchType.LAZY)
private List<Post> posts;
private Instant creationDate;
@ManyToOne(fetch = FetchType.LAZY)
private User user;
}
package com.maxicb.backend.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Vote {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long voteId;
private VoteType voteType;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "postId", referencedColumnName = "postId")
private Post post;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", referencedColumnName = "userId")
private User user;
}
package com.maxicb.backend.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import java.time.Instant;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@NotEmpty
private String text;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "postId", referencedColumnName = "postId")
private Post post;
private Instant creationDate;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId", referencedColumnName = "userId")
private User user;
}
public enum VoteType {
UPVOTE(1), DOWNVOTE(-1);
VoteType(int direction) {}
}
package com.maxicb.backend.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.Instant;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table(name = "token")
@Entity
public class AccountVerificationToken {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String token;
@OneToOne(fetch = FetchType.LAZY)
private User user;
private Instant expirationDate;
}
package com.maxicb.backend.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class NotificationEmail {
private String subject;
private String recepient;
private String body;
}
パート2 :リポジトリの作成👩
今では、データベースにEntitesを格納する責任があるリポジトリをカバーする必要があります.インサイドコム.お名前.バックエンドは、リポジトリと呼ばれる新しいパッケージを作成し、次のインターフェイスを追加します.
package com.maxicb.backend.repository;
import com.maxicb.backend.model.User;
import org.springframework.data.repository.CrudRepository;
import java.util.Optional;
public interface UserRepository extends CrudRepository<User, Long> {
Optional<User> findByUsername(String username);
}
package com.maxicb.backend.repository;
import com.maxicb.backend.model.Post;
import com.maxicb.backend.model.Subreddit;
import com.maxicb.backend.model.User;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface PostRepository extends CrudRepository<Post, Long> {
List<Post> findAllBySubreddit(Subreddit subreddit);
List<Post> findByUser(User user);
}
package com.maxicb.backend.repository;
import com.maxicb.backend.model.Subreddit;
import org.springframework.data.repository.CrudRepository;
import java.util.Optional;
public interface SubredditRepository extends CrudRepository<Subreddit, Long> {
Optional<Subreddit> findByName(String subredditName);
}
package com.maxicb.backend.repository;
import com.maxicb.backend.model.Post;
import com.maxicb.backend.model.User;
import com.maxicb.backend.model.Vote;
import org.springframework.data.repository.CrudRepository;
import java.util.Optional;
public interface VoteRepository extends CrudRepository<Vote, Long> {
Optional<Vote> findTopByPostAndUserOrderByVoteIdDesc(Post post, User currentUser);
}
package com.maxicb.backend.repository;
import com.maxicb.backend.model.Comment;
import com.maxicb.backend.model.Post;
import com.maxicb.backend.model.User;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface CommentRepository extends CrudRepository<Comment, Long> {
List<Comment> findByPost(Post post);
List<Comment> findAllByUser(User user);
}
package com.maxicb.backend.repository;
import com.maxicb.backend.model.AccountVerificationToken;
import org.springframework.data.repository.CrudRepository;
import java.util.Optional;
public interface TokenRepository extends CrudRepository<AccountVerificationToken, Long> {
Optional<AccountVerificationToken> findByToken(String token);
}
結論🔍
次
登録、電子メールの送信、アカウントの活性化/検証の実装。
Reference
この問題について(フルスタックredditクローン-春のブート、反応、電子アプリ-パート2), 我々は、より多くの情報をここで見つけました https://dev.to/maxicb/full-stack-reddit-clone-spring-boot-react-electron-app-part-2-446lテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol