用uniapp 及socket.io做一个简单聊天app1
####相关的表结构,用的是mysql
- 用户表(Users)
存储用户的基本信息。
CREATE TABLE Users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- 好友关系表(Friends)
存储用户之间的好友关系。
CREATE TABLE Friends (user_id INT,friend_id INT,status ENUM('pending', 'accepted', 'blocked') DEFAULT 'pending',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (user_id, friend_id),FOREIGN KEY (user_id) REFERENCES Users(id),FOREIGN KEY (friend_id) REFERENCES Users(id)
);
- 群组表(Groups)
存储群组的信息。
CREATE TABLE Groups (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,description TEXT,owner_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (owner_id) REFERENCES Users(id)
);
- 群组成员表(GroupMembers)
存储群组中的成员信息。
CREATE TABLE GroupMembers (group_id INT,user_id INT,role ENUM('member', 'admin') DEFAULT 'member',joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (group_id, user_id),FOREIGN KEY (group_id) REFERENCES Groups(id),FOREIGN KEY (user_id) REFERENCES Users(id)
);
- 聊天信息表(Messages)
存储聊天消息,包括私聊和群聊。
CREATE TABLE Messages (id INT AUTO_INCREMENT PRIMARY KEY,sender_id INT,receiver_id INT, -- 可以是用户ID(私聊)或群组ID(群聊)type ENUM('private', 'group') NOT NULL,content TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (sender_id) REFERENCES Users(id),FOREIGN KEY (receiver_id) REFERENCES Groups(id) -- 如果是群聊消息
);
- 黑名单表(Blacklists)
存储用户之间的拉黑关系。
CREATE TABLE Blacklists (user_id INT,blocked_user_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (user_id, blocked_user_id),FOREIGN KEY (user_id) REFERENCES Users(id),FOREIGN KEY (blocked_user_id) REFERENCES Users(id)
);
- 邀请表(Invites)
存储群组邀请信息。
CREATE TABLE Invites (id INT AUTO_INCREMENT PRIMARY KEY,inviter_id INT,invitee_id INT,group_id INT,status ENUM('pending', 'accepted', 'declined') DEFAULT 'pending',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (inviter_id) REFERENCES Users(id),FOREIGN KEY (invitee_id) REFERENCES Users(id),FOREIGN KEY (group_id) REFERENCES Groups(id)
);
数据库表关系描述
Users表 存储用户的基本信息。
Friends表 记录用户之间的好友关系,并支持拉黑功能。
Groups表 存储群组的信息,每个群组由一个用户创建(owner_id)。
GroupMembers表 存储群组成员及其角色(普通成员或管理员)。
Messages表 存储所有的聊天消息,可以是私聊消息或群聊消息。
Blacklists表 存储用户之间的拉黑关系。
Invites表 存储群组邀请信息,并记录邀请状态(待处理、接受、拒绝)。
示例流程
添加好友
用户A向用户B发送好友请求,在Friends表中插入一条记录,状态为pending。
用户B接受好友请求,将状态更新为accepted。
拉黑好友
用户A将用户B拉黑,在Blacklists表中插入一条记录。
在Friends表中将对应记录的状态更新为blocked。
创建群组
用户A创建一个群组,在Groups表中插入一条记录。
在GroupMembers表中插入一条记录,将用户A设为管理员。
邀请加入群组
用户A邀请用户B加入群组,在Invites表中插入一条记录,状态为pending。
用户B接受邀请,将状态更新为accepted,并在GroupMembers表中插入一条记录。
发送消息
用户A发送一条私聊消息给用户B,在Messages表中插入一条记录,type为private。
用户A在群组中发送一条消息,在Messages表中插入一条记录,type为group。
以上设计涵盖了基本的好友、群组、聊天消息以及拉黑和邀请功能。如果需要更详细的业务逻辑实现,还需要在应用层进行更多的逻辑处理。
最终的sql:
-- 创建 Users 表
CREATE TABLE Users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE,avatar_url VARCHAR(255), -- 用户头像字段brief TEXT, -- 简介字段created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 创建 Friends 表
CREATE TABLE Friends (user_id INT,group_friend_id INT,type ENUM('user', 'group') NOT NULL, -- 用于区分用户或群组status ENUM('pending', 'accepted', 'blocked') DEFAULT 'pending',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (user_id, group_friend_id, type),FOREIGN KEY (user_id) REFERENCES Users(id),FOREIGN KEY (group_friend_id) REFERENCES Users(id) -- 或参考 ChatGroups(id) 根据 type
);-- 创建 ChatGroups 表
CREATE TABLE ChatGroups (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,description TEXT,avatar_url VARCHAR(255), -- 群组头像字段owner_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (owner_id) REFERENCES Users(id)
);-- 创建 Messages 表
CREATE TABLE Messages (id INT AUTO_INCREMENT PRIMARY KEY,sender_id INT,receiver_id INT, -- 可以是用户ID(私聊)或群组ID(群聊)receiver_type ENUM('user', 'group') NOT NULL, -- 用于区分用户或群组content_type ENUM('text', 'audio', 'video', 'image') NOT NULL,content TEXT NOT NULL,sender_avatar VARCHAR(255), -- 发送者头像receiver_avatar VARCHAR(255), -- 接收者头像is_retracted BOOLEAN DEFAULT 0, -- 是否被撤回retracted_at TIMESTAMP NULL DEFAULT NULL, -- 撤回时间created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (sender_id) REFERENCES Users(id),FOREIGN KEY (receiver_id) REFERENCES Users(id) -- 或参考 ChatGroups(id) 根据 receiver_type
);-- 创建 Blacklists 表
CREATE TABLE Blacklists (user_id INT,blocked_user_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (user_id, blocked_user_id),FOREIGN KEY (user_id) REFERENCES Users(id),FOREIGN KEY (blocked_user_id) REFERENCES Users(id)
);-- 创建 Invites 表
CREATE TABLE Invites (id INT AUTO_INCREMENT PRIMARY KEY,inviter_id INT,invitee_id INT,group_id INT,group_avatar VARCHAR(255), -- 群组头像字段inviter_avatar VARCHAR(255), -- 邀请人头像字段invitee_avatar VARCHAR(255), -- 被邀请人头像字段status ENUM('pending', 'accepted', 'declined') DEFAULT 'pending',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (inviter_id) REFERENCES Users(id),FOREIGN KEY (invitee_id) REFERENCES Users(id),FOREIGN KEY (group_id) REFERENCES ChatGroups(id)
);
相关文章:
用uniapp 及socket.io做一个简单聊天app1
####相关的表结构,用的是mysql 用户表(Users) 存储用户的基本信息。 CREATE TABLE Users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE,created_a…...

