文章目录
问答子模块-代码编写
1 业务分析
招聘微服务主要有两块:企业信息和招聘信息
需要些的功能对应API:
- 最新回答列表
查replytime值最新的记录,最新回复的问题显示在上方, 按回复时间降序排序。/problem/newlist/{label}/{page}/{size} 最新回答列表
- 热门回答列表
查reply值最多的记录,按回复数降序排序/problem/hotlist/{label}/{page}/{size} 热门回答列表
- 等待回答列表
查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 表结构分析
- 问题表
问题表 tb_problem 字段名称 字段含义 字段类型 备注 id ID 文本 title 问题标题 文本 content 问题内容 文本 createtime 发布日期 日期 updatetime 更新日期 日期 userid 发布人ID 文本 nickname 发布人昵称 文本 visits 浏览量 整型 thumbup 点赞数 整型 reply 回复数 整型 solve 是否解决 文本 replyname 最新回复人 文本 replytime 最新回复时间 日期 - 回答表
回答表 tb_reply 字段名称 字段含义 字段类型 备注 id ID 文本 problemid 问题ID 文本 content 回答内容 文本 createtime 回答日期 日期 updatetime 更新日期 日期 userid 回答人ID 文本 nickname 回答人昵称 文本 - 问答标签中间表,problemid和 labelid 作为联合主键
问答标签中间表 tb_pl 字段名称 字段含义 字段类型 备注 problemid 问题ID 文本 labelid 标签ID 文本
2.3 代码生成器
- 使用代码生成器生成招聘微服务代码 tensquare_qa
- 拷贝到当前工程,并在父工程引入。
- 修改Application类名称为QaApplication
- 修改application.yml 中的端口为9003 ,url 为jdbc:mysql://192.168.184.134:3306/tensquare_qa?characterEncoding=UTF8
- 进行浏览器测试
- 给service加上事务注解
@Transactional
3 需要写的业务模块
3.1 方法一,面向对象的sql语句
- 创建回答中间表实体类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; } }
- 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()
-
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); }
-
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); } ......
-
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 测试接口
- http://localhost:9003/problem/newlist/1/1/1
- http://localhost:9003/problem/hotlist/1/1/1
- http://localhost:9003/problem/waitlist/1/1/1
十次方00、目录
https://blog.csdn.net/amingccc/article/details/84260613