0

0

一个简单QQ群聊案例代码解析(PHP实现)

易达

易达

发布时间:2020-06-01 12:48:28

|

3831人浏览过

|

来源于php中文网

原创

问题:

使用面向对象编程的方式实现以下业务逻辑:

1.       张三使用账号a,密码b登录了qq

2.       显示出张三最后的登录的时间

3.       张三查看了 1小时内的行政部门群的信息(这个群里有张三,李四,王五,其中张三是群主)

立即学习PHP免费学习笔记(深入)”;

4.       输出张三看到的这些信息

5.       突然张三收到好友李四的信息:信息叫:张三,我是李四,你在干嘛(张三创建了一个好友组,里面有好友李四)

6.       张三回复李四:我在想你呀

首先我们来分析一下

1、流程分析

1.张三使用账号a,密码b登录了qq

2.显示出张三最后的登录的时间

3.张三查看了 1个小时内的行政部门群的信息(这个群里有张三,李四,王五,其中张三是群主)

4.输出张三看到的这些信息

5.李四发送消息给张三,信息为:张三,我是李四,你在干嘛

6.张三发送消息给李四,信息为:我在想你呀

2、功能分析:

1.识别对象

 QQ会员,QQ会员登录信息,QQ会员消息,QQ会员群, QQ会员和群的关系(一对多)

2.识别对象的属性

 QQ会员: 

     属性:id,姓名,账号,密码

 QQ会员登录信息:(一个会员可以多次登录,有多条登录记录)

      属性:id,会员id,登录时间

QQ会员消息:属性:id,内容,发送时间,发送人,接收人,状态(已读,未读),查看时间

QQ会员群: 属性:id,创建会员,群名称,群的创建时间

QQ会员和群的关系:(这种关系也是一个类,也可以产生很多的实例)

       属性:id,user_id,group_id,create_time

3.识别对象的方法

QQ会员:

方法:

    1.登录 ,

    2.查看消息

    3.发送消息

QQ会员登录信息:

    1.保存会员的登录信息

    2.获取用户最后的登录信息

QQ会员消息:

    方法:修改状态(可以被修改为已读),获取会员消息,添加会员消息

QQ会员群:

方法:1.获取所有的群  2.创建群(张三查看行政部门群,说明这个群肯定是被某个人创建的)

QQ会员和群的关系:

方法:1.根据会员查看她所有的群 = 获取会员所有的群

          2.根据一个群,可以查看这个群里的所有成员

 3、数据库分析:

1.QQ会员:其中属性对应的就是表中的字段

2.QQ会员消息:其中属性对应的就是表中的字段

3.QQ会员群:其中属性对应的就是表中的字段

4.QQ会员和群的中间表 :因为一个会员可以从属于多个会员群,所以需要有张这个表

人声去除
人声去除

用强大的AI算法将声音从音乐中分离出来

下载

       字段:id,会员id,群id,入群时间

5.QQ会员登录信息列表

分析完成后,我们来具体的操作

1、创建数据库,初始化数据

创建数据库,名字我们尽量通俗易懂点好,就叫做qq

0.png

创建表qq_group表 会员组 

1.png

创建表qq_msg 消息表

2.png

创建表qq_user 会员表

3.png

创建表qq_user_group_relation会员和组的关系表

4.png

创建表 qq_user_login_record 会员登录信息记录表

5.png

初始化数据,哪些是项目的启动数据呢

1、会员有张三,李四,王五,他们分别有账号密码

2、有2个组 行政部门群组,好友组

3、张三创建了行政部门群,张三,李四,王五都在该群里

4、张三还创建了好友组,里面有李四

接下里我们把这些数据填入数据库中

1、会员有张三,李四,王五,他们分别有账号密码(qq_user)

11.png

2、有2个组 行政部门群组,好友组(qq_group)

22.png

3、张三创建了行政部门群,张三,李四,王五都在该群里

4、张三还创建了好友组,里面有李四 (qq_user_group_relation)

33.png

为了让行政群里能有消息,我们先试着在消息表里添加一条记录

44.png

