用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)属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…...
在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 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...