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

互联网 20-6-1
问题:

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

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 会员登录信息记录表

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

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

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

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

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

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

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

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

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

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

2、创建类,实现类

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

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

<?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']);             } } ?>
<?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;         }                       }  } ?>
<?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【内容】:张三,我是王五李四发了信息给张三,说“张三,我是李四,你在干嘛”张三回复了李四,说“我在想你呀”

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

登录信息表数据增加了

消息表数据增加了

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

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

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: PHP
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:一个简单的部门案例详解(PHP代码实例)

相关资讯