匿名发帖/匿名论坛功能设计与实现(编辑发帖部分)

news2024/12/27 4:15:33

前言

还是之前的音乐系统,首页一直是没想好写些什么,想写一个基于数据分析筛选的歌曲推荐功能,但是目前技术选型没太有考究等以后再实现吧,昨天突然想到可以把首页设计成前40%页面是歌曲推荐后面接下来就是一段匿名论坛功能,说干就干,直接构思,设计,实现。

sql设计

        sql经过了数个功能的设计实现之后,现在的sql结构已经基本成熟,对此业务目前我使用了5个表,post(核心帖子表),post_data(帖子数据表),post_draft(帖子草稿表),post_images(帖子图片关联表),post_topics(话题表)

post表

post_data表

post_draft表

post_images 

 post_topics

这是这5个表的sql结构,然后下面是设计的UI:

接口实现

主要是设计了4个接口功能

发帖接口

        使用Optional进行校验参数,大致发帖封为两种方式,一个是前端已经有了草稿,草稿里储存了一个随机的postId,储存帖子信息的时候直接使用这个postId即可,如果为null,则再后端再创建一下uuid即可,分为实名和匿名,匿名就捏造姓名和头像,其他的就是简单的写DB的操作

    @Override
    public Result postPost(Optional<PostPostDto> optional) {
        if (!optional.isPresent()) {
            return Result.error("传入空参数");
        }
        PostPostDto postPostDto = optional.get();
        String content = postPostDto.getContent();
        String remark = postPostDto.getRemark();
        String account = postPostDto.getAccount();
        Integer topicId = postPostDto.getTopicId();
        Integer wordNum = postPostDto.getWordNum();
        List<String> picList = postPostDto.getPicList();
        Boolean isNameless = postPostDto.getIsNameless();


        Post post = BeanUtil.toBean(postPostDto, Post.class);
        if (post.getId() == null) {
            // 说明是没有草稿直接发布的,就直接uuid一个即可
            post.setId(RandomUtil.randomInt());
        }
        PostData postData = BeanUtil.toBean(postPostDto, PostData.class);
        if (isNameless) {
            // 是匿名
            Faker faker = new Faker(new Locale("zh-CN"));
            String adjective = faker.name().fullName();
            String name = faker.animal().name();
            String nickname = adjective + "的" + name;
            post.setNickname(nickname);
            post.setAvatar(NAMELESS_AVATAR_URL);
        } else {
            // 实名的话就直接去查account的信息
            UserCommentPo userInfo = infoMapper.getInfoByAccount(Long.valueOf(account));
            post.setAvatar(userInfo.getAvatar());
            post.setNickname(userInfo.getUsername());
        }

        save(post);

        // 设置postImages的值
        ArrayList<PostImages> postImagesList = new ArrayList<>();
        picList.forEach((pic) -> {
            PostImages tempPostImages = new PostImages();
            tempPostImages.setPostId(post.getId());
            tempPostImages.setImageUrl(pic);
            postImagesList.add(tempPostImages);
        });
        postImagesMapper.insert(postImagesList);

        // 设置postData的值
        postData.setPostId(post.getId());
        postDataMapper.insert(postData);


        return Result.ok("操作正确");
    }

    

 查询话题

        这个太简单就是查一下数据库,用了mp的语法

    @Override
    public Result getTopics() {

        LambdaQueryWrapper<PostTopics> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(PostTopics::getId, PostTopics::getTitle).eq(PostTopics::getIsDie, false);
        List<PostTopics> postTopics = postTopicsMapper.selectList(queryWrapper);
        return Result.ok(postTopics);
    }

 查询帖子的历史草稿

        这个主要是数据库设计上的思维巧妙,其实业务上并无难度,就是没难度的查询

    @Override
    public Result listDraftsByTimes(Integer postId) {
        // 构建查询条件
        LambdaQueryWrapper<PostDraft> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(PostDraft::getPostId, postId)
                   .eq(PostDraft::getIsDie, false)
                   .orderByDesc(PostDraft::getUpdateTime);
        
        // 查询草稿列表
        List<PostDraft> drafts = postDraftMapper.selectList(queryWrapper);
        
        return Result.ok(drafts);
    }

