基于图片分享的仿微博系统的设计与开发

2024-01-02 04:59

本文主要是介绍基于图片分享的仿微博系统的设计与开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、需求分析

【背景分析】

        随着数字技术、移动互联网、云存储技术的快速发展,图片的质量得以极大的提高, 而且图片的获取、传递、分享成本大幅降低,并且在数字技术的引领之下,图片社交平台 逐渐成为真正的社交时尚。以图片社交平台 Pinterest 和 Instagram 为例,从后工业时代图片的创作、传播机制、社交属性等角度研究数字图片对人类日常生活,尤其是社交方式 的冲击,同时强调数字技术在图片社交中所发挥的关键作用。数字社会显然制造出了更多 的视觉信息,提供各种不在场的视觉经验,迫使人们接收信息、感知世界,尤其在社交网络上,图片正在迅速取代文字成为更简单、更及时、更直观、信息量更大、解读空间更广泛 的社交手段。
        本文对基于图⽚ 分享的社交平台进行了研究,并在 web 中构建了整个社区。
【功能预期】
系统功能说明.
平台共有两大类功能:前台功能和后台功能。
平台共有三种平台 ⻆⾊ :访客 户、注册 户、管理员。
1. 所有 ⻆⾊ 均可使 的前台功能(首页)
         显示分享列表
         搜索并查看分享的内容
         点赞榜
         最新发布
         查看分享,点击分享进
         登录的 ⼊⼝ 链接
2. 注册 户的前台功能
         点赞分享
         收藏分享
         评论分享 ( 不超过 100 )
         回复评论 ( 不超过 100 )
3. 注册 户的后台功能
         我的分享
         发布分享
         修改分享
4.  分享状态
         我的收藏
5.管理员的后台功能
         注册 户管理
         设计分享内容的屏蔽关键字

二、实现分析

【技术实现】
前端技术: HTML+JavaScript+CSS+Jquery+Bootstrap+VUE+Jquery.DataTable( 后台 )
后端技术: Springboot+Mybatis-Plus+Redis
开发环境: IDEA+Tomcat+Mysql 8.0+JDK1.8+VMware

三、数据库设计

【 数据库表设计】

表1:tb_blog 表(分享表)
名称类型长度注释
idbigint20主键
user_idbigint20用户id
titlevarchar255标题
imagesvarchar2048探店的照片,最多6张,多张以","隔开
contentvarchar2048探店的文字描述
likedint8点赞数量
collectint8收藏的数量
commentsint8评论数量
statustinyint1博客状态:0-屏蔽、1-可见、2-不可见
can_liketinyint1是否可以点赞
can_comtinyint1是否可以评论
create_timetimestamp0创建时间
update_timetimestamp0更新时间
表2:tb_blog_comments 表(评论表)
名称类型长度注释
idbigint20主键
user_idbigint20用户id
blog_idbigint20关联微博id
parent_idbigint20关联的1级评论id,如果是一级评论,则值为0
answer_idbigint20回复的评论id
contentvarchar255回复的内容
create_timetimestamp0创建时间
update_timetimestamp0更新时间

表3:tb_collect(收藏表) 

名称类型长度注释
idbigint20主键
user_idbigint20用户id
collect_blog_idbigint20收藏的博客ID
create_timetimestamp0创建时间
表4:tb_follow 表(关注表)
名称类型长度注释
idbigint20主键
user_idbigint20用户id
follow_user_idbigint20关联的用户id
create_timetimestamp0创建时间
表5:tb_forbiddenword 表(敏感词)
名称类型长度注释
idbigint20主键
wordvarchar50敏感词汇
create_timetimestamp0创建时间
表6:tb_rooter 表(管理员表)
名称类型长度注释
idbigint20主键
root_namevarchar20管理员用户名
root_accountvarchar20管理员账号
passwordvarchar30密码
表7:tb_user 表(用户表)
名称类型长度注释
idbigint20主键
phonevarchar11手机号码
passwordvarchar128密码,加密存储
nick_namevarchar32昵称,默认是用户id
iconvarchar255人物头像
user_statustinyint10-正常、1-禁止分享
fan_numbigint20粉丝数
follow_numbigint20关注数
create_timetimestamp0创建时间
update_timetimestamp0更新时间
表8:tb_userInfo(个人隐私表)
名称类型长度注释
user_idbigint20主键,用户id
fan_displaytinyint1是否展示粉丝,0-false、1-true
follow_displaytinyint1是否展示关注,0-false、1-true
create_timetimestamp0创建时间
update_timetimestamp0更新时间

四、业务实现

1.登录功能

        通过最终的校验,因为在后续的业务中,需要获取登录用户信息,所以我们将用户 信息保存在 ThreadLocal 中,将来用户访问时都是一个个独立的线程,通过 Threadlocal 挂载到线程下面,保证原子性。 而且,用户发起的 ajax 请求,许多要登录才能操作。简单的办法是,将 session 保存在 session,但是这种方法太笨重了,所以我们采用 redis 实现。所以需要模拟 session 超时过期,设置它的时间为 30 分钟,30 分钟后自动过期,同时需要存储 user 对象数据,采用的 redis 数据结构 hash。对于 Token,使用 UUID 随机生成,极端状态下可能会出现重复,可使用雪花算法,这里默认使用 UUID。
