同一异常处理
- 异常可能会出现在各个位置,不管是controller、service、dao。那么异常就是自己可预见的异常还有就是不可预见的异常。
- 对于可预见的异常,直接进行try-catch处理。
- 对于不可预见的异常,需要进行统一处理,对异常进行记录,给用户相对较好的提示信息。
- 新建一个handler包。
AllExceptionHandler
//对加了@Controller注解的方法进行拦截处理 AOP的实现
@ControllerAdvice
public class AllExceptionHandler {
//进行异常处理,处理Exception.class的异常
@ExceptionHandler(Exception.class)
@ResponseBody //返回json数据
public Result doException(Exception ex){
ex.printStackTrace();
return Result.fail(-999,"系统异常");
}
}
首页的最热文章
- 根据文档可以知道对应的接口、请求方式以及请求参数
- 因为是关于文章的,所以同样在ArticleController接口进行创建
ArticleController
@PostMapping("hot")
public Result hotArticle(){
int limit = 5;
return articleService.hotArticle(limit);
}
- 再根据返回数据形式可知,返回的数据只有文章id以及标题,对应在文章表中都可以查到
ArticleService
// 最热文章
Result hotArticle(int limit);
ArticleServiceImpl
- 因为是最热的文章,那么只需要根据浏览数就可以确定
@Override
public Result hotArticle(int limit) {
LambdaQueryWrapper<Article> wrapper = new LambdaQueryWrapper<>();
//select id,title from article order by view_counts desc limit 5
wrapper.orderByDesc(Article::getViewCounts);
wrapper.select(Article::getId,Article::getTitle);
wrapper.last("limit "+limit);
List<Article> articles = articleMapper.selectList(wrapper);
return Result.success(copyList(articles,false,false));
}
首页的最新文章
- 根据文档可知接口、请求方式、请求参数
- 因为是关于文章的,所以同样在ArticleController接口进行创建
ArticleController
/**
* 首页 最新文章
* @return
*/
@PostMapping("new")
public Result newArticles(){
int limit = 5;
return articleService.newArticles(limit);
}
- 根据返回的数据形式,和最热文章一样,也只需要文章id和文章标题
ArticleService
// 最新文章
Result newArticles(int limit);
ArticleServiceImpl
- 和最热文章不同,这里要根据文章创建的时间进行一个倒序排序
@Override
public Result newArticles(int limit) {
LambdaQueryWrapper<Article> wrapper = new LambdaQueryWrapper<>();
wrapper.orderByDesc(Article::getCreateDate);
wrapper.select(Article::getId,Article::getTitle);
wrapper.last("limit "+limit);
//select id, title from ms_article order by create_date limit 5
List<Article> articles = articleMapper.selectList(wrapper);
return Result.success(copyList(articles,false,false));
}
文章归档
- 根据文档说明,可知请求地址、请求方法、请求参数
- 因为是文章的,所以还是写在ArticleController
controller
@PostMapping("listArchives")
public Result listArchives(){
return articleService.listArchives();
}
- 根据返回数据形式,可知,返回的是时间、月、总数,涉及到了文章表
创建一个Archives类,专门用来定义需要返回的数据
@Data
public class Archives {
private Integer year;
private Integer month;
private Integer count;
}
service
@Override
public Result listArchives() {
List<Archives> archivesList = articleMapper.listArchives();
return Result.success(archivesList);
}
因为表中的时间格林时间,mp无法完成转换,所以要自己写sql语句
Dao
public interface ArticleMapper extends BaseMapper<Article> {
List<Archives> listArchives();
}
sql
<select id="listArchives" resultType="com.mszlu.blog.dao.dos.Archives">
select year(create_date) as year,month(create_date) as month,count(*) as count from ms_article group by year,month
</select>