十次方后端笔记二:招聘、问答、文章和活动微服务

完成招聘、问答、文章以及活动微服务,并使用为部分数据添加缓存机制

招聘微服务

招聘微服务CRUD代码生成(省略)

表结构分析

招聘微服务分为两块:

  • 企业信息
  • 招聘信息

tb_enterprise 企业表

字段名称字段含义字段类型备注
idID文本
name企业名称文本
summary企业简介文本
address企业地址文本
labels标签列表文本用逗号分隔
coordinate企业位置坐标文本经度,纬度
ishot是否热门文本0:非热门1:热门
logoLOGO文本
jobcount职位数数字
urlURL文本

tb_recruit 招聘信息表

字段名称字段含义字段类型备注
idID文本
jobname招聘职位文本
salary薪资范围文本
condition经验要求文本
education学历要求文本
type任职方式文本
address办公地址文本
eid企业ID文本
createtime发布日期日期
state状态文本0:关闭1:开启 2:推荐
url原网址文本
label标签文本
content1职位描述文本
content2职位要求文本

热门企业列表

controller

	@GetMapping("/search/hotlist")
	public Result hotlist() {
		return Result.ok("查询成功", enterpriseService.hotlist());
	}

service

	public List<Enterprise> hotlist() {
		return enterpriseDao.findByIshot("1");
	}

dao

List<Enterprise> findByIshot(String ishot);

推荐职位列表

查询状态为2并以创建日期降序排序,查询前4条记录

controller

	/**
	 * 推荐职位
	 */
	@GetMapping("search/recommend")
	public Result findRecommend() {
		return Result.ok(recruitService.findTop4ByStateOrderByCreatetimeDesc("2"));
	}

service

	/**
	 * 查询推荐职位
	 * @return
	 */
	public List<Recruit> findTop4ByStateOrderByCreatetimeDesc(String state) {
		return recruitDao.findTop4ByStateOrderByCreatetimeDesc(state);
	}

dao

List<Recruit> findTop4ByStateOrderByCreatetimeDesc(String state);

最新职位列表

查询状态不为0并以创建日期降序排序,查询前12条记录

controller

	/**
	 * 最新职位
	 */
	@GetMapping("search/newlist")
	public Result findNewRecruitList() {
		return Result.ok(recruitService.findNewRecruitList());
	}

service

	/**
	 * 查询最新职位列表
	 * 查询最新的12条以及排除被关闭的职位
	 */
	public List<Recruit> findNewRecruitList() {
		return recruitDao.findTop12ByStateNotOrderByCreatetimeDesc("0");
	}

dao

List<Recruit> findTop12ByStateNotOrderByCreatetimeDesc(String state);

问答微服务

问答微服务CRUD代码生成(省略)

生成过后需要手动添加关系表的实体类

package com.tensquare.qa.pojo;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

@Data
@Entity
@Table(name = "tb_pl")
public class Pl implements Serializable {

    @Id
    private String problemid;

    @Id
    private String labelid;
}

表结构分析

问答微服务的表分为两张数据表以及一张关系表:问题表、回答表以及问答标签关系表

tb_problem 问题表

字段名称字段含义字段类型备注
idID文本
title问题标题文本
content问题内容文本
createtime发布日期日期
updatetime更新日期日期
userid发布人ID文本
nickname发布人昵称文本
visits浏览量整型
thumbup点赞数整型
reply回复数整型
solve是否解决文本
replyname最新回复人文本
replytime最新回复时间日期

tb_reply 回答表

字段名称字段含义字段类型备注
idID文本
problemid问题ID文本
content问题内容文本
createtime发布日期日期
updatetime更新日期日期
userid发布人ID文本
nickname发布人昵称文本

tb_pl 问题标签关系表

字段名称字段含义字段类型备注
problemid问题ID文本
labelid标签ID文本

最新问题列表

最新回复的问题显示在上方,按回复时间降序排序。

controller

	/**
	 * 最新问题列表
	 */
	@GetMapping("newlist/{label}/{page}/{size}")
	public Result findNewProblemList(@PathVariable("label") String labelId,
								 @PathVariable("page") int page,
								 @PathVariable("size") int size) {
			return Result.ok(problemService.findNewProblemList(labelId, page, size));
	}

