达人探店模块 完整源代码 核心总结1. 实体类 BlogDataEqualsAndHashCode(callSuperfalse)TableName(tb_blog)publicclassBlogimplementsSerializable{privatestaticfinallongserialVersionUID1L;TableId(valueid,typeIdType.AUTO)privateLongid;/** * 商户id */privateLongshopId;/** * 用户id */privateLonguserId;/** * 用户图标 */TableField(existfalse)privateStringicon;/** * 用户姓名 */TableField(existfalse)privateStringname;/** * 标题 */privateStringtitle;/** * 探店的照片最多9张多张以,隔开 */privateStringimages;/** * 探店的文字描述 */privateStringcontent;/** * 点赞数量 */privateIntegerliked;/** * 评论数量 */privateIntegercomments;/** * 创建时间 */privateLocalDateTimecreateTime;/** * 更新时间 */privateLocalDateTimeupdateTime;/** * 是否被当前用户点赞 */TableField(existfalse)privateBooleanisLike;}2. UploadController图片上传Slf4jRestControllerRequestMapping(upload)publicclassUploadController{PostMapping(blog)publicResultuploadImage(RequestParam(file)MultipartFileimage){try{// 1.获取原始文件名称StringoriginalFilenameimage.getOriginalFilename();// 2.生成新文件名StringfileNamecreateNewFileName(originalFilename);// 3.保存文件image.transferTo(newFile(SystemConstants.IMAGE_UPLOAD_DIR,fileName));// 4.返回结果log.debug(文件上传成功{},fileName);returnResult.ok(fileName);}catch(IOExceptione){thrownewRuntimeException(文件上传失败,e);}}// 生成随机文件名privateStringcreateNewFileName(StringoriginalFilename){StringsuffixoriginalFilename.substring(originalFilename.lastIndexOf(.));returnUUID.randomUUID().toString()suffix;}}3. BlogControllerRestControllerRequestMapping(/blog)publicclassBlogController{ResourceprivateIBlogServiceblogService;// 发布探店笔记PostMappingpublicResultsaveBlog(RequestBodyBlogblog){returnblogService.saveBlog(blog);}// 查看笔记详情GetMapping(/{id})publicResultqueryBlogById(PathVariableLongid){returnblogService.queryBlogById(id);}// 点赞/取消点赞PutMapping(/like/{id})publicResultlikeBlog(PathVariableLongid){returnblogService.likeBlog(id);}// 点赞排行榜 Top5GetMapping(/likes/{id})publicResultqueryBlogLikes(PathVariableLongid){returnblogService.queryBlogLikes(id);}// 分页查询热门笔记GetMapping(/hot)publicResultqueryHotBlog(RequestParam(valuecurrent,defaultValue1)Integercurrent){returnblogService.queryHotBlog(current);}}4. IBlogServicepublicinterfaceIBlogServiceextendsIServiceBlog{ResultsaveBlog(Blogblog);ResultqueryBlogById(Longid);ResultlikeBlog(Longid);ResultqueryBlogLikes(Longid);ResultqueryHotBlog(Integercurrent);}5. BlogServiceImpl核心业务ServicepublicclassBlogServiceImplextendsServiceImplBlogMapper,BlogimplementsIBlogService{ResourceprivateIUserServiceuserService;ResourceprivateStringRedisTemplatestringRedisTemplate;publicstaticfinalStringBLOG_LIKED_KEYblog:liked:;// 发布笔记OverridepublicResultsaveBlog(Blogblog){// 1.获取登录用户UserDTOuserUserHolder.getUser();blog.setUserId(user.getId());// 2.保存探店笔记booleansavesave(blog);if(!save){returnResult.fail(发布笔记失败);}// 3.返回笔记idreturnResult.ok(blog.getId());}// 查询笔记详情OverridepublicResultqueryBlogById(Longid){// 1.查询blogBlogbloggetById(id);if(blognull){returnResult.fail(笔记不存在);}// 2.查询发布者信息queryBlogUser(blog);// 3.查询是否被当前用户点赞isBlogLiked(blog);returnResult.ok(blog);}// 点赞/取消点赞ZSet 实现OverridepublicResultlikeBlog(Longid){// 1.获取登录用户LonguserIdUserHolder.getUser().getId();StringkeyBLOG_LIKED_KEYid;// 2.判断是否点赞过DoublescorestringRedisTemplate.opsForZSet().score(key,userId.toString());if(scorenull){// 3.未点赞数据库1Redis保存booleansuccessupdate().setSql(liked liked 1).eq(id,id).update();if(success){stringRedisTemplate.opsForZSet().add(key,userId.toString(),System.currentTimeMillis());}}else{// 4.已点赞数据库-1Redis移除booleansuccessupdate().setSql(liked liked - 1).eq(id,id).update();if(success){stringRedisTemplate.opsForZSet().remove(key,userId.toString());}}returnResult.ok();}// 点赞排行榜 Top5OverridepublicResultqueryBlogLikes(Longid){StringkeyBLOG_LIKED_KEYid;// 1.查询 Top5 用户idSetStringtop5stringRedisTemplate.opsForZSet().range(key,0,4);if(CollUtil.isEmpty(top5)){returnResult.ok(Collections.emptyList());}// 2.转换idListLongidstop5.stream().map(Long::valueOf).collect(Collectors.toList());StringidStrStrUtil.join(,,ids);// 3.根据id查询用户并保持排序ListUserDTOuserDTOListuserService.query().in(id,ids).last(ORDER BY FIELD(id,idStr)).list().stream().map(user-BeanUtil.copyProperties(user,UserDTO.class)).collect(Collectors.toList());returnResult.ok(userDTOList);}// 分页查询热门笔记OverridepublicResultqueryHotBlog(Integercurrent){PageBlogpagethis.query().orderByDesc(liked).page(newPage(current,SystemConstants.MAX_PAGE_SIZE));ListBlogrecordspage.getRecords();// 封装用户信息和点赞状态records.forEach(blog-{queryBlogUser(blog);isBlogLiked(blog);});returnResult.ok(records);}// 封装查询发布者信息privatevoidqueryBlogUser(Blogblog){LonguserIdblog.getUserId();UseruseruserService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}// 封装判断当前用户是否点赞privatevoidisBlogLiked(Blogblog){UserDTOuserUserHolder.getUser();if(usernull){blog.setIsLike(false);return;}LonguserIduser.getId();StringkeyBLOG_LIKED_KEYblog.getId();DoublescorestringRedisTemplate.opsForZSet().score(key,userId.toString());blog.setIsLike(score!null);}}二、核心知识点总结你必须掌握1 注解使用你最容易混淆图片上传RequestParam(file)JSON提交笔记RequestBody路径参数PathVariable2 点赞功能核心防止重复点赞Redis ZSet数据库存数量、Redis存用户ID点赞zadd取消点赞zrem3 你最容易忘的引用传递queryBlogUser(blog);isBlogLiked(blog);无返回值直接修改原对象企业级通用抽取私有方法复用代码4 排行榜关键zrange key 0 4取Top5ORDER BY FIELD保证查询顺序和Redis一致5 企业级规范图片不上传到本地用Nginx/云存储点赞必须用Redis防重未登录用户做非空判断多表数据统一封装返回
黑马点评--达人探店模块
达人探店模块 完整源代码 核心总结1. 实体类 BlogDataEqualsAndHashCode(callSuperfalse)TableName(tb_blog)publicclassBlogimplementsSerializable{privatestaticfinallongserialVersionUID1L;TableId(valueid,typeIdType.AUTO)privateLongid;/** * 商户id */privateLongshopId;/** * 用户id */privateLonguserId;/** * 用户图标 */TableField(existfalse)privateStringicon;/** * 用户姓名 */TableField(existfalse)privateStringname;/** * 标题 */privateStringtitle;/** * 探店的照片最多9张多张以,隔开 */privateStringimages;/** * 探店的文字描述 */privateStringcontent;/** * 点赞数量 */privateIntegerliked;/** * 评论数量 */privateIntegercomments;/** * 创建时间 */privateLocalDateTimecreateTime;/** * 更新时间 */privateLocalDateTimeupdateTime;/** * 是否被当前用户点赞 */TableField(existfalse)privateBooleanisLike;}2. UploadController图片上传Slf4jRestControllerRequestMapping(upload)publicclassUploadController{PostMapping(blog)publicResultuploadImage(RequestParam(file)MultipartFileimage){try{// 1.获取原始文件名称StringoriginalFilenameimage.getOriginalFilename();// 2.生成新文件名StringfileNamecreateNewFileName(originalFilename);// 3.保存文件image.transferTo(newFile(SystemConstants.IMAGE_UPLOAD_DIR,fileName));// 4.返回结果log.debug(文件上传成功{},fileName);returnResult.ok(fileName);}catch(IOExceptione){thrownewRuntimeException(文件上传失败,e);}}// 生成随机文件名privateStringcreateNewFileName(StringoriginalFilename){StringsuffixoriginalFilename.substring(originalFilename.lastIndexOf(.));returnUUID.randomUUID().toString()suffix;}}3. BlogControllerRestControllerRequestMapping(/blog)publicclassBlogController{ResourceprivateIBlogServiceblogService;// 发布探店笔记PostMappingpublicResultsaveBlog(RequestBodyBlogblog){returnblogService.saveBlog(blog);}// 查看笔记详情GetMapping(/{id})publicResultqueryBlogById(PathVariableLongid){returnblogService.queryBlogById(id);}// 点赞/取消点赞PutMapping(/like/{id})publicResultlikeBlog(PathVariableLongid){returnblogService.likeBlog(id);}// 点赞排行榜 Top5GetMapping(/likes/{id})publicResultqueryBlogLikes(PathVariableLongid){returnblogService.queryBlogLikes(id);}// 分页查询热门笔记GetMapping(/hot)publicResultqueryHotBlog(RequestParam(valuecurrent,defaultValue1)Integercurrent){returnblogService.queryHotBlog(current);}}4. IBlogServicepublicinterfaceIBlogServiceextendsIServiceBlog{ResultsaveBlog(Blogblog);ResultqueryBlogById(Longid);ResultlikeBlog(Longid);ResultqueryBlogLikes(Longid);ResultqueryHotBlog(Integercurrent);}5. BlogServiceImpl核心业务ServicepublicclassBlogServiceImplextendsServiceImplBlogMapper,BlogimplementsIBlogService{ResourceprivateIUserServiceuserService;ResourceprivateStringRedisTemplatestringRedisTemplate;publicstaticfinalStringBLOG_LIKED_KEYblog:liked:;// 发布笔记OverridepublicResultsaveBlog(Blogblog){// 1.获取登录用户UserDTOuserUserHolder.getUser();blog.setUserId(user.getId());// 2.保存探店笔记booleansavesave(blog);if(!save){returnResult.fail(发布笔记失败);}// 3.返回笔记idreturnResult.ok(blog.getId());}// 查询笔记详情OverridepublicResultqueryBlogById(Longid){// 1.查询blogBlogbloggetById(id);if(blognull){returnResult.fail(笔记不存在);}// 2.查询发布者信息queryBlogUser(blog);// 3.查询是否被当前用户点赞isBlogLiked(blog);returnResult.ok(blog);}// 点赞/取消点赞ZSet 实现OverridepublicResultlikeBlog(Longid){// 1.获取登录用户LonguserIdUserHolder.getUser().getId();StringkeyBLOG_LIKED_KEYid;// 2.判断是否点赞过DoublescorestringRedisTemplate.opsForZSet().score(key,userId.toString());if(scorenull){// 3.未点赞数据库1Redis保存booleansuccessupdate().setSql(liked liked 1).eq(id,id).update();if(success){stringRedisTemplate.opsForZSet().add(key,userId.toString(),System.currentTimeMillis());}}else{// 4.已点赞数据库-1Redis移除booleansuccessupdate().setSql(liked liked - 1).eq(id,id).update();if(success){stringRedisTemplate.opsForZSet().remove(key,userId.toString());}}returnResult.ok();}// 点赞排行榜 Top5OverridepublicResultqueryBlogLikes(Longid){StringkeyBLOG_LIKED_KEYid;// 1.查询 Top5 用户idSetStringtop5stringRedisTemplate.opsForZSet().range(key,0,4);if(CollUtil.isEmpty(top5)){returnResult.ok(Collections.emptyList());}// 2.转换idListLongidstop5.stream().map(Long::valueOf).collect(Collectors.toList());StringidStrStrUtil.join(,,ids);// 3.根据id查询用户并保持排序ListUserDTOuserDTOListuserService.query().in(id,ids).last(ORDER BY FIELD(id,idStr)).list().stream().map(user-BeanUtil.copyProperties(user,UserDTO.class)).collect(Collectors.toList());returnResult.ok(userDTOList);}// 分页查询热门笔记OverridepublicResultqueryHotBlog(Integercurrent){PageBlogpagethis.query().orderByDesc(liked).page(newPage(current,SystemConstants.MAX_PAGE_SIZE));ListBlogrecordspage.getRecords();// 封装用户信息和点赞状态records.forEach(blog-{queryBlogUser(blog);isBlogLiked(blog);});returnResult.ok(records);}// 封装查询发布者信息privatevoidqueryBlogUser(Blogblog){LonguserIdblog.getUserId();UseruseruserService.getById(userId);blog.setName(user.getNickName());blog.setIcon(user.getIcon());}// 封装判断当前用户是否点赞privatevoidisBlogLiked(Blogblog){UserDTOuserUserHolder.getUser();if(usernull){blog.setIsLike(false);return;}LonguserIduser.getId();StringkeyBLOG_LIKED_KEYblog.getId();DoublescorestringRedisTemplate.opsForZSet().score(key,userId.toString());blog.setIsLike(score!null);}}二、核心知识点总结你必须掌握1 注解使用你最容易混淆图片上传RequestParam(file)JSON提交笔记RequestBody路径参数PathVariable2 点赞功能核心防止重复点赞Redis ZSet数据库存数量、Redis存用户ID点赞zadd取消点赞zrem3 你最容易忘的引用传递queryBlogUser(blog);isBlogLiked(blog);无返回值直接修改原对象企业级通用抽取私有方法复用代码4 排行榜关键zrange key 0 4取Top5ORDER BY FIELD保证查询顺序和Redis一致5 企业级规范图片不上传到本地用Nginx/云存储点赞必须用Redis防重未登录用户做非空判断多表数据统一封装返回