1、实现mapper接口及sql映射
@Mapper
public interface DiscussPostMapper {
List< DiscussPost> selectDiscussPosts ( int userId, int offset, int limit) ;
int selectDiscussPostRows ( @Param ( "userId" ) int userId) ;
}
< sql id = " selectFields" >
id, user_id, title, content, type, status, create_time, comment_count, score
</ sql>
< select id = " selectDiscussPosts" resultType = " DiscussPost" >
select < include refid = " selectFields" > </ include>
from discuss_post
where status != 2
< if test = " userId!=0" >
and user_id = #{userId}
</ if>
order by type desc, create_time desc
limit #{offset}, #{limit}
</ select>
< select id = " selectDiscussPostRows" resultType = " int" >
select count(id)
from discuss_post
where status != 2
< if test = " userId!=0" >
and user_id = #{userId}
</ if>
</ select>
2、实现Service层
@Service
public class DiscussPostService {
@Autowired
private DiscussPostMapper discussPostMapper;
public List< DiscussPost> findDiscussPosts ( int userId, int offset, int limit) {
return discussPostMapper. selectDiscussPosts ( userId, offset, limit) ;
}
public int findDiscussPostRows ( int userId) {
return discussPostMapper. selectDiscussPostRows ( userId) ;
}
}
3、实现page实体类
public class Page {
private int current = 1 ;
private int limit = 10 ;
private int rows;
private String path;
public int getCurrent ( ) {
return current;
}
public void setCurrent ( int current) {
if ( current >= 1 ) {
this . current = current;
}
}
public int getLimit ( ) {
return limit;
}
public void setLimit ( int limit) {
if ( limit >= 1 && limit <= 100 ) {
this . limit = limit;
}
}
public int getRows ( ) {
return rows;
}
public void setRows ( int rows) {
if ( rows >= 0 ) {
this . rows = rows;
}
}
public String getPath ( ) {
return path;
}
public void setPath ( String path) {
this . path = path;
}
public int getOffset ( ) {
return ( current - 1 ) * limit;
}
public int getTotal ( ) {
if ( rows % limit == 0 ) {
return rows / limit;
} else {
return rows / limit + 1 ;
}
}
public int getFrom ( ) {
int from = current - 2 ;
return from < 1 ? 1 : from;
}
public int getTo ( ) {
int to = current + 2 ;
int total = getTotal ( ) ;
return to > total ? total : to;
}
}
4、实现Controller层请求
@Controller
public class HomeController {
@Autowired
private DiscussPostService discussPostService;
@RequestMapping ( path = "/index" , method = RequestMethod. GET)
public String getIndexPage ( Model model, Page page) {
page. setRows ( discussPostService. findDiscussPostRows ( 0 ) ) ;
page. setPath ( "/index" ) ;
List< DiscussPost> list = discussPostService. findDiscussPosts ( 0 , page. getOffset ( ) , page. getLimit ( ) ) ;
List< Map< String, Object> > discussPosts = new ArrayList < > ( ) ;
if ( list != null) {
for ( DiscussPost post : list) {
Map< String, Object> map = new HashMap < > ( ) ;
map. put ( "post" , post) ;
User user = userService. findUserById ( post. getUserId ( ) ) ;
map. put ( "user" , user) ;
discussPosts. add ( map) ;
}
}
model. addAttribute ( "discussPosts" , discussPosts) ;
return "/index" ;
}
}
5.前端页面显示
< ul class = " list-unstyled" >
< li class = " media pb-3 pt-3 mb-3 border-bottom" th: each= " map:${discussPosts}" >
< a href = " site/profile.html" >
< img th: src= " ${map.user.headerUrl}" class = " mr-4 rounded-circle" alt = " 用户头像" style =" width : 50px; height : 50px; " >
</ a>
< div class = " media-body" >
< h6 class = " mt-0 mb-3" >
< a href = " #" th: utext= " ${map.post.title}" > xxxxxxxxxxxxxxx</ a>
< span class = " badge badge-secondary bg-primary" th: if= " ${map.post.type==1}" > 置顶</ span>
< span class = " badge badge-secondary bg-danger" th: if= " ${map.post.status==1}" > 精华</ span>
</ h6>
< div class = " text-muted font-size-12" >
< u class = " mr-3" th: utext= " ${map.user.username}" > 用户名</ u> 发布于 < b th: text= " ${#dates.format(map.post.createTime,' yyyy-MM-dd HH:mm:ss' )}" > 发布时间</ b>
< ul class = " d-inline float-right" >
< li class = " d-inline ml-2" > 赞 11</ li>
< li class = " d-inline ml-2" > |</ li>
< li class = " d-inline ml-2" > 回帖 7</ li>
</ ul>
</ div>
</ div>
</ li>
</ ul>
< nav class = " mt-5" th: if= " ${page.rows>0}" >
< ul class = " pagination justify-content-center" >
< li class = " page-item" >
< a class = " page-link" th: href= " @{${page.path}(current=1)}" > 首页</ a>
</ li>
< li th: class= " |page-item ${page.current==1?' disabled' :' ' }|" >
< a class = " page-link" th: href= " @{${page.path}(current=${page.current-1})}" > 上一页</ a> </ li>
< li th: class= " |page-item ${i==page.current?' active' :' ' }|" th: each= " i:${#numbers.sequence(page.from,page.to)}" >
< a class = " page-link" href = " #" th: text= " ${i}" > 1</ a>
</ li>
< li th: class= " |page-item ${page.current==page.total?' disabled' :' ' }|" >
< a class = " page-link" th: href= " @{${page.path}(current=${page.current+1})}" > 下一页</ a>
</ li>
< li class = " page-item" >
< a class = " page-link" th: href= " @{${page.path}(current=${page.total})}" > 末页</ a>
</ li>
</ ul>
</ nav>