唯讀---圖書微服務

唯讀---圖書微服務

上一期博客已經(jīng)更新了圖書微服務的搭建,現(xiàn)在直接就是照著圖書微服務接口補充邏輯,這幾天忙的一批,忙著工作室招新,哈哈哈哈,不過還好,有好多優(yōu)秀學弟學妹來搞這個事情,也是比較放心。

一、依賴導入

話不多說,直接吧pom.xml粘過來

wedo-book-service/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>wedo-book</artifactId>
        <groupId>com.wedo.book</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wedo.book</groupId>
    <artifactId>wedo-book-service</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <!-- eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- jdbc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mysql驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
        </dependency>
        <!-- 分頁插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>
        <!-- 依賴leyou-item-interface -->
        <dependency>
            <groupId>com.wedo.book</groupId>
            <artifactId>wedo-book-interface</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 依賴wedo-common -->
        <dependency>
            <groupId>com.wedo.common</groupId>
            <artifactId>wedo-common</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!-- Spring AMQP -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

</project>

wedo-book-interface/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>wedo-book</artifactId>
        <groupId>com.wedo.book</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wedo.book</groupId>
    <artifactId>wedo-book-interface</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wedo.common</groupId>
            <artifactId>wedo-common</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

二、wedo-book代碼編寫

先簡單介紹一下這個模塊:

這個模塊也就是傳說中的圖書微服務,唯讀項目的核心部分,與書或者內容相關的都在這個微服務中體現(xiàn),因為之前寫好了接口文檔,現(xiàn)在只需要照著接口文檔補接口就行了,但是哥們好像并不怎么看接口文檔,有點桑心,還好可以靠口頭對接口,哥們:你獲取圖書列表咋搞,我:這個url,要這幾個參數(shù)。雖然比較原始,但還是能用。

項目概覽

項目概覽

就長這個樣子了,對了,還有wedo-book-interface子項目

interface子項目

然后就是一點一點補接口遼

實體類編寫

實體類在book-interface項目里了,其他項目需要用到這個實體類直接依賴interface就可以遼

實體類其實在一開始就設計的差不多了,后來有做了些小改動。

首先是我們的主角,Book實體類,這個是圖書實體鴨

package com.wedo.book.pojo;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Table(name = "book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String intro;
    private Long aId;
    private String bookComment;
    private String image;
    private Date creatDate;
    private Integer chapterNumber;
    private Date updateDate;
    private Boolean state;
    private String protagonist;
    private Long cId;

    // get和set咱們就略了吧,要不然太長了
}

然后就是不可或缺的角色,Category實體類,這個是分類哈

package com.wedo.book.pojo;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "category")
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String typeName;
    private String typeInfo;
    private String iconUrl;

    // get和set就繼續(xù)略了
}

緊接著是章節(jié),Chapter實體類,有章節(jié)的信息,還有內容

package com.wedo.book.pojo;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "chapter")
public class Chapter {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Integer sequenceNum;
    private String title;
    private String context;
    private Long bId;
    
    // get和set再略
}

下一個是圖書熱度實體類,雖然我覺得這個好像存在設計問題,BookHot

package com.wedo.book.pojo;

import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "book_hot")
public class BookHot {
    @Id
    private Long bId;
    private Integer clickNum;
    private Integer searchNum;
    private Integer hot;

    // 我再略
}

連接詞窮,反正這個是作者實體類,Author

package com.wedo.book.pojo;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "author")
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String introduce;
    private String aPhoto;
    
    // 略略略
}

實體增強類

這個主要用戶接收requestbody參數(shù)的類,應為前端發(fā)送的是json,后臺只能用requestbody了,雖然個別情況很麻煩,但是為了哥們前端寫的簡單,就這吧。

ChapterRequest

package com.wedo.book.bo;

import com.wedo.book.pojo.Chapter;

/**
 * Chapter請求參數(shù)實體類
 */
public class ChapterRequest extends Chapter {
    private Integer frontSequenceNum;

    public Integer getFrontSequenceNum() {
        return frontSequenceNum;
    }

    public void setFrontSequenceNum(Integer frontSequenceNum) {
        this.frontSequenceNum = frontSequenceNum;
    }
}

響應結果類

這個就不用多說了吧,就是需要自定義響應結果的情況

ChapterResult(感覺多余)

package com.wedo.book.result;

/**
 * 章節(jié)基本信息
 */
public class ChapterResult {
    private Long id;
    private Integer sequenceNum;
    private String title;
    private Long bId;
    
    // get和set略了
}

BookHotResult

package com.wedo.book.result;

import com.wedo.book.pojo.Book;

public class BookHotResult extends Book {
    private String name;
    private Integer hot;

    // get和set又略
}

interface項目基本就這么多,后期需要補上可被其他微服務調用的接口包,等用到在寫吧

Mapper層(Dao層)

打的有點累,這個是BookMapper,用了通用mapper基本只需要寫特殊方法,我的習慣一般是單表使用通用mapper提供的方法,多表使用自定義方法,手寫sql了

package com.wedo.book.mapper;

import com.wedo.book.pojo.Book;
import com.wedo.book.result.BookHotResult;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import tk.mybatis.mapper.common.Mapper;

import java.util.List;

public interface BookMapper extends Mapper<Book> {
    @Select("select b.id,b.title,b.intro,b.image,bh.hot,a.name from book b join book_hot bh,author a where b.c_id = #{cid} and bh.b_id = b.id and a.id = b.a_id order by bh.hot desc limit #{rows};")
    List<BookHotResult> queryBooksByCidAndHot(@Param("cid") Long cid, @Param("rows") Integer rows);
}

CategoryMapper

package com.wedo.book.mapper;