service

	/**
	 * 按活跃时间查询问题列表
	 *
	 * @param labelId 标签ID
	 * @param page 当前页码
	 * @param size 当前页记录数
	 * @return List<Problem> 问题列表
	 */
    public List<Problem> findNewProblemList(String labelId, int page, int size) {
		return problemDao.findNewProblemList(labelId, PageRequest.of(page, size));
    }

dao

    @Query("SELECT p FROM Problem p " +
            "WHERE id IN (SELECT pl.problemid FROM Pl pl WHERE pl.labelid = ?1) " +
            "ORDER BY p.replytime DESC")
    List<Problem> findNewProblemList(String labelId, Pageable pageable);

热门问题列表

按回复数降序排序

controller

	/**
	 * 热门问题列表
	 */
	@GetMapping("hotlist/{label}/{page}/{size}")
	public Result findHotList(@PathVariable("label") String labelId,
							  @PathVariable("page") int page,
							  @PathVariable("size") int size) {
		return Result.ok(problemService.findHotList(labelId, page, size));
	}

service

	/**
	 * 查询热门问题列表
	 *
	 * @param labelId 标签ID
	 * @param page 当前页码
	 * @param size 当前页记录数
	 * @return List<Problem> 问题列表
	 */
	public List<Problem> findHotList(String labelId, int page, int size) {
		return problemDao.findHotProblemList(labelId, PageRequest.of(page, size));
	}

dao

    @Query("SELECT p FROM Problem p " +
            "WHERE id IN (SELECT pl.problemid FROM Pl pl WHERE pl.labelid = ?1) " +
            "ORDER BY p.reply DESC")
    List<Problem> findHotProblemList(String labelId, Pageable pageable);

等待回答列表

controller

	/**
	 * 待回复问题列表
	 */
	@GetMapping("waitlist/{label}/{page}/{size}")
	public Result findWaitList(@PathVariable("label") String labelId,
							  @PathVariable("page") int page,
							  @PathVariable("size") int size) {
		return Result.ok(problemService.findWaitList(labelId, page, size));
	}

service

	/**
	 * 查询待回复问题列表
	 *
	 * @param labelId 标签ID
	 * @param page 当前页码
	 * @param size 当前页记录数
	 * @return List<Problem> 问题列表
	 */
	public List<Problem> findWaitList(String labelId, int page, int size) {
		return problemDao.findWaitReplyProblemList(labelId, PageRequest.of(page, size));
	}

dao

    @Query("SELECT p FROM Problem p " +
            "WHERE id IN (SELECT pl.problemid FROM Pl pl WHERE pl.labelid = ?1) " +
            "AND p.reply = 0 " +
            "ORDER BY p.createtime DESC")
    List<Problem> findWaitReplyProblemList(String labelId, Pageable pageable);

文章微服务

文章微服务CRUD代码生成(省略)

表结构分析

文章微服务只有一张表:文章表

tb_article 文章表

字段名称字段含义字段类型备注
idID文本
columnid专栏ID文本
userid用户ID文本
title文章标题文本
content文章内容文本
image文章封面文本
createtime发表日期日期
updatetime修改日期日期
ispublic是否公开文本0:不公开1:公开
istop是否置顶文本0:不置顶1:置顶
visits浏览量整型
thumbup点赞数整型
comment评论数整型
state审核状态文本0:未审核 1:已审核
channelid所属频道整型关联频道表ID
urlURL地址文本
type文章类型文本0:分享1:专栏

文章审核

controller

	/**
	 * 文章审核
	 */
	@PutMapping("examine/{articleId}")
	public Result examine(@PathVariable("articleId") Integer articleId) {
		articleService.examine(articleId);
		return Result.ok("审核成功");
	}

service

	/**
	 * 文章审核
	 *
	 * @param articleId 文章ID
	 */
	public void examine(Integer articleId) {
		articleDao.updateStateById(articleId);
	}

dao

    @Modifying
    @Query("UPDATE Article a SET a.state = '1' " +
            "WHERE a.id = ?1")
    void updateStateById(Integer articleId);

文章点赞

controller

	/**
	 * 文章点赞
	 */
	@PutMapping("thumbup/{articleId}")
	public Result thumbup(@PathVariable("articleId") Integer articleId) {
		articleService.thumbup(articleId);
		return Result.ok("审核成功");
	}

service

	/**
	 * 文章点赞
	 *
	 * @param articleId 文章ID
	 */
	public void thumbup(Integer articleId) {
		articleDao.updateThumbupById(articleId);
	}

dao

    @Modifying
    @Query("UPDATE Article a SET a.thumbup = a.thumbup + 1 " +
            "WHERE a.id = ?1")
    void updateThumbupById(Integer articleId);

Spring Redis

使用Spring cache对部分数据进行缓存。

Docker安装Redis

任何安装复杂的东西只要和Docker联系起来,基本上可以说零操作!!!

下载Redis镜像

  1. 搜索Redis镜像

    docker search redis
    
  2. 下载Redis镜像

    docker pull redis
    
  3. 使用镜像生成Redis容器并运行

    docker run -di --name=tensquare_redis -p 6379:6379 redis
    

Redis-GUI客户端

给大家提供一个Redis的界面工具 - RedisDesktopManager,我提供这个是Windows版本的,版本是4.0.0。这个工具最新的版本都是要收费的了,还不便宜。

?百度云盘链接?

链接:https://pan.baidu.com/s/1bx_a2jQANwPWloZ6-pdBYQ
提取码:csxg

文章微服务- 缓存处理

  1. 引入Spring Data Redis依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. application.yml中配置Redis主机位置

    spring:   
      redis:
        host: 192.168.136.104
        # 如果redis端口保持默认的话,可以省略端口配置
        port: 6379
    
  3. 修改ArticleService#findById的逻辑

    先查询Redis是否已缓存,如果已缓存,取出缓存的数据直接返回,否则从数据库中查询并存入Redis,放入时需要设置有效时间为一天。

    	@Autowired
    	private RedisTemplate<String, Article> redisTemplate;
    
    	private static final String redisKeyPrefix = "article_";
    
    	/**
    	 * 根据ID查询实体
    	 * @param id
    	 * @return
    	 */
    	public Article findById(String id) {
    		String key = redisKeyPrefix + id;
    		Article article = redisTemplate.opsForValue().get(key);
    		if (article == null) {
    			article = articleDao.findById(id).get();
    			redisTemplate.opsForValue().set(key, article, 1, TimeUnit.DAYS);
    		}
    
    		return article;
    	}
    
  4. 更新缓存

    修改、删除文章时,清除缓存。直接调用redisTemplate.delete(key)即可。

Spring Cache + Spring Redis

活动微服务

活动微服务CRUD代码生成(省略)

活动详情缓存

  1. 引入Spring Redis依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. application.yaml中配置Redis主机位置

    spring: 
      redis:
        host: 192.168.136.104
        port: 6379
    
  3. 开启Spring Cache注解扫描,修改GatheringApplication,在类上加上@EnableCaching即可

    package com.tensquare.gathering;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.Bean;
    import util.IdWorker;
    
    @EnableCaching
    @SpringBootApplication
    public class GatheringApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(GatheringApplication.class, args);
    	}
    
    	@Bean
    	public IdWorker idWorker(){
    		return new IdWorker(1, 5);
    	}
    	
    }
    
  4. GatheringService#findById加入缓存注解

    	/**
    	 * 根据ID查询实体
    	 * @param id
    	 * @return
    	 */
    	@Cacheable(value = "gathering", key = "#id")
    	public Gathering findById(String id) {
    		return gatheringDao.findById(id).get();
    	}
    
  5. 删除和修改时,更新缓存

    	/**
    	 * 修改
    	 * @param gathering
    	 */
    	@CacheEvict(value = "gathering", key = "#id")
    	public void update(Gathering gathering) {
    		gatheringDao.save(gathering);
    	}
    
    	/**
    	 * 删除
    	 * @param id
    	 */
    	@CacheEvict(value = "gathering", key = "#id")
    	public void deleteById(String id) {
    		gatheringDao.deleteById(id);
    	}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值