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

2021-02-19 php中文網最新課程

本文為php中文網認證作者:「易達」投稿,歡迎加入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']);


}
}
?>

<?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 "創建了群";
}


}
?>

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

public $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 = "insert into ".$this->tableName.
"(user_id,login_time) values({$userid}, {$logintime} )";



$result = mysqli_query($conn,$sql);

if( $result ){
return true;
}else{
return false;
}


}

public function getLastLoginInfo($userid){

$conn = $this->mySql->link;

$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/>";

$startTime= strtotime("-1 hour");
$endTime = time();
$msglist = $zhangsan->getMessage($startTime,$endTime,1);
echo "張三查看了 1小時內的行政部門群的信息<br/><br/>";
echo "<b>張三看到的信息是</b></br/><br/>";


foreach( $msglist as $msg ){
echo "【發送人id】:".$msg["send_user_id"]."【內容】:".$msg["content"]."<br/>";
}
echo "<br/><br/>";


$lisi = new User(2,"李四","lisi","123456");
$lisi->sendMessage("張三,我是李四,你在幹嘛",$zhangsan->id,2);
echo "李四發了信息給張三,說「張三,我是李四,你在幹嘛」<br/><br/>";

$zhangsan->sendMessage("我在想你呀",$lisi->id,2);
echo "張三回復了李四,說「我在想你呀」";
?>

運行結果如下:

張三使用帳號a和密碼b 登錄了
張三最後登錄時間為2020-06-01 12:40:20
張三查看了 1小時內的行政部門群的信息
張三看到的信息是
【發送人id】:3【內容】:張三,我是王五
李四發了信息給張三,說「張三,我是李四,你在幹嘛」
張三回復了李四,說「我在想你呀」

我們再來看資料庫裡的表有哪些變化

登錄信息表數據增加了

消息表數據增加了

總結:

1、講解了一個簡單的qq會員登錄聊天的場景。

相關焦點

  • PHP實現多個文件上傳的簡單方法有哪些?
    本篇文章將給大家介紹關於PHP實現多個文件上傳的一些簡單方法。下面我們就通過具體的代碼示例,為大家介紹PHP實現多文件上傳的一些簡單方法。multiple是我們實現多文件上傳的一個重要屬性。同時我們將input中name名設置為一個file[] 數組。那麼我們再選擇多個文件上傳,如下圖:如圖我們選擇了三張圖片,然後再用如下upload.php文件來接收三個數據。
  • PHP 實現簡單的 MVC 框架
    學習框架最好的辦法就是了解其基本原理和運行流程,自己開發一個 MVC 框架,可以近距離的接觸到這些內容,為以後學習大型框架打好基礎。小編今天介紹的項目課程就是教你開發一個簡單的MVC框架。項目名稱:【PHP 實現簡單的 MVC 框架】項目簡介:該項目課程使用 PHP 實現一個簡單的 MVC 框架,包含模型、視圖、控制器以及模板解析等部分。通過項目了解MVC框架的基本原理和運行流程,學習面向對象編程和MVC設計模式,並學習開發中的一些注意事項。
  • 一個簡單例子說明php自定義函數過濾字符串功能實現!
    代碼如下:PHP編程實例:簡單的自定義函數過濾字符串功能實現!2、php自定義函數我們把內容過濾(過濾字符串功能)功能語句都寫到函數裡方便後續的調用。函數是可以實現特定功能的代碼塊(程序),大部分程式語言都有這個概念,函數可以更好實現模塊功能。函數可以分為父函數和子函數,他們之前可以相互調用。
  • php解析json格式的文本
    昨天,在我校的高級培訓群裡,有同學諮詢了如何用php解析json格式的文本問題,老師發現這個問題比較典型,在此將相關的知識點總結分享給同學們,希望對其他同學掌握該知識點也能起到一些幫助。該同學認為用json格式存儲數據比較簡潔,問直接用json格式定義一個數組該怎麼做。
  • 用php代碼實現在數組中追加一個全新的元素與屬性
    本文主要簡單介紹了用php代碼在一個數組中添加一個全新的元素與屬性方法 1、首先要定義一個用於測試的正常數組
  • PHP Document 代碼注釋規範
    4.給php代碼添加規範的注釋PHPDocument是從你的原始碼的注釋中生成文檔,因此在給你的程序做注釋的過程,也就是你編制文檔的過程。從這一點上講,PHPdoc促使你要養成良好的編程習慣,儘量使用規範,清晰文字為你的程序做注釋,同時多多少少也避免了事後編制文檔和文檔的更新不同步的一些問題。
  • 如何實現一個PHP類來計算整數的階乘?(代碼詳解)
    本篇文章主要給大家介紹實現一個PHP類來計算整數的階乘。首先大家簡單了解一下什麼是階乘?一個正整數的階乘(factorial)是所有小於及等於該數的正整數的積,並且0的階乘為1。自然數n的階乘寫作n!。
  • 如何使用PHP處理CSV文件?(代碼示例)
    源 / php中文網      源 / www.php.cn在PHP中我們可以使用fgetcsv()函數來解析CSV文件,它可以自動解析給定資源中的CSV欄位。php解析CSV文件可以使用fgetcsv()函數;該函數從打開的文件中解析一行,校驗 CSV 欄位。語法如下:fgetcsv("filename.csv", 1000, ",");filename.csv:CSV文件的名稱。
  • 實例,PHP實現下載文件的三種方法
    1、直接添加文件連結<button><a href="lib.zip">下載文件</a></button>使用上面的代碼實現文件下載2、傳遞參數並下載傳遞參數:<button><a href="tt.php?
  • PHP編程實例:自定義函數實現簡單數字加密和解密算法
    加密和解密一般用於電子商務,但是一般的網站開發中也會用涉及到到加密和解密,特別是文件處理上,今天為大家講解一個自定義函數簡單的數字加密/解密算法實例。實現過程1、製作form表單提交框一個文本輸入框和一個提交按鈕。2、創建php腳本文件。3、定義加密數字和解密數字的函數。
  • php框架開發:實現最簡單的MVC框架實例教程
    這篇文章主要介紹了php實現最簡單的MVC框架實例教程,講述了MVC框架的運行原理及簡單實現方法,具有不錯的參考借鑑價值,
  • PHP代碼審計四
    ,漏洞根據不同的代碼可以導致各種攻擊,如代碼注入、SQL注入、目錄遍歷等等<?文件,則仍按照php語法進行解析,這是include()函數所決定的。php:// 訪問各個輸入/輸出流(I/O streams),php://filter用於讀取源碼,php://input用於執行php代碼。
  • 如何利用PHP-FPM實現open_basedir繞過
    FASTCGI快速通用網關接口是常駐內存的CGI,實際上是對CGI程序的進程管理,FastCGI接口方式採用C/S結構,可以將HTTP伺服器和腳本解析伺服器分開,同時在腳本解析伺服器上啟動一個或者多個腳本解析守護進程。當HTTP伺服器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然後將得到的結果返回給瀏覽器。
  • (實用篇)PHP會員找回密碼功能的簡單實現
    HTML我們在找回密碼的頁面上放置一個要求用戶輸入註冊時所用的郵箱,然後提交前臺js來處理交互。代碼如下,並會返回相應的處理結果給前臺頁面,請看jQuery代碼:代碼如下 以上使用的jQuery代碼很方便簡潔的完成了前端交互操作,如果您有一定的jQuery基礎,那上面的代碼一目了然,不多解釋。
  • 實例,PHP+MySql 實現簡單的分頁功能
    參數:The offset 是返回集的初始標註,起始點是0,不是1The count 規定返回的數量簡單示例:SELECT * FROM user limit 10; // 取前 10 條數據SELECT * FROM user limit 10,10; // 查詢 11-20 這 10 條數據2、實現原理
  • PHP中實現簡單的生日提醒功能實例,簡單又實用!
    那麼在PHP中怎麼實現類似生日提醒的小功能呢?今天為大家詳細講解一下。實現過程1、準備一張生日祝福的圖片。2、創建php腳本文件。3、設置員工的生日。代碼如下:程序運行結果如下:PHP知識點總結1、if語句if語句在PHPweb
  • 搜索 PHP代碼審計之旅
    其他理解來也很簡單,就比如搭建一個網站,黑盒測試是在不知道網站源碼的情況下,對各個功能進行測試看看是否有問題,而白盒測試則是知道源碼,可以從代碼入手,看看代碼是否有問題,灰盒測試就是兩者混合起來進行測試(個人理解,如有錯誤請師傅指正),當然這些概念還有更深層的知識,這裡就不詳細介紹了。
  • 0060 PHP代碼嵌入到HTML網頁當中
    前面2節課全部都是之前寫過的程序重新用PHP程式語言來實現。這節課開始學習如何使用PHP結合HTML網頁來實現具體的動態數據網頁。學哥計劃做一個學生分數管理功能的網頁,首先來做一個一覽查詢頁面。PHP嵌入HTML的方式前面幾節課都是純粹的PHP代碼,然後通過php命令執行php文件代碼的方式來運行PHP代碼。
  • 使用PHP Mktime實現倒計時功能
    源 / php中文網      源 / www.php.cn如果你的網頁關注的是未來的某一特定事件,比如春節、國慶或者你的婚禮,你可能想要一個倒計時計時器,讓用戶知道離事件發生還有多久。在PHP中我們可以使用時間戳和mktime函數來實現。mktime()函數用於人為地生成選定日期和時間的Unix 時間戳。它的工作原理與time()函數相同,不同之處是它用於指定的日期,而不一定是今天的日期。如何編寫倒計時計時器?
  • a彩蛋.PHP零基礎,可變變量,雙變量的解析
    這一期算是彩蛋吧,從此但要離開這個系列一段時間了,本期由於非常的簡單,大家可以買包瓜子,嗑著瓜子來看本篇文章。本次要給大家說的是可變變量,聽上去很牛,但實際上也就那麼回事,要不我們來看看它的代碼。代碼原型:<?