記事ディレクトリ
序文
前回の API 開発では、定義された VO、BO、および PO オブジェクトに疑問があり、各レイヤーで定義されたオブジェクトの利点をよく理解していないという友人から個人的にメッセージが届きました。どれも失血や貧血のオブジェクトで、オブジェクトのフィールドがよく似ていて、渡すときにコピーしたりコピーしたりするので、使うのが面倒に感じますが、そうするメリットは何ですか?
同様の質問はありますか? 実際の事例を持たない学生にとっては、これが普通の考え方だと思います。しかし、実際のシナリオ: サービス層は PO オブジェクトを取得した後、さまざまなシナリオに従ってさまざまなアセンブリ、計算、その他のロジックを実行するため、BO は非常に必要です。このように考えることができます。データベース PO に直接マッピングしているだけであれば、サービス層が弱いのではありませんか? 実際のプロジェクトでは、サービス層が最も厚い層であり、最も多くの処理を行う場所であることが多いため、データベースの PO オブジェクトの BO 層をラップすることが非常に重要です。それを得る!これは、私がこれまでに見た中で最も典型的な否定的な例の 1 つです。ユーザー インターフェイスは暗号化されたパスワードを返します。なんと、この天への犠牲は不公平ではありません~~
この記事では、書籍詳細関連のインターフェース(管理者側)を要件に沿って開発する私の考えを徹底的に書き綴っていきます、これが本当の実戦です!
1. 需要
B 側の管理者側と C 側の学生側の両方に書籍の詳細に関するモジュールがあり、多少の違いはありますが似ています。管理者は自分にとって役立つ情報に焦点を当て、学生は自分にとって役立つ情報に焦点を当てます书评管理
。主な違いは次のとおりです。
- B 側管理者側:
所有评论
さまざまなステータス (0-レビュー予定、1-合格、2-却下) のコメントを含む書籍を表示します。 - C-エンド学生エンド: 書籍の表示
审核通过的评论
、および我是否收藏
この記事では主に管理者側の実装を行います
2. サービス層
ブック詳細には表示される内容が多いため、フロントエンドのクラスメートと合わせて定義する必要があり、通常は次の 2 つの方法があります。
- 詳細に含まれるすべての情報を含むインターフェース
- 複数のインターフェース (それぞれに部分的な情報が含まれる)
采用多个接口
コメントの場合はページネーションが関係し、インターフェースの扱いがそれほど簡単ではないため、私がここで行う方法は次のとおりです。
これを 2 つのインターフェースに分割しました。
- 書籍詳細 - 基本情報インターフェース
- 本の詳細 - 書評インターフェイス
2.1 書籍の詳細 - 基本情報インターフェイス
本詳細BO
書籍の詳細 を含め图书的全部信息 + 创建人 + 修改人
、ここではすべての PO フィールドを直接取得しましたが、実際のプロジェクトでは、製品設計プロトタイプと PRD で必要なフィールドのみを可能な限り返す必要があります。
@Data
public class BookDetailBO implements Serializable {
private Integer id;
private String bookNo;
private String bookName;
private Integer bookType;
private String author;
private String description;
private String publisher;
private Date publishDate;
private String coverImage;
private Integer status;
private Integer borrowCount;
private Integer commentCount;
private Boolean isRecommend;
private Integer createUserId;
private Integer modifyUserId;
private Date gmtCreate;
private Date gmtModified;
// Book外的字段
private String createUserName;
private String modifyUserName;
}
ブックサービス
書籍の詳細を取得するためのインターフェイス メソッドを追加します。通常、このようなよく知られたメソッドについてはコメントを書かないことをお勧めします。
BookDetailBO getBookDetail(Integer id);
BookServiceImpl
実装コードについては、これまでずっと学んできたクラスメートであれば、次のコードを理解し、記述し、最適化できると思います~
@Override
public BookDetailBO getBookDetail(Integer id) {
// 图书基本信息
Book book = bookMapper.selectByPrimaryKey(id);
if (book == null) {
return null;
}
BookDetailBO detailBO = new BookDetailBO();
BeanUtils.copyProperties(book, detailBO);
// 图书创建人
User createUser = userMapper.selectByPrimaryKey(book.getCreateUserId());
detailBO.setCreateUserName(createUser.getUserName());
if (book.getModifyUserId() != null) {
// 图书修改人
if (book.getCreateUserId().equals(book.getModifyUserId())) {
detailBO.setModifyUserName(createUser.getUserName());
} else {
User modifyUser = userMapper.selectByPrimaryKey(book.getModifyUserId());
detailBO.setModifyUserName(modifyUser.getUserName());
}
}
return detailBO;
}
もちろん、個別のクエリを実行する方法、テーブル クエリを結合する方法など、さまざまな実装方法があります。
ここではクエリを分離します。主に考慮すべき点は缓存优化
利用可能な。結合クエリの場合、最適化の余地はありません。
2.2 本の詳細 - 書評インターフェイス
ブックコメントBO
コメントのリストについては、管理者がすべてのコメントを表示できるため、 を含めます图书评论的全部信息 + 学生信息 + 审核人
。
学生情報を返すことは、フロントエンドがより豊富に表示するのにも便利ですが、これは主に製品設計に依存し、最も一般的なフィールドが直接返されます。
@Data
public class BookCommentBO implements Serializable {
private Integer id;
private Integer studentId;
private Integer bookId;
private Integer score;
private String comment;
private Integer status;
private Date verifyTime;
private Integer verifyUserId;
private Date gmtCreate;
private Date gmtModified;
// BookComment以外的字段
private StudentBO student;
private String verifyUserName;
}
学生BO
学生 StudentBO についても、管理者は同じ理由で関連情報を確認することがあります~
@Data
public class StudentBO implements Serializable {
private Integer id;
private Integer userId;
private String studentNo;
private String studentName;
private String nickName;
private String department;
private String idCardImage;
private Boolean isApproved;
private Boolean isFrozen;
private Date gmtCreate;
private Date gmtModified;
}
ブックコメントサービス
書評インターフェイスを追加しました
public interface BookCommentService {
Page<BookCommentBO> getBookCommentPage(int pageNum, int pageSize, int bookId);
}
BookCommentServiceImpl
前のセクションのページング関数が使用されます。7.3 SpringBoot は MyBatis ページング プラグインを統合します。 github.pageHelper: 書籍リスト API を実装します。
@Service
public class BookCommentServiceImpl implements BookCommentService {
@Autowired
private BookCommentMapper bookCommentMapper;
@Autowired
private StudentMapper studentMapper;
@Autowired
private UserMapper userMapper;
@Override
public Page<BookCommentBO> getBookCommentPage(int pageNum, int pageSize, int bookId) {
// 图书的评论列表
BookCommentExample example = new BookCommentExample();
example.createCriteria().andBookIdEqualTo(bookId);
// 查询并分页
Page<BookComment> page = PageHelper.startPage(pageNum, pageSize)
.doSelectPage(() -> bookCommentMapper.selectByExample(example));
Page<BookCommentBO> pageBO = new Page<>();
BeanUtils.copyProperties(page, pageBO);
for (BookComment bookComment : page.getResult()) {
BookCommentBO bookCommentBO = new BookCommentBO();
BeanUtils.copyProperties(bookComment, bookCommentBO);
Student student = studentMapper.selectByPrimaryKey(bookCommentBO.getStudentId());
// 评论的学生
StudentBO studentBO = new StudentBO();
BeanUtils.copyProperties(student, studentBO);
bookCommentBO.setStudent(studentBO);
// 审核人
if (bookCommentBO.getVerifyUserId() != null) {
User verifyUser = userMapper.selectByPrimaryKey(bookCommentBO.getVerifyUserId());
bookCommentBO.setVerifyUserName(verifyUser.getUserName());
}
pageBO.add(bookCommentBO);
}
return pageBO;
}
}
3. Web層
BookAdminController
@Autowired
private BookService bookService;
@Autowired
private BookCommentService bookCommentService;
@GetMapping("/book/detail")
public TgResult<BookDetailBO> getBookDetail(@RequestParam("id") Integer id) {
return TgResult.ok(bookService.getBookDetail(id));
}
@GetMapping("/book/comment/list")
public TgResult<BookCommentBO> getBookCommentList(@RequestParam("pageNum") Integer pageNum
, @RequestParam("pageSize") Integer pageSize, @RequestParam("id") Integer id) {
return TgResult.ok(bookCommentService.getBookCommentPage(pageNum, pageSize, id));
}
前述のすべてのコード、新しく挿入された bookCommentService、および 2 つの新しいインターフェイスが追加されました。
4、ポストマンテスト
やっと
もっと実践的な記事を読みたい場合は、やはり私の実践的なコラムをお勧めします –> フロントエンド犬兄弟と私が共同で作成したコラム「SpringBoot+SpringCloud+Vue によるフロントエンドとバックエンドのプロジェクトの分離に基づく」0からので、エンタープライズレベルの標準化されたプロジェクトですぐに実践経験を積むことができます!
具体的なメリット、計画、技術選定はすべて「 The Beginning 」で読めます!
コラムを購読した後、私の WeChat を追加していただければ、各ユーザーに的を絞ったガイダンスを提供します。
さらに、私をフォローすることを忘れないでください: Tiangang gg、新しい記事を見逃すのは簡単ではありません: https://blog.csdn.net/scm_2008