【部分代码实现】
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
//StringTemplate 要求必须为 String 类型
Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(), CopyOptions.create()
.setIgnoreNullValue(true)
.setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
String token = UUID.randomUUID().toString(true); //利用 UUID 随机生成 token 作为模拟
sessionID
String tokenKey = LOGIN_USER_KEY + token;
stringRedisTemplate.opsForHash().putAll(tokenKey,
对于 Token 的内容,还需要在每次发起请求时候,添加到请求头,对此前端的 js 的。
代码如下: 
// request 拦截器,将用户 token 放入头中
let token = sessionStorage.getItem("token");
axios.interceptors.request.use(
config => {
if(token) config.headers['authorization'] = token
return config
}, error => {
console.log(error)
return Promise.reject(error)
}
)
        最后,对于登录校验,需要使用到拦截器。用户进行一些操作时需要更新会话时间, 也就是 redis 的存活时间。同时,如果没有进行操作,超过最大时间后,直接删 redis 中的数据即可。我们的做法是,设置多层拦截器,外层拦截器拦截一切请求,内层拦截器登录校验,只要发起请求则从请求头中获取 Token,更新对应用户的会话时间。具体原理如下图所示:

2.实现滚动查询

        首先滚动查询,肯定需要前端监听滚动事件,到达一定值( 快到底部 ) 时触发滚动查询。对于后端查询数据( 按发布的时间降序排序 ) 时,需要注意两点:
        其一,极端情况下,在用户要滚动到下一页时,刚好有另外一名用户发布新的分享。假如此时直接用分页插件直接查询下一页会出错,查询到的数据会重复,因为最新的数据多了一条。
        所以应该记录最后一条数据的 id,下次查询该条数据以后的数据。
        其二,不能简单的在公开显示的分享中查询,应该查询所有分享包括不可见,而在遍历的时候去判断获取状态的分享数据。因为极端情况下,刚好查询下一页时,最后一 条分享用户刚好设置不可见,在只查询可见分享条件下,上次查询到的最后一条分享将会查询不到,产生错误。
【部分代码】实现:
List<Blog> records = new ArrayList<>();
// 根据用户查询
if (current == 1) {
Page<Blog> page = query()
.orderByDesc("create_time")
.eq("status", BLOG_NORMAL)
.page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
// 获取当前页数据
records = page.getRecords();
18
} else {
int num = 0;
int index = 0;
QueryWrapper<Blog> blogQueryWrapper = new QueryWrapper<>();
blogQueryWrapper.select()
.orderByDesc("create_time");
List<Blog> blogList = this.baseMapper.selectList(blogQueryWrapper);
for (Blog blog : blogList) {
if (blog.getId() == id) {
break;
}
index++;
}
//剩余的数量
int leaveNum = blogList.size() - index - 1;
while (leaveNum > 0 && num < 10) {
index++;
//分享的状态是必须是公开的
if (blogList.get(index).getStatus() == BLOG_NORMAL) { num++; records.add(blogList.get(index));
}
//剩余数量 -1
leaveNum--;
}
}

3.评论实现

        该业务逻辑层主要实现评论的功能模块,包括评论查看,回复评论。每条分享的评论,顶级评论一定是直接关联在分享下面,然后对于次级评论,关联在一级评论下方,相当于有了关联的评论 id ,即父评论 id 。对于子评论,有两个重要字段,父评论 id 和回复评论 id 。如果子评论的回复 id 为空,则此评论回复一级评论;否则,此评论则回复该 一级评论下对应的对应 id 的子评论。
具体参考之前的文章:一问多答式的评论模块

4.点赞实现

        点赞功能是基于 redis 实现的,点赞人数会比较多,用 MySQL 实现太笨重了,采用 redis 的排序集合实现,集合里的 score 存储的是时间戳, value 对应用户 ID 。查询点赞详情时,从 redis 中遍历出集合,再从数据库中查询数据。点赞时需要判断当前登录用户是否点赞,已点赞,则取消点赞; 未点赞,则直接点赞。
【部分代码实现】
if (score == null) {
// 3.如果未点赞,可以点赞
// 3.1.数据库点赞数 + 1
boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();
// 3.2.保存用户到 Redis 的 set 集合 zadd key value score
if (isSuccess) {
stringRedisTemplate.opsForZSet().add(key, userId.toString(), System.currentTimeMillis());
}
} else {
// 4.如果已点赞,取消点赞
// 4.1.数据库点赞数 -1
boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
// 4.2.把用户从 Redis 的 set 集合移除
if (isSuccess) {
stringRedisTemplate.opsForZSet().remove(key, userId.toString());
}
}

 五、界面展示

1、首页

 2.单个内容模块

3.博文展开

4.二级评论展开 

6.他人主页

7.个人主页

 8.查看粉丝

 9.发布分享

10. 隐私设置

11.管理用户

12.敏感词汇管控

 

六、资源获取 


如果文章对您有用的话,三连支持一下吧!!!

这篇关于基于图片分享的仿微博系统的设计与开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561399

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听