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

2020-07-16 10:05:56
問題:

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

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

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群聊案例程式碼解析(PHP實現)的詳細內容,更多請關注TW511.COM其它相關文章!