2、创建类,实现类

根据分析,我们应该至少要创建5个类,但是所有的类都需要数据库连接,所以我们可以单独创建一个数据库类,所以有6个类需要创建

为了方便管理,我们把这些类都放到model目录中

model/Mysql.class.php

<?php
//数据库连接类
class Mysql{
    //属性:id,姓名,账号,密码,登录时间
    public $link = "";//id
   
    public function __construct(){
        //创建连接
        $this->init();
    }
    public function __destruct(){
        //销毁数据库连接
        if( $this->link ){
            mysqli_close($this->link);
        }
    }
    //创建连接,初始化连接
    public function init(  ){
       //创建连接
       $config = Array(
           "type"=>'mysql',
           "hostname"=>"127.0.0.1",
           "database"=>"qq",
           "username"=>"root",
           "password"=>"root"
       );
       $this->link = mysqli_connect($config['hostname'],$config['username'],
        $config['password'],$config['database']);
       
    }
}
?>

model/Group.class.php

<?php
require_once "MySql.class.php";
class Group{
    // 属性:id,创建会员,群名称,群的创建时间
    public $id = "";
    public $userid = "";
    public $groupName = "";
    public $createTime = "";
    public $mySql = "";
    public $tableName = "qq_user_group";
    public function __construct(){
        $this->mySql = new MySql();
    }
    //1.获取所有的群 
    //如果不指定具体的创建人,可以获取所有的群
    public function getAll($creatorUserId=''){
        //创建连接
        $conn = $this->Mysql->link;
        //写sql,执行sql
        $where = "";
        if( !empty($userid) ){
            $where .= " creator_user_id=".$creatorUserId;
        }
        $sql = "select * from {$this->tableName} where 1=1 and {$where}";
        //执行sql
        $result = mysqli_query($conn,$sql);

        //获取数据
        // $list = mysqli_fetch_all($result);
        $list = Array();
        while( $row=mysqli_fetch_assoc($result) ){
            $list[] = $row;
        }
        //end
        //返回数据
        return $list;
    }
    //2.创建群 留给同学些,课上就不写了,因为目前的最终效果不需要呈现,默认已经是张三创建好了
    public function create(){
        echo "创建了群";
    }
    
}
?>

Message.class.php

<?php
require_once  dirname(__FILE__)."/MySql.class.php";

// 会员消息类
class Message{
    //属性:id,内容,发送时间,发送人,接收人,状态(已读,未读),查看时间
    public $id = "";
    public $content = "";
    public $sendTime = "";
    public $sendUserId = "";
    public $toUserId = "";
    public $status = "";
    public $readTime = "";
    public $mySql = "";
    public $tableName = "qq_msg";
    public function __construct(){
        $this->mySql = new MySql();
    }
    

    // 方法:修改状态(可以被修改为已读),查看消息,发送消息
    public function updateStatus($id,$status){
        //创建连接
        $conn = $this->mySql->link;
        //写sql,执行sql
        $sql = "update {$this->tableName} set status={$status} where id={$id}";
        //执行
        $result = mysqli_query($conn,$sql);
        if( $result ){
            return true;
        }else{
            return false;
        }

    }
    //查看会员消息列表
    public function getMsgList($userid,$type,$startTime,$endTime,$groupId){
        //创建连接
        $conn = $this->mySql->link;
        //写sql,执行sql
        $where = " to_user_id={$userid} ";
        if( $type !=""){//这里特别注意不能直接写!empty,会导致0的情况考虑不进来 而0表示未读
            $where .= " and status=".$type;
        }
        if( !empty($startTime) && !empty($endTime) ){
            //判断时间
            $where .= " and create_time between {$startTime} and  {$endTime}";
        }
        if( $groupId ){
            $where .= " and group_id = ".$groupId;
        }
        $sql = "select * from {$this->tableName} where {$where}";
        
        //执行

        $result = mysqli_query($conn,$sql);
        //获取数据
        // return mysqli_fetch_all($result);
        $list = Array();
        while( $row=mysqli_fetch_assoc($result) ){
            $list[] = $row;
        }
        return $list;
    }
    //添加消息
    public function add($userid,$content,$toUserId,$groupId){
        
        //创建连接
        $conn = $this->mySql->link;
        //写sql,执行sql
        $sql = "insert into {$this->tableName} (content,create_time,send_user_id,
            to_user_id,status,read_time,group_id) values ('{$content}',".time().",{$userid},
                {$toUserId},0,0,".$groupId.") ";
        //执行
        $result = mysqli_query($conn,$sql);
        if( $result ){
            return true;
        }else{
            return false;
        }
        
        
    }

}
?>