在Postman中引用JS库
前言 在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的,即在请求前使用JavaScript脚本对…...

学习笔记-系统框图简化求传递函数公式例题
简化系统结构图求系统传递函数例题 基础知识回顾 第四讲 控制系统的方框图 (zhihu.com) 「自控原理」2.3 方框图的绘制及化简_方框图化简-CSDN博客 自动控制原理笔记-结构图及其等效变换_结构图等效变换-CSDN博客 例子一 「自控原理」2.3 方框图的绘制及化简_方框图化简-CS…...
postgrsql——事务概述
事务概述 事务的特性 原子性(Atomicity): 事务被视为一个整体,其中的操作要么全部执行成功,要么全部不执行,即不存在部分执行的情况。这确保了事务的完整性和一致性。一致性(Consistency&…...
1.Spring Boot 简介(Spring MVC+Mybatis-plus)
文章目录 一,Spring Boot 简介二,搭建springboot项目并整合mybatis-plus框架1.pom导依赖2.添加启动项3.配置文件.yml 三,springboot集成 Spring MVC1.springmvc定义2.应用注解 一,Spring Boot 简介 SpringBoot是Spring的子工程(或…...

《计算机网络》(学习笔记)
目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…...

指针函数和函数指针
函数名在表达式中应该如何被解读?答:函数名可以在表达式中被解读成“指向该函数的指针”。 函数指针和指针函数有什么区别?答:函数指针是一个指向函数的指针;指针函数是一个返回指针变量的函数。 一个函数能否有时候…...
Elasticsearch跨集群搜索
Elasticsearch(简称ES)是一种基于Lucene的搜索引擎,以其高性能、可扩展性和实时搜索能力而广受欢迎。在大型分布式系统中,跨集群搜索成为了一个重要的需求,它允许用户从多个Elasticsearch集群中联合查询数据࿰…...

基于FPGA的数字信号处理(19)--行波进位加法器
1、10进制加法是如何实现的? 10进制加法是大家在小学就学过的内容,不过在这里我还是帮大家回忆一下。考虑2个2位数的10进制加法,例如:15 28 43,它的运算过程如下: 个位两数相加,结果为5 8 1…...
树莓派下,centos7操作系统, TensorFlow java版实现植物分类功能
在树莓派上运行CentOS 7,并使用TensorFlow Java版本实现植物分类功能可以通过以下步骤实现。以下是详细的指导: 一、安装和设置环境 1. 更新系统并安装基本工具 确保你的CentOS 7系统是最新的,并安装必要的工具: sudo yum update -y sudo yum install -y wget unzip gi…...
开源一个react路由缓存库
Github仓库 背景 产品希望可以像浏览器那样每打开一个路由,会多一个tab,用户可以切换tab访问之前加载过的页面,且不会重新加载。真就产品一句话…… Github上有轮子了吗 Github上开箱即用的轮子是基于react-router-dom V5实现的ÿ…...

go-kratos 学习笔记(7) 服务发现服务间通信grpc调用
服务发现 Registry 接口分为两个,Registrar 为实例注册和反注册,Discovery 为服务实例列表获取 创建一个 Discoverer 服务间的通信使用的grpc,放到data层,实现的是从uses服务调用orders服务 app/users/internal/data.go 加入 New…...

SPSS个人版是什么软件
SPSS是一款数据统计、分析软件,它由IBM公司出品,这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等,软件易学且功能非常强大,可以使用SPSS制作图表,例如柱状、饼状、折线等图表&…...

Minos 多主机分布式 docker-compose 集群部署
参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能 中文地址:MinIO | 用于AI的S3 …...

Unity + Hybridclr + Addressable + 微信小程序 热更新报错
报错时机: Generate All 怎么All 死活就是报错 生成微信小程序,并启动后 报错内容: MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因: Hybridclr 开发文档 解…...

鸿蒙开发—黑马云音乐之Music页面
目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果: 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…...

IsaacLab | 如何在Manipulation任务中添加新的目标(target)
如是我闻: 终于让我给摸索出来了,在这里描述一下问题场景。 假使说我们有一个机械臂操作的任务,这样婶的 Isaac Lab | Push 我们想做多目标的任务,这时候需要向环境中添加第二个目标,像这样 Isaac Lab | Add target 那…...

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)
接上篇《60、Pandas中DataFrame对象的操作(一)》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…...

Linux(虚拟机)的介绍
Linux介绍 常见的操作系统 Windows:微软公司开发的一款桌面操作系统(闭源系统)。版本有dos,win98,win NT,win XP , win7, win vista. win8, win10,win11。服务器操作系统:winserve…...

CSS(九)——CSS 轮廓(outline)
CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 轮廓(outline)属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...