十次方10、吐槽子模块-MongoDB功能引入及吐槽业务代码编写

吐槽子模块-功能实现

这个模块不使用代码生成器,因为不操作mysql数据库,没有数据库表,所以要自己创建,采用SpringDataMongoDB框架实现吐槽微服务的持久层。
实现功能:

  1. 基本增删改查API
  2. 根据上级ID查询吐槽列表
  3. 吐槽点赞
  4. 发布吐槽

1 模块搭建

  1. 在tensquare_parent工程下添加模块tensquare_spit,创建maven工程
  2. 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>	
    
  3. 创建application.yml
    server:
    	port: 9006
    spring:
    	application:
    		name: tensquare‐spit #指定服务名
    	data:
    		mongodb:
    			host: 192.168.184.134
    			database: spitdb	
    
  4. 创建启动类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。

    官网主页: https://projects.spring.io/spring-data-mongodb/

  • 创建测试类
    在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实现

  1. 创建实体类
    创建包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;
    }
    
  2. 创建数据访问接口
    com.tensquare.spit包下创建dao包,包下创建接口

    /**
     * * 吐槽数据访问层
     * @author Chen
     * @created 2018-11-24-15:04.
     */
    public interface SpitDao extends MongoRepository<Spit, String> {
    }
    
  3. 创建业务逻辑类
    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);
        }
    }
    
  4. 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查询吐槽列表

  1. SpitDao新增方法定义
    ......
    /**
    * 根据上级ID查询吐槽列表(分页)
    * @param parentid
    * @param pageable
    * @return
    */
    public Page<Spit> findByParentid(String parentid,Pageable pageable);
    ......
    
  2. 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);
    	}
    ......
    
  3. 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 吐槽点赞

  1. 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类来实现对某列的操作。

  2. 修改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");
        }
    ......
    
  3. 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控制用户不能重复点赞

  1. 首先引入依赖
    ......
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    ......
    
  2. 修改application.yml
    ......
      redis:
    	host: 192.168.1.194
    ......
    
  3. 修改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 增加浏览量与分享数

  1. 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, "分享成功");
        }
    ......
    
  2. 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值