文章目录
吐槽子模块-功能实现
这个模块不使用代码生成器,因为不操作mysql数据库,没有数据库表,所以要自己创建,采用SpringDataMongoDB框架实现吐槽微服务的持久层。
实现功能:
- 基本增删改查API
- 根据上级ID查询吐槽列表
- 吐槽点赞
- 发布吐槽
1 模块搭建
- 在tensquare_parent工程下添加模块tensquare_spit,创建maven工程
- pom.xml引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>com.tensquare</groupId> <artifactId>tensquare_common</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
- 创建application.yml
server: port: 9006 spring: application: name: tensquare‐spit #指定服务名 data: mongodb: host: 192.168.184.134 database: spitdb
- 创建启动类SpitApplication
@SpringBootApplication public class SpitApplication { public static void main(String[] args) { SpringApplication.run(SpitApplication.class, args); } @Bean public IdWorker idWorkker() { return new IdWorker(1, 1); } }
2 Java操作MongoDB测试
2.1 测试工程搭建
如果是没有搭建tensquare_spit模块,使用新的工程MongoDemo测试,就需加入mongodb-driver
依赖。
-
mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。我们通过一个入门的案例来了解mongodb-driver的基本使用
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb‐driver</artifactId> <version>3.6.3</version> </dependency> </dependencies>
-
创建测试类
/** * MongoDb入门小demo */ public class MongoDemo { public static void main(String[] args) { MongoClient client = new MongoClient("192.168.184.134");//创建连接 MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库 MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合 FindIterable<Document> documents = spit.find();//查询记录获取文档集合 for (Document document : documents) { // System.out.println("内容:" + document.getString("content")); System.out.println("用户ID:" + document.getString("userid")); System.out.println("浏览量:" + document.getInteger("visits")); } client.close();//关闭连接 } }
-
如果是吐槽模块中操作,需引入
SpringDataMongoDB
,SpringData家族成员之一,用于操作MongoDb的持久层框架,封装了底层的mongodbdriver。 -
创建测试类
在SpitApplication类的任意方法中,右键Go To-->Test
,也可以用快捷键ctrl+shift+T
@RunWith(SpringRunner.class) @SpringBootTest(classes = SpitApplication.class)//这里的Application是springboot的启动类名 public class SpitApplicationTest { ...... }
2.2 插入数据
/**
* 测试插入数据
*/
@Test
public void MongoDBInsert() {
MongoClient client = new MongoClient("192.168.184.138");//创建连接
MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库
MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合
Map<String, Object> map = new HashMap();
map.put("content", "我要吐槽");
map.put("userid", "9999");
map.put("visits", 123);
map.put("publishtime", new Date());
Document document = new Document(map);
spit.insertOne(document);//插入数据
client.close();
}
2.3 查询全部记录
/**
* 测试数据查询
*/
@Test
public void MongoDBFindAll() {
//创建连接
MongoClient client = new MongoClient("192.168.184.138");
//创建连接
MongoDatabase spitdb = client.getDatabase("spitdb");
//获取集合
MongoCollection<Document> spit = spitdb.getCollection("spit");
//查询记录获取文档集合
FindIterable<Document> documents = spit.find();
//遍历数据
for (Document document : documents) { //
System.out.println("内容:" + document.getString("content"));
System.out.println("用户ID:" + document.getString("userid"));
System.out.println("浏览量:" + document.getInteger("visits"));
}
//关闭连接
client.close();
}
2.4 条件查询
BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,是keyvalue的数据结构,用起来和HashMap是基本一致的。
- 查询浏览量大于1000的记录
/** * 测试条件查询 */ @Test public void MongoDBFindBy() { //创建连接 MongoClient client = new MongoClient("192.168.184.138"); //创建连接 MongoDatabase spitdb = client.getDatabase("spitdb"); //获取集合 MongoCollection<Document> spit = spitdb.getCollection("spit"); // 构建查询条件 BasicDBObject bson = new BasicDBObject("visits", new BasicDBObject("$gt", 1000)); //查询记录获取文档集合 FindIterable<Document> documents = spit.find(bson); //遍历数据 for (Document document : documents) { // System.out.println("内容:" + document.getString("content")); System.out.println("用户ID:" + document.getString("userid")); System.out.println("浏览量:" + document.getInteger("visits")); } //关闭连接 client.close(); }
- 查询userid为1013的记录
...... // 构建查询条件 BasicDBObject bson = new BasicDBObject("userid", "1013"); ......
3 吐槽子模块-基本代码
3.1 基本增删改查API实现
-
创建实体类
创建包com.tensquare.spit,包下建包pojo 用于存放实体类,创建实体类/** * 吐槽实体 * @author Chen * @created 2018-11-24-15:01. */ @Data public class Spit implements Serializable { @Id private String _id; private String content; private Date publishtime; private String userid; private String nickname; private Integer visits; private Integer thumbup; private Integer share; private Integer comment; private String state; private String parentid; }
-
创建数据访问接口
com.tensquare.spit包下创建dao包,包下创建接口/** * * 吐槽数据访问层 * @author Chen * @created 2018-11-24-15:04. */ public interface SpitDao extends MongoRepository<Spit, String> { }
-
创建业务逻辑类
com.tensquare.spit包下创建service包,包下创建类/** * @author Chen * @created 2018-11-24-15:06. */ @Service @Transactional public class SpitService { @Autowired private SpitDao spitDao; @Autowired private IdWorker idWorker; /** * 查询全部记录 * @return */ public List<Spit> findAll() { return spitDao.findAll(); } /** * 根据主键查询实体 * @param id * @return */ public Spit findById(String id) { Spit spit = spitDao.findById(id).get(); return spit; } /** * 增加 * @param spit */ public void add(Spit spit) { spit.set_id(idWorker.nextId() + ""); spitDao.save(spit); } /** * 修改 * * @param spit */ public void update(Spit spit) { spitDao.save(spit); } /** * 删除 * @param id */ public void deleteById(String id) { spitDao.deleteById(id); } }
-
com.tensquare.spit包下创建controller类
/** * @author Chen * @created 2018-11-24-15:08. */ @RestController @CrossOrigin @RequestMapping("/spit") public class SpitController { @Autowired private SpitService spitService; /** * 查询全部数据 * @return */ @RequestMapping(method = RequestMethod.GET) public Result findAll() { return new Result(true, StatusCode.OK, "查询成功", spitService.findAll()); } /** * 根据ID查询 * @param id ID * @return */ @RequestMapping(value = "/{id}", method = RequestMethod.GET) public Result findOne(@PathVariable String id) { return new Result(true, StatusCode.OK, "查询成功", spitService.findById(id)); } /** * 增加 * @param spit */ @RequestMapping(method = RequestMethod.POST) public Result add(@RequestBody Spit spit) { spitService.add(spit); return new Result(true, StatusCode.OK, "增加成功"); } /*** 修改 * @param spit */ @RequestMapping(value = "/{id}", method = RequestMethod.PUT) public Result update(@RequestBody Spit spit, @PathVariable String id) { spit.set_id(id); spitService.update(spit); return new Result(true, StatusCode.OK, "修改成功"); } /** * 删除 * @param id */ @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public Result deleteById(@PathVariable String id) { spitService.deleteById(id); return new Result(true, StatusCode.OK, "删除成功"); } }
3.2 根据上级ID查询吐槽列表
- SpitDao新增方法定义
...... /** * 根据上级ID查询吐槽列表(分页) * @param parentid * @param pageable * @return */ public Page<Spit> findByParentid(String parentid,Pageable pageable); ......
- SpitService新增方法
...... /** * 根据上级ID查询吐槽列表 * @param parentid * @param page * @param size * @return */ public Page<Spit> findByParentid(String parentid,int page, int size){ PageRequest pageRequest = PageRequest.of(page‐1, size); return spitDao.findByParentid(parentid, pageRequest); } ......
- SpitController新增方法
...... /** * 根据上级ID查询吐槽分页数据 * @param page * @param size * @return */ @GetMapping("/comment/{parentId}/{page}/{size}") public Result findByParentid(@PathVariable String parentId, @PathVariable int page, @PathVariable int size) { Page<Spit> pageList = spitService.findByParentid(parentId, page, size); return new Result(true, StatusCode.OK, "查询成功", new PageResult<Spit>(pageList.getTotalElements(), pageList.getContent())); } ......
3.3 吐槽点赞
-
SpitService 新增updateThumbup方法
...... /** * 点赞 * @param id */ public void updateThumbup(String id){ Spit spit = spitDao.findById(id).get(); spit.setThumbup(spit.getThumbup()+1); spitDao.save(spit); } ......
以上方法虽然实现起来比较简单,但是执行效率并不高,因为我只需要将点赞数加1就可以了,没必要查询出所有字段修改后再更新所有字段。
我们可以使用MongoTemplate类来实现对某列的操作。 -
修改SpitService
...... @Autowired private MongoTemplate mongoTemplate; ...... /** * 点赞 * @param id */ public void updateThumbup(String id) { //方法一:效率问题,每次都要查一下,在插值,访问数据2次。 /*Spit spit = spitDao.findById(id).get(); spit.setThumbup((spit.getThumbup() == null ? 0 : spit.getThumbup()) + 1); spitDao.save(spit);*/ //方法二:使用mongo命令来实现db.spit.update({"_id":"1"},{$inc:{thumbup:Number:Int()}}) Query query = new Query(); query.addCriteria(Criteria.where("_id").is(id)); Update update = new Update(); update.inc("thumbup", 1); mongoTemplate.updateFirst(query, update, "spit"); } ......
-
SpitController新增方法
...... /** * 点赞 * @param id * @return */ @PutMapping("/thumbup/{id}") public Result updateThumbup(@PathVariable String id) { spitService.updateThumbup(id); return new Result(true, StatusCode.OK, "点赞成功"); } ......
3.4 控制不能重复点赞
我们可以通过redis控制用户不能重复点赞
- 首先引入依赖
...... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ......
- 修改application.yml
...... redis: host: 192.168.1.194 ......
- 修改SpitController的updateThumbup方法,用redis缓存点过赞的用户id
...... @Autowired private RedisTemplate redisTemplate; ...... /** * 点赞 * @param id * @return */ @PutMapping("/thumbup/{id}") public Result updateThumbup(@PathVariable String id) { /*spitService.updateThumbup(id); return new Result(true, StatusCode.OK, "点赞成功");*/ //判断用户是否点过赞, 后边我们会修改为当前登陆的用户 String userid = "2023"; if (redisTemplate.opsForValue().get("thumbup_" + userid + "_" + id) != null) { return new Result(false, StatusCode.REPERROR, "你已经点过赞了"); } spitService.updateThumbup(id); redisTemplate.opsForValue().set("thumbup_" + userid + "_" + id, "1"); return new Result(true, StatusCode.OK, "点赞成功"); } ......
3.5 发布吐槽
修改SpitService的add方法
......
/**
* 发布吐槽(或吐槽评论)
* @param spit
*/
public void add(Spit spit) {
/* //主键值
spit.set_id(idWorker.nextId() + "");
spitDao.save(spit);*/
spit.set_id(idWorker.nextId() + "");
spit.setPublishtime(new Date());//发布日期
spit.setVisits(0);//浏览量
spit.setShare(0);//分享数
spit.setThumbup(0);//点赞数
spit.setComment(0);//回复数
spit.setState("1");//状态
//如果存在上级ID,评论
if (spit.getParentid() != null && !"".equals(spit.getParentid())) {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(spit.getParentid()));
Update update = new Update();
update.inc("comment", 1);
mongoTemplate.updateFirst(query, update, "spit");
}
spitDao.save(spit);
}
......
3.6 增加浏览量与分享数
- SpitController增加2个接口方法
...... /** * 浏览量 * @param id * @return */ @PutMapping("/visited/{id}") public Result addVisit(@PathVariable String id){ spitService.addVisit(id); return new Result(true, StatusCode.OK, "点赞成功"); } /** * 转发分享 * @param id * @return */ @PutMapping("/share/{id}") public Result addShare(@PathVariable String id){ spitService.addShare(id); return new Result(true, StatusCode.OK, "分享成功"); } ......
- SpitService增加2个方法
...... /** * 增加访问量 * @param id */ public void addVisit(String id){ Query query =new Query(); query.addCriteria(Criteria.where("_id").is(id)); Update update = new Update(); update.inc("visits",1); mongoTemplate.updateFirst(query,update,"spit"); } /** * 增加分享 * @param id */ public void addShare(String id){ Query query =new Query(); query.addCriteria(Criteria.where("_id").is(id)); Update update = new Update(); update.inc("share",1); mongoTemplate.updateFirst(query,update,"spit"); } ......
十次方00、总目录
https://mp.csdn.net/postedit/84260613