import com.wedo.book.pojo.Category;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import tk.mybatis.mapper.common.Mapper;

import java.util.List;

public interface CategoryMapper extends Mapper<Category> {

    @Delete("delete from category_book where c_id = #{cid}")
    void deleteCategoryAndBook(@Param("cid") Long cid);

    @Select("select c.* from book b join category c where b.id = #{bid} and b.c_id = c.id;")
    List<Category> queryCategoryByBid(@Param("bid") Long bid);
}

ChapterMapper

package com.wedo.book.mapper;

import com.wedo.book.pojo.Chapter;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import tk.mybatis.mapper.common.Mapper;

public interface ChapterMapper extends Mapper<Chapter> {

    @Select("SELECT max(sequence_num) FROM `chapter` where b_id = #{bid}")
    Integer queryMaxSequenceNumByBid(@Param("bid") Long bid);

    @Update("UPDATE chapter SET sequence_num=sequence_num+1 WHERE sequence_num > #{frontSequenceNum} and b_id = #{bid}")
    void updateSequenceNumLaterAdd(@Param("frontSequenceNum") Integer frontSequenceNum,@Param("bid") Long bid);

    @Update("UPDATE chapter SET sequence_num=sequence_num-1 WHERE sequence_num > #{frontSequenceNum} and b_id = #{bid}")
    void updateSequenceNumLaterSub(@Param("frontSequenceNum") Integer frontSequenceNum,@Param("bid") Long bid);
}

BookHotMapper

package com.wedo.book.mapper;

import com.wedo.book.pojo.BookHot;
import tk.mybatis.mapper.common.Mapper;

public interface BookHotMapper extends Mapper<BookHot> {
}

AuthorMapper

package com.wedo.book.mapper;

import com.wedo.book.pojo.Author;
import tk.mybatis.mapper.common.Mapper;

public interface AuthorMapper extends Mapper<Author> {
}

controller層

首先是BookController

package com.wedo.book.controller;

import com.wedo.book.pojo.Book;
import com.wedo.book.pojo.BookHot;
import com.wedo.book.result.BookHotResult;
import com.wedo.book.service.BookService;
import com.wedo.common.pojo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping("books")
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping("page")
    public ResponseEntity<PageResult<Book>> queryBookByPage(
            @RequestParam(value = "title",required = false) String title,
            @RequestParam(value = "cid",required = false) Long cid,
            @RequestParam(value = "page",defaultValue = "1") Integer page,
            @RequestParam(value = "rows",defaultValue = "6") Integer rows
    ) {
        PageResult<Book> result = this.bookService.queryBookByPage(title,cid,page,rows);
        if (result == null || CollectionUtils.isEmpty(result.getItems())) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.ok(result);
    }

    /**
     * 根據(jù)分類id查詢
     * @param cid
     * @param page
     * @param rows
     * @return
     */
    @GetMapping("pageByCid")
    public ResponseEntity<PageResult<Book>> queryBookPageByCid(
            @RequestParam(value = "cid",required = true) Long cid,
            @RequestParam(value = "page",defaultValue = "1") Integer page,
            @RequestParam(value = "rows",defaultValue = "6") Integer rows
    ) {
        PageResult<Book> result = this.bookService.queryBookPageByCid(cid,page,rows);
        if (result == null || CollectionUtils.isEmpty(result.getItems())) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.ok(result);
    }

    /**
     * 根據(jù)分類id查詢
     * @param cid
     * @param rows
     * @return
     */
    @GetMapping("pageByCidAndHot")
    public ResponseEntity<List<BookHotResult>> queryBooksByCidAndHot(
            @RequestParam(value = "cid") Long cid,
            @RequestParam(value = "rows",defaultValue = "4") Integer rows
    ) {
        List<BookHotResult> books = this.bookService.queryBooksByCidAndHot(cid,rows);
        if (CollectionUtils.isEmpty(books)) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.ok(books);
    }

    /**
     * 根據(jù)作者id查詢
     * @param aid
     * @param page
     * @param rows
     * @return
     */
    @GetMapping("pageByAid")
    public ResponseEntity<PageResult<Book>> queryBookPageByAid(
            @RequestParam(value = "aid",required = true) Long aid,
            @RequestParam(value = "page",defaultValue = "1") Integer page,
            @RequestParam(value = "rows",defaultValue = "6") Integer rows
    ) {
        PageResult<Book> result = this.bookService.queryBookPageByAid(aid,page,rows);
        if (result == null || CollectionUtils.isEmpty(result.getItems())) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.ok(result);
    }

    /**
     * 根據(jù)圖書id查找
     * @param bid
     * @return
     */
    @GetMapping("bid/{bid}")
    public ResponseEntity<Book> queryBookByBid(@PathVariable("bid")Long bid) {
        Book result = this.bookService.queryBookByBid(bid);
        if (result == null) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.ok(result);
    }

    @PutMapping
    public ResponseEntity<Void> updateBook(@RequestBody Book book) {
        if (book.getId() == null) {
            return ResponseEntity.badRequest().build();
        }
        this.bookService.updateBookById(book);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    @PostMapping
    public ResponseEntity<Void> addBook(@RequestBody Book book) {
        this.bookService.saveBook(book);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    @DeleteMapping
    public ResponseEntity<Void> deleteBook(@RequestBody Book book) {
        if (book.getId() == null) {
            return ResponseEntity.badRequest().build();
        }
        this.bookService.deleteBook(book.getId());
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

}

GET請求我一般用于查詢遼,Post一般用來添加,Put請求用于修改,Delete請求用于刪除,業(yè)務內容基本跟方法名字面意思一致。

好累啊,今天先到這里了,明天再繼續(xù)更新吧。
上一篇:唯讀---項目基礎搭建

下一篇:最后一篇了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容