从零用java实现 小红书 springboot vue uniapp (8)个人资料修改 消息页优化

前言

移动端演示 http://8.146.211.120:8081/#/

前面的文章我们主要完成了点赞关注 im 聊天功能 下面我们将完善个人资料修改 和消息页优化 向产品迈进
个人资料修改

自定义头像背景图 以及网名等等修改之后个人资料卡片也会随之改变

这样看起来就美观多了

修改文字资料的话很简单 调用orm的update方法即可

主要难点是修改 头像和背景图 我们服务器的带宽很有限

这里我们就需要压缩图片上传

bash 复制代码
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.20</version>
        </dependency>

添加依赖

bash 复制代码
            java.io.File newFile = null;
            try {
            // 先尝试压缩并保存图片
                Thumbnails.of(file.getInputStream()).scale(1)
                        .outputQuality(0.25f)
                        .toFile(sysUploadPath + newFileSavePath + finalName);
                newFile = new java.io.File(sysUploadPath + newFileSavePath + finalName);
            } catch (IOException e) {
                //保存文件到指定目录
                 newFile = new java.io.File(sysUploadPath + newFileSavePath + finalName);
                file.transferTo(newFile);
            }

修改上传代码 outputQuality 是压缩比例 我们设置了0.25 经对比没有明显变糊

但是体积原来的2m优化到了600k 不会卡到半天都是白屏

贴一下完整的修改头像方法 由于上传时已经进行修改所以 不用和前台进行过多交互

bash 复制代码
    @ApiOperation(value = "修改头像")
    @ApiOperationSupport(order = 1)
    @PostMapping("/api/auth/updateAuthorAvatar")
    @OperLog(operModule = "修改头像",operType = OperType.EDIT,operDesc = "修改头像")
    public ResultBean<Author> updateAuthorAvatar(String fileId) {
        String followId = String.valueOf(request.getAttribute("authorId"));
        Author author = authorService.getById(followId);
        author.setAuthorId(followId);
        author.setAvatarId(fileId);
        File file = fileService.selectFileByFileId(fileId);
        String serverName = request.getServerName();
        author.setAvatarUrl("http://" + serverName + ":" + port + file.getFilePath());
        authorService.updateById(author);
        return ResultBean.success(author);
    };

消息页优化

消息页我们前民实现了未读消息列表

还有三个大功能没有实现

1.收到的赞和收藏

因为在前期我们在数据库设计上已经做好基础

有作者和关注人 且点赞和收藏表的字段一致

bash 复制代码
  SELECT
                n.note_id,
                n.note_title,
                n.follow_id,
                n.follow_name,
                a.AVATAR_URL,
                n.create_time,
                b.FIRST_PICTURE, CASE
            WHEN n.AUTHOR_ID IN (
                SELECT
                    AUTHOR_ID
                FROM
                    business_up_notes
            ) THEN
                1
            WHEN n.AUTHOR_ID IN (
                SELECT
                    AUTHOR_ID
                FROM
                    business_star_notes
            ) THEN
                2
            END AS `type`
            FROM
                (
                    SELECT
                        *, 'business_up_notes' AS source_table
                    FROM
                        business_up_notes
                    WHERE
                        AUTHOR_ID = #{authorId}
                    UNION ALL
                        SELECT
                            *, 'business_star_notes' AS source_table
                        FROM
                            business_star_notes
                        WHERE
                            AUTHOR_ID = #{authorId}
                ) AS n
            LEFT JOIN business_author a ON n.follow_id = a.AUTHOR_ID
            LEFT JOIN business_note b ON n.note_id = b.note_id
            where n.follow_id != #{authorId}
            ORDER BY
                n.create_time DESC

我们还是一条sql搞定 因为页面需要关注人的头像和笔记的图片

我们进行一下连表查询 最后过滤我们自己给自己点赞的记录即可

点击再次进去文章详情

2.新增关注

我们直接可以复用前面文章的粉丝列表页即可

3.评论和回复

这个模块有两种展现形式

1.对我笔记的评论

2.对我评论的回复

这里我们前面的评论表没有完善 所以导致查询有问题

bash 复制代码
        //如果上级pid不为空 设置 上级作者名和id
        if(StringUtil.isNotEmpty(replyDto.getParentId())){
            Reply parentReply = replyService.getById(replyDto.getParentId());
            replyDto.setParentAuthorName(parentReply.getAuthorName());
            replyDto.setParentAuthorId(parentReply.getAuthorId());
            //如果top不为空 设置第二级回复的 上级作者名和id
        }else if(StringUtil.isNotEmpty(replyDto.getTopParentId())){
            Reply parentReply = replyService.getById(replyDto.getTopParentId());
            replyDto.setParentAuthorName(parentReply.getAuthorName());
            replyDto.setParentAuthorId(parentReply.getAuthorId());
            //如果评论没有上级id和顶级id则回复的是笔记的作者
        }else if(StringUtil.isEmpty(replyDto.getParentId())&&StringUtil.isEmpty(replyDto.getTopParentId())){
            replyDto.setParentAuthorName(note.getAuthorName());
            replyDto.setParentAuthorId(note.getAuthorId());
        }

分析一下代码 首先我们设置没有parentId和topid这种情况下评论的是笔记本身

所以我们设置他的上级作者是笔记的作何

在判断有没有topid有的话回复的是第一级评论

最后判断有没有parentId有的话是第二级评论

我们用012 分别表示这三种情况

有了上级parentId就比较好查询了

bash 复制代码
  SELECT
                r.reply_id,
                r.note_id,
                b.note_title,
                a.author_id,
                a.author_name,
                a.AVATAR_URL,
                r.create_time,
                r.REPLAY_CONTENT,
                b.FIRST_PICTURE,
                CASE
                    WHEN r.TOP_PARENT_ID IS NULL THEN 1
                    WHEN r.TOP_PARENT_ID IS NOT NULL THEN 2
                END AS type,
                  r.PARENT_ID,
                  (
                        SELECT
                            REPLAY_CONTENT
                        FROM
                            business_reply
                        WHERE
                           REPLY_ID = r.PARENT_ID
                        LIMIT 1
                    ) AS parentReplayContent
            FROM
                business_reply r
            LEFT JOIN business_author a ON r.author_id = a.AUTHOR_ID
            LEFT JOIN business_note b ON r.note_id = b.note_id
            where PARENT_AUTHOR_ID = #{authorId} and r.author_id != #{authorId}
            ORDER BY
                r.create_time DESC

分析sql

首选我们查询所有给我们评论的 如果是笔记回复 设置类型1

如果是评论回复 设置类型2 如果是评论回复还需要查询你引用的回复

最后过滤自己的

这里我们实现了一个细节

当点击引用的回复时 我们希望进入到评论页面的相应位置

实现方法

1.进入笔记详情页传入回复的id;

2.给每个回复设置ref属性 这里不用dom查询因为有时获取不到

3.加载页面是滑动到制定位置并加一个时间的背景

4.其它优化项目

编辑删除笔记

笔记页判断作者是否当前用户 是的话可进行编辑

查询笔记和我们上传过的图片

修改时需要删除关联过的图片(不删除文件)重新建立关联关系

再次进入页面就显示编辑时间了

删除笔记则是逻辑删除

当再次进入页面是 显示笔记已删除并跳转主页

个人资料修改 消息页优化开发完毕 后续进行收到赞评论关注实时推送 之后就是后台相关管理

代码地址
https://gitee.com/ddeatrr/springboot_vue_xhs

相关推荐
秋难降7 分钟前
贪心算法:看似精明的 “短视选手”,用好了也能逆袭!💥
java·算法
清风细雨_林木木9 分钟前
Css样式中设置gap: 12px以后左右出现距离问题解析
css·vue.js·elementui
阿蒙Amon10 分钟前
C#数字金额转中文大写金额:代码解析
java·mysql·c#
失乐园13 分钟前
电商/物流/IoT三大场景:用MongoDB设计高扩展数据架构的最佳实践
java·后端·架构
五行星辰15 分钟前
Spring AI 实战:用 Java 搞 AI,从此告别调参侠
java·后端
知其然亦知其所以然19 分钟前
不懂 Python?没关系!Easy RAG 让 Java 开发者也能玩转大模型
java·后端·llm
五行星辰20 分钟前
Spring AI 实现 MCP:让 AI 自动管理你的代码质量
java·后端
用户214118326360223 分钟前
N8N教程-手把手教你搭建 N8N 自动化工作流:从安装到云部署全流程实战
前端·vue.js
shangjg324 分钟前
Kafka ACK机制详解:数据可靠性与性能的权衡之道
java·数据库·分布式·后端·kafka
王翼鹏30 分钟前
Spring boot 策略模式
java·spring boot·策略模式