model/User.class.php

<?php
//引入UserLoginInfo
require_once  "MySql.class.php";
require_once "UserLoginInfo.class.php";
require_once "Message.class.php";
class User{
    //属性:id,姓名,账号,密码,登录时间
    public $id = "";//id
    public $name = "";//姓名
    public $username = "";//账号
    public $password = "";//密码
    public $mySql = "";
    public $tableName = "qq_msg";
   
    public function __construct($id,$name,$username,$password){
        //初始化对象
        $this->id = $id;
        $this->name = $name;
        $this->username = $username;
        $this->password = $password;
        $this->mySql = new MySql();
    }
   

    public function login( $inputUsername,$inputPassword ){
        //登录逻辑
        //判断用户名和密码是否正确
        if( $inputUsername != $this->username ||
            $inputPassword !=$this->password){
            return array("msg"=>"用户名或者账号错误");
        }
        //登录成功
        $logintime = time();
        // echo $this->name."使用账号:{$inputUsername}和密码{$inputPassword}登录了,
        //     登录时间为:".date('Y-m-d H:i:s',$logintime);
        //将登录信息保存到数据库
        $logininfo = new UserLoginInfo();
        $result = $logininfo->save($this->id);
        return $result;
    }
    //查看消息 
    public function getMessage($startTime,$endTime,$groupId){
        //查看消息相当于通过查看这个动作和消息进行了互动
        //所以通过方法的调用来执行
        $messageModel = new Message();
        return $messageModel->getMsgList($this->id,'',$startTime,$endTime,$groupId);
        
    }
    //发送消息相当于通过查看这个动作和消息进行了互动
    public function sendMessage($content,$toUserId,$groupId){
         //所以通过方法的调用来执行
        $messageModel = new Message();
        return $messageModel->add($this->id,$content,$toUserId,$groupId);
    }
    
}
?>

model/UserGroupRelation.class.php

<?php
require_once "Mysql.class.php";
class UserGroupRelation{
    // 属性:id,创建会员,群名称,群的创建时间
    public $id = "";
    public $userid = "";
    public $groupName = "";
    public $createTime = "";
    public $mySql = "";
    public $tableName = "qq_user_group_relation";
    public function __construct(){
        $this->mySql = new MySql();
    }
    
    //1.获取一个群里所有的会员 根据群获取会员
    public function getUserList($groupid){
        //创建连接
        $conn = $this->mySql->link;
        //写sql,执行sql
       
        $sql = "select * from {$this->tableName }  where group_id={$groupid}";
        //执行
        $result = mysqli_query($conn,$sql);
        //获取数据
        // return mysqli_fetch_all($result);
        $list = Array();
        while( $row=mysqli_fetch_assoc($result) ){
            $list[] = $row;
        }
        return $list;
    }
    //2.根据某个会员获取他所有的群
    public function getGroupList($userid){
        //创建连接
        $conn = $this->mySql->link;
        //写sql,执行sql
       
        $sql = "select * from {$this->tableName }  where user_id={$userid}";
        //执行
        $result = mysqli_query($conn,$sql);
        //获取数据
        // return mysqli_fetch_all($result);
        $list = Array();
        while( $row=mysqli_fetch_assoc($result) ){
            $list[] = $row;
        }
        return $list;
    }
    
}
?>

model/UserLoginInfo.class.php

<?php
require_once "Mysql.class.php";

