python3GUI--短视频社交软件 By:Django+PyQt5(前后端分离项目)

文章目录


拿到代码的同学,请务必仔细阅读本篇博客,避免踩坑!
本篇能帮您解决大量学习pyqt5过程中的问题,少走弯路!

视频演示地址:https://www.bilibili.com/video/BV1R7yZBwEPx/

一.前言

本次模仿抖音短视频,使用PyQt5实现了短视频软件的大多数功能,主要的功能亮点有:刷短视频、视频互动(点赞、收藏、投币...)好友关系管理、实时消息互动、视频发布、个人信息管理,本系统采用前后端分离架构,实现了数据处理与逻辑和数据展示,让我们开始吧~

二.项目简介

博主使用一张思维导图展示所有功能,大家可以自行放大查看。

三.核心页面介绍(前端+逻辑)

1.主界面

软件启动后进入软件主界面,主界面开始推荐短视频内容,如果用户已经登录,会自动同步用户对视频的操作:点赞、投币、收藏,界面上除了展示这些信息还展示了短视频作者的头像以及昵称,用户可以在主界面上通过上下滑动切换视频内容,底部的进度条会实时展示当前视频的播放进度,用户可以手动点击指定的位置调整视频播放进度,我们的这个视频播放器很轻量,间接的提升了用户体验。

2.朋友界面

在这个界面用户可以对好友关系进行处理,比如我用左侧的账号添加右侧的账号为好友,右侧收到后可以进行好友关系处理,即选择接受和拒绝,当点击接受之后双方互为好友,当点击拒绝之后移除这条好友申请,当双方互为好友之后可以通过点击信息区域到聊天界面,亦可删除好友关系,这个界面就是用于好友管理的统一的界面。

3.消息界面

在这个界面里按照最后一条消息由近及远的方式排列了好友消息,展示了最后一条消息发送事件、内容以及对方头像和用户名,用户点击之后到聊天界面,可以与对方进行实时聊天,我们的系统内置聊天服务接口,聊天消息送达速度不低于1秒,真正地接近realTime!

4.聊天界面

用户可以在朋友界面、消息界面点击对方头像或者名称到聊天界面,这个界面里展示了与对方的聊天历史以及对方信息,根据每条消息的发送时间戳进行分组,根据情况展示不同规则的时间数据,用户可以在底部输入框输入内容然后点击发送按钮将消息发送给对方,新消息会实时展示到当前聊天界面里,用户可以点击右侧的滚动条查看消息历史。

5."我的"界面

在此界面展示了用户的基本个人信息、按类别展示了用户的操作视频内容,用户可以在这个页面通过切换tab查看自己的作品、点赞、收藏、投币的视频内容,视频的封面展示了目标视频的点赞数,根据点赞数进行了格式化处理(比如超过了1千就展示1k),本页面一共三个按钮:编辑资料、添加朋友、菜单按钮,菜单按钮点击后弹出菜单项,菜单项包括:切换账号、退出系统,当点击编辑资料的时候跳转到资料编辑界面、点击添加朋友到好友搜索添加界面,可以说本界面联动了多个界面。

6.资料编辑界面

在这个页面用户可以对自己的资料进行详细编辑,编辑之后点击保存能同步到各个页面,我们设置了相关接口,同样支持保存与数据同步。

7.好友搜索添加界面

用户通过在顶部搜索框输入关键字的方式进行好友检索,在这个页面可以选择目标用户发送好友申请,对方处理后就能实现好友添加。

8.视频发布界面

我们登录的账号,可以进行视频发布,用户通过选择本地文件+添加简单的视频描述即可完成视频基本资料的编辑,点击发布按钮即可将当前的视频发布到线上,其他用户启动APP后会拉取到最新的短视频数据然后进行播放。我们模拟了网络CDN服务器的效果,通过计算视频的MD5值实现了天然的去重,在本地创建了videos/和covers/目录,所有的视频和图片资源都将保存到目录中,在实际的应用场景中一般都会先将图片放到CDN服务器中,通过保存指定的URL地址实现资源数据的持久化存储。

9.登录&注册界面

介绍了这么多主要界面居然忘了介绍登录注册/笑哭,未登录的用户在界面上进行点赞、投币等操作时,会自动跳转到登录界面,用户可以通过输入自己在系统注册的账号使用手机号+密码的方式进行登录,没有账号的朋友可以去注册属于自己的账号,当天首次登录的用户自己的硬币数量会自动+1,硬币可以用于给视频投币,已经登录的用户可以在个人页面进行登录退出,实现了登录系统的逻辑闭环。

四.Django后端部分

我们的项目是前后端分离的,后端我们采用Django撰写了相关的接口给界面提供数据服务与支持,我们的后端项目在部署的时候可以与前端项目分机器部署,比如:后端部署在服务器上,前端可以分发给用户实现多开,后端与前端的对应关系是1对多。