保存草稿

        这段代码没啥难度,也和发帖差不多,就是判断现在有没有postId,没有的话,我就设置一个,主要是sql设计上的难度,炸一想,我也想不出来,根据业务推出来的业务结构,业务就是历史草稿功能。

  
    @Override
    public Result saveDraft(PostDraft draft) {
        // 设置更新时间
        draft.setUpdateTime(LocalDateTime.now());
        draft.setIsDie(false);
        
        // 如果第一次生成草稿就先创建一个新的postId
        if (draft.getPostId() == null) {
            draft.setPostId(Math.abs(RandomUtil.randomInt()));
        }

        postDraftMapper.insert(draft);
        return Result.ok(draft.getPostId());
    }

前端的函数

        前端的实现同样精彩,只说几点主要的逻辑,防抖限流就不讲了

        编辑部分使用wangeditor实现,编辑html格式实现富文本,搞了一个定时器每一秒,统计一次字数。返回顶部和发布设置 按钮,使用Element-plus里的scroll组件里的监听事件实现,发图片使用的是Element-plus的upload组件,然后接入aliyun-oss的sdk。另外就是草稿恢复等功能,其实没什么逻辑难度有点无关紧要,就是查询历史草稿,然后点击恢复就把item传到编辑器里。

待完成实现

草稿箱接口

帖子展示接口

帖子的管理接口

帖子举报接口

帖子数据可视化管理接口

             

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序 城市点击后跳转 并首页显示被点击城市

在微信小程序中&#xff0c;渲染出城市列表后&#xff0c;如何点击城市&#xff0c;就跳转回到首页&#xff0c;并在首页显示所点击的城市呢&#xff1f; 目录 一、定义点击城市的事件 二、首页的处理 首页&#xff1a;点击成都市会跳转到城市列表 城市列表&#xff1a;点击…

DOM,事件监听和VUE入门

四个事件、 JS模块化 VUE入门 Ajax VUE总结

Python学习笔记(5)Python的创建型设计模式

创建型设计模式&#xff08;Creational Design Patterns&#xff09;&#xff0c;主要关注对象的创建机制。这类模式可以使得系统更加独立于如何创建、组合和表示其对象。通过将这些职责分离出来&#xff0c;创建型设计模式有助于提高代码的灵活性和复用性。 本书的范例代码已经…

云备份实战项目

文章目录 前言一、整体项目简介二、服务端环境及功能简介三、 客户端环境及功能简介四、服务端文件管理类的实现1. 获取文件大小&#xff0c;最后一次修改时间&#xff0c;最后一次访问时间&#xff0c;文件名称&#xff0c;以及文件内容的读写等功能2. 判断文件是否存在&#…

Java有关数组的相关问题

Java中的栈和堆的含义 栈 存储局部变量&#xff1a;栈主要用于存储方法中的局部变量&#xff0c;包括基本数据类型&#xff08;int、double、boolean等&#xff09;和对象的引用&#xff08;不包含对象本身&#xff09;。 遵循后进先出原则&#xff1a;当一个方法被调用时&…

使用Dify与BGE-M3搭建RAG(检索增强生成)应用-改进一,使用工作流代替Agnet

文章目录 前言Agent vs 工作流编写工作流 前言 在上一篇中&#xff0c;我们实现了一个基本的基于Dify的RAG的示范。 使用Dify与BGE-M3搭建RAG&#xff08;检索增强生成&#xff09;应用 这个效果确实很差。 我们一起来看看&#xff0c;该怎么改进。 今天我们就尝试一下&…

Python语法基础(四)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说&#xff0c;A函数作为B函数的参数&#xff0c;B函数就是高阶函数 map&#xff1a;映射 map(func,iterable) 这个是map的基本语法&#xff0c;…

Python毕业设计选题:基于django+vue的智慧社区可视化平台的设计与实现+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 养老机构管理 业主管理 社区安防管理 社区设施管理 车位…

Ubuntu环境中RocketMQ安装教程

参考教程 https://blog.csdn.net/weixin_56219549/article/details/126143231 1、安装JDK&#xff0c;并配置环境变量&#xff08;略&#xff09; 2、下载RocketMQ安装包 RocketMQ下载地址&#xff0c;选择二进制包下载 unzip rocketmq-all-5.0.0-ALPHA-bin-release.zip 使…

【SSM】mybatis的增删改查

