溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

發(fā)布時間:2020-06-02 13:48:03 來源:億速云 閱讀:289 作者:Leah 欄目:編程語言

這篇文章為大家分享PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊的方法。文章以代碼和步驟解析實現(xiàn)模擬QQ的各種功能,希望大家通過這篇文章能有所收獲。

使用面向?qū)ο缶幊痰姆绞綄崿F(xiàn)以下業(yè)務(wù)邏輯:

1.       張三使用賬號a,密碼b登錄了qq

2.       顯示出張三最后的登錄的時間

3.       張三查看了 1小時內(nèi)的行政部門群的信息(這個群里有張三,李四,王五,其中張三是群主)

4.       輸出張三看到的這些信息

5.       突然張三收到好友李四的信息:信息叫:張三,我是李四,你在干嘛(張三創(chuàng)建了一個好友組,里面有好友李四)

6.       張三回復(fù)李四:我在想你呀

首先我們來分析一下

1、流程分析

1.張三使用賬號a,密碼b登錄了qq

2.顯示出張三最后的登錄的時間

3.張三查看了 1個小時內(nèi)的行政部門群的信息(這個群里有張三,李四,王五,其中張三是群主)

4.輸出張三看到的這些信息

5.李四發(fā)送消息給張三,信息為:張三,我是李四,你在干嘛

6.張三發(fā)送消息給李四,信息為:我在想你呀

2、功能分析:

1.識別對象

QQ會員,QQ會員登錄信息,QQ會員消息,QQ會員群, QQ會員和群的關(guān)系(一對多)

2.識別對象的屬性

QQ會員:

屬性:id,姓名,賬號,密碼

QQ會員登錄信息:(一個會員可以多次登錄,有多條登錄記錄)

屬性:id,會員id,登錄時間

QQ會員消息:屬性:id,內(nèi)容,發(fā)送時間,發(fā)送人,接收人,狀態(tài)(已讀,未讀),查看時間

QQ會員群: 屬性:id,創(chuàng)建會員,群名稱,群的創(chuàng)建時間

QQ會員和群的關(guān)系:(這種關(guān)系也是一個類,也可以產(chǎn)生很多的實例)

屬性:id,user_id,group_id,create_time

3.識別對象的方法

QQ會員:

方法:

1.登錄 ,

2.查看消息

3.發(fā)送消息

QQ會員登錄信息:

1.保存會員的登錄信息

2.獲取用戶最后的登錄信息

QQ會員消息:

方法:修改狀態(tài)(可以被修改為已讀),獲取會員消息,添加會員消息

QQ會員群:

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

QQ會員和群的關(guān)系:

方法:1.根據(jù)會員查看她所有的群 = 獲取會員所有的群

2.根據(jù)一個群,可以查看這個群里的所有成員

3、數(shù)據(jù)庫分析:

1.QQ會員:其中屬性對應(yīng)的就是表中的字段

2.QQ會員消息:其中屬性對應(yīng)的就是表中的字段

3.QQ會員群:其中屬性對應(yīng)的就是表中的字段

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

字段:id,會員id,群id,入群時間

5.QQ會員登錄信息列表

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

1、創(chuàng)建數(shù)據(jù)庫,初始化數(shù)據(jù)

創(chuàng)建數(shù)據(jù)庫,名字我們盡量通俗易懂點好,就叫做qq

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

創(chuàng)建表qq_group表 會員組

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

創(chuàng)建表qq_msg 消息表

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

創(chuàng)建表qq_user 會員表

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

創(chuàng)建表qq_user_group_relation會員和組的關(guān)系表

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

創(chuàng)建表 qq_user_login_record 會員登錄信息記錄表

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

初始化數(shù)據(jù),哪些是項目的啟動數(shù)據(jù)呢

1、會員有張三,李四,王五,他們分別有賬號密碼

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

3、張三創(chuàng)建了行政部門群,張三,李四,王五都在該群里

4、張三還創(chuàng)建了好友組,里面有李四

接下里我們把這些數(shù)據(jù)填入數(shù)據(jù)庫中

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

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

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

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

3、張三創(chuàng)建了行政部門群,張三,李四,王五都在該群里

4、張三還創(chuàng)建了好友組,里面有李四 (qq_user_group_relation)

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

為了讓行政群里能有消息,我們先試著在消息表里添加一條記錄

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

2、創(chuàng)建類,實現(xiàn)類

根據(jù)分析,我們應(yīng)該至少要創(chuàng)建5個類,但是所有的類都需要數(shù)據(jù)庫連接,所以我們可以單獨創(chuàng)建一個數(shù)據(jù)庫類,所以有6個類需要創(chuàng)建

