创新实训(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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含章节:课后习题答案 第1章数字媒体技术概论 1.1媒体及其特性 1.1.1媒体概念 1.1.2媒体特性 1.2数字媒体及其特性 1.2.1数字媒体概念 1.2.2数字媒体特性 1.2.3数字媒体传播模式 1.3数字媒体技术的研究领域 1.3.1数字媒体内容产业 1.3.2数字媒体技术发展趋势 1.3.3数字媒体技术研究领域 1.3.4数字媒体应用领域 练习与思考 第2章数字音频技术基础 2.1音频技术及其特性 2.1.1音频的概念及特性 2.1.2模拟音频记录设备及特性. 2.1.3模拟音频处理设备 2.2音频数字化 2.2.1数字音频 2.2.2音频的数字化过程 2.3数字音频质量及格式 2.3.1音频数据率及质量 2.3.2声音文件格式 2.4数字音频的编辑技术 2.4.1数字音频的编辑方式 2.4.2数字音频设备 2.4.3数字音频编辑软件简介 2.4.4数字音频编辑实例 2.5数字音频技术应用 练习与思考 第3章数字图像的处理技术 3.1图像颜色模型 3.1.1视觉系统对颜色的感知 3.1.2RGB颜色模型 3.1.3CMYK颜色模型 3.1.4HSB颜色模型 3.1.5YUV与YIQ颜色模型 3.1.6CIELab颜色模型 3.2彩色空间的线性变换 3.2.1YUV与RGB彩色空间变换 3.2.2YIQ与RGB彩色空间变换 3.2.3HSI(HSB)与RGB之间的转换 3.2.4YCrCb与RGB彩色空间变换 3.3图像的基本属性及种类 3.3.1分辨率 3.3.2颜色深度 3.3.3真彩色、伪彩色与直接色 3.3.4图像的大小及种类 3.4数字图像的获取技术 3.4.1位图的获取设备与技术 3.4.2矢量图的获取设备与技术 3.5图像创意设计与编辑技术 3.5.1图像处理软件简介 …… 第4章数字视频及编辑 第5章数字动画技术 第6章游戏设计技术 第7章数字媒体的Web集成与应用 第8章数字媒体压缩技术 第9章数字媒体存储技术 第10章数字媒体管理与保护 第11章数字媒体的传输技术 第12章数字媒体技术发展趋势

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值