首页开发
对于首页开发来说,要做到下面两点:
- 
确定好每页的页数,最好是有一个默认值 前端可以选择各种成熟的element-ui即可
 
- 
确定好前端返回的数据类型 
页面参数
这是前端api的请求
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 |  /**
   * 获取帖子
   * @param {int} current 当前页码
   * @param {int} limit 每页条数
   * @param {int} orderMode 排序模式,0 最新 1 热门
   * @returns
   */
  static async getDiscussPosts(current = 1, limit = 5, orderMode = 0) {
    return get('/index', {
      current,
      limit,
      orderMode
    })
  }
 | 
 
前端会使用get方法来向后端传递三个参数,分别是:
功能开发
在开发时我们要遵守mvc三层架构的形式去进行开发
- 
controller 前端的请求参数 
- 
service 业务逻辑方法 
- 
mapper 数据库调用 
Homecontroller
根据前端来确定对应的方法
| 1
2
 | @GetMapping
public Result<List<Map<String, Object>>> getDiscussPosts(@RequestParam(defaultValue = "1") int current, @RequestParam(defaultValue = "5") int limit, @RequestParam(defaultValue = "0") int orderMode)
 | 
 
这是函数签名,因为前端在传递这些参数的时候是有默认值的,所以我们可以使用RequestParam注解来设定默认值。
因为数据返回的是一个List<Map<>>的形式,所以我们还需要一个可以展示post的一个实体类,这样就可以把前端查询到的帖子数据由实体类进行返回。
HomeService
在HomeService里面需要实现查询封装页数的行为,在数据库中的分页查询就是limit语句,像下面这样
| 1
2
3
 | select * 
from Post
limit offset, pageSize
 | 
 
所以对于page和pageSize这两个参数来说,其中
- page=- (current - 1) * pageSize
- pageSize = limit
在service层可以拼接好这两个字段,然后传递到mapper层里面
HomeMapper
在首页展示出所有的帖子其实执行的就是一次select语句,这个方法与根据特定用户id进行查找的方式很像,所以我们可以封装一个userId参数,这样在实现根据用户id进行查找的时候就可以传进用户id来进行查找,而不用额外的去写一个方法。
因为userId是可有可无的,所以对于此类比较复杂的动态sql,我们可以将其书写在xml文件里面。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 | <sql id="commonField">
        id, user_id, title, content, type, status, create_time, comment_count, score
    </sql>
<select id="getDiscussPosts" resultType="com.zxp.nowcodercommunity.pojo.DiscussPost">
    select <include refid="commonField"/>
    from discuss_post
    where status != 2
    <if test="userId != 0">
        and user_id = #{userId}
    </if>
    order by type desc,
    <if test="orderMode == 1">
        score desc,
    </if>
    create_time desc
    limit #{offset}, #{limit}
</select>
 | 
 
构造返回数据
在controller层就可以使用service层里面传递回来的数据进行构造,来自后端的数据大概是这样
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 | {
    "code": 200,
    "msg": null,
    "data": [
        {
            "post": {
                "id": 275,
                "userId": 11,
                "title": "我是管理员",
                "content": "我是管理员,你们都老实点!",
                "type": 1,
                "status": 1,
                "createTime": "2019-05-16T10:58:44.000+00:00",
                "commentCount": 12,
                "score": 1751.2900346113624
            },
            "user": {
                "id": 11,
                "username": "nowcoder11",
                "headerUrl": "http://images.nowcoder.com/head/11t.png",
                "type": null,
                "createTime": null
            }
        }
}
      
 | 
 
也就是说需要我们显示的去构造一个List类型的数据,最后返回。
获取来自mapper的数据
获取来自mapper数据后
| 1
 | List<DiscussPost> list = homeService.getDiscussPosts(0, page.getCurrent(), page.getLimit(), 0);
 | 
 
显然,list里面存储的就是我们的post数据,我们还要根据post里面的userId来构造user数据,这个过程可以使用stream流来进行操作。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 | List<Map<String, Object>> data = list.stream().map(post -> {
            Map<String, Object> map = new HashMap<>();
            map.put("post", post);
            // 获取用户信息并拷贝属性
            User user = userService.getUserById(post.getUserId());
            UserVo userVo = new UserVo();
    		// 拷贝到UserVo里面
            BeanUtils.copyProperties(user, userVo);
            map.put("user", userVo);
            return map;
        }).collect(Collectors.toList());
 | 
 
测试
前端工程是vue3项目,所以在准备好前端工程前使用postman来进行测试
测试/index接口
在向前端发送数据后,可以看到确实接收到了数据

前后端联调
启动vue项目后,可以看到首页已经成功的将帖子展示了出来

但是当前页面还有一个缺点就是时间格式显示的不太正常,这是因为我们并未给定时间格式的形式。一种简单的方式是在参数上指定好日期格式。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 | public class DiscussPost {
    private int id;
    private int userId;
    private String title;
    private String content;
    private int type;
    private int status;
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date createTime;
    private int commentCount;
    private double score;
}
 | 
 
这样时间就可以按照我们需要的格式去显示

同时,我们还需要开发一个查询帖子总数的服务,这个比较简单,思路和分页查询差不多,就不写了。
总结
我觉得对于一个初学者,下面几点都很重要