# 开发社区首页 --- ![](https://gitee.com/veal98/images/raw/master/img/20210116110550.png) ## DiscussPost 讨论帖 ### Entity ### DAO - Mapper 接口 `DiscussPostMapper` - 对应的 xml 配置文件 `discusspost-mapper.xml` `@Param` 注解用于给参数起别名,**如果只有一个参数**,并且需要在 `` 里使用,则必须加别名 ```java @Mapper public interface DiscussPostMapper { /** * 分页查询讨论贴信息 * * @param userId 当传入的 userId = 0 时查找所有用户的帖子 * 当传入的 userId != 0 时,查找该指定用户的帖子 * @param offset 每页的起始索引 * @param limit 每页显示多少条数据 * @return */ List selectDiscussPosts(int userId, int offset, int limit); /** * 查询讨论贴的个数 * @param userId 当传入的 userId = 0 时计算所有用户的帖子总数 * 当传入的 userId != 0 时计算该指定用户的帖子总数 * @return */ int selectDiscussPostRows(@Param("userId") int userId); } ``` 对应的 Mapper: ```xml id, user_id, title, content, type, status, create_time, comment_count, score ``` ### Service 关于自动注入 Mapper 报错问题:可参考 [关于IDEA中@Autowired 注解报错~图文](https://www.cnblogs.com/taopanfeng/p/10994075.html) ```java @Service public class DiscussPostSerivce { @Autowired private DiscussPostMapper discussPostMapper; /** * 分页查询讨论帖信息 * * @param userId 当传入的 userId = 0 时查找所有用户的帖子 * 当传入的 userId != 0 时,查找该指定用户的帖子 * @param offset 每页的起始索引 * @param limit 每页显示多少条数据 * @return */ public List findDiscussPosts (int userId, int offset, int limit) { return discussPostMapper.selectDiscussPosts(userId, offset, limit); } /** * 查询讨论贴的个数 * @param userId 当传入的 userId = 0 时计算所有用户的帖子总数 * 当传入的 userId != 0 时计算该指定用户的帖子总数 * @return */ public int findDiscussPostRows (int userId) { return discussPostMapper.selectDiscussPostRows(userId); } } ``` ## User ### Entity ### DAO ```java @Mapper public interface UserMapper { /** * 根据 id 查询用户 * @param id * @return */ User selectById (int id); /** * 根据 username 查询用户 * @param username * @return */ User selectByName(String username); /** * 根据 email 查询用户 * @param email * @return */ User selectByEmail(String email); /** * 插入用户(注册) * @param user * @return */ int insertUser(User user); /** * 修改用户状态 * @param id * @param status 0:未激活,1:已激活 * @return */ int updateStatus(int id, int status); /** * 修改头像 * @param id * @param headerUrl * @return */ int updateHeader(int id, String headerUrl); /** * 修改密码 * @param id * @param password * @return */ int updatePassword(int id, String password); } ``` 对应的 mapper.xml: ```xml username, password, salt, email, type, status, activation_code, header_url, create_time id, username, password, salt, email, type, status, activation_code, header_url, create_time insert into user () values(#{username}, #{password}, #{salt}, #{email}, #{type}, #{status}, #{activationCode}, #{headerUrl}, #{createTime}) update user set status = #{status} where id = #{id} update user set header_url = #{headerUrl} where id = #{id} update user set password = #{password} where id = #{id} ``` ### Service ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User findUserById (int id) { return userMapper.selectById(id); } } ``` ## Page 分页 ```java /** * 封装分页相关的信息 */ 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 (current >= 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; } /** * 获取当前页的起始索引 offset * @return */ public int getOffset() { return current * limit - limit; } /** * 获取总页数 * @return */ public int getTotal() { if (rows % limit == 0) { return rows / limit; } else { return rows / limit + 1; } } /** * 获取分页栏起始页码 * 分页栏显示当前页码及其前后两页 * @return */ public int getFrom() { int from = current - 2; return from < 1 ? 1 : from; } /** * 获取分页栏结束页码 * @return */ public int getTo() { int to = current + 2; int total = getTotal(); return to > total ? total : to; } } ``` ## Controller ```java @Controller public class HomeController { @Autowired private DiscussPostSerivce discussPostSerivce; @Autowired private UserService userService; @GetMapping("/index") public String getIndexPage(Model model, Page page) { // 获取总页数 page.setRows(discussPostSerivce.findDiscussPostRows(0)); page.setPath("/index"); // 分页查询 List list = discussPostSerivce.findDiscussPosts(0, page.getOffset(), page.getLimit()); // 封装帖子和该帖子对应的用户信息 List> discussPosts = new ArrayList<>(); if (list != null) { for (DiscussPost post : list) { Map 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"; } } ``` 🚩 小 Tip:这里不用把 Page 放入 model(`model.addAttribute("page", page);` 因为在方法调用之前,Spring MVC 会自动实例化 Model 和 Page,并将 Page 注入 Model,所以,在 Thymeleaf 中可以直接访问 Page 对象中的数据 ## 前端界面 index.html ```html th:each="map:${discussPosts}" ``` 表示将每次遍历 `discussPosts` 取出的变量称为 `map`