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

相关推荐
ggdpzhk17 分钟前
idea 编辑竖列:alt +shift+insert
java·ide·intellij-idea
徐飞不会喝酒24 分钟前
uniapp 微信小程序uview2.0 u-popup弹出层弹出在遮罩层不影响卡片正常勾选的情况下实现点击空白区域关闭弹层
微信小程序·uni-app
hikktn1 小时前
Java 兼容读取WPS和Office图片,结合EasyExcel读取单元格信息
java·开发语言·wps
迪迦不喝可乐1 小时前
软考 高级 架构师 第十一章 面向对象分析 设计模式
java·设计模式
檀越剑指大厂1 小时前
【Java基础】使用Apache POI和Spring Boot实现Excel文件上传和解析功能
java·spring boot·apache
苹果酱05671 小时前
Golang的网络流量分配策略
java·spring boot·毕业设计·layui·课程设计
孑么2 小时前
GDPU Android移动应用 重点习题集
android·xml·java·okhttp·kotlin·android studio·webview
未命名冀3 小时前
微服务面试相关
java·微服务·面试
Heavydrink3 小时前
ajax与json
java·ajax·json
阿智智3 小时前
纯手工(不基于maven的pom.xml、Web容器)连接MySQL数据库的详细过程(Java Web学习笔记)
java·mysql数据库·纯手工连接