首頁 >後端開發 >php教程 >一個簡單QQ群聊案例程式碼解析(PHP實作)

一個簡單QQ群聊案例程式碼解析(PHP實作)

易达
易达原創
2020-06-01 12:48:283606瀏覽

問題:

使用物件導向程式設計的方式實現以下業務邏輯:

##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會員:

#QQ會員:

#方法:

    1.登入 ,

    2.檢視訊息

    3.傳送訊息

#QQ會員登入資料:

##   資訊

    2.取得使用者最後的登入資訊

QQ會員訊息:

    方法:修改狀態(可修改為已讀取),取得會員訊息,新增會員訊息

QQ會員群:

方法:1.取得所有的群  2.創建群(張三查看行政部門群,說明這個群肯定是被某個人創建的)

QQ會員和群組的關係:

方法:1.根據會員查看她所有的群 = 取得會員所有的群組

          2.根據一個群,可以檢視這個群裡的所有成員

 3、資料庫分析:

1.QQ會員:其中屬性對應的是表格中的欄位

2.QQ會員訊息:其中屬性對應的是表格中的欄位

3.QQ會員群:其中屬性對應的就是表格中的欄位

4.QQ會員和群組的中間表 :因為一個會員可以從屬於多個會員群,所以需要有張這個表

       欄位:id,會員id,群id,入群時間

5.QQ會員登入資訊清單

分析完成後,我們來具體的操作

1、建立資料庫,初始化資料一個簡單QQ群聊案例程式碼解析(PHP實作)

建立資料庫,名字我們盡量通俗易懂點好,就叫做qq

一個簡單QQ群聊案例程式碼解析(PHP實作)

建立表格qq_group表格會員群組 

一個簡單QQ群聊案例程式碼解析(PHP實作)

建立表格qq_msg 訊息表

一個簡單QQ群聊案例程式碼解析(PHP實作)

建立表格qq_user 會員表格

一個簡單QQ群聊案例程式碼解析(PHP實作)

#建立表格qq_user_group_relation會員和群組的關係表

一個簡單QQ群聊案例程式碼解析(PHP實作)


############################### ###建立表qq_user_login_record 會員登入資訊記錄表##################初始化數據,哪些是專案的啟動資料呢##########1、會員有張三,李四,王五,他們分別有帳號密碼#########2、有2個群組行政部門群組,好友群組###

3、張三創建了行政部門群,張三,李四,王五都在該群裡

4、張三還創建了好友組,裡面有李四

#接下裡我們把這些資料填入資料庫

1、會員有張三,李四,王五,他們分別有帳號密碼(qq_user)

1一個簡單QQ群聊案例程式碼解析(PHP實作)

2、有2個群組行政部門群組,好友群組(qq_group)

2一個簡單QQ群聊案例程式碼解析(PHP實作)

3、張三創建了行政部門群,張三,李四,王五都在該群組

4、張三也建立了好友群組,裡面有李四(qq_user_group_relation)

3一個簡單QQ群聊案例程式碼解析(PHP實作)

4一個簡單QQ群聊案例程式碼解析(PHP實作)




##為了讓行政群組裡能有訊息,我們先試著在訊息表裡加入一筆記錄


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"=>&#39;mysql&#39;,
           "hostname"=>"127.0.0.1",
           "database"=>"qq",
           "username"=>"root",
           "password"=>"root"
       );
       $this->link = mysqli_connect($config[&#39;hostname&#39;],$config[&#39;username&#39;],
        $config[&#39;password&#39;],$config[&#39;database&#39;]);
       
    }
}
?>

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=&#39;&#39;){
        //创建连接
        $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 (&#39;{$content}&#39;,".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(&#39;Y-m-d H:i:s&#39;,$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,&#39;&#39;,$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.php222一個簡單QQ群聊案例程式碼解析(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[&#39;login_time&#39;]);

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 "张三回复了李四,说“我在想你呀”";
?>

運行結果如下:111一個簡單QQ群聊案例程式碼解析(PHP實作)

張三使用帳號a和密碼b 登入了

張三最後登入時間為2020-06-01 12:40:20

張三檢視了1小時內的行政部門群的訊息######張三看到的訊息是######【發送人id】:3【內容】:張三,我是王五#########李四發了訊息給張三,說「張三,我是李四,你在幹嘛」######張三回復了李四,說「我在想你呀」#########我們再來看資料庫裡的表有哪些變化######登入資訊表資料增加了############# ##訊息表資料增加了###############總結:#########1、講解了一個簡單的qq會員登入聊天的場景###

以上是一個簡單QQ群聊案例程式碼解析(PHP實作)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn