十次方06、问答子模块-业务代码编写

问答子模块-代码编写

1 业务分析

招聘微服务主要有两块:企业信息和招聘信息
需要些的功能对应API:

  1. 最新回答列表
    查replytime值最新的记录,最新回复的问题显示在上方, 按回复时间降序排序。

    /problem/newlist/{label}/{page}/{size} 最新回答列表

  2. 热门回答列表
    查reply值最多的记录,按回复数降序排序

    /problem/hotlist/{label}/{page}/{size} 热门回答列表

  3. 等待回答列表
    查reply值为0的记录

    /problem/waitlist/{label}/{page}/{size} 等待回答列表

2 数据库表结构

2.1 建表sql语句


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`tensquare_qa` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `tensquare_qa`;

/*Table structure for table `tb_pl` */

DROP TABLE IF EXISTS `tb_pl`;

CREATE TABLE `tb_pl` (
  `problemid` varchar(20) NOT NULL COMMENT '问题ID',
  `labelid` varchar(20) NOT NULL COMMENT '标签ID',
  PRIMARY KEY (`problemid`,`labelid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `tb_pl` */

insert  into `tb_pl`(`problemid`,`labelid`) values ('1','1');

/*Table structure for table `tb_problem` */

DROP TABLE IF EXISTS `tb_problem`;

CREATE TABLE `tb_problem` (
  `id` varchar(20) NOT NULL COMMENT 'ID',
  `title` varchar(100) DEFAULT NULL COMMENT '标题',
  `content` text COMMENT '内容',
  `createtime` datetime DEFAULT NULL COMMENT '创建日期',
  `updatetime` datetime DEFAULT NULL COMMENT '修改日期',
  `userid` varchar(20) DEFAULT NULL COMMENT '用户ID',
  `nickname` varchar(100) DEFAULT NULL COMMENT '昵称',
  `visits` bigint(20) DEFAULT NULL COMMENT '浏览量',
  `thumbup` bigint(20) DEFAULT NULL COMMENT '点赞数',
  `reply` bigint(20) DEFAULT NULL COMMENT '回复数',
  `solve` varchar(1) DEFAULT NULL COMMENT '是否解决',
  `replyname` varchar(100) DEFAULT NULL COMMENT '回复人昵称',
  `replytime` datetime DEFAULT NULL COMMENT '回复日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='问题';

/*Data for the table `tb_problem` */

insert  into `tb_problem`(`id`,`title`,`content`,`createtime`,`updatetime`,`userid`,`nickname`,`visits`,`thumbup`,`reply`,`solve`) values ('1','这是个问题','代码调试不通咋办?','2018-01-08 11:50:50','2018-01-09 11:50:54','2',NULL,101,NULL,NULL,NULL);

/*Table structure for table `tb_reply` */

DROP TABLE IF EXISTS `tb_reply`;

CREATE TABLE `tb_reply` (
  `id` varchar(20) NOT NULL COMMENT '编号',
  `problemid` varchar(20) DEFAULT NULL COMMENT '问题ID',
  `content` text COMMENT '回答内容',
  `createtime` datetime DEFAULT NULL COMMENT '创建日期',
  `updatetime` datetime DEFAULT NULL COMMENT '更新日期',
  `userid` varchar(20) DEFAULT NULL COMMENT '回答人ID',
  `nickname` varchar(100) DEFAULT NULL COMMENT '回答人昵称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='回答';

/*Data for the table `tb_reply` */

insert  into `tb_reply`(`id`,`problemid`,`content`,`createtime`,`updatetime`,`userid`,`nickname`) values ('','1',NULL,NULL,NULL,NULL,NULL);
insert  into `tb_reply`(`id`,`problemid`,`content`,`createtime`,`updatetime`,`userid`,`nickname`) values ('2','1','问老师呗','2018-01-10 14:14:06',NULL,'1',NULL);
insert  into `tb_reply`(`id`,`problemid`,`content`,`createtime`,`updatetime`,`userid`,`nickname`) values ('3','2','明天再调','2018-01-07 14:14:13',NULL,'1',NULL);

/*Table structure for table `tb_ul` */

DROP TABLE IF EXISTS `tb_ul`;

CREATE TABLE `tb_ul` (
  `uid` varchar(20) NOT NULL COMMENT '用户ID',
  `lid` varchar(20) NOT NULL COMMENT '标签ID',
  PRIMARY KEY (`uid`,`lid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `tb_ul` */

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;


2.2 表结构分析

  1. 问题表
    问题表tb_problem
    字段名称字段含义字段类型备注
    idID文本
    title问题标题文本
    content问题内容文本
    createtime发布日期日期
    updatetime更新日期日期
    userid发布人ID文本
    nickname发布人昵称文本
    visits浏览量整型
    thumbup点赞数整型
    reply回复数整型
    solve是否解决文本
    replyname最新回复人文本
    replytime最新回复时间日期
  2. 回答表
    回答表tb_reply
    字段名称字段含义字段类型备注
    idID文本
    problemid问题ID文本
    content回答内容文本
    createtime回答日期日期
    updatetime更新日期日期
    userid回答人ID文本
    nickname回答人昵称文本
  3. 问答标签中间表,problemid和 labelid 作为联合主键
    问答标签中间表tb_pl
    字段名称字段含义字段类型备注
    problemid问题ID文本
    labelid标签ID文本

2.3 代码生成器

  1. 使用代码生成器生成招聘微服务代码 tensquare_qa
  2. 拷贝到当前工程,并在父工程引入。
  3. 修改Application类名称为QaApplication
  4. 修改application.yml 中的端口为9003 ,url 为jdbc:mysql://192.168.184.134:3306/tensquare_qa?characterEncoding=UTF8
  5. 进行浏览器测试
  6. 给service加上事务注解@Transactional

3 需要写的业务模块

3.1 方法一,面向对象的sql语句

  1. 创建回答中间表实体类Pl.java
    @Entity
    @Table(name = "tb_pl")
    public class Pl implements Serializable {
        @Id
        private String problemid;
        @Id
        private String lableid;
    
        public String getLableid() {
            return lableid;
        }
        public void setLableid(String lableid) {
            this.lableid = lableid;
        }
    
        public String getProblemid() {
            return problemid;
        }
    
        public void setProblemid(String problemid) {
            this.problemid = problemid;
        }
    }
    
  2. Dao中sql的写法,注意tb_pl表是用的pl对象
    /**
    * 根据标签ID查询最新问题列表
    * @param labelId
    * @param pageable
    * @return
    */
    @Query("select p from Problem p where id in( select problemid from Pl where labelid=?1 ) order by replytime desc")
    public Page<Problem> findNewListByLabelId(String labelId, Pageable pageable);	
    /
    **
    * 根据标签ID查询热门问题列表
    * @param labelId
    * @param pageable
    * @return
    */
    @Query("select p from Problem p where id in( select problemid from Pl where labelid=?1 ) order by reply desc")
    public Page<Problem> findHotListByLabelId(String labelId, Pageable pageable);
    /**
    * 根据标签ID查询等待回答列表
    * @param labelId
    * @param pageable
    * @return
    */
    @Query("select p from Problem p where id in( select problemid from Pl where labelid=?1 ) and reply=0 order by createtime desc")
    public Page<Problem> findWaitListByLabelId(String labelId, Pageable pageable);
    

3.2 方法二,sql语句中联合表查询,不需要创建实体类

  • 最新问答列表,findNewListByLabelId()
  • 热门问答列表,findHotListByLabelId()
  • 等待回答列表,findWaitListByLabelId()
  1. ProblemDao

    /**
     * 数据访问接口
     *
     * @author Administrator
     */
    public interface ProblemDao extends JpaRepository<Problem, String>, JpaSpecificationExecutor<Problem> {
        /**
         * 根据标签ID查询最新问题列表
         * @param labelId
         * @param pageable
         * @return
         */
        @Query(value = "SELECT * FROM tb_problem ,tb_pl WHERE id = problemid AND labelid=?1 ORDER BY replytime DESC", nativeQuery = true)
        public Page<Problem> findNewListByLabelId(String labelId, Pageable pageable);
    
        /**
         * 根据标签ID查询热门问题列表
         * @param labelId
         * @param pageable
         * @return
         */
        @Query(value = "SELECT * FROM tb_problem ,tb_pl WHERE id = problemid AND labelid=?1 ORDER BY reply DESC", nativeQuery = true)
        public Page<Problem> findHotListByLabelId(String labelId, Pageable pageable);
    
        /**
         * 根据标签ID查询等待回答列表
         * @param labelId
         * @param pageable
         * @return
         */
        @Query(value = "SELECT * FROM tb_problem ,tb_pl WHERE id = problemid AND labelid=?1 AND reply=0 ORDER BY createtime DESC", nativeQuery = true)
        public Page<Problem> findWaitListByLabelId(String labelId, Pageable pageable);
    }
    
    
  2. ProblemService

    ......
        /**
         * 根据标签ID查询问题列表
         * @param labelId 标签ID
         * @param page    页码
         * @param size    页大小
         * @return
         */
        public Page<Problem> findNewListByLabelId(String labelId, int page, int size) {
            PageRequest pageRequest = PageRequest.of(page - 1, size);
            return problemDao.findNewListByLabelId(labelId, pageRequest);
        }
    
        /**
         * 根据标签ID查询热门问题列表
         * @param labelId 标签ID
         * @param page    页码
         * @param size    页大小
         * @return
         */
        public Page<Problem> findHotListByLabelId(String labelId, int page, int size) {
            PageRequest pageRequest = PageRequest.of(page - 1, size);
            return problemDao.findHotListByLabelId(labelId, pageRequest);
        }
    
        /**
         * 根据标签ID查询等待回答列表
         * @param labelId 标签ID
         * @param page    页码
         * @param size    页大小
         * @return
         */
        public Page<Problem> findWaitListByLabelId(String labelId, int page, int size) {
            PageRequest pageRequest = PageRequest.of(page - 1, size);
            return problemDao.findWaitListByLabelId(labelId, pageRequest);
        }
    ......
    
  3. ProblemController

    ......
       /**
         * 根据标签ID查询最新问题列表
         * @param label
         * @return
         */
        @GetMapping("/newlist/{label}/{page}/{size}")
        public Result findNewListByLabelId(@PathVariable String label, @PathVariable int page, @PathVariable int size) {
            Page<Problem> pageData = problemService.findNewListByLabelId(label, page, size);
            return new Result(true, StatusCode.OK, "查询成功", new PageResult<Problem>(pageData.getTotalElements(), pageData.getContent()));
        }
    
        /**
         * 根据标签ID查询最新问题列表
         * @param label
         * @return
         */
        @GetMapping("/hotlist/{label}/{page}/{size}")
        public Result findHotListByLabelId(@PathVariable String label, @PathVariable int page, @PathVariable int size) {
            Page<Problem> pageData = problemService.findHotListByLabelId(label, page, size);
            return new Result(true, StatusCode.OK, "查询成功", new PageResult<Problem>(pageData.getTotalElements(), pageData.getContent()));
        }
    
        /**
         * 根据标签ID查询最新问题列表
         * @param label
         * @return
         */
        @GetMapping("/waitlist/{label}/{page}/{size}")
        public Result findWaitListByLabelId(@PathVariable String label, @PathVariable int page, @PathVariable int size) {
            Page<Problem> pageData = problemService.findWaitListByLabelId(label, page, size);
            return new Result(true, StatusCode.OK, "查询成功", new PageResult<Problem>(pageData.getTotalElements(), pageData.getContent()));
        }
    ......
    

3.3 测试接口

十次方00、目录
https://blog.csdn.net/amingccc/article/details/84260613

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值