前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开发体育赛事直播系统:实现聊天交友的私聊功能技术实现全方案解析

开发体育赛事直播系统:实现聊天交友的私聊功能技术实现全方案解析

作者头像
用户10027718
发布于 2025-04-08 02:25:03
发布于 2025-04-08 02:25:03
1800
举报

基于“东莞梦幻网络科技”体育赛事直播系统,展示前后端技术(PHP ThinkPHP + Vue.js + Android Java + iOS OC)实现的“用户与用户之间私聊”完整方案,包括功能描述、界面效果、技术实现、数据结构、接口设计及关键代码示例。

一、私聊聊天功能模块包含:

1、用户与用户之间一对一私聊。

2、显示聊天记录、发送时间。

3、未读消息红点提示。

4、消息免打扰(可切换)。

5、聊天窗口置顶。

6、删除聊天、清空聊天记录。

7、发送消息、图片、表情等。

二、技术实现方案技术栈:

1、后端: PHP (ThinkPHP)

2、数据库MySQL

3、实时通信: WebSocket + Redis(用于消息推送 & 未读消息计数)

4、前端(H5/PC): Vue.js

5、移动端: Java (Android)、Objective-C (iOS)

三、数据结构设计(MySQL)

1、用户表 users

代码语言:sql
AI代码解释
复制
CREATE TABLE `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(50),
  `avatar` VARCHAR(255),
  `status` TINYINT DEFAULT 1
);

2、聊天消息表 chat_messages

代码语言:sql
AI代码解释
复制
CREATE TABLE `chat_messages` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `sender_id` INT,
  `receiver_id` INT,
  `content` TEXT,
  `send_time` DATETIME,
  `is_read` TINYINT DEFAULT 0,
  `is_deleted` TINYINT DEFAULT 0
);

3、聊天设置表 chat_settings

代码语言:sql
AI代码解释
复制
CREATE TABLE `chat_settings` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT,
  `chat_user_id` INT,
  `is_top` TINYINT DEFAULT 0,
  `no_disturb` TINYINT DEFAULT 0
);

四、后端接口设计(ThinkPHP)

1、获取聊天列表

代码语言:php
AI代码解释
复制
public function getChatList($userId)
{
    $chats = ChatModel::getChatListByUser($userId); // 关联读取chat_settings、last_message
    return json(['status' => 1, 'data' => $chats]);
}

2、获取聊天记录

代码语言:php
AI代码解释
复制
public function getMessages(Request $request)
{
    $userId = $request->param('user_id');
    $peerId = $request->param('peer_id');
    $messages = ChatMessageModel::getMessages($userId, $peerId);
    return json(['status' => 1, 'data' => $messages]);
}

3、发送消息

代码语言:php
AI代码解释
复制
public function sendMessage(Request $request)
{
    $data = $request->post();
    ChatMessageModel::send($data['sender_id'], $data['receiver_id'], $data['content']);
    // WebSocket推送
    WebSocketService::pushToUser($data['receiver_id'], $data);
    return json(['status' => 1, 'msg' => '发送成功']);
}

五、Vue 前端页面实现(关键代码)

1、聊天列表组件

代码语言:html
AI代码解释
复制
<template>
  <div class="chat-list">
    <div v-for="chat in chatList" :key="chat.user_id" class="chat-item">
      <div class="avatar"><img :src="chat.avatar"></div>
      <div class="info">
        <div class="name">{{ chat.username }}</div>
        <div class="last-msg">{{ chat.last_message }}</div>
        <div class="time">{{ chat.last_time }}</div>
        <div v-if="chat.unread_count > 0" class="red-dot">{{ chat.unread_count }}</div>
      </div>
      <el-dropdown>
        <span class="el-dropdown-link">···</span>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item @click.native="setTop(chat)">置顶聊天</el-dropdown-item>
          <el-dropdown-item @click.native="deleteChat(chat)">删除聊天</el-dropdown-item>
          <el-dropdown-item @click.native="clearMessages(chat)">清空消息</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
  </div>
</template>

2、聊天窗口

代码语言:html
AI代码解释
复制
<template>
  <div class="chat-window">
    <div class="header">
      {{ targetUser.username }}
      <el-switch v-model="noDisturb" @change="toggleNoDisturb">消息免打扰</el-switch>
    </div>
    <div class="chat-content">
      <div v-for="msg in messages" :class="{'mine': msg.sender_id === userId}">
        <div class="message">{{ msg.content }}</div>
        <div class="time">{{ msg.send_time }}</div>
      </div>
    </div>
    <div class="input-area">
      <el-input v-model="input" @keyup.enter="sendMessage" placeholder="请输入消息..." />
    </div>
  </div>
</template>

六、Android Java 实现(部分代码)

代码语言:java
AI代码解释
复制
public class ChatListActivity extends AppCompatActivity {
    private RecyclerView chatListView;
    private ChatListAdapter adapter;
    private List<ChatItem> chatItems = new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat_list);
        
        chatListView = findViewById(R.id.chat_list_view);
        chatListView.setLayoutManager(new LinearLayoutManager(this));
        
        adapter = new ChatListAdapter(chatItems, new ChatListAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(ChatItem item) {
                openChatWindow(item);
            }
            
            @Override
            public void onMoreClick(ChatItem item, View view) {
                showChatMenu(item, view);
            }
        });
        
        chatListView.setAdapter(adapter);
        
        loadChatList();
    }
    
    private void loadChatList() {
        // 调用API获取聊天列表
        ApiService.getInstance().getChatList(new ApiCallback<List<ChatItem>>() {
            @Override
            public void onSuccess(List<ChatItem> result) {
                chatItems.clear();
                chatItems.addAll(result);
                adapter.notifyDataSetChanged();
            }
            
            @Override
            public void onFailure(String error) {
                Toast.makeText(ChatListActivity.this, error, Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    private void openChatWindow(ChatItem item) {
        Intent intent = new Intent(this, ChatActivity.class);
        intent.putExtra("chat_id", item.getId());
        intent.putExtra("user_name", item.getUsername());
        startActivity(intent);
    }
    
    private void showChatMenu(ChatItem item, View anchorView) {
        PopupMenu popupMenu = new PopupMenu(this, anchorView);
        popupMenu.getMenuInflater().inflate(R.menu.chat_item_menu, popupMenu.getMenu());
        
        // 设置菜单项状态
        popupMenu.getMenu().findItem(R.id.menu_top).setTitle(item.isTop() ? "取消置顶" : "置顶");
        popupMenu.getMenu().findItem(R.id.menu_mute).setTitle(item.isMuted() ? "关闭免打扰" : "消息免打扰");
        
        popupMenu.setOnMenuItemClickListener(menuItem -> {
            switch (menuItem.getItemId()) {
                case R.id.menu_top:
                    toggleTopChat(item, !item.isTop());
                    return true;
                case R.id.menu_mute:
                    toggleMuteChat(item, !item.isMuted());
                    return true;
                case R.id.menu_delete:
                    deleteChat(item);
                    return true;
                case R.id.menu_clear:
                    clearMessages(item);
                    return true;
                default:
                    return false;
            }
        });
        
        popupMenu.show();
    }
    
    private void toggleTopChat(ChatItem item, boolean isTop) {
        ApiService.getInstance().topChat(item.getId(), isTop, new ApiCallback<Void>() {
            @Override
            public void onSuccess(Void result) {
                loadChatList();
            }
            
            @Override
            public void onFailure(String error) {
                Toast.makeText(ChatListActivity.this, error, Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    private void toggleMuteChat(ChatItem item, boolean isMuted) {
        ApiService.getInstance().muteChat(item.getId(), isMuted, new ApiCallback<Void>() {
            @Override
            public void onSuccess(Void result) {
                loadChatList();
            }
            
            @Override
            public void onFailure(String error) {
                Toast.makeText(ChatListActivity.this, error, Toast.LENGTH_SHORT).show();
            }
        });
    }
    
    private void deleteChat(ChatItem item) {
        new AlertDialog.Builder(this)
            .setTitle("删除聊天")
            .setMessage("确定要删除此聊天记录吗?")
            .setPositiveButton("确定", (dialog, which) -> {
                ApiService.getInstance().deleteChat(item.getId(), new ApiCallback<Void>() {
                    @Override
                    public void onSuccess(Void result) {
                        loadChatList();
                    }
                    
                    @Override
                    public void onFailure(String error) {
                        Toast.makeText(ChatListActivity.this, error, Toast.LENGTH_SHORT).show();
                    }
                });
            })
            .setNegativeButton("取消", null)
            .show();
    }
    
    private void clearMessages(ChatItem item) {
        new AlertDialog.Builder(this)
            .setTitle("清空消息")
            .setMessage("确定要清空此聊天中的所有消息吗?")
            .setPositiveButton("确定", (dialog, which) -> {
                ApiService.getInstance().clearMessages(item.getId(), new ApiCallback<Void>() {
                    @Override
                    public void onSuccess(Void result) {
                        loadChatList();
                    }
                    
                    @Override
                    public void onFailure(String error) {
                        Toast.makeText(ChatListActivity.this, error, Toast.LENGTH_SHORT).show();
                    }
                });
            })
            .setNegativeButton("取消", null)
            .show();
    }
}

七、iOS Objective-C 实现(部分代码)

代码语言:objectivec
AI代码解释
复制
#import "ChatListViewController.h"
#import "ChatItem.h"
#import "ChatViewController.h"
#import "ApiService.h"

@interface ChatListViewController ()

@end

@implementation ChatListViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title = @"私聊";
    self.chatItems = [NSMutableArray array];
    
    // 设置表格视图
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"ChatCell"];
    [self.view addSubview:self.tableView];
    
    // 加载数据
    [self loadChatList];
}

- (void)loadChatList {
    [[ApiService sharedInstance] getChatListWithCompletion:^(NSArray *chatItems, NSError *error) {
        if (error) {
            NSLog(@"Error loading chat list: %@", error.localizedDescription);
            return;
        }
        
        [self.chatItems removeAllObjects];
        [self.chatItems addObjectsFromArray:chatItems];
        [self.tableView reloadData];
    }];
}

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.chatItems.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ChatCell" forIndexPath:indexPath];
    
    ChatItem *chatItem = self.chatItems[indexPath.row];
    
    // 配置单元格
    cell.textLabel.text = chatItem.username;
    cell.detailTextLabel.text = chatItem.lastMessage;
    cell.imageView.image = [UIImage imageNamed:chatItem.avatar ?: @"default_avatar"];
    
    // 显示未读消息数
    if (chatItem.unreadCount > 0) {
        UILabel *badge = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
        badge.text = [NSString stringWithFormat:@"%ld", (long)chatItem.unreadCount];
        badge.textColor = [UIColor whiteColor];
        badge.backgroundColor = [UIColor redColor];
        badge.textAlignment = NSTextAlignmentCenter;
        badge.layer.cornerRadius = 10;
        badge.layer.masksToBounds = YES;
        cell.accessoryView = badge;
    } else {
        cell.accessoryView = nil;
    }
    
    // 置顶聊天背景色
    if (chatItem.isTop) {
        cell.backgroundColor = [UIColor colorWithRed:0.9 green:0.95 blue:1.0 alpha:1.0];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
    
    return cell;
}

#pragma mark - UITableViewDelegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    ChatItem *chatItem = self.chatItems[indexPath.row];
    [self openChatWithChatItem:chatItem];
}

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
    ChatItem *chatItem = self.chatItems[indexPath.row];
    
    // 置顶/取消置顶
    UITableViewRowAction *topAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal 
        title:chatItem.isTop ? @"取消置顶" : @"置顶" 
        handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
            [self toggleTopChat:chatItem];
        }];
    topAction.backgroundColor = [UIColor blueColor];
    
    // 删除
    UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive 
        title:@"删除" 
        handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
            [self deleteChat:chatItem];
        }];
    
    return @[deleteAction, topAction];
}

- (void)openChatWithChatItem:(ChatItem *)chatItem {
    ChatViewController *chatVC = [[ChatViewController alloc] init];
    chatVC.chatId = chatItem.chatId;
    chatVC.chatTitle = chatItem.username;
    [self.navigationController pushViewController:chatVC animated:YES];
}

- (void)toggleTopChat:(ChatItem *)chatItem {
    [[ApiService sharedInstance] topChat:chatItem.chatId isTop:!chatItem.isTop completion:^(BOOL success, NSError *error) {
        if (success) {
            [self loadChatList];
        } else {
            NSLog(@"Error toggling top chat: %@", error.localizedDescription);
        }
    }];
}

- (void)deleteChat:(ChatItem *)chatItem {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"删除聊天" 
        message:@"确定要删除此聊天记录吗?" 
        preferredStyle:UIAlertControllerStyleAlert];
    
    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        [[ApiService sharedInstance] deleteChat:chatItem.chatId completion:^(BOOL success, NSError *error) {
            if (success) {
                [self loadChatList];
            } else {
                NSLog(@"Error deleting chat: %@", error.localizedDescription);
            }
        }];
    }]];
    
    [self presentViewController:alert animated:YES completion:nil];
}

@end

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
丝般润滑:Oracle 18.3 RPM安装从未有过的顺畅初体验
自 Oracle 18c 开始,Oracle开始支持 Linux 上的 Oracle 数据库 RPM 安装方式,虽然刚刚发布还有一些限制,但是这无疑开始改变,目前的限制包括:
数据和云
2018/11/08
8800
快讯:Oracle 18c 通用版本 18.3 正式发布
如同 Oracle 此前预告的那样,Oracle Database 18c 已经正式发布,初始发布的 Linux X86 版本,版本号 18.3 :
数据和云
2018/07/27
7070
快讯:Oracle 18c 通用版本 18.3 正式发布
Linux下安装Oracle的过程和涉及的知识点-系列2
官方下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
bisal
2019/01/29
5560
在Mac上通过Docker部署Oracle Database 12.2版本
Oracle 已经宣布支持了Docker部署,这也让我们在Mac上部署 Oracle 数据库有了多一个选择,这是我的第一个Docker应用,非常简便快速的就完成了部署,简捷是最直接的体验。在 云和恩墨 和 恩墨学院 的培训中,我们使用Docker为环境部署实现了极大的便利和简化。
数据和云01
2018/09/05
2.3K1
在Mac上通过Docker部署Oracle Database 12.2版本
RHEL7.2 安装部署Oracle12c
1.安装前准备 版本: oracle12c-12.1.0.2 下载链接: http://www.oracle.com/technetwork/database/enterprise-edition/d
DevOps云学堂
2019/10/18
7530
Oracle win32_11gR2_database在Win7下的安装与卸载
在安装oracle之前,请检查一下自己的电脑硬件是否复合oracle要求的最低硬件配置:
授客
2019/09/12
7150
Oracle win32_11gR2_database在Win7下的安装与卸载
Oracle 19c之RPM安装
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bisal
2019/09/18
4.9K0
Oracle 19c之RPM安装
CentOS6.9下安装Oracle11gR2数据库
https://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-linx8664soft-100572.html
yuanfan2012
2019/06/02
1.8K0
Oracle 12cR2初体验(r11笔记第91天)
对于很多Oracle DBA来说,12c最期待人心的就是12c Release 2的发布了,而Linux64位版本的发布则是一个重头戏。详情可以关注公众号dbaplus来了解一下,今晚零点即将发布,可以尝个鲜。 今天下载了软件,体验了一番,我谈谈我的感受。 面对一个完全空白的环境,我的基本测试思路如下: 1.使用静默安装完成Oracle软件的部署 2.使用DBCA静默完成数据库的创建 3.拷贝$ORACLE_HOME克隆安装至另外一台服务器 静默安装数据库软件 这个步骤里面的很多操作都比较常规, 安装时指
jeanron100
2018/03/21
1.1K0
Windows 环境下安装 Oracle 19C
Oracle12c 版本的说明: Oracle12cR2=12.2.0.1 Oracle18C=12.2.0.2 Oracle19c=12.2.0.3
JiekeXu之路
2020/03/19
9.3K0
Windows 环境下安装 Oracle 19C
Centos7.6安装Oracle11g详细教程
最近因为业务需要安装oracle数据库,那真是一顿操作猛如虎,结果一看都是坑,要么无法远程安装,要么依赖包装不上,要么参数配置有问题。最后在同事的帮助下,终于可以安装成功了。今天小编就和大家分享下centos7.6下安装oracle11g的详细操作方法。
吾爱运维
2022/09/29
6.3K0
Centos7.6安装Oracle11g详细教程
Linux red hat enterprise5下安装oracle
我对linux是绝对的菜鸟,但今天有份工作是给一台装在linux上的oracle服务器设置自动数据备份。这很可能是只做一次的工作,只做一次的东西,时间久了肯定会忘掉,所以把整个安装和配置过程记录下来,供下次需要时翻看。
明年我18
2019/09/18
1.9K0
Linux red hat enterprise5下安装oracle
Oracle Database Express 18.4版本:敏捷的二步安装法
可能有些朋友还不知道,Oracle 推出了完全免费的 Express 版本,虽然存在一些功能限制,但是这个版本是完全免费的,只要你需要,可以随意适用。
数据和云01
2020/03/27
5000
Java程序员必备的辅助开发神器(2022年版),建议收藏
Nexus Repository OSS(Maven私服):https://www.sonatype.com/products/repository-oss
Tom弹架构
2021/11/02
1.1K0
Oracle 的安装与基本操作
在计算机信息安全领域中,数据库系统无疑有着举足轻重的地位。例如,微软的SQL server、IBM的DB2,以及甲骨文公司的Oracle、MySQL等,都是比较知名的数据库管理软件,其中Oracle数据库更是在电信、银行、证券、交通等大型应用场合拥有着绝对领先的优势。 这里我们就来说说Oracle 12c的安装。 Oracle 12c明确支持的Linux操作系统包括Oracle Linux 7、Oracle Linux 6. Oracle Linux 5. Red Hat Enterprise Linux 7、Red Hat Enterprise Linux 6. Red Hat Enterprise Linux 5. SUSE Linux Distributions .NeoKylin Linux Advanced Server Distributions。 因为Red Hat Enterprise 和CentOS属于同步发行的操作系统,所以Oracle 12c也同样支持CentOS7. CentOS6. CentOS5 操作系统。在其他Linux系统中安装时,个别软件或配置文件可能需要做适当调整。
小手冰凉
2019/12/12
1.1K0
Oracle 的安装与基本操作
002.Oracle安装部署-ASM
安装包: linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip
木二
2019/07/01
1.1K0
oracle 数据库RPM安装方式
下载RPM包 Oracle Database Software Downloads 下载Linux x86-64 对应的RPM oracle-database-ee-19c-1.0-1.x86_64.rpm oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm compat-libcap1-1.10-7.el7.x86_64.rpm compat-libstdc+±33-3.2.3-72.el7.x86_64.rpm
用户2038009
2021/03/08
1.1K0
Oracle 基础系列之1.1 oracle的安装
一、 1、以下是安装Oracle的一些硬件上的条件: (1)、操作系统最后是windows2000(也就是服务器版的操作系统) (2)、内存最好在1G以上,当然越大越好(因为Oracle服务启动就要消耗操作系统几百兆的内存,加上操作系统自己也要消耗内存) (3)、硬盘空间需要2G以上,当然越大越好 2、安装过程中,主要注意的点: (1)、全局数据库名和SID的设置 与Sql Server数据库不同的是,我们在安装完Sql Server之后,系统会自动给我们安装很多类型的数据库,而Oracle不会,Oracl
郑小超.
2018/01/26
9630
Oracle研究专题:Oracle系统安装与配置
本文主要介绍了如何安装和配置Oracle数据库以及如何使用PL/SQL Developer进行数据库的连接、调试和管理。包括介绍了Oracle数据库的下载、安装和配置过程,以及如何使用PL/SQL Developer进行数据库连接、调试和管理的方法。
SAP梦心
2018/01/05
1.4K0
Oracle研究专题:Oracle系统安装与配置
Oracle 19c 之 RPM 包安装初体验(一)
Oracle 自18c 开始,便已经提供Linux 环境单机的 rpm 安装方式,不过仅支持单实例安装,不支持集群,也只有企业版,其他版本的没有发布,不过有2.5 G 大小。
JiekeXu之路
2020/06/22
2.8K0
Oracle 19c 之 RPM 包安装初体验(一)
推荐阅读
相关推荐
丝般润滑:Oracle 18.3 RPM安装从未有过的顺畅初体验
更多 >
LV.1
云和恩墨(北京)信息技术有限公司
目录
  • 一、私聊聊天功能模块包含:
  • 二、技术实现方案技术栈:
  • 三、数据结构设计(MySQL)
  • 四、后端接口设计(ThinkPHP)
  • 五、Vue 前端页面实现(关键代码)
  • 六、Android Java 实现(部分代码)
  • 七、iOS Objective-C 实现(部分代码)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档