spring Cloud微服务架构实战项目系列之文章微服务开发(四)

文章目录

  • 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前端功能演示界面

spring Cloud微服务架构实战项目系列之文章微服务开发(四)_第1张图片

头部属于菜单功能区,内容主体分为左边文章频道区和右侧文章列表区。左边文章频道查询接口和右侧文章列表信息查询接口。

3项目目录

       项目采用spring boot多模块构建,后期会加入spring cloud构建工程,目前已经拆分为微服务。

       项目依赖于tensquare_base、tensquare_common2个微服务模块。

       微服务模块为tensquare_article

4搭建工程

tensquare_article

4.1首先从meaven中新建module模块

spring Cloud微服务架构实战项目系列之文章微服务开发(四)_第2张图片

4.2输入项目模块名称

spring Cloud微服务架构实战项目系列之文章微服务开发(四)_第3张图片

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创建包分类

spring Cloud微服务架构实战项目系列之文章微服务开发(四)_第4张图片

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分页查询文章列表信息

spring Cloud微服务架构实战项目系列之文章微服务开发(四)_第5张图片

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个人说明

经验是由一点一点积累的,思维也是由一天一天训练出来的。

10我的个人网站

如果你急需一个单体结构项目练手下面的项目可能适合你,可以学习一个完整的项目流程,项目业务以及前后端项目的常用技术:电商在线演示地址为:演示地址

持续更新分享此项目微服务架构项目实战(开发中…)

你可能感兴趣的:(Spring,Coud微服务,工作总结,项目实战开发,spring,cloud,微服务架构,java项目实战)