首页后端开发PHP一个简单QQ群聊案例代码解析(PHP实现)

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

时间2024-02-02 04:49:03发布访客分类PHP浏览752
导读:收集整理的这篇文章主要介绍了一个简单QQ群聊案例代码解析(PHP实现 ,觉得挺不错的,现在分享给大家,也给大家做个参考。问题:使用面向对象编程的方式实现以下业务逻辑:1. 张三使用账号a,密码b登录了QQ2. 显示出...
收集整理的这篇文章主要介绍了一个简单QQ群聊案例代码解析(PHP实现),觉得挺不错的,现在分享给大家,也给大家做个参考。问题:

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

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

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

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

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会员和群的中间表 :因为一个会员可以从属于多个会员群,所以需要有张这个表

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

5.QQ会员登录信息列表

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

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

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

创建表qq_group表 会员组

创建表qq_msg 消息表

创建表qq_user 会员表

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

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

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

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

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

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

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

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

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

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

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

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

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

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

?phprequire_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

?phprequire_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//引入UserLOGinInforequire_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

?phprequire_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

?phprequire_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【内容】:张三,我是王五


李四发了信息给张三,说“张三,我是李四,你在干嘛”

张三回复了李四,说“我在想你呀”

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

登录信息表数据增加了

消息表数据增加了

总结:

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

以上就是一个简单QQ群聊案例代码解析(PHP实现)的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 一个简单QQ群聊案例代码解析(PHP实现)
本文地址: https://pptw.com/jishu/596381.html
入阶PHP-FPM PHP == 和 === 区别

游客 回复需填写必要信息