前言
由于我们的系统是根据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;
}