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

@@ -1,26 +0,0 @@
package com.java2nb.novel.news.api;
import com.java2nb.novel.news.entity.News;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* 新闻微服务API接口定义内部
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
public interface NewsApi {
/**
* 查询最新新闻集合
* @param limit 查询条数
* @return 新闻集合
* */
@GetMapping("api/news/listLastIndexNews")
List<News> listLastIndexNews(@RequestParam("limit") int limit);
}

View File

@@ -1,149 +0,0 @@
package com.java2nb.novel.news.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.io.Serializable;
import java.util.Date;
public class News implements Serializable {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@ApiModelProperty(value = "类别ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer catId;
@ApiModelProperty(value = "分类名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String catName;
@ApiModelProperty(value = "来源")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String sourceName;
@ApiModelProperty(value = "标题")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String title;
@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;
@ApiModelProperty(value = "内容")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String content;
@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 Integer getCatId() {
return catId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCatId(Integer catId) {
this.catId = catId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getCatName() {
return catName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCatName(String catName) {
this.catName = catName == null ? null : catName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getSourceName() {
return sourceName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setSourceName(String sourceName) {
this.sourceName = sourceName == null ? null : sourceName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getTitle() {
return title;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setTitle(String title) {
this.title = title == null ? null : title.trim();
}
@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;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getContent() {
return content;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setContent(String content) {
this.content = content == null ? null : content.trim();
}
}

View File

@@ -1,102 +0,0 @@
package com.java2nb.novel.news.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.util.Date;
public class NewsCategory {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer id;
@ApiModelProperty(value = "分类名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String name;
@ApiModelProperty(value = "排序")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte sort;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long updateUserId;
@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 getName() {
return name;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setName(String name) {
this.name = name == null ? null : name.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 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,22 +0,0 @@
package com.java2nb.novel.news.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.java2nb.novel.news.entity.News;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 新闻VO对象
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@Data
public class NewsVO extends News {
@ApiModelProperty(value = "新闻发布时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
private Date createTime;
}

View File

@@ -1,72 +0,0 @@
<?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>novel-news</artifactId>
<groupId>com.java2nb.novel</groupId>
<version>1.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>news-service</artifactId>
<dependencies>
<dependency>
<groupId>com.java2nb.novel</groupId>
<artifactId>news-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix</artifactId>
</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>
</configuration>
</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 NewsApplication {
public static void main(String[] args) {
SpringApplication.run(NewsApplication.class);
}
}

View File

@@ -1,60 +0,0 @@
package com.java2nb.novel.news.controller;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.common.bean.PageBean;
import com.java2nb.novel.common.bean.ResultBean;
import com.java2nb.novel.news.entity.News;
import com.java2nb.novel.news.service.NewsService;
import com.java2nb.novel.news.vo.NewsVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 新闻微服务Controller
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@RestController
@RequestMapping("news")
@RequiredArgsConstructor
@Slf4j
@Api(tags = "新闻相关接口")
public class NewsController {
private final NewsService newsService;
/**
* 分页查询新闻列表接口
* */
@ApiOperation("分页查询新闻列表接口")
@GetMapping("listByPage")
public ResultBean<PageBean<News>> listByPage(@ApiParam("当前页码") @RequestParam(value = "curr", defaultValue = "1") int page, @ApiParam("每页大小") @RequestParam(value = "limit", defaultValue = "5") int pageSize){
return ResultBean.ok(newsService.listByPage(page,pageSize));
}
/**
* 新闻内容查询接口
* */
@ApiOperation("新闻内容查询接口")
@GetMapping("{newsId}")
public ResultBean<NewsVO> newsInfo(@ApiParam("新闻ID") @PathVariable("newsId") Long newsId) {
News news = newsService.queryNewsInfo(newsId);
NewsVO newsVO = new NewsVO();
BeanUtils.copyProperties(news,newsVO);
return ResultBean.ok(newsVO);
}
}

View File

@@ -1,41 +0,0 @@
package com.java2nb.novel.news.controller.api;
import com.java2nb.novel.news.entity.News;
import com.java2nb.novel.news.service.NewsService;
import com.java2nb.novel.news.vo.NewsVO;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.Date;
import java.util.List;
/**
* 新闻微服务API接口内部调用
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@RestController
@RequestMapping(("api/news"))
@ApiIgnore
@RequiredArgsConstructor
public class NewsApi {
private final NewsService newsService;
/**
* 查询最新新闻集合
* @param limit 查询条数
* @return 新闻集合
* */
@GetMapping("listLastIndexNews")
List<News> listLastIndexNews(@RequestParam("limit") int limit){
return newsService.listLastIndexNews(limit);
}
}

View File

@@ -1,55 +0,0 @@
package com.java2nb.novel.news.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 NewsCategoryDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final NewsCategory newsCategory = new NewsCategory();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> id = newsCategory.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> name = newsCategory.name;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> sort = newsCategory.sort;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> createUserId = newsCategory.createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = newsCategory.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> updateUserId = newsCategory.updateUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> updateTime = newsCategory.updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class NewsCategory extends SqlTable {
public final SqlColumn<Integer> id = column("id", JDBCType.INTEGER);
public final SqlColumn<String> name = column("name", JDBCType.VARCHAR);
public final SqlColumn<Byte> sort = column("sort", 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 NewsCategory() {
super("news_category");
}
}
}

View File

@@ -1,184 +0,0 @@
package com.java2nb.novel.news.mapper;
import com.java2nb.novel.news.entity.NewsCategory;
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.news.mapper.NewsCategoryDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface NewsCategoryMapper {
@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<NewsCategory> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("NewsCategoryResult")
NewsCategory selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="NewsCategoryResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="sort", property="sort", 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<NewsCategory> 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(newsCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, newsCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Integer id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, newsCategory)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(NewsCategory record) {
return insert(SqlBuilder.insert(record)
.into(newsCategory)
.map(id).toProperty("id")
.map(name).toProperty("name")
.map(sort).toProperty("sort")
.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(NewsCategory record) {
return insert(SqlBuilder.insert(record)
.into(newsCategory)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(name).toPropertyWhenPresent("name", record::getName)
.map(sort).toPropertyWhenPresent("sort", record::getSort)
.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<NewsCategory>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, name, sort, createUserId, createTime, updateUserId, updateTime)
.from(newsCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<NewsCategory>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, name, sort, createUserId, createTime, updateUserId, updateTime)
.from(newsCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default NewsCategory selectByPrimaryKey(Integer id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, name, sort, createUserId, createTime, updateUserId, updateTime)
.from(newsCategory)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(NewsCategory record) {
return UpdateDSL.updateWithMapper(this::update, newsCategory)
.set(id).equalTo(record::getId)
.set(name).equalTo(record::getName)
.set(sort).equalTo(record::getSort)
.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(NewsCategory record) {
return UpdateDSL.updateWithMapper(this::update, newsCategory)
.set(id).equalToWhenPresent(record::getId)
.set(name).equalToWhenPresent(record::getName)
.set(sort).equalToWhenPresent(record::getSort)
.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(NewsCategory record) {
return UpdateDSL.updateWithMapper(this::update, newsCategory)
.set(name).equalTo(record::getName)
.set(sort).equalTo(record::getSort)
.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(NewsCategory record) {
return UpdateDSL.updateWithMapper(this::update, newsCategory)
.set(name).equalToWhenPresent(record::getName)
.set(sort).equalToWhenPresent(record::getSort)
.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,70 +0,0 @@
package com.java2nb.novel.news.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 NewsDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final News news = new News();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> id = news.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> catId = news.catId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> catName = news.catName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> sourceName = news.sourceName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> title = news.title;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = news.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> createUserId = news.createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> updateTime = news.updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> updateUserId = news.updateUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> content = news.content;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class News extends SqlTable {
public final SqlColumn<Long> id = column("id", JDBCType.BIGINT);
public final SqlColumn<Integer> catId = column("cat_id", JDBCType.INTEGER);
public final SqlColumn<String> catName = column("cat_name", JDBCType.VARCHAR);
public final SqlColumn<String> sourceName = column("source_name", JDBCType.VARCHAR);
public final SqlColumn<String> title = column("title", JDBCType.VARCHAR);
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 final SqlColumn<String> content = column("content", JDBCType.VARCHAR);
public News() {
super("news");
}
}
}

View File

@@ -1,205 +0,0 @@
package com.java2nb.novel.news.mapper;
import com.java2nb.novel.news.entity.News;
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.news.mapper.NewsDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface NewsMapper {
@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<News> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("NewsResult")
News selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="NewsResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="cat_id", property="catId", jdbcType=JdbcType.INTEGER),
@Result(column="cat_name", property="catName", jdbcType=JdbcType.VARCHAR),
@Result(column="source_name", property="sourceName", jdbcType=JdbcType.VARCHAR),
@Result(column="title", property="title", jdbcType=JdbcType.VARCHAR),
@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),
@Result(column="content", property="content", jdbcType=JdbcType.VARCHAR)
})
List<News> 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(news);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, news);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Long id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, news)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(News record) {
return insert(SqlBuilder.insert(record)
.into(news)
.map(id).toProperty("id")
.map(catId).toProperty("catId")
.map(catName).toProperty("catName")
.map(sourceName).toProperty("sourceName")
.map(title).toProperty("title")
.map(createTime).toProperty("createTime")
.map(createUserId).toProperty("createUserId")
.map(updateTime).toProperty("updateTime")
.map(updateUserId).toProperty("updateUserId")
.map(content).toProperty("content")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(News record) {
return insert(SqlBuilder.insert(record)
.into(news)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(catId).toPropertyWhenPresent("catId", record::getCatId)
.map(catName).toPropertyWhenPresent("catName", record::getCatName)
.map(sourceName).toPropertyWhenPresent("sourceName", record::getSourceName)
.map(title).toPropertyWhenPresent("title", record::getTitle)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
.map(updateUserId).toPropertyWhenPresent("updateUserId", record::getUpdateUserId)
.map(content).toPropertyWhenPresent("content", record::getContent)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<News>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, catId, catName, sourceName, title, createTime, createUserId, updateTime, updateUserId, content)
.from(news);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<News>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, catId, catName, sourceName, title, createTime, createUserId, updateTime, updateUserId, content)
.from(news);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default News selectByPrimaryKey(Long id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, catId, catName, sourceName, title, createTime, createUserId, updateTime, updateUserId, content)
.from(news)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(News record) {
return UpdateDSL.updateWithMapper(this::update, news)
.set(id).equalTo(record::getId)
.set(catId).equalTo(record::getCatId)
.set(catName).equalTo(record::getCatName)
.set(sourceName).equalTo(record::getSourceName)
.set(title).equalTo(record::getTitle)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
.set(updateUserId).equalTo(record::getUpdateUserId)
.set(content).equalTo(record::getContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(News record) {
return UpdateDSL.updateWithMapper(this::update, news)
.set(id).equalToWhenPresent(record::getId)
.set(catId).equalToWhenPresent(record::getCatId)
.set(catName).equalToWhenPresent(record::getCatName)
.set(sourceName).equalToWhenPresent(record::getSourceName)
.set(title).equalToWhenPresent(record::getTitle)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId)
.set(content).equalToWhenPresent(record::getContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(News record) {
return UpdateDSL.updateWithMapper(this::update, news)
.set(catId).equalTo(record::getCatId)
.set(catName).equalTo(record::getCatName)
.set(sourceName).equalTo(record::getSourceName)
.set(title).equalTo(record::getTitle)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
.set(updateUserId).equalTo(record::getUpdateUserId)
.set(content).equalTo(record::getContent)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(News record) {
return UpdateDSL.updateWithMapper(this::update, news)
.set(catId).equalToWhenPresent(record::getCatId)
.set(catName).equalToWhenPresent(record::getCatName)
.set(sourceName).equalToWhenPresent(record::getSourceName)
.set(title).equalToWhenPresent(record::getTitle)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId)
.set(content).equalToWhenPresent(record::getContent)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,39 +0,0 @@
package com.java2nb.novel.news.service;
import com.java2nb.novel.common.bean.PageBean;
import com.java2nb.novel.news.entity.News;
import com.java2nb.novel.news.vo.NewsVO;
import java.util.List;
/**
* 新闻服务接口
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
public interface NewsService {
/**
* 分页查询新闻列表接口
* @param page 查询页码
* @param pageSize 分页大小
* @return 新闻列表集合
* */
PageBean<News> listByPage(int page, int pageSize);
/**
* 查询最新新闻集合
* @param limit 查询条数
* @return 新闻集合
* */
List<News> listLastIndexNews(int limit);
/**
* 查询新闻
* @param newsId 新闻id
* @return 新闻
* */
News queryNewsInfo(Long newsId);
}

View File

@@ -1,75 +0,0 @@
package com.java2nb.novel.news.service.impl;
import com.github.pagehelper.PageHelper;
import com.java2nb.novel.common.bean.PageBean;
import com.java2nb.novel.common.utils.BeanUtil;
import com.java2nb.novel.news.entity.News;
import com.java2nb.novel.news.mapper.NewsDynamicSqlSupport;
import com.java2nb.novel.news.mapper.NewsMapper;
import com.java2nb.novel.news.service.NewsService;
import com.java2nb.novel.news.vo.NewsVO;
import lombok.RequiredArgsConstructor;
import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.springframework.stereotype.Service;
import java.util.List;
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 NewsServiceImpl implements NewsService {
private final NewsMapper newsMapper;
@Override
public PageBean<News> listByPage(int page, int pageSize) {
PageHelper.startPage(page,pageSize);
SelectStatementProvider selectStatement =
select(NewsDynamicSqlSupport.id, NewsDynamicSqlSupport.catName,
NewsDynamicSqlSupport.catId, NewsDynamicSqlSupport.title,NewsDynamicSqlSupport.createTime)
.from(NewsDynamicSqlSupport.news)
.orderBy(NewsDynamicSqlSupport.createTime.descending())
.build()
.render(RenderingStrategies.MYBATIS3);
List<News> news = newsMapper.selectMany(selectStatement);
PageBean<News> pageBean = new PageBean<>(news);
pageBean.setList(BeanUtil.copyList(newsMapper.selectMany(selectStatement), NewsVO.class));
return pageBean;
}
@Override
public List<News> listLastIndexNews(int limit) {
SelectStatementProvider selectStatement =
select(NewsDynamicSqlSupport.id, NewsDynamicSqlSupport.catName,
NewsDynamicSqlSupport.catId, NewsDynamicSqlSupport.title)
.from(NewsDynamicSqlSupport.news)
.orderBy(NewsDynamicSqlSupport.createTime.descending())
.limit(limit)
.build()
.render(RenderingStrategies.MYBATIS3);
return newsMapper.selectMany(selectStatement);
}
@Override
public News queryNewsInfo(Long newsId) {
SelectStatementProvider selectStatement = select(NewsDynamicSqlSupport.news.allColumns())
.from(NewsDynamicSqlSupport.news)
.where(NewsDynamicSqlSupport.id,isEqualTo(newsId))
.build()
.render(RenderingStrategies.MYBATIS3);
return newsMapper.selectMany(selectStatement).get(0);
}
}

View File

@@ -1,4 +0,0 @@
spring:
profiles:
include: [common]

View File

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

View File

@@ -4,21 +4,24 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-news</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>
<artifactId>news-api</artifactId>
<artifactId>novel-news-api</artifactId>
<dependencies>
<dependency>
<groupId>com.java2nb.novel</groupId>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,64 @@
package io.github.xxyopen.novel.news.dto.resp;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 新闻信息 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
@Data
@Builder
public class NewsInfoRespDto {
/**
* ID
*/
@Schema(description = "新闻ID")
private Long id;
/**
* 类别ID
*/
@Schema(description = "类别ID")
private Long categoryId;
/**
* 类别名
*/
@Schema(description = "类别名")
private String categoryName;
/**
* 新闻来源
*/
@Schema(description = "新闻来源")
private String sourceName;
/**
* 新闻标题
*/
@Schema(description = "新闻标题")
private String title;
/**
* 更新时间
*/
@Schema(description = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime updateTime;
/**
* 新闻内容
* */
@Schema(description = "新闻内容")
private String content;
}

View File

@@ -0,0 +1,48 @@
<?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>novel-news</artifactId>
<groupId>io.github.xxyopen</groupId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>novel-news-service</artifactId>
<dependencies>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-news-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-config</artifactId>
</dependency>
<dependency>
<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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,19 @@
package io.github.xxyopen.novel.news;
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;
@SpringBootApplication(scanBasePackages = {"io.github.xxyopen.novel"})
@MapperScan("io.github.xxyopen.novel.news.dao.mapper")
@EnableCaching
@EnableDiscoveryClient
public class NovelNewsApplication {
public static void main(String[] args) {
SpringApplication.run(NovelNewsApplication.class, args);
}
}

View File

@@ -0,0 +1,50 @@
package io.github.xxyopen.novel.news.controller;
import io.github.xxyopen.novel.common.constant.ApiRouterConsts;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.news.dto.resp.NewsInfoRespDto;
import io.github.xxyopen.novel.news.service.NewsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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 = "NewsController", description = "前台门户-新闻模块")
@RestController
@RequestMapping(ApiRouterConsts.API_FRONT_NEWS_URL_PREFIX)
@RequiredArgsConstructor
public class NewsController {
private final NewsService newsService;
/**
* 最新新闻列表查询接口
*/
@Operation(summary = "最新新闻列表查询接口")
@GetMapping("latest_list")
public RestResp<List<NewsInfoRespDto>> listLatestNews() {
return newsService.listLatestNews();
}
/**
* 新闻信息查询接口
*/
@Operation(summary = "新闻信息查询接口")
@GetMapping("{id}")
public RestResp<NewsInfoRespDto> getNews(
@Parameter(description = "新闻ID") @PathVariable Long id) {
return newsService.getNews(id);
}
}

View File

@@ -0,0 +1,97 @@
package io.github.xxyopen.novel.news.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("news_category")
public class NewsCategory implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 类别名
*/
private String name;
/**
* 排序
*/
private Integer sort;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
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 "NewsCategory{" +
"id=" + id +
", name=" + name +
", sort=" + sort +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,100 @@
package io.github.xxyopen.novel.news.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("news_content")
public class NewsContent implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 新闻ID
*/
private Long newsId;
/**
* 新闻内容
*/
private String content;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getNewsId() {
return newsId;
}
public void setNewsId(Long newsId) {
this.newsId = newsId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
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 "NewsContent{" +
"id=" + id +
", newsId=" + newsId +
", content=" + content +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,128 @@
package io.github.xxyopen.novel.news.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("news_info")
public class NewsInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 类别ID
*/
private Long categoryId;
/**
* 类别名
*/
private String categoryName;
/**
* 新闻来源
*/
private String sourceName;
/**
* 新闻标题
*/
private String title;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCategoryId() {
return categoryId;
}
public void setCategoryId(Long categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public String getSourceName() {
return sourceName;
}
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
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 "NewsInfo{" +
"id=" + id +
", categoryId=" + categoryId +
", categoryName=" + categoryName +
", sourceName=" + sourceName +
", title=" + title +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,17 @@
package io.github.xxyopen.novel.news.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.news.dao.entity.NewsCategory;
/**
* <p>
* 新闻类别 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/12
*/
public interface NewsCategoryMapper extends BaseMapper<NewsCategory> {
}

View File

@@ -0,0 +1,17 @@
package io.github.xxyopen.novel.news.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.news.dao.entity.NewsContent;
/**
* <p>
* 新闻内容 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface NewsContentMapper extends BaseMapper<NewsContent> {
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.news.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.news.dao.entity.NewsInfo;
/**
* <p>
* 新闻信息 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/12
*/
public interface NewsInfoMapper extends BaseMapper<NewsInfo> {
}

View File

@@ -0,0 +1,47 @@
package io.github.xxyopen.novel.news.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.news.dao.entity.NewsInfo;
import io.github.xxyopen.novel.news.dao.mapper.NewsInfoMapper;
import io.github.xxyopen.novel.news.dto.resp.NewsInfoRespDto;
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 NewsCacheManager {
private final NewsInfoMapper newsInfoMapper;
/**
* 最新新闻列表查询,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.LATEST_NEWS_CACHE_NAME)
public List<NewsInfoRespDto> listLatestNews() {
// 从新闻信息表中查询出最新发布的两条新闻
QueryWrapper<NewsInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc(DatabaseConsts.CommonColumnEnum.CREATE_TIME.getName())
.last(DatabaseConsts.SqlEnum.LIMIT_2.getSql());
return newsInfoMapper.selectList(queryWrapper).stream().map(v -> NewsInfoRespDto.builder()
.id(v.getId())
.categoryId(v.getCategoryId())
.categoryName(v.getCategoryName())
.title(v.getTitle())
.sourceName(v.getSourceName())
.updateTime(v.getUpdateTime())
.build()).toList();
}
}

View File

@@ -0,0 +1,30 @@
package io.github.xxyopen.novel.news.service;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.news.dto.resp.NewsInfoRespDto;
import java.util.List;
/**
* 新闻模块 服务类
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
public interface NewsService {
/**
* 最新新闻列表查询
*
* @return 新闻列表
*/
RestResp<List<NewsInfoRespDto>> listLatestNews();
/**
* 新闻信息查询
*
* @param id 新闻ID
* @return 新闻信息
*/
RestResp<NewsInfoRespDto> getNews(Long id);
}

View File

@@ -0,0 +1,53 @@
package io.github.xxyopen.novel.news.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.news.dao.entity.NewsContent;
import io.github.xxyopen.novel.news.dao.entity.NewsInfo;
import io.github.xxyopen.novel.news.dao.mapper.NewsContentMapper;
import io.github.xxyopen.novel.news.dao.mapper.NewsInfoMapper;
import io.github.xxyopen.novel.news.dto.resp.NewsInfoRespDto;
import io.github.xxyopen.novel.news.manager.cache.NewsCacheManager;
import io.github.xxyopen.novel.news.service.NewsService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 新闻模块 服务实现类
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
@Service
@RequiredArgsConstructor
public class NewsServiceImpl implements NewsService {
private final NewsCacheManager newsCacheManager;
private final NewsInfoMapper newsInfoMapper;
private final NewsContentMapper newsContentMapper;
@Override
public RestResp<List<NewsInfoRespDto>> listLatestNews() {
return RestResp.ok(newsCacheManager.listLatestNews());
}
@Override
public RestResp<NewsInfoRespDto> getNews(Long id) {
NewsInfo newsInfo = newsInfoMapper.selectById(id);
QueryWrapper<NewsContent> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.NewsContentTable.COLUMN_NEWS_ID, id)
.last(DatabaseConsts.SqlEnum.LIMIT_1.getSql());
NewsContent newsContent = newsContentMapper.selectOne(queryWrapper);
return RestResp.ok(NewsInfoRespDto.builder()
.title(newsInfo.getTitle())
.sourceName(newsInfo.getSourceName())
.updateTime(newsInfo.getUpdateTime())
.content(newsContent.getContent())
.build());
}
}

View File

@@ -0,0 +1,15 @@
server:
port: 9030
spring:
profiles:
include: common
active: dev
management:
# 端点启用配置
endpoint:
logfile:
# 启用返回日志文件内容的端点
enabled: true
# 外部日志文件路径
external-file: logs/novel-news-service.log

View File

@@ -0,0 +1,6 @@
spring:
application:
name: novel-news-service
profiles:
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/news-service.log</File>
<File>logs/novel-news-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>

View File

@@ -4,17 +4,32 @@
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>
<artifactId>novel-news</artifactId>
<packaging>pom</packaging>
<modules>
<module>news-api</module>
<module>news-service</module>
<module>novel-news-api</module>
<module>novel-news-service</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-config</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>