目录 代理Dao方式的增删改查 1. 创建项目 $$1. 在sql.xml里增加日志代码以及user的mapper资源。 $$ 2. 在usermapper里引入接口。 $$3. 在测试类中引入以下代码&#xff0c;并修改其中名字。 $$ 4. 实例对象User.java里属性要与表中列严格对应。 2. 查询 1>. 查询所有 …

【C++习题】23.二分查找算法_寻找旋转排序数组中的最小值

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 153. 寻找旋转排序数组中的最小值 题目描述&#xff1a; 解法 暴力解法&#xff1a;O(n) 从前往后找数组中的最小值。 二分算法&#xff1a;O(logn) 先找二段性 因为这…

Linux笔记---进程:进程终止

1. 进程终止概念与分类 进程终止是指一个正在运行的进程结束其执行的操作。以下是一些常见的导致进程终止的情况&#xff1a; 一、正常终止 完成任务当进程完成了它被设计要执行的任务后&#xff0c;就会正常终止。收到特定信号在操作系统中&#xff0c;进程可能会收到来自操作…

立创庐山派 K230 RTSP 推流

立创庐山派使用的是K230芯片&#xff0c;按照教程刷了canmv固件&#xff0c;下载canmv ide&#xff0c;使用嘉楠社区的rtsp和wlan例程&#xff0c;修改成连接wifi以及RTSP推流例程 # Description: This example demonstrates how to stream video and audio to the network us…

Oracle数据恢复—Oracle数据库sysaux文件损坏的数据恢复案例

Oracle数据库故障&分析&#xff1a; 一台Oracle数据库打开报错&#xff0c;报错信息&#xff1a; “system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。管理员联系我们数据恢复中心寻求帮助&#xff0c;并提供了Oracle_Home目录的所有文件。用户方要求…

【kafka04】消息队列与微服务之Kafka 图形工具

Kafka 在 ZooKeeper 里面的存储结构 topic 结构 /brokers/topics/[topic] partition结构 /brokers/topics/[topic]/partitions/[partitionId]/state broker信息 /brokers/ids/[o...N] 控制器 /controller 存储center controller中央控制器所在kafka broker的信息 消费者 /c…

微众银行前端面试题及参考答案

使用的协议是 HTTP 还是 HTTPS&#xff0c;为什么没用 HTTPS&#xff1f; 在前端开发中&#xff0c;有些网站使用 HTTP 协议&#xff0c;有些使用 HTTPS 协议。 使用 HTTP 协议的情况可能是因为网站对安全性的要求不是极高&#xff0c;或者处于开发的早期阶段&#xff0c;还没有…

第144场双周赛:移除石头游戏、两个字符串得切换距离、零数组变换 Ⅲ、最多可收集的水果数目

Q1、[简单] 移除石头游戏 1、题目描述 Alice 和 Bob 在玩一个游戏&#xff0c;他们俩轮流从一堆石头中移除石头&#xff0c;Alice 先进行操作。 Alice 在第一次操作中移除 恰好 10 个石头。接下来的每次操作中&#xff0c;每位玩家移除的石头数 恰好 为另一位玩家上一次操作…

UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e

近日&#xff0c;优傲&#xff08;UR&#xff09;机器人公司立足中国市场需求&#xff0c;重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲&#xff08;UR&#xff09;一以贯之的高品质与性能特质&#xff0c;着重优化负载自重比&#xff0c;且在价格层面具竞争力&…

应急响应靶机——Windows挖矿事件

载入虚拟机&#xff0c;开启虚拟机&#xff1a; &#xff08;账户密码&#xff1a;administrator/zgsf123&#xff09; 发现登录进去就弹出终端界面&#xff0c;自动运行powshell命令&#xff0c;看来存在计划任务&#xff0c;自动下载了一些文件&#xff0c;之后就主动结束退…

基于深度学习和卷积神经网络的乳腺癌影像自动化诊断系统(PyQt5界面+数据集+训练代码)

乳腺癌是全球女性中最常见的恶性肿瘤之一&#xff0c;早期准确诊断对于提高生存率具有至关重要的意义。传统的乳腺癌诊断方法依赖于放射科医生的经验&#xff0c;然而&#xff0c;由于影像分析的复杂性和人类判断的局限性&#xff0c;准确率和一致性仍存在挑战。近年来&#xf…