创新实训(32)——有关用户自主提交自己博客信息的接口设计

前言

由于我们的系统是根据rss订阅定时抽取,而用户也有可能有自己的自建博客,所以每个用户可以向系统提交自己的自建博客的rss链接,然后等待定时的抽取。
接口列表如下:
在这里插入图片描述

用户提交自己的自建博客信息

在这里插入图片描述
Controller层:


    /**
     * 用户可以自己将自己的博客添加到博客平台上
     * @param param
     * @param username
     * @return
     */
    @PermitAll
    @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json")
    public Response addBlog(
            @RequestBody Map param,
            @RequestAttribute String username) {
        User user = userService.selectUserByName(username);
        String title = (String) param.get("title");
        String url = (String) param.get("url");
        String feed = (String) param.get("feed");
        Blog blog = Blog.builder()
                .title(title)
                .feed(feed)
                .url(url)
                .userId(user.getId()).build();

        blogService.insertUserBlog(blog);
        return Response.success("添加博客成功");
    }

Service层:

   /**
     * 插入一个新blog 连用户的id一块插入  用户为博客系统添加rss订阅
     * @param blog
     */
    public void insertUserBlog(Blog blog)
    {
        blogDao.insertUserBlog(blog);
    }

Dao层:


    /**
     * 插入一个新blog 连用户的id一块插入  用户为博客系统添加rss订阅
     *
     * @param blog
     */
    @Insert("INSERT INTO blog (title, url, feed,user_id) VALUES (#{blog.title}, #{blog.url}, #{blog.feed} , #{blog.userId})")
    int insertUserBlog(@Param("blog") Blog blog);

用户更新自己的博客信息

在这里插入图片描述
Controller层:

    /**
     * 更新自己的博客信息
     * @param param
     * @param username
     * @return
     */
    @PermitAll
    @RequestMapping(value = "/edit", method = RequestMethod.POST, produces = "application/json")
    public Response updateBlog(
            @RequestBody Map param,
            @RequestAttribute String username) {
        User user = userService.selectUserByName(username);
        String title = (String) param.get("title");
        String url = (String) param.get("url");
        String feed = (String) param.get("feed");
        Blog blog = Blog.builder()
                .title(title)
                .feed(feed)
                .url(url)
                .userId(user.getId()).build();

        blogService.updateBlogByUserId(blog);
        return Response.success("修改博客成功");
    }

Service层:

  /**
     * 根据userId更新blog信息  用于用户自己添加的blog
     * @param blog
     */
    public void updateBlogByUserId(Blog blog)
    {
        blogDao.updateBlogByUserId(blog);
    }

Dao层:

    /**
     *根据userId更新blog信息  用于用户自己添加的blog
     *
     * @param blog
     * @return
     */
    @Update("UPDATE blog SET " +
            "title = #{blog.title}, " +
            "url = #{blog.url}, " +
            "feed = #{blog.feed} " +
            "WHERE user_id = #{blog.userId}")
    int updateBlogByUserId(@Param("blog") Blog blog);

查询用户是否提交过自己的博客信息

Controller层:
如果没有提交过,则返回-1.如果提交过,则返回博客的信息

 /**
     * 查看用户是否 提交过自己的博客
     * @param username
     * @return
     */
    @PermitAll
    @RequestMapping(value = "/status", method = RequestMethod.GET, produces = "application/json")
    public Response getStatus(
            @RequestAttribute String username) {
        User user = userService.selectUserByName(username);
        Blog blog = blogService.selectBlogByUserId(user.getId());
        if(blog == null)
        {
            return Response.success("用户还未提交过博客",-1);
        }
        return Response.success("用户已经添加过博客",blog);


    }

Service层:

   /**
     * 根据userId获取blog信息 看用户是否提交过博客
     * @param userId
            * @return
     */
        public Blog selectBlogByUserId(int userId)
        {

            Blog blog =  blogDao.selectBlogByUserId(userId);
            return blog;

    }

Dao层:

   /**
     * 根据用户id 获取博客信息
     * @param userId
     * @return
     */
    @Select("select id ,title,url ,feed ,user_id as userId" +
            " from blog " +
            "where user_id = #{userId}")
    Blog selectBlogByUserId(@Param("userId")int userId);

获取一个用户提交的博客中,文章的数量

在这里插入图片描述
Controller层:

   /**
     * 获取一个用户提交的博客中 文章的数量
     * @param username
     * @return
     */
    @PermitAll
    @RequestMapping(value = "/count", method = RequestMethod.GET, produces = "application/json")
    public Response getUserArticleCount(@RequestAttribute String username)
    {
        User user = userService.selectUserByName(username);
        int count = blogService.selectArticleCount(user.getId());
        return Response.success("获取用户的文章数量成功",count);

    }

Service层:

/**
     * 获取一个用户提交的博客中 文章的数量
     * @param userId
     * @return
     */
    public int selectArticleCount(int userId)
    {
        return blogDao.selectArticleCount(userId);
    }