為了方便管理,我們把這些類都放到model目錄中

model/Mysql.class.php

<?php
//數(shù)據(jù)庫連接類
class Mysql{
    //屬性:id,姓名,賬號,密碼,登錄時間
    public $link = "";//id
   
    public function __construct(){
        //創(chuàng)建連接
        $this->init();
    }
    public function __destruct(){
        //銷毀數(shù)據(jù)庫連接
        if( $this->link ){
            mysqli_close($this->link);
        }
    }
    //創(chuàng)建連接,初始化連接
    public function init(  ){
       //創(chuàng)建連接
       $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,創(chuàng)建會員,群名稱,群的創(chuàng)建時間
    public $id = "";
    public $userid = "";
    public $groupName = "";
    public $createTime = "";
    public $mySql = "";
    public $tableName = "qq_user_group";
    public function __construct(){
        $this->mySql = new MySql();
    }
    //1.獲取所有的群 
    //如果不指定具體的創(chuàng)建人,可以獲取所有的群
    public function getAll($creatorUserId=''){
        //創(chuàng)建連接
        $conn = $this->Mysql->link;
        //寫sql,執(zhí)行sql
        $where = "";
        if( !empty($userid) ){
            $where .= " creator_user_id=".$creatorUserId;
        }
        $sql = "select * from {$this->tableName} where 1=1 and {$where}";
        //執(zhí)行sql
        $result = mysqli_query($conn,$sql);

        //獲取數(shù)據(jù)
        // $list = mysqli_fetch_all($result);
        $list = Array();
        while( $row=mysqli_fetch_assoc($result) ){
            $list[] = $row;
        }
        //end
        //返回數(shù)據(jù)
        return $list;
    }
    //2.創(chuàng)建群 留給同學(xué)些,課上就不寫了,因為目前的最終效果不需要呈現(xiàn),默認(rèn)已經(jīng)是張三創(chuàng)建好了
    public function create(){
        echo "創(chuàng)建了群";
    }
    
}
?>

Message.class.php

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

// 會員消息類
class Message{
    //屬性:id,內(nèi)容,發(fā)送時間,發(fā)送人,接收人,狀態(tài)(已讀,未讀),查看時間
    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();
    }
    

    // 方法:修改狀態(tài)(可以被修改為已讀),查看消息,發(fā)送消息
    public function updateStatus($id,$status){
        //創(chuàng)建連接
        $conn = $this->mySql->link;
        //寫sql,執(zhí)行sql
        $sql = "update {$this->tableName} set status={$status} where id={$id}";
        //執(zhí)行
        $result = mysqli_query($conn,$sql);
        if( $result ){
            return true;
        }else{
            return false;
        }

    }
    //查看會員消息列表
    public function getMsgList($userid,$type,$startTime,$endTime,$groupId){
        //創(chuàng)建連接
        $conn = $this->mySql->link;
        //寫sql,執(zhí)行sql
        $where = " to_user_id={$userid} ";
        if( $type !=""){//這里特別注意不能直接寫!empty,會導(dǎo)致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}";
        
        //執(zhí)行

        $result = mysqli_query($conn,$sql);
        //獲取數(shù)據(jù)
        // return mysqli_fetch_all($result);
        $list = Array();
        while( $row=mysqli_fetch_assoc($result) ){
            $list[] = $row;
        }
        return $list;
    }
    //添加消息
    public function add($userid,$content,$toUserId,$groupId){
        
        //創(chuàng)建連接
        $conn = $this->mySql->link;
        //寫sql,執(zhí)行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.") ";
        //執(zhí)行
        $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);
        //將登錄信息保存到數(shù)據(jù)庫
        $logininfo = new UserLoginInfo();
        $result = $logininfo->save($this->id);
        return $result;
    }
    //查看消息 
    public function getMessage($startTime,$endTime,$groupId){
        //查看消息相當(dāng)于通過查看這個動作和消息進行了互動
        //所以通過方法的調(diào)用來執(zhí)行
        $messageModel = new Message();
        return $messageModel->getMsgList($this->id,'',$startTime,$endTime,$groupId);
        
    }
    //發(fā)送消息相當(dāng)于通過查看這個動作和消息進行了互動
    public function sendMessage($content,$toUserId,$groupId){
         //所以通過方法的調(diào)用來執(zhí)行
        $messageModel = new Message();
        return $messageModel->add($this->id,$content,$toUserId,$groupId);
    }
    
}
?>

