refactor: 基于 novel 项目 & Spring Cloud 2022 & Spring Cloud Alibaba 2022 重构

This commit is contained in:
xiongxiaoyang
2023-03-30 16:15:56 +08:00
parent d68ce51c82
commit 3d098eea5e
505 changed files with 14127 additions and 24067 deletions

View File

@@ -4,8 +4,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-cloud</artifactId>
<groupId>com.java2nb.novel</groupId>
<version>1.3.0</version>
<groupId>io.github.xxyopen</groupId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -13,62 +13,37 @@
<dependencies>
<dependency>
<groupId>com.java2nb.novel</groupId>
<artifactId>book-api</artifactId>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-config</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.java2nb.novel</groupId>
<artifactId>news-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-book-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.maven.plugin.version}</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>201206030/${project.artifactId}:${project.version}</imageName>
<dockerHost>${docker.host}</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>-->
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,20 +0,0 @@
package com.java2nb.novel;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 首页微服务启动器
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@SpringBootApplication
@EnableFeignClients
public class HomeApplication {
public static void main(String[] args) {
SpringApplication.run(HomeApplication.class);
}
}

View File

@@ -1,89 +0,0 @@
package com.java2nb.novel.home.controller;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.book.vo.BookVO;
import com.java2nb.novel.common.bean.ResultBean;
import com.java2nb.novel.home.entity.HomeFriendLink;
import com.java2nb.novel.home.service.HomeService;
import com.java2nb.novel.home.vo.HomeBookVO;
import com.java2nb.novel.news.entity.News;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 首页微服务对外接口
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@RestController
@RequestMapping("home")
@RequiredArgsConstructor
@Slf4j
@Api(tags = "首页相关接口")
public class HomeController {
private final HomeService homeService;
/**
* 首页小说推荐数据查询接口
* */
@ApiOperation("首页小说推荐列表查询接口")
@GetMapping("book")
public ResultBean<List<HomeBookVO>> listHomeBook(){
return ResultBean.ok(homeService.listHomeBook());
}
/**
* 首页友情链接查询接口
* */
@ApiOperation("首页友情链接查询接口")
@GetMapping("friendLink")
public ResultBean<List<HomeFriendLink>> listIndexLink(){
return ResultBean.ok(homeService.listFriendLink());
}
/**
* 首页新闻查询接口
* */
@ApiOperation("首页新闻查询接口")
@GetMapping("news")
public ResultBean<List<News>> listIndexNews(){
return ResultBean.ok(homeService.listIndexNews());
}
/**
* 首页点击榜单查询接口
* */
@ApiOperation("首页点击榜单查询接口")
@GetMapping("listClickRank")
public ResultBean<List<Book>> listClickRank(){
return ResultBean.ok(homeService.listClickRank());
}
/**
* 首页新书榜单查询接口
* */
@ApiOperation("首页点击榜单查询接口")
@GetMapping("listNewRank")
public ResultBean<List<Book>> listNewRank(){
return ResultBean.ok(homeService.listNewRank());
}
/**
* 首页更新榜单查询接口
* */
@ApiOperation("首页点击榜单查询接口")
@GetMapping("listUpdateRank")
public ResultBean<List<BookVO>> listUpdateRank(){
return ResultBean.ok(homeService.listUpdateRank());
}
}

View File