Dao层:

  /**
     *获取一个用户提交的博客中 文章的数量
     * @param userId
     * @return
     */
    @Select("select count(*) from blog as A , article as B where A.user_id = #{userId} and B.blog_id = A.id")
    int selectArticleCount(@Param("userId") int userId);

获取用户提交博客的一些统计信息

在这里插入图片描述
共有三种,请求时用label属性进行区分
(1)某个用户 最近几天发布的文章的数量,发布文章的趋势 ArticlePostStatistics
(2)用户发布的文章的浏览量的变化 ArticleBrowsingCountStatistics
(3)用户发布文章的点赞量的变化 ArticleLikingCountStatistics

Controller层:

   /**
     * 有关用户提交博客的统计信息
     * (1)某个用户  最近几天发布的文章的数量   发布文章的趋势
     *(2)用户发布的文章的浏览量的变化
     * (3)用户发布文章的点赞量的变化
     * @param username
     * @param day
     * @param label
     * @return
     */
    @PermitAll
    @RequestMapping(value = "/statistics/{label}", method = RequestMethod.GET, produces = "application/json")
    public Response getStatistics(
            @RequestAttribute String username,
            @RequestParam(value = "day", required = false, defaultValue = "15") Integer day,
            @PathVariable String  label)
    {
        User user = userService.selectUserByName(username);

        if("ArticlePostStatistics".equals(label))
        {
            List<ArticleTimeCount> articleTimeCounts =getArticlePostStatistics(day,user.getId());
            if(articleTimeCounts.size() == 0)
            {
                return Response.success("结果为空");
            }

            return Response.success("获取最近发布文章数量成功", getArticlePostStatistics(day,user.getId()));
        }
        else if("ArticleBrowsingCountStatistics".equals(label))
        {
            List<ArticleTimeCount> articleTimeCounts =getArticleBrowsingCountStatistics(day,user.getId());
            if(articleTimeCounts.size() == 0)
            {
                return Response.success("结果为空");
            }
            return Response.success("获取文章点击量成功", getArticleBrowsingCountStatistics(day,user.getId()));
        }
        else if ("ArticleLikingCountStatistics".equals(label))
        {
            List<ArticleTimeCount> articleTimeCounts =getArticleLikingCountStatistics(day,user.getId());
            if(articleTimeCounts.size() == 0)
            {
                return Response.success("结果为空");
            }
            return Response.success("获取文章点赞量成功", getArticleLikingCountStatistics(day,user.getId()));
        }

        return Response.success("获取统计信息失败");

    }
  /**
     * 某个用户  最近几天发布的文章的数量   发布文章的趋势
     * @param day
     * @param userId
     * @return
     */
    public  List<ArticleTimeCount> getArticlePostStatistics(int day ,int userId)
    {
        return blogService.selectUserPostArticleCount(day, userId);
    }


    /**
     * 用户发布的文章的浏览量的变化
     * @param day
     * @param userId
     * @return
     */
    public  List<ArticleTimeCount> getArticleBrowsingCountStatistics(int day ,int userId)
    {
        return blogService.selectUserBlogBroweringCount(userId,day);
    }

    /**
     * 用户发布文章的点赞量的变化
     * @param day
     * @param userId
     * @return
     */
    public  List<ArticleTimeCount> getArticleLikingCountStatistics(int day ,int userId)
    {
        return blogService.selectUserBlogLikingCount(userId,day);
    }

Dao层:


    /**
     * 获取某个用户发布博客的趋势
     * @param day
     * @return
     */
    @Select("select count(*) as count , DATE_FORMAT( update_time, '%Y-%m-%d' ) AS time " +
            " from article " +
            " where update_time < CURDATE( ) + 1 " +
            " and update_time >= DATE_SUB( CURDATE( ), INTERVAL #{day} DAY ) " +
            " and blog_id = #{blogId} " +
            " group by DATE_FORMAT( update_time, '%Y-%m-%d') " +
            " order by update_time asc")
    List<ArticleTimeCount> selectUserPostArticleCount(@Param("day") int day, @Param("blogId") int blogId);
  /**
     * 查询用户发布的博客  博客文章的浏览量统计
     * @param userId
     * @param day
     * @return
     */
    @Select("select count(*) as count , DATE_FORMAT( C.browse_time, '%Y-%m-%d' ) AS time " +
            "from blog as A , article as B , user_browsing_history as C " +
            "where A.user_id = #{userId} " +
            "and B.blog_id = A.id and B.id = C.article_id and " +
            "C.browse_time < CURDATE( ) + 1 " +
            "and  C.browse_time >= DATE_SUB( CURDATE( ), INTERVAL #{day} DAY )  " +
            "group by DATE_FORMAT( C.browse_time, '%Y-%m-%d') " +
            "order by C.browse_time asc")
    List<ArticleTimeCount> selectUserBlogBroweringCount(@Param("userId") int userId,@Param("day") int day);


    /**
     * 查询用户发布的博客  博客文章的点赞量统计
     * @param userId
     * @param day
     * @return
     */
    @Select("select count(*) as count , DATE_FORMAT( C.click_liking_time, '%Y-%m-%d' ) AS time " +
            "from blog as A , article as B , user_liking as C " +
            "where A.user_id = #{userId} " +
            "and B.blog_id = A.id and B.id = C.article_id and " +
            "C.click_liking_time < CURDATE( ) + 1 " +
            "and  C.click_liking_time >= DATE_SUB( CURDATE( ), INTERVAL #{day} DAY )  " +
            "group by DATE_FORMAT( C.click_liking_time, '%Y-%m-%d') " +
            "order by C.click_liking_time asc")
    List<ArticleTimeCount> selectUserBlogLikingCount(@Param("userId") int userId,@Param("day") int day);