model/UserGroupRelation.class.php

<?php
require_once "Mysql.class.php";
class UserGroupRelation{
    // 屬性:id,創(chuàng)建會員,群名稱,群的創(chuàng)建時間
    public $id = "";
    public $userid = "";
    public $groupName = "";
    public $createTime = "";
    public $mySql = "";
    public $tableName = "qq_user_group_relation";
    public function __construct(){
        $this->mySql = new MySql();
    }
    
    //1.獲取一個群里所有的會員 根據(jù)群獲取會員
    public function getUserList($groupid){
        //創(chuàng)建連接
        $conn = $this->mySql->link;
        //寫sql,執(zhí)行sql
       
        $sql = "select * from {$this->tableName }  where group_id={$groupid}";
        //執(zhí)行
        $result = mysqli_query($conn,$sql);
        //獲取數(shù)據(jù)
        // return mysqli_fetch_all($result);
        $list = Array();
        while( $row=mysqli_fetch_assoc($result) ){
            $list[] = $row;
        }
        return $list;
    }
    //2.根據(jù)某個會員獲取他所有的群
    public function getGroupList($userid){
        //創(chuàng)建連接
        $conn = $this->mySql->link;
        //寫sql,執(zhí)行sql
       
        $sql = "select * from {$this->tableName }  where user_id={$userid}";
        //執(zhí)行
        $result = mysqli_query($conn,$sql);
        //獲取數(shù)據(jù)
        // 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();
        //保存到數(shù)據(jù)庫
        //創(chuàng)建連接
        $conn = $this->mySql->link;
        //寫sql執(zhí)行sql
        $sql = "insert into ".$this->tableName.
            "(user_id,login_time) values({$userid}, {$logintime} )";
      
        //執(zhí)行
        $result = mysqli_query($conn,$sql);
        //這種增,刪,改的動作返回的結(jié)果是一個數(shù)字 1表示成功
        if( $result ){
            return true;
        }else{
            return false;
        }
        
    }
    //獲取用戶最后登錄信息
    public function getLastLoginInfo($userid){
        //創(chuàng)建連接
        $conn = $this->mySql->link;
        //寫sql執(zhí)行sql
        $sql = "select * from ".$this->tableName.
            " where user_id={$userid} order by id desc limit 2";
   
        //執(zhí)行
        $result = mysqli_query($conn,$sql);
        //獲取數(shù)據(jù)
        $lastLoginInfo = mysqli_fetch_assoc($result);
        
        return $lastLoginInfo;
    }
}
?>

3、寫流程

創(chuàng)建index.php

<?php
//業(yè)務(wù)代碼
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個小時內(nèi)的行政部門群的信息(這個群里有張三,李四,王五,其中張三是群主)
$startTime= strtotime("-1 hour");
$endTime = time();
$msglist = $zhangsan->getMessage($startTime,$endTime,1);//查看行為
echo "張三查看了 1小時內(nèi)的行政部門群的信息<br/><br/>";
echo "<b>張三看到的信息是</b></br/><br/>";
//3.輸出張三看到的這些信息
// print_r($msglist);
foreach( $msglist as $msg ){
       echo "【發(fā)送人id】:".$msg["send_user_id"]."【內(nèi)容】:".$msg["content"]."<br/>";
}
echo "<br/><br/>";
//4.突然張三收到好友李四的信息:信息叫:張三,你在干嘛
//相當(dāng)于是李四給張三發(fā)送了消息
$lisi = new User(2,"李四","lisi","123456");
$lisi->sendMessage("張三,我是李四,你在干嘛",$zhangsan->id,2);
echo "李四發(fā)了信息給張三,說“張三,我是李四,你在干嘛”<br/><br/>";
//5.張三回復(fù)李四:我在想你呀
$zhangsan->sendMessage("我在想你呀",$lisi->id,2);
echo "張三回復(fù)了李四,說“我在想你呀”";
?>

運行結(jié)果如下:

張三使用賬號a和密碼b 登錄了

張三最后登錄時間為2020-06-01 12:40:20

張三查看了 1小時內(nèi)的行政部門群的信息

張三看到的信息是

【發(fā)送人id】:3【內(nèi)容】:張三,我是王五


李四發(fā)了信息給張三,說“張三,我是李四,你在干嘛”

張三回復(fù)了李四,說“我在想你呀”

我們再來看數(shù)據(jù)庫里的表有哪些變化

登錄信息表數(shù)據(jù)增加了

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

消息表數(shù)據(jù)增加了

PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊

以上就是PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊的詳細內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI