从零用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

相关推荐
乔冠宇2 分钟前
微信小程序修改个人信息头像(uniapp开发)
微信小程序·小程序·uni-app
南宫生12 分钟前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长35 分钟前
Maven 基础环境搭建与配置(一)
java·maven
bing_1581 小时前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式
天上掉下来个程小白1 小时前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
风与沙的较量丶2 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言
m0_748251722 小时前
SpringBoot3 升级介绍
java
极客先躯3 小时前
说说高级java每日一道面试题-2025年2月13日-数据库篇-请说说 MySQL 数据库的锁 ?
java·数据库·mysql·数据库的锁·模式分·粒度分·属性分
程序员侠客行3 小时前
Spring事务原理 二
java·后端·spring
小猫猫猫◍˃ᵕ˂◍3 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式