class UserLoginInfo{
    //属性:id,会员id,登录时间
    public $id = "";//id
    public $userid = "";//姓名
    public $loginTime = "";//登录时间
    public $mySql = "";
    public $tableName = "qq_user_login_record";
    public function __construct(){
        $this->mySql = new MySql();
    }
    //方法:
    public function save( $userid ){
        //添加用户登录记录
        $logintime = time();
        //保存到数据库
        //创建连接
        $conn = $this->mySql->link;
        //写sql执行sql
        $sql = "insert into ".$this->tableName.
            "(user_id,login_time) values({$userid}, {$logintime} )";
      
        //执行
        $result = mysqli_query($conn,$sql);
        //这种增,删,改的动作返回的结果是一个数字 1表示成功
        if( $result ){
            return true;
        }else{
            return false;
        }
        
    }
    //获取用户最后登录信息
    public function getLastLoginInfo($userid){
        //创建连接
        $conn = $this->mySql->link;
        //写sql执行sql
        $sql = "select * from ".$this->tableName.
            " where user_id={$userid} order by id desc limit 2";
   
        //执行
        $result = mysqli_query($conn,$sql);
        //获取数据
        $lastLoginInfo = mysqli_fetch_assoc($result);
        
        return $lastLoginInfo;
    }
}
?>

3、写流程

创建index.php

<?php
//业务代码
require_once "model/Message.class.php";
require_once "model/User.class.php";
require_once "model/UserGroupRelation.class.php";
require_once "model/UserLoginInfo.class.php";

//张三登录
$zhangsan = new User(1,"张三","a","b");
// //登录
$zhangsan->login("a","b");
echo $zhangsan->name."使用账号a和密码b 登录了<br/><br/>";
//输出最后登录时间
$logininfoModel = new UserLoginInfo();
//获取最后登录信息
$lastLoginInfo = $logininfoModel->getLastLoginInfo($zhangsan->id);
$lastLoginTime = date("Y-m-d H:i:s",$lastLoginInfo['login_time']);

echo $zhangsan->name."最后登录时间为".$lastLoginTime."<br/><br/>";
// 2.张三查看了 1个小时内的行政部门群的信息(这个群里有张三,李四,王五,其中张三是群主)
$startTime= strtotime("-1 hour");
$endTime = time();
$msglist = $zhangsan->getMessage($startTime,$endTime,1);//查看行为
echo "张三查看了 1小时内的行政部门群的信息<br/><br/>";
echo "<b>张三看到的信息是</b></br/><br/>";
//3.输出张三看到的这些信息
// print_r($msglist);
foreach( $msglist as $msg ){
       echo "【发送人id】:".$msg["send_user_id"]."【内容】:".$msg["content"]."<br/>";
}
echo "<br/><br/>";
//4.突然张三收到好友李四的信息:信息叫:张三,你在干嘛
//相当于是李四给张三发送了消息
$lisi = new User(2,"李四","lisi","123456");
$lisi->sendMessage("张三,我是李四,你在干嘛",$zhangsan->id,2);
echo "李四发了信息给张三,说“张三,我是李四,你在干嘛”<br/><br/>";
//5.张三回复李四:我在想你呀
$zhangsan->sendMessage("我在想你呀",$lisi->id,2);
echo "张三回复了李四,说“我在想你呀”";
?>

运行结果如下:

张三使用账号a和密码b 登录了张三最后登录时间为2020-06-01 12:40:20张三查看了 1小时内的行政部门群的信息张三看到的信息是【发送人id】:3【内容】:张三,我是王五李四发了信息给张三,说“张三,我是李四,你在干嘛”张三回复了李四,说“我在想你呀”

我们再来看数据库里的表有哪些变化

登录信息表数据增加了

2222.png

消息表数据增加了

1111.png

总结:

1、讲解了一个简单的qq会员登录聊天的场景

相关文章

QQ
QQ

QQ是腾讯在中国开发的一款社交应用,用户可用QQ在手机和电脑上聊天。QQ截止目前拥有超过8.2亿用户,是中国最多人使用的社交应用程序之一,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

12

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

69

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

59

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

46

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

24

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

4

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

348

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号