实战篇 02. 达人探店 - 查看探店笔记学习文档

2 阅读3分钟

📚 实战篇 02. 达人探店 - 查看探店笔记学习文档

一、 业务场景与核心痛点

当用户在 App 前端点击某一条探店笔记时,页面不仅要展示笔记的标题、图片、文字内容,还必须要在顶部展示作者的头像和昵称

核心痛点:数据库表结构的设计与前端需求的不匹配

  • 在我们的数据库中,探店笔记表(tb_blog)为了遵循数据库设计范式,只保存了作者的 user_id,而没有直接保存作者的 name(昵称)和 icon(头像)。
  • 如果后端只单纯地 blogService.getById(id) 然后返回给前端,前端根本无法渲染出作者的信息。

解决方案:

后端在查出 Blog 数据后,必须拿着里面的 user_id,再去查一次用户表(tb_user),然后把查到的头像和昵称“塞”进 Blog 对象中,最后再统一返回给前端。


二、 实体类改造 (MyBatisPlus 的小技巧)

为了能把用户的昵称和头像装进 Blog 对象里,我们需要在 Blog 实体类中增加这两个字段。

但是!这两个字段在 tb_blog 数据库表中是不存在的。如果不加特殊注解,MyBatisPlus 在执行 SQL 时会因为找不到这两个列而直接报错。

解决方案:使用 @TableField(exist = false) 注解。

Java

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_blog")
public class Blog implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    // ... 其他原生字段省略 (shopId, title, images, content, userId 等) ...

    /**
     * 用户图标 (数据库 tb_blog 表中不存在此字段!)
     */
    @TableField(exist = false)
    private String icon;

    /**
     * 用户姓名 (数据库 tb_blog 表中不存在此字段!)
     */
    @TableField(exist = false)
    private String name;
}

这个注解非常关键,它明确告诉 MyBatisPlus:“这两个字段只是为了我写 Java 代码传数据方便用的,你在生成 SELECTINSERT 语句时,请自动忽略它们。”


三、 核心业务代码落地

BlogServiceImpl 中,我们需要重写一下根据 ID 查询笔记的逻辑:

Java

@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {

    @Resource
    private IUserService userService;

    @Override
    public Result queryBlogById(Long id) {
        // 1. 查询探店笔记
        Blog blog = getById(id);
        if (blog == null) {
            return Result.fail("笔记不存在!");
        }
        
        // 2. 核心补全逻辑:查询并封装发布这篇笔记的用户信息
        queryBlogUser(blog);
        
        // 3. 返回完整的笔记对象
        return Result.ok(blog);
    }

    /**
     * 封装的私有方法:根据 blog 中的 userId 查询用户信息,并塞回 blog 中
     */
    private void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        if (user != null) {
            blog.setName(user.getNickName());
            blog.setIcon(user.getIcon());
        }
    }
}

四、 学习总结与伏笔

这一节的业务逻辑非常简单,主要考察的是你对 Spring Boot 和 MyBatisPlus 关联查询的处理能力。在不使用复杂 SQL JOIN 连表查询的情况下,通过 Java 代码分步查询并拼装数据,是微服务架构中非常推荐的做法(因为连表查询在分库分表后很难操作)。


⚠️ 留给下一节的巨大悬念:

现在笔记是能正常展示了,但是页面下方还有一个**“点赞”按钮。 如果只是单纯地给点赞数 +1 很容易(直接 Update 数据库即可)。但是,如何保证“一个用户对同一篇笔记只能点赞一次” ?如果用户已经点过赞了,再次打开这个页面时,如何让前端把大拇指图标高亮显示**?

这就意味着,我们在查询笔记详情时,不仅要查作者信息,还要判断当前登录用户有没有点过赞!这就需要 Redis 的强势介入了。