@@ -1,119 +0,0 @@
package com.java2nb.novel.home.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.util.Date;
public class HomeBook {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@ApiModelProperty(value = "小说ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long bookId;
@ApiModelProperty(value = "排序号")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte sort;
@ApiModelProperty(value = "类型0轮播图1顶部小说栏设置2本周强推3热门推荐4精品推荐")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte type;
@ApiModelProperty(value = "创建时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@ApiModelProperty(value = "创建人ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long createUserId;
@ApiModelProperty(value = "更新时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date updateTime;
@ApiModelProperty(value = "更新人ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long updateUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Long id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getBookId() {
return bookId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setBookId(Long bookId) {
this.bookId = bookId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getSort() {
return sort;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setSort(Byte sort) {
this.sort = sort;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getType() {
return type;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setType(Byte type) {
this.type = type;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getCreateUserId() {
return createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getUpdateTime() {
return updateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getUpdateUserId() {
return updateUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
}

View File

@@ -1,134 +0,0 @@
package com.java2nb.novel.home.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.util.Date;
public class HomeFriendLink {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer id;
@ApiModelProperty(value = "链接名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String linkName;
@ApiModelProperty(value = "链接url")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String linkUrl;
@ApiModelProperty(value = "排序号")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte sort;
@ApiModelProperty(value = "是否开启0不开启1开启")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte isOpen;
@ApiModelProperty(value = "创建人id")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long createUserId;
@ApiModelProperty(value = "创建时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@ApiModelProperty(value = "更新者用户id")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long updateUserId;
@ApiModelProperty(value = "更新时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Integer id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getLinkName() {
return linkName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setLinkName(String linkName) {
this.linkName = linkName == null ? null : linkName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getLinkUrl() {
return linkUrl;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl == null ? null : linkUrl.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getSort() {
return sort;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setSort(Byte sort) {
this.sort = sort;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getIsOpen() {
return isOpen;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setIsOpen(Byte isOpen) {
this.isOpen = isOpen;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getCreateUserId() {
return createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getUpdateUserId() {
return updateUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getUpdateTime() {
return updateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}

View File

@@ -1,18 +0,0 @@
package com.java2nb.novel.home.feign;
import com.java2nb.novel.book.api.BookApi;
import com.java2nb.novel.home.feign.fallback.BookFeignFallback;
import org.springframework.cloud.openfeign.FeignClient;
/**
* 小说服务Feign客户端
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@FeignClient(name = "book-service",fallback = BookFeignFallback.class)
public interface BookFeignClient extends BookApi {
}

View File

@@ -1,16 +0,0 @@
package com.java2nb.novel.home.feign;
import com.java2nb.novel.book.api.BookApi;
import com.java2nb.novel.news.api.NewsApi;
import org.springframework.cloud.openfeign.FeignClient;
/**
* 新闻服务Feign客户端
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@FeignClient("news-service")
public interface NewsFeignClient extends NewsApi {
}

View File

@@ -1,15 +0,0 @@
package com.java2nb.novel.home.feign.fallback;
import com.java2nb.novel.book.api.fallback.BookApiFallback;
import com.java2nb.novel.home.feign.BookFeignClient;
import org.springframework.stereotype.Service;
/**
* 小说Feign客户端降级处理类(服务消费端,自定义降级处理)
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/7
*/
@Service
public class BookFeignFallback extends BookApiFallback implements BookFeignClient {
}

View File

@@ -1,60 +0,0 @@
package com.java2nb.novel.home.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
import java.util.Date;
public final class HomeBookDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final HomeBook homeBook = new HomeBook();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> id = homeBook.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> bookId = homeBook.bookId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> sort = homeBook.sort;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> type = homeBook.type;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = homeBook.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> createUserId = homeBook.createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> updateTime = homeBook.updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> updateUserId = homeBook.updateUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class HomeBook extends SqlTable {
public final SqlColumn<Long> id = column("id", JDBCType.BIGINT);
public final SqlColumn<Long> bookId = column("book_id", JDBCType.BIGINT);
public final SqlColumn<Byte> sort = column("sort", JDBCType.TINYINT);
public final SqlColumn<Byte> type = column("type", JDBCType.TINYINT);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Long> createUserId = column("create_user_id", JDBCType.BIGINT);
public final SqlColumn<Date> updateTime = column("update_time", JDBCType.TIMESTAMP);
public final SqlColumn<Long> updateUserId = column("update_user_id", JDBCType.BIGINT);
public HomeBook() {
super("home_book");
}
}
}

View File

@@ -1,192 +0,0 @@
package com.java2nb.novel.home.mapper;
import com.java2nb.novel.home.entity.HomeBook;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.home.mapper.HomeBookDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface HomeBookMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<HomeBook> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("HomeBookResult")
HomeBook selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="HomeBookResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="book_id", property="bookId", jdbcType=JdbcType.BIGINT),
@Result(column="sort", property="sort", jdbcType=JdbcType.TINYINT),
@Result(column="type", property="type", jdbcType=JdbcType.TINYINT),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="update_user_id", property="updateUserId", jdbcType=JdbcType.BIGINT)
})
List<HomeBook> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(homeBook);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, homeBook);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Long id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, homeBook)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(HomeBook record) {
return insert(SqlBuilder.insert(record)
.into(homeBook)
.map(id).toProperty("id")
.map(bookId).toProperty("bookId")
.map(sort).toProperty("sort")
.map(type).toProperty("type")
.map(createTime).toProperty("createTime")
.map(createUserId).toProperty("createUserId")
.map(updateTime).toProperty("updateTime")
.map(updateUserId).toProperty("updateUserId")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(HomeBook record) {
return insert(SqlBuilder.insert(record)
.into(homeBook)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(bookId).toPropertyWhenPresent("bookId", record::getBookId)
.map(sort).toPropertyWhenPresent("sort", record::getSort)
.map(type).toPropertyWhenPresent("type", record::getType)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
.map(updateUserId).toPropertyWhenPresent("updateUserId", record::getUpdateUserId)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<HomeBook>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, bookId, sort, type, createTime, createUserId, updateTime, updateUserId)
.from(homeBook);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<HomeBook>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, bookId, sort, type, createTime, createUserId, updateTime, updateUserId)
.from(homeBook);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default HomeBook selectByPrimaryKey(Long id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, bookId, sort, type, createTime, createUserId, updateTime, updateUserId)
.from(homeBook)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(HomeBook record) {
return UpdateDSL.updateWithMapper(this::update, homeBook)
.set(id).equalTo(record::getId)
.set(bookId).equalTo(record::getBookId)
.set(sort).equalTo(record::getSort)
.set(type).equalTo(record::getType)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
.set(updateUserId).equalTo(record::getUpdateUserId);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(HomeBook record) {
return UpdateDSL.updateWithMapper(this::update, homeBook)
.set(id).equalToWhenPresent(record::getId)
.set(bookId).equalToWhenPresent(record::getBookId)
.set(sort).equalToWhenPresent(record::getSort)
.set(type).equalToWhenPresent(record::getType)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(HomeBook record) {
return UpdateDSL.updateWithMapper(this::update, homeBook)
.set(bookId).equalTo(record::getBookId)
.set(sort).equalTo(record::getSort)
.set(type).equalTo(record::getType)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
.set(updateUserId).equalTo(record::getUpdateUserId)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(HomeBook record) {
return UpdateDSL.updateWithMapper(this::update, homeBook)
.set(bookId).equalToWhenPresent(record::getBookId)
.set(sort).equalToWhenPresent(record::getSort)
.set(type).equalToWhenPresent(record::getType)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,65 +0,0 @@
package com.java2nb.novel.home.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
import java.util.Date;
public final class HomeFriendLinkDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final HomeFriendLink homeFriendLink = new HomeFriendLink();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> id = homeFriendLink.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> linkName = homeFriendLink.linkName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> linkUrl = homeFriendLink.linkUrl;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> sort = homeFriendLink.sort;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> isOpen = homeFriendLink.isOpen;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> createUserId = homeFriendLink.createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = homeFriendLink.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> updateUserId = homeFriendLink.updateUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> updateTime = homeFriendLink.updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class HomeFriendLink extends SqlTable {
public final SqlColumn<Integer> id = column("id", JDBCType.INTEGER);
public final SqlColumn<String> linkName = column("link_name", JDBCType.VARCHAR);
public final SqlColumn<String> linkUrl = column("link_url", JDBCType.VARCHAR);
public final SqlColumn<Byte> sort = column("sort", JDBCType.TINYINT);
public final SqlColumn<Byte> isOpen = column("is_open", JDBCType.TINYINT);
public final SqlColumn<Long> createUserId = column("create_user_id", JDBCType.BIGINT);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Long> updateUserId = column("update_user_id", JDBCType.BIGINT);
public final SqlColumn<Date> updateTime = column("update_time", JDBCType.TIMESTAMP);
public HomeFriendLink() {
super("home_friend_link");
}
}
}

View File

@@ -1,199 +0,0 @@
package com.java2nb.novel.home.mapper;
import com.java2nb.novel.home.entity.HomeFriendLink;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.home.mapper.HomeFriendLinkDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface HomeFriendLinkMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<HomeFriendLink> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("HomeFriendLinkResult")
HomeFriendLink selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="HomeFriendLinkResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="link_name", property="linkName", jdbcType=JdbcType.VARCHAR),
@Result(column="link_url", property="linkUrl", jdbcType=JdbcType.VARCHAR),
@Result(column="sort", property="sort", jdbcType=JdbcType.TINYINT),
@Result(column="is_open", property="isOpen", jdbcType=JdbcType.TINYINT),
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="update_user_id", property="updateUserId", jdbcType=JdbcType.BIGINT),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP)
})
List<HomeFriendLink> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(homeFriendLink);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, homeFriendLink);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Integer id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, homeFriendLink)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(HomeFriendLink record) {
return insert(SqlBuilder.insert(record)
.into(homeFriendLink)
.map(id).toProperty("id")
.map(linkName).toProperty("linkName")
.map(linkUrl).toProperty("linkUrl")
.map(sort).toProperty("sort")
.map(isOpen).toProperty("isOpen")
.map(createUserId).toProperty("createUserId")
.map(createTime).toProperty("createTime")
.map(updateUserId).toProperty("updateUserId")
.map(updateTime).toProperty("updateTime")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(HomeFriendLink record) {
return insert(SqlBuilder.insert(record)
.into(homeFriendLink)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(linkName).toPropertyWhenPresent("linkName", record::getLinkName)
.map(linkUrl).toPropertyWhenPresent("linkUrl", record::getLinkUrl)
.map(sort).toPropertyWhenPresent("sort", record::getSort)
.map(isOpen).toPropertyWhenPresent("isOpen", record::getIsOpen)
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(updateUserId).toPropertyWhenPresent("updateUserId", record::getUpdateUserId)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<HomeFriendLink>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, linkName, linkUrl, sort, isOpen, createUserId, createTime, updateUserId, updateTime)
.from(homeFriendLink);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<HomeFriendLink>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, linkName, linkUrl, sort, isOpen, createUserId, createTime, updateUserId, updateTime)
.from(homeFriendLink);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default HomeFriendLink selectByPrimaryKey(Integer id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, linkName, linkUrl, sort, isOpen, createUserId, createTime, updateUserId, updateTime)
.from(homeFriendLink)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(HomeFriendLink record) {
return UpdateDSL.updateWithMapper(this::update, homeFriendLink)
.set(id).equalTo(record::getId)
.set(linkName).equalTo(record::getLinkName)
.set(linkUrl).equalTo(record::getLinkUrl)
.set(sort).equalTo(record::getSort)
.set(isOpen).equalTo(record::getIsOpen)
.set(createUserId).equalTo(record::getCreateUserId)
.set(createTime).equalTo(record::getCreateTime)
.set(updateUserId).equalTo(record::getUpdateUserId)
.set(updateTime).equalTo(record::getUpdateTime);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(HomeFriendLink record) {
return UpdateDSL.updateWithMapper(this::update, homeFriendLink)
.set(id).equalToWhenPresent(record::getId)
.set(linkName).equalToWhenPresent(record::getLinkName)
.set(linkUrl).equalToWhenPresent(record::getLinkUrl)
.set(sort).equalToWhenPresent(record::getSort)
.set(isOpen).equalToWhenPresent(record::getIsOpen)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(HomeFriendLink record) {
return UpdateDSL.updateWithMapper(this::update, homeFriendLink)
.set(linkName).equalTo(record::getLinkName)
.set(linkUrl).equalTo(record::getLinkUrl)
.set(sort).equalTo(record::getSort)
.set(isOpen).equalTo(record::getIsOpen)
.set(createUserId).equalTo(record::getCreateUserId)
.set(createTime).equalTo(record::getCreateTime)
.set(updateUserId).equalTo(record::getUpdateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(HomeFriendLink record) {
return UpdateDSL.updateWithMapper(this::update, homeFriendLink)
.set(linkName).equalToWhenPresent(record::getLinkName)
.set(linkUrl).equalToWhenPresent(record::getLinkUrl)
.set(sort).equalToWhenPresent(record::getSort)
.set(isOpen).equalToWhenPresent(record::getIsOpen)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,56 +0,0 @@
package com.java2nb.novel.home.service;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.book.vo.BookVO;
import com.java2nb.novel.home.entity.HomeFriendLink;
import com.java2nb.novel.home.vo.HomeBookVO;
import com.java2nb.novel.news.entity.News;
import java.util.List;
/**
* 首页服务接口
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
public interface HomeService {
/**
* 首页小说推荐数据查询
* @return 首页推荐的小说数据
* */
List<HomeBookVO> listHomeBook();
/**
* 首页友情链接查询
* @return 友情链接集合
* */
List<HomeFriendLink> listFriendLink();
/**
* 查询首页新闻
* @return 新闻列表集合
* */
List<News> listIndexNews();
/**
* 首页点击榜单查询接口
* @return 小说数据集合
* */
List<Book> listClickRank();
/**
* 首页新书榜单查询接口
* @return 小说数据集合
* */
List<Book> listNewRank();
/**
* 首页更新榜单查询接口
* @return 小说数据集合
* */
List<BookVO> listUpdateRank();
}

View File

@@ -1,147 +0,0 @@
package com.java2nb.novel.home.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.book.vo.BookVO;
import com.java2nb.novel.common.cache.CacheKey;
import com.java2nb.novel.common.cache.CacheService;
import com.java2nb.novel.common.utils.BeanUtil;
import com.java2nb.novel.common.utils.Constants;
import com.java2nb.novel.home.entity.HomeBook;
import com.java2nb.novel.home.entity.HomeFriendLink;
import com.java2nb.novel.home.feign.BookFeignClient;
import com.java2nb.novel.home.feign.NewsFeignClient;
import com.java2nb.novel.home.mapper.HomeBookDynamicSqlSupport;
import com.java2nb.novel.home.mapper.HomeBookMapper;
import com.java2nb.novel.home.mapper.HomeFriendLinkDynamicSqlSupport;
import com.java2nb.novel.home.mapper.HomeFriendLinkMapper;
import com.java2nb.novel.home.service.HomeService;
import com.java2nb.novel.home.vo.HomeBookVO;
import com.java2nb.novel.news.entity.News;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
import static org.mybatis.dynamic.sql.select.SelectDSL.select;
/**
* 首页服务接口实现
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@Service
@RequiredArgsConstructor
public class HomeServiceImpl implements HomeService {
private final CacheService cacheService;
private final BookFeignClient bookFeignClient;
private final HomeBookMapper homeBookMapper;
private final HomeFriendLinkMapper homeFriendLinkMapper;
private final NewsFeignClient newsFeignClient;
@SneakyThrows
@Override
public List<HomeBookVO> listHomeBook() {
String result = cacheService.get(CacheKey.INDEX_BOOK_SETTINGS_KEY);
if (result == null || result.length() < Constants.OBJECT_JSON_CACHE_EXIST_LENGTH) {
List<HomeBook> list = homeBookMapper.selectMany(
select(HomeBookDynamicSqlSupport.bookId,HomeBookDynamicSqlSupport.type)
.from(HomeBookDynamicSqlSupport.homeBook)
.orderBy(HomeBookDynamicSqlSupport.type,HomeBookDynamicSqlSupport.sort)
.build()
.render(RenderingStrategies.MYBATIS3));
List<Book> books = bookFeignClient.queryBookByIds(list.stream().map(HomeBook::getBookId).collect(Collectors.toList()));
Map<Long, Book> booksById = books.stream().collect(Collectors.toMap(Book::getId, Function.identity(),(key1, key2) -> key2));
List<HomeBookVO> resultList = new ArrayList<>(booksById.size());
for(HomeBook homeBook : list){
HomeBookVO homeBookVO = new HomeBookVO();
BeanUtils.copyProperties(homeBook,homeBookVO);
Book book = booksById.get(homeBook.getBookId());
if(book != null){
BeanUtils.copyProperties(book,homeBookVO);
resultList.add(homeBookVO);
}
}
result = new ObjectMapper().writeValueAsString(resultList);
cacheService.set(CacheKey.INDEX_BOOK_SETTINGS_KEY, result);
}
return new ObjectMapper().readValue(result, List.class);
}
@Override
public List<HomeFriendLink> listFriendLink() {
List<HomeFriendLink> result = (List<HomeFriendLink>) cacheService.getObject(CacheKey.INDEX_LINK_KEY);
if(result == null || result.size() == 0) {
SelectStatementProvider selectStatement =
select(HomeFriendLinkDynamicSqlSupport.linkName,HomeFriendLinkDynamicSqlSupport.linkUrl)
.from(HomeFriendLinkDynamicSqlSupport.homeFriendLink)
.where(HomeFriendLinkDynamicSqlSupport.isOpen,isEqualTo((byte)1))
.orderBy(HomeFriendLinkDynamicSqlSupport.sort)
.build()
.render(RenderingStrategies.MYBATIS3);
result = homeFriendLinkMapper.selectMany(selectStatement);
cacheService.setObject(CacheKey.INDEX_LINK_KEY,result);
}
return result;
}
@Override
public List<News> listIndexNews() {
List<News> result = (List<News>) cacheService.getObject(CacheKey.INDEX_NEWS_KEY);
if(result == null || result.size() == 0) {
result = newsFeignClient.listLastIndexNews(2);
cacheService.setObject(CacheKey.INDEX_NEWS_KEY,result);
}
return result;
}
@Override
public List<Book> listClickRank() {
List<Book> result = (List<Book>) cacheService.getObject(CacheKey.INDEX_CLICK_BANK_BOOK_KEY);
if (result == null || result.size() == 0) {
result = bookFeignClient.listRank((byte) 0, 10);
cacheService.setObject(CacheKey.INDEX_CLICK_BANK_BOOK_KEY, result, 5000);
}
return result;
}
@Override
public List<Book> listNewRank() {
List<Book> result = (List<Book>) cacheService.getObject(CacheKey.INDEX_NEW_BOOK_KEY);
if (result == null || result.size() == 0) {
result = bookFeignClient.listRank((byte) 1, 10);
cacheService.setObject(CacheKey.INDEX_NEW_BOOK_KEY, result, 3600);
}
return result;
}
@Override
public List<BookVO> listUpdateRank() {
List<BookVO> result = (List<BookVO>) cacheService.getObject(CacheKey.INDEX_UPDATE_BOOK_KEY);
if (result == null || result.size() == 0) {
List<Book> bookPOList = bookFeignClient.listRank((byte) 2, 23);
result = BeanUtil.copyList(bookPOList, BookVO.class);
cacheService.setObject(CacheKey.INDEX_UPDATE_BOOK_KEY, result, 60 * 10);
}
return result;
}
}

View File

@@ -1,38 +0,0 @@
package com.java2nb.novel.home.vo;
import com.java2nb.novel.home.entity.HomeBook;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 首页小说VO对象
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@Data
public class HomeBookVO extends HomeBook implements Serializable {
@ApiModelProperty(value = "小说名")
private String bookName;
@ApiModelProperty(value = "小说封面")
private String picUrl;
@ApiModelProperty(value = "作者名")
private String authorName;
@ApiModelProperty(value = "小说简介")
private String bookDesc;
@ApiModelProperty(value = "小说评分")
private Float score;
@Override
public String toString() {
return super.toString();
}
}

View File

@@ -0,0 +1,21 @@
package io.github.xxyopen.novel.home;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication(scanBasePackages = {"io.github.xxyopen.novel"})
@MapperScan("io.github.xxyopen.novel.*.dao.mapper")
@EnableCaching
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"io.github.xxyopen.novel.book.feign"})
public class NovelHomeApplication {
public static void main(String[] args) {
SpringApplication.run(NovelHomeApplication.class, args);
}
}

View File

@@ -0,0 +1,49 @@
package io.github.xxyopen.novel.home.controller.front;
import io.github.xxyopen.novel.common.constant.ApiRouterConsts;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.home.dto.resp.HomeBookRespDto;
import io.github.xxyopen.novel.home.dto.resp.HomeFriendLinkRespDto;
import io.github.xxyopen.novel.home.service.HomeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 前台门户-首页模块 API 控制器
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Tag(name = "HomeController", description = "前台门户-首页模块")
@RestController
@RequestMapping(ApiRouterConsts.API_FRONT_HOME_URL_PREFIX)
@RequiredArgsConstructor
public class HomeController {
private final HomeService homeService;
/**
* 首页小说推荐查询接口
*/
@Operation(summary = "首页小说推荐查询接口")
@GetMapping("books")
public RestResp<List<HomeBookRespDto>> listHomeBooks() {
return homeService.listHomeBooks();
}
/**
* 首页友情链接列表查询接口
*/
@Operation(summary = "首页友情链接列表查询接口")
@GetMapping("friend_Link/list")
public RestResp<List<HomeFriendLinkRespDto>> listHomeFriendLinks() {
return homeService.listHomeFriendLinks();
}
}

View File

@@ -0,0 +1,111 @@
package io.github.xxyopen.novel.home.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说推荐
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/12
*/
@TableName("home_book")
public class HomeBook implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 推荐类型;0-轮播图 1-顶部栏 2-本周强推 3-热门推荐 4-精品推荐
*/
private Integer type;
/**
* 推荐排序
*/
private Integer sort;
/**
* 推荐小说ID
*/
private Long bookId;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public Long getBookId() {
return bookId;
}
public void setBookId(Long bookId) {
this.bookId = bookId;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "HomeBook{" +
"id=" + id +
", type=" + type +
", sort=" + sort +
", bookId=" + bookId +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,125 @@
package io.github.xxyopen.novel.home.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 友情链接
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
@TableName("home_friend_link")
public class HomeFriendLink implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 链接名
*/
private String linkName;
/**
* 链接url
*/
private String linkUrl;
/**
* 排序号
*/
private Integer sort;
/**
* 是否开启;0-不开启 1-开启
*/
private Integer isOpen;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLinkName() {
return linkName;
}
public void setLinkName(String linkName) {
this.linkName = linkName;
}
public String getLinkUrl() {
return linkUrl;
}
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public Integer getIsOpen() {
return isOpen;
}
public void setIsOpen(Integer isOpen) {
this.isOpen = isOpen;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "HomeFriendLink{" +
"id=" + id +
", linkName=" + linkName +
", linkUrl=" + linkUrl +
", sort=" + sort +
", isOpen=" + isOpen +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.home.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.home.dao.entity.HomeBook;
/**
* <p>
* 小说推荐 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/12
*/
public interface HomeBookMapper extends BaseMapper<HomeBook> {
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.home.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.home.dao.entity.HomeFriendLink;
/**
* <p>
* 友情链接 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface HomeFriendLinkMapper extends BaseMapper<HomeFriendLink> {
}

View File

@@ -0,0 +1,51 @@
package io.github.xxyopen.novel.home.dto.resp;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 首页小说推荐 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/13
*/
@Data
public class HomeBookRespDto {
/**
* 类型;0-轮播图 1-顶部栏 2-本周强推 3-热门推荐 4-精品推荐
*/
@Schema(description = "类型;0-轮播图 1-顶部栏 2-本周强推 3-热门推荐 4-精品推荐")
private Integer type;
/**
* 推荐小说ID
*/
@Schema(description = "小说ID")
private Long bookId;
/**
* 小说封面地址
*/
@Schema(description = "小说封面地址")
private String picUrl;
/**
* 小说名
*/
@Schema(description = "小说名")
private String bookName;
/**
* 作家名
*/
@Schema(description = "作家名")
private String authorName;
/**
* 书籍描述
*/
@Schema(description = "书籍描述")
private String bookDesc;
}

View File

@@ -0,0 +1,32 @@
package io.github.xxyopen.novel.home.dto.resp;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 首页友情链接 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
@Data
public class HomeFriendLinkRespDto implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 链接名
*/
@Schema(description = "链接名")
private String linkName;
/**
* 链接url
*/
@Schema(description = "链接url")
private String linkUrl;
}

View File

@@ -0,0 +1,44 @@
package io.github.xxyopen.novel.home.manager.cache;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.github.xxyopen.novel.common.constant.CacheConsts;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import io.github.xxyopen.novel.home.dao.entity.HomeFriendLink;
import io.github.xxyopen.novel.home.dao.mapper.HomeFriendLinkMapper;
import io.github.xxyopen.novel.home.dto.resp.HomeFriendLinkRespDto;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 友情链接 缓存管理类
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Component
@RequiredArgsConstructor
public class FriendLinkCacheManager {
private final HomeFriendLinkMapper friendLinkMapper;
/**
* 友情链接列表查询,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.REDIS_CACHE_MANAGER,
value = CacheConsts.HOME_FRIEND_LINK_CACHE_NAME)
public List<HomeFriendLinkRespDto> listFriendLinks() {
// 从友情链接表中查询出友情链接列表
QueryWrapper<HomeFriendLink> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc(DatabaseConsts.CommonColumnEnum.SORT.getName());
return friendLinkMapper.selectList(queryWrapper).stream().map(v -> {
HomeFriendLinkRespDto respDto = new HomeFriendLinkRespDto();
respDto.setLinkName(v.getLinkName());
respDto.setLinkUrl(v.getLinkUrl());
return respDto;
}).toList();
}
}

View File

@@ -0,0 +1,86 @@
package io.github.xxyopen.novel.home.manager.cache;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.github.xxyopen.novel.book.dto.resp.BookInfoRespDto;
import io.github.xxyopen.novel.common.constant.CacheConsts;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import io.github.xxyopen.novel.home.dao.entity.HomeBook;
import io.github.xxyopen.novel.home.dao.mapper.HomeBookMapper;
import io.github.xxyopen.novel.home.dto.resp.HomeBookRespDto;
import io.github.xxyopen.novel.home.manager.feign.BookFeignManager;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 首页推荐小说 缓存管理类
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Component
@RequiredArgsConstructor
public class HomeBookCacheManager {
private final HomeBookMapper homeBookMapper;
private final BookFeignManager bookFeignManager;
/**
* 查询首页小说推荐,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.HOME_BOOK_CACHE_NAME)
public List<HomeBookRespDto> listHomeBooks() {
// 从首页小说推荐表中查询出需要推荐的小说
QueryWrapper<HomeBook> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc(DatabaseConsts.CommonColumnEnum.SORT.getName());
List<HomeBook> homeBooks = homeBookMapper.selectList(queryWrapper);
// 获取推荐小说ID列表
if (!CollectionUtils.isEmpty(homeBooks)) {
List<Long> bookIds = homeBooks.stream()
.map(HomeBook::getBookId)
.toList();
// 根据小说ID列表查询相关的小说信息列表
List<BookInfoRespDto> bookInfos = bookFeignManager.listBookInfoByIds(bookIds);
// 组装 HomeBookRespDto 列表数据并返回
if (!CollectionUtils.isEmpty(bookInfos)) {
Map<Long, BookInfoRespDto> bookInfoMap = bookInfos.stream()
.collect(Collectors.toMap(BookInfoRespDto::getId, Function.identity()));
return homeBooks.stream().map(v -> {
BookInfoRespDto bookInfo = bookInfoMap.get(v.getBookId());
HomeBookRespDto bookRespDto = new HomeBookRespDto();
bookRespDto.setType(v.getType());
bookRespDto.setBookId(v.getBookId());
bookRespDto.setBookName(bookInfo.getBookName());
bookRespDto.setPicUrl(bookInfo.getPicUrl());
bookRespDto.setAuthorName(bookInfo.getAuthorName());
bookRespDto.setBookDesc(bookInfo.getBookDesc());
return bookRespDto;
}).toList();
}
}
return Collections.emptyList();
}
@CacheEvict(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.HOME_BOOK_CACHE_NAME)
public void evictCache(){
}
}

View File

@@ -0,0 +1,35 @@
package io.github.xxyopen.novel.home.manager.feign;
import io.github.xxyopen.novel.book.dto.resp.BookEsRespDto;
import io.github.xxyopen.novel.book.dto.resp.BookInfoRespDto;
import io.github.xxyopen.novel.book.feign.BookFeign;
import io.github.xxyopen.novel.common.constant.ErrorCodeEnum;
import io.github.xxyopen.novel.common.resp.RestResp;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* 小说微服务调用 Feign 客户端管理
*
* @author xiongxiaoyang
* @date 2023/3/29
*/
@Component
@AllArgsConstructor
public class BookFeignManager {
private final BookFeign bookFeign;
public List<BookInfoRespDto> listBookInfoByIds(List<Long> bookIds){
RestResp<List<BookInfoRespDto>> resp = bookFeign.listBookInfoByIds(bookIds);
if(Objects.equals(ErrorCodeEnum.OK.getCode(),resp.getCode())){
return resp.getData();
}
return new ArrayList<>(0);
}
}

View File

@@ -0,0 +1,30 @@
package io.github.xxyopen.novel.home.service;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.home.dto.resp.HomeBookRespDto;
import io.github.xxyopen.novel.home.dto.resp.HomeFriendLinkRespDto;
import java.util.List;
/**
* 首页模块 服务类
*
* @author xiongxiaoyang
* @date 2022/5/13
*/
public interface HomeService {
/**
* 查询首页小说推荐列表
*
* @return 首页小说推荐列表的 rest 响应结果
*/
RestResp<List<HomeBookRespDto>> listHomeBooks();
/**
* 首页友情链接列表查询
*
* @return 友情链接列表
*/
RestResp<List<HomeFriendLinkRespDto>> listHomeFriendLinks();
}

View File

@@ -0,0 +1,43 @@
package io.github.xxyopen.novel.home.service.impl;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.home.dto.resp.HomeBookRespDto;
import io.github.xxyopen.novel.home.dto.resp.HomeFriendLinkRespDto;
import io.github.xxyopen.novel.home.manager.cache.FriendLinkCacheManager;
import io.github.xxyopen.novel.home.manager.cache.HomeBookCacheManager;
import io.github.xxyopen.novel.home.service.HomeService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Optional;
/**
* 首页模块 服务实现类
*
* @author xiongxiaoyang
* @date 2022/5/13
*/
@Service
@RequiredArgsConstructor
public class HomeServiceImpl implements HomeService {
private final HomeBookCacheManager homeBookCacheManager;
private final FriendLinkCacheManager friendLinkCacheManager;
@Override
public RestResp<List<HomeBookRespDto>> listHomeBooks() {
List<HomeBookRespDto> list = homeBookCacheManager.listHomeBooks();
if(CollectionUtils.isEmpty(list)){
homeBookCacheManager.evictCache();
}
return RestResp.ok(list);
}
@Override
public RestResp<List<HomeFriendLinkRespDto>> listHomeFriendLinks() {
return RestResp.ok(friendLinkCacheManager.listFriendLinks());
}
}

View File

@@ -1,6 +1,16 @@
server:
port: 9001
spring:
profiles:
include: [common]
feign:
sentinel:
enabled: true
include: common
active: dev
management:
# 端点启用配置
endpoint:
logfile:
# 启用返回日志文件内容的端点
enabled: true
# 外部日志文件路径
external-file: logs/novel-home-service.log

View File

@@ -1,12 +1,6 @@
spring:
application:
name: novel-home
name: novel-home-service
profiles:
active: dev
cloud:
nacos:
config:
extconfig[0]:
dataid: novel-redis.yml
group: novel-common
refresh: true
include: common

View File

@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
<!-- appender是configuration的子节点是负责写日志的组件。 -->
<!-- ConsoleAppender把日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--
<pattern>%d %p (%file:%line\)- %m%n</pattern>
-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 控制台也要使用UTF-8不要使用GBK否则会中文乱码 -->
<charset>UTF-8</charset>
@@ -26,7 +26,7 @@
<!-- 2.如果日期没有发生变化但是当前日志的文件大小超过1KB时对当前日志进行分割 重命名 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/novel-home.log</File>
<File>logs/novel-home-service.log</File>
<!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
<!-- TimeBasedRollingPolicy 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@@ -49,24 +49,31 @@
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>198.245.61.51:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<!-- 控制台输出日志级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="LOGSTASH"/>
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为【从高到低】FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="com.java2nb" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="LOGSTASH"/>
</logger>
<springProfile name="dev">
<!-- ROOT 日志级别 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为【从高到低】FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="io.github.xxyopen" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</logger>
</springProfile>
<springProfile name="prod">
<!-- ROOT 日志级别 -->
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为【从高到低】FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="io.github.xxyopen" level="ERROR" additivity="false">
<appender-ref ref="FILE"/>
</logger>
</springProfile>
</configuration>