看一下这三句sql的运行结果:
(1)统计用户博客文章的浏览量
在这里插入图片描述
(2)统计用户发布文章的趋势
在这里插入图片描述

我们看到很多的天数都是空着的,而前端在绘制折线图时,需要每一天的数据都有,所以接下来我们需要写一个方法,将缺少的天数补上,并且数量为0,并且按时间降序返回。

/**
     * 比较日期大小
     */
    public class sortClass implements Comparator {
        @Override
        public int compare(Object arg0, Object arg1){
            ArticleTimeCount item0 = (ArticleTimeCount)arg0;
            ArticleTimeCount item1 = (ArticleTimeCount)arg1;
            int flag = item0.getTime().compareTo(item1.getTime());
            return flag;
        }
    }



    /**
     * 此日期是否在时间内
     * @param date
     * @param dateList
     * @return
     */
    private   boolean dateInList(String date,List<ArticleTimeCount> dateList)
    {
        for(ArticleTimeCount str :dateList)
        {
            if(str.getTime().equals(date) )
            {
                return true;
            }
        }
        return false;
    }

    /**
     * 补全时间
     * @param startTime
     * @param endTime
     * @return
     */
    private  List<String> completionDate(
            LocalDateTime startTime,
            LocalDateTime endTime) {
        //日期格式化
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        List<String> dateList = new ArrayList<>();
        //遍历给定的日期期间的每一天
        for (int i = 0; !Duration.between(startTime.plusDays(i), endTime).isNegative(); i++) {
            //添加日期
            dateList.add(startTime.plusDays(i).format(formatter));
        }
        return dateList;
    }
     /**
     * 将空缺的时间填上,并且数量记为0
     * @param articleTimeCounts
     * @return
     */
    public List<ArticleTimeCount> sortArticleTimeCount(List<ArticleTimeCount>  articleTimeCounts)
    {
        if( articleTimeCounts.get(0) != null)
        {  String startTime;
            startTime =  articleTimeCounts.get(0).getTime();
            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            LocalDateTime startDate = LocalDateTime.of(LocalDate.parse(startTime,df),LocalTime.parse("00:00:00"));

            LocalDateTime endDate = LocalDateTime.now();
            List<String> dateList = completionDate(startDate,endDate);

            for(String str :dateList)
            {
                if(!dateInList(str, articleTimeCounts))
                {
                    ArticleTimeCount articleTimeCount = new ArticleTimeCount();
                    articleTimeCount.setCount(0);
                    articleTimeCount.setTime(str);
                    articleTimeCounts.add(articleTimeCount);
                }
            }
            BlogService.sortClass sort = new BlogService.sortClass();
            Collections.sort(articleTimeCounts,sort);
            return articleTimeCounts;
        }
        return null;
    }



Service层:

 /**
     * 查询用户发布的博客  博客文章的浏览量统计
     * @param userId
     * @param day
     * @return
     */
    public List<ArticleTimeCount> selectUserBlogBroweringCount(int userId, int day)
    {
        List<ArticleTimeCount> articleTimeCounts =blogDao.selectUserBlogBroweringCount(userId,day);

        articleTimeCounts = sortArticleTimeCount(articleTimeCounts);
        return articleTimeCounts;
    }


    /**
     *查询用户发布的博客  博客文章的点赞量统计
     * @param userId
     * @param day
     * @return
     */
    public List<ArticleTimeCount> selectUserBlogLikingCount(int userId, int day )
    {
        List<ArticleTimeCount> articleTimeCounts =blogDao.selectUserBlogLikingCount(userId,day);
        articleTimeCounts = sortArticleTimeCount(articleTimeCounts);
        return articleTimeCounts;
    }
     /**
     * 最近几天 某个用户发布文章的数量
     * @param day
     * @return
     */
    public List<ArticleTimeCount> selectUserPostArticleCount(int day, int userId)
    {
        int blogId = blogDao.selectBlogByUserId(userId).getId();
        List<ArticleTimeCount> articleTimeCounts =blogDao.selectUserPostArticleCount(day,blogId);

        articleTimeCounts = sortArticleTimeCount(articleTimeCounts);
        return articleTimeCounts;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值