文章目录
- 1文章微服务的搭建
- 2前端功能演示界面
- 3项目目录
- 4搭建工程
- 4.1首先从meaven中新建module模块
- 4.2输入项目模块名称
- 4.3 点击下一步
- 4.4 粘贴meaven依赖
- 4.5新建application.yml
- 4.6创建包分类
- 4.7新建跨域配置类
- 4.8新建controller
- 5数据库分析
- 6接口列表
- 6.1分页查询文章列表信息
- 6.2文章审核接口
- 6.3文章点赞接口
- 7spring-boot-starter-data-redis的使用
- 7.1根据ID查询文章详情
- 7.2pom中引入redis
- 7.3在service服务层中添加
- 7.3.1注入redis模板操作类
- 7.3.2操作redis
- 7.4删除文章
- 8学习目标
- 9个人说明
- 10[我的个人网站](http://www.liph.fun/)
文章微服务属于微服务社交项目的文章版块功能,这个功能主要讲解查询文章列表接口服务和spring data redis缓存使用。
1文章微服务的搭建
上篇文章主要讲解了招聘微服务的职位列表信息查询以及热门企业查询服务,本次课程主要讲解文章微服务spring boot工程的搭建以及开发文章微服务功能。
2前端功能演示界面
头部属于菜单功能区,内容主体分为左边文章频道区和右侧文章列表区。左边文章频道查询接口和右侧文章列表信息查询接口。
3项目目录
项目采用spring boot多模块构建,后期会加入spring cloud构建工程,目前已经拆分为微服务。
项目依赖于tensquare_base、tensquare_common2个微服务模块。
微服务模块为tensquare_article
4搭建工程
tensquare_article
4.1首先从meaven中新建module模块
4.2输入项目模块名称
4.3 点击下一步
点击完成,完成新建模块
4.4 粘贴meaven依赖
<?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>tensquare_parent</artifactId>
<groupId>com.tensquare</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_article</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis依赖commons-pool 这个依赖一定要添加 -->
<!--<dependency>-->
<!--<groupId>io.lettuce</groupId>-->
<!--<artifactId>lettuce-core</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
4.5新建application.yml
server:
port: 9005
spring:
application:
name: tensquare_article #指定服务名
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/tensquare_article?characterEncoding=UTF8
username: root
password: root
jpa:
database: MySQL
show-sql: true
redis:
host: 127.0.0.1
port: 6379
4.6创建包分类
4.7新建跨域配置类
为了防止前后端分离请求跨域请求失败新增配置类如下:
```java
package com.tensquare.article.config;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class CorsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setContentType("textml;charset=UTF-8");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "0");
response.setHeader("Access-Control-Allow-Headers","Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("XDomainRequestAllowed", "1");
chain.doFilter(req, res);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
4.8新建controller
package com.tensquare.article.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tensquare.article.pojo.Article;
import com.tensquare.article.service.ArticleService;
import entity.PageResult;
import entity.Result;
import entity.StatusCode;
/**
* 控制器层
* @author Administrator
*
*/
@RestController
@CrossOrigin
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
/**
* 根据ID查询
* @param id ID
* @return
*/
@RequestMapping(value="/{id}",method= RequestMethod.GET)
public Result findById(@PathVariable String id){
return new Result(true,StatusCode.OK,"查询成功",articleService.findById(id));
}
/**
* 分页+多条件查询
* @param searchMap 查询条件封装
* @param page 页码
* @param size 页大小
* @return 分页结果
*/
@RequestMapping(value="/search/{page}/{size}",method=RequestMethod.POST)
public Result findSearch(@RequestBody Map searchMap , @PathVariable int page, @PathVariable int size){
Page<Article> pageList = articleService.findSearch(searchMap, page, size);
return new Result(true,StatusCode.OK,"查询成功", new PageResult<Article>(pageList.getTotalElements(), pageList.getContent()) );
}
/***
* 文章审核
*/
@RequestMapping(value = "/examine/{id}")
public Result examine(@PathVariable String id){
articleService.examine(id);
return new Result(true,StatusCode.OK,"审核成功");
}
/**
* 文章点赞
*/
@RequestMapping(value = "/thumbsup/{id}")
public Result updatethumbsup(@PathVariable String id){
articleService.thumbsup(id);
return new Result(true,StatusCode.OK,"点赞成功");
}
}
5数据库分析
表名:tb_article
字段 | 中文名 |
id | 文章主键ID |
title | 文章标题 |
content | 文章内容 |
createtime | 创建时间 |
thumbup | 点赞数 |
state | 审核状态 |
channelid | 所属频道 |
表名:tb_channel
字段 | 中文名 |
id | 频道ID |
name | 频道名称 |
state | 频道状态 |
6接口列表
6.1分页查询文章列表信息
6.2文章审核接口
根据文章ID,后台运营管理员审核文章通过才能显示到前台首页头条中,
更新文章表state字段为1
6.3文章点赞接口
用户对某一篇文章进行点赞,根据文章Id,找到文章将文章中的thumbup+1,进行点赞数增加。
7spring-boot-starter-data-redis的使用
7.1根据ID查询文章详情
由于用户频繁查询文章信息,为了优化根据ID查询文章的接口,可以使用spring-data-redis来将文章信息存储到redis中,如果redis中存在则用户去redis缓存中去获取文章信息。
7.2pom中引入redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
7.3在service服务层中添加
7.3.1注入redis模板操作类
@Resource
private RedisTemplate redisTemplate;
7.3.2操作redis
/***
* 首先查询redis
*/
Article article= (Article) redisTemplate.opsForValue().get("article_"+id);
if(article==null){
//查询数据库
article=articleDao.findById(id).get();
//查询出来放入缓存 //过期时间控制
redisTemplate.opsForValue().set("article_"+id,article,100, TimeUnit.SECONDS);
}
return article;
7.4删除文章
由于当用户删除或者更新文章的时候,前台如果还从redis获取缓存数据有的时候会不准确所以,在删除和修改文章的时候需要删除redis缓存。
public void update(Article article) {
redisTemplate.delete( "article_" + article.getId() );//删除缓存
articleDao.save(article);
}
8学习目标
- 掌握微服务模块的搭建
- 学会编写从controller到service再到dao层的数据流
- 学会将其他技术整合到项目中例如redis
- 掌握spring-data-redis的使用
- 学习文章微服务模块功能
9个人说明
经验是由一点一点积累的,思维也是由一天一天训练出来的。