
前言继续学习第五天的内容今日所学任务1.实现达人探店功能2.实现了关注与取关功能3.实现了共同关注功能今日收获1.实现达人探店功能黑马点评项目中的达人探店功能主要是让用户发布自己的探店笔记并在首页或个人主页中展示其他用户可以查看、点赞和关注作者。这个功能模拟了大众点评、小红书一类平台中的内容分享场景是项目中社交互动模块的重要组成部分。探店笔记对应的实体是 Blog数据库表中保存了笔记 id、商铺 id、用户 id、标题、图片、正文内容、点赞数、评论数、创建时间等信息。用户发布探店笔记时前端会提交笔记内容、商铺 id、图片等数据到后端。后端首先通过登录拦截器确认当前用户已登录然后从 UserHolder 中获取当前登录用户信息将用户 id 设置到 Blog 对象中再调用 save 方法把笔记保存到数据库。保存成功后返回新生成的笔记 id。查询探店笔记时项目提供了多个接口。例如首页热门笔记会按照点赞数倒序分页查询用户个人主页可以查询某个用户发布的所有笔记详情页可以根据笔记 id 查询单篇笔记。由于 Blog 表中只保存了作者 userId前端展示时还需要作者昵称和头像所以后端查询博客后会根据 userId 再查询用户表将昵称和头像填充到 Blog 的临时字段中返回给前端。点赞功能使用 Redis 的 ZSet 实现。每篇笔记对应一个点赞集合key 类似 blog:liked:笔记id。用户点赞时后端先判断当前用户 id 是否已经存在于 ZSet 中。如果不存在说明用户还未点赞就将数据库中的点赞数加一并把用户 id 写入 ZSetscore 使用当前时间戳如果已经存在说明用户已经点赞再次点击就是取消点赞后端会将点赞数减一并从 ZSet 中移除该用户。通过 ZSet不仅可以判断用户是否点赞还可以按照点赞时间查询前几名点赞用户。达人探店还结合了关注推送功能。用户发布笔记成功后后端会查询该用户的所有粉丝然后把新笔记 id 推送到每个粉丝的收件箱中。收件箱使用 Redis ZSet 保存key 类似 feed:粉丝idmember 是笔记 idscore 是发布时间戳。当粉丝查看关注动态时系统从自己的 feed 集合中按时间倒序读取笔记 id再查询笔记详情返回。为了支持不断下拉加载项目使用滚动分页方式返回最小时间戳和偏移量。总体来说达人探店功能实现了内容发布、内容查询、点赞互动和关注流推送。它综合使用了 MySQL 保存核心数据Redis ZSet 实现点赞排行和 Feed 流提高了社交场景下的数据查询效率和用户体验。2.实现了关注与取关功能、黑马点评的关注与取关功能主要围绕用户之间的关注关系展开核心接口在 FollowController 中对外提供关注/取关、判断是否关注、查询共同关注三个能力。关注和取关使用同一个接口PUT /follow/{id}/{isFollow}。其中 id 表示被关注用户的 idisFollow 表示操作类型true 为关注false 为取关。业务层会先通过 UserHolder.getUser() 获取当前登录用户然后根据当前用户 id 和目标用户 id 维护关注关系。当用户执行关注操作时系统会创建一条 Follow 记录保存到数据库表中字段主要包括当前用户 id 和被关注用户 id。保存成功后还会把被关注用户 id 写入 Redis Setkey 的格式是 follows:当前用户id。这样做的好处是后续查询共同关注时可以直接利用 Redis Set 的交集操作效率更高。当用户执行取关操作时系统会根据 user_id 和 follow_user_id 删除数据库中的关注记录。删除成功后也会同步从 Redis Set 中移除对应的被关注用户 id保证数据库和缓存中的关注关系一致。判断是否关注的接口是 GET /follow/or/not/{id}。它会查询数据库中是否存在当前用户关注目标用户的记录如果数量大于 0就说明已关注返回 true否则返回 false。共同关注接口是 GET /follow/common/{id}。系统会分别构造当前用户和目标用户的 Redis Set key然后使用 Redis 的 intersect 求交集得到两人都关注的用户 id 列表再根据这些 id 查询用户信息并转换为 UserDTO 返回给前端。整体来看这个功能采用“数据库保存真实关系Redis 提升集合查询效率”的设计。数据库保证数据可靠Redis Set 则让共同关注这种集合运算更快是一个比较典型的缓存辅助社交关系查询实现。3.实现了共同关注功能黑马点评的共同关注功能用于查询“当前登录用户”和“目标用户”之间都关注了哪些人类似社交平台里的“共同关注”。它的接口位于 FollowController 中对应请求路径是 GET /follow/common/{id}其中 {id} 表示目标用户的 id。前端访问该接口后后端会返回两个人共同关注的用户列表。该功能的核心实现位于 FollowServiceImpl 的 followCommons(Long id) 方法中。方法首先通过 UserHolder.getUser().getId() 获取当前登录用户的 id然后分别构造两个 Redis key当前用户的关注集合 key 为 follows:当前用户id目标用户的关注集合 key 为 follows:目标用户id。项目中在用户执行关注操作时会把被关注用户的 id 存入 Redis Set因此每个用户都有一个自己的关注集合。共同关注的判断并不是直接查数据库而是利用 Redis Set 的交集操作完成。代码通过 stringRedisTemplate.opsForSet().intersect(key, key2) 求两个关注集合的交集。交集中保存的就是当前用户和目标用户都关注的用户 id。Redis Set 天然适合做这类集合运算查询效率比遍历数据库再手动比对更高尤其适合关注关系这种社交场景。如果交集为空说明两人没有共同关注系统会直接返回空列表避免继续查询数据库。如果交集不为空就把 Redis 中取出的字符串 id 转换成 Long 类型然后调用 userService.listByIds(ids) 批量查询这些共同关注用户的完整信息。查询到用户实体后再通过 BeanUtil.copyProperties 转换成 UserDTO只返回前端需要展示的用户 id、昵称、头像等信息避免暴露敏感字段。整体来看共同关注功能采用了“数据库保存关注关系Redis Set 加速集合查询”的设计。数据库负责保证关注数据的可靠性Redis 负责提升共同关注查询性能。关注和取关时同步维护 Redis Set共同关注时直接求交集这种实现思路清晰、性能较好也体现了 Redis 在社交关系场景中的典型用法。总结今日主要围绕项目中的社交与内容互动功能进行了学习和实现重点完成了达人探店、关注与取关、共同关注等模块。首先实现了达人探店功能用户可以通过发布探店笔记分享消费体验、门店信息和个人评价使平台内容更加丰富也为其他用户提供参考。该功能涉及笔记发布、内容展示、用户信息关联等逻辑进一步加深了对业务流程和数据交互的理解。其次实现了关注与取关功能。用户可以根据兴趣关注其他用户也可以取消已关注对象。该功能看似简单但需要准确处理用户关系数据避免重复关注、错误取关等问题同时还要保证前端状态与后端数据保持一致。通过这一部分的学习对用户关系表的设计、接口编写以及业务判断有了更清晰的认识。最后实现了共同关注功能。该功能可以展示两个用户之间共同关注的人增强用户之间的社交联系也提升了平台的互动性。在实现过程中需要对两个用户的关注列表进行查询和比对并返回交集结果因此对集合操作、数据筛选以及接口返回格式有了更深入的掌握。总体来说今天的学习任务主要集中在用户社交关系和内容分享场景中不仅完善了项目的核心功能也提升了对后端业务逻辑、数据库操作和接口设计的综合运用能力。通过这些功能的实现对项目整体结构和用户互动机制有了更完整的理解。