1.Django做后端的好处

使用 Django 作为 PyQt5 抖音客户端(或类似短视频桌面端) 的后端,相比其他 Web 框架(如 Flask、FastAPI、Tornado、Sanic 等),有以下几个显著优势:

1、全功能框架,快速构建完整后端体系

2、ORM 与数据模型管理极其强大

3、安全性与可扩展性强

4、生态完善、社区成熟

5、与异步框架的兼容性增强

2.数据库设计

我们的数据库中设计了7张数据表,这7张数据表的表接口如下,我们封装了db_engine数据库引擎,能对sqlite3数据库引擎对数据表数据进行管理

bash 复制代码
    def create_database(self):
        """
        创建数据库,并确保各表存在
        """
        # 用户表
        create_users_sql = """
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    phone TEXT NOT NULL UNIQUE,
    password TEXT NOT NULL,
    lastlogin INTEGER  default 0,
    gender INTEGER default 0, --0保密  1-男 2-女
    age INTEGER default 0,
    status INTEGER default 0,
    birthday VARCHAR(16) default "",
    nickname VARCHAR(16) default "",
    avatar TEXT,
    description VARCHAR(120)  default "",
    coins INTEGER default 10--用户硬币数
);
"""
        self.execute(create_users_sql)

        # 消息表
        create_messages_sql = """
CREATE TABLE IF NOT EXISTS messages (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_a_id INTEGER NOT NULL,
    user_b_id INTEGER NOT NULL,
    create_time INTEGER NOT NULL,
    message_type INTEGER NOT NULL,
    content TEXT,
    status INTEGER DEFAULT 0,-- 0未读 1已读
    FOREIGN KEY(user_a_id) REFERENCES users(id),
    FOREIGN KEY(user_b_id) REFERENCES users(id)
);
"""
        self.execute(create_messages_sql)

        # 短视频表
        create_short_videos_sql = """
        CREATE TABLE IF NOT EXISTS short_videos (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            url TEXT NOT NULL,
            url_md5 TEXT NOT NULL,
            cover TEXT,
            description TEXT NOT NULL,
            status INTEGER DEFAULT 0,
            publish_time INTEGER,
            likes INTEGER DEFAULT 0,
            collections INTEGER DEFAULT 0,
            comments INTEGER DEFAULT 0,
            coins INTEGER DEFAULT 0
        );
        """
        self.execute(create_short_videos_sql)

        # 新增:短视频-用户关联表
        create_user_short_videos_sql = """
CREATE TABLE IF NOT EXISTS user_short_videos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    short_video_id INTEGER NOT NULL,
    status INTEGER DEFAULT 0,
    create_time INTEGER NOT NULL
);
"""
        self.execute(create_user_short_videos_sql)

        create_user_video_actions_sql = """
    CREATE TABLE IF NOT EXISTS user_video_actions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    short_video_id INTEGER NOT NULL,
    liked INTEGER DEFAULT 0,      -- 是否点赞 0/1
    collected INTEGER DEFAULT 0,  -- 是否收藏 0/1
    coined INTEGER DEFAULT 0,  -- 是否投币 0/1
    create_time INTEGER NOT NULL  -- 行为时间
);

"""
        self.execute(create_user_video_actions_sql)

        create_video_comments_sql = """
        CREATE TABLE IF NOT EXISTS video_comments (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    short_video_id INTEGER NOT NULL,
    user_id INTEGER NOT NULL,
    content TEXT NOT NULL,
    target_user_id INTEGER DEFAULT 0, -- 回复目标用户ID,0表示评论
    comment_time INTEGER NOT NULL,
    status INTEGER DEFAULT 0
);

"""
        self.execute(create_video_comments_sql)

        # 好友关系表
        create_friends_sql = """
        CREATE TABLE IF NOT EXISTS friends (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_id INTEGER NOT NULL,
            friend_id INTEGER NOT NULL,
            status INTEGER DEFAULT 0,     -- 0=待确认, 1=已通过, 2=已拒绝
            request_time INTEGER NOT NULL,
            confirm_time INTEGER DEFAULT 0,
            UNIQUE(user_id, friend_id)
        );
        """
        self.execute(create_friends_sql)

3.接口设计

我们设计了10几个接口用于支持PyQt5抖音的全部数据逻辑功能,每个接口都统一了出口函数,开发者可通过调整此出口函数实现所有API接口的统一控制,另外我们的接口都是POST请求,这加强了我们系统的安全性,也更符合RESTful 规范,相关的接口定义如下:

bash 复制代码
urlpatterns = [
    # ---------- 用户接口 ----------
    path('add_user/', ApiViews.add_user),
    path('verify_user/', ApiViews.verify_user),
    path('get_user/', ApiViews.get_user),
    path('update_user/', ApiViews.update_user),
    path('search_user/', ApiViews.search_user),

    # ---------- 消息接口 ----------
    path('add_message/', ApiViews.add_message),
    path('get_message/', ApiViews.get_message),
    path('get_message_list/', ApiViews.get_message_list),
    path('set_message_read/', ApiViews.set_message_read),

    # ---------- 短视频接口 ----------
    path('add_user_video/', ApiViews.add_user_video),
    path('get_recommend_video/', ApiViews.get_recommend_video),
    path('update_short_video/', ApiViews.update_short_video),

    # ---------- 用户-短视频关联 ----------
    path('get_user_short_video/', ApiViews.get_user_short_video),
    path('update_user_short_video/', ApiViews.update_user_short_video),

    # ---------- 用户视频行为(点赞/收藏) ----------
    path('set_user_video_action/', ApiViews.set_user_video_action),
    path('get_user_video_action/', ApiViews.get_user_video_action),

    # ---------- 评论接口 ----------
    path('add_video_comment/', ApiViews.add_video_comment),
    path('get_video_comment/', ApiViews.get_video_comment),
    path('update_video_comment/', ApiViews.update_video_comment),

    # ---------- 好友关系接口 ----------
    path('add_friend_request/', ApiViews.add_friend_request),
    path('update_friendship/', ApiViews.update_friendship),
    path('get_friends/', ApiViews.get_friends),
    path('delete_friendship/', ApiViews.delete_friendship),
]

4.用户数据安全

我们的用户数据统一保存在users数据表中,由于我们使用了sha256加密存储了数据,所以只有用户自己知道自己的密码,这意味着即使有黑客入侵我们的后端系统,也无法得到明文的用户密码,这大大加强了数据安全性。用户密码的加密解密函数如下:

bash 复制代码
def sha256_key():
    """用盐生成一个SHA256密钥"""
    return hashlib.sha256(SECRET_KEY.encode()).digest()


def xor_encrypt(text: str) -> str:
    """用SHA256生成的密钥做简单XOR加密"""
    try:
        key = sha256_key()
        text_bytes = text.encode()
        key_len = len(key)
        result = bytearray()
        for i in range(len(text_bytes)):
            result.append(text_bytes[i] ^ key[i % key_len])
        return result.hex()  # 返回16进制字符串,方便存储
    except:
        traceback.print_exc()
    return ""


def xor_decrypt(hex_text: str) -> str:
    """解密XOR加密后的16进制字符串"""
    try:
        key = sha256_key()
        text_bytes = bytes.fromhex(hex_text)
        key_len = len(key)
        result = bytearray()
        for i in range(len(text_bytes)):
            result.append(text_bytes[i] ^ key[i % key_len])
        return result.decode()
    except:
        traceback.print_exc()
    return ""

五.关于项目

1.项目部署

服务端

本项目是前后端分离的项目,需要先开启服务端(后端),一般在本地调试只需要执行下面的调试命令即可

bash 复制代码
python manage.py runserver 8888

启动后会自动监听本地的8888端口

博主已经在后端项目根目录下放置了windows机器一键启动脚本:start.bat,双击即可一键启动后端。

如果部署在了服务器上,需要配合nginx+uwsgi等运维软件实现服务器部署。

后端控制台启动后前端会发送请求到后端,后端可以在控制台看到实时日志输出。

客户端

客户端的话,需要在代码中找到api_engien.py中的api_address,这就是配置的后端接口服务根地址,如果本地部署的话,这个地址是不需要更改的,确定后端地址没问题后,直接启动前端项目即可看到主界面。

2.项目结构

项目结构大家见名知意哈

服务端

客户端

客户端项目是本次开发花费时间最久的地方,我们花费了大量精力在前端代码撰写上

六.总结

本次和大家详细分享了我开发的前后端分离的短视频社交软件,实现了短视频的查看、发布与好友实时互动,本次也是博主的一次尝试,实现效果良好,对项目感兴趣的朋友可以私聊我了解更多!

相关推荐
小马过河R1 小时前
AIGC首帧图尾帧图生成视频案例教程
aigc·音视频·ai视频
woshihonghonga1 小时前
【动手学深度学习】
开发语言·python
causaliy2 小时前
实践六:防盗链知识点——视频
爬虫·音视频
码界筑梦坊2 小时前
240-基于Python的医疗疾病数据可视化分析系统
开发语言·python·信息可视化·数据分析·毕业设计·echarts
有意义2 小时前
从零搭建:json-server+Bootstrap+OpenAI 全栈 AI 小项目
前端·后端·llm
戴草帽的大z2 小时前
使用V4L2工具验证RK3588平台视频设备节点数据有效性
ffmpeg·音视频·rk3588·nv12·v4l2-ctl
MoRanzhi12032 小时前
Python 实现:从数学模型到完整控制台版《2048》游戏
数据结构·python·算法·游戏·数学建模·矩阵·2048