您好,登錄后才能下訂單哦!
這篇文章為大家分享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
創(chuàng)建表qq_group表 會員組
創(chuàng)建表qq_msg 消息表
創(chuàng)建表qq_user 會員表
創(chuàng)建表qq_user_group_relation會員和組的關(guān)系表
創(chuàng)建表 qq_user_login_record 會員登錄信息記錄表
初始化數(shù)據(jù),哪些是項目的啟動數(shù)據(jù)呢
1、會員有張三,李四,王五,他們分別有賬號密碼
2、有2個組 行政部門群組,好友組
3、張三創(chuàng)建了行政部門群,張三,李四,王五都在該群里
4、張三還創(chuàng)建了好友組,里面有李四
接下里我們把這些數(shù)據(jù)填入數(shù)據(jù)庫中
1、會員有張三,李四,王五,他們分別有賬號密碼(qq_user)
2、有2個組 行政部門群組,好友組(qq_group)
3、張三創(chuàng)建了行政部門群,張三,李四,王五都在該群里
4、張三還創(chuàng)建了好友組,里面有李四 (qq_user_group_relation)
為了讓行政群里能有消息,我們先試著在消息表里添加一條記錄
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ù)增加了
消息表數(shù)據(jù)增加了
以上就是PHP使用面向?qū)ο缶幊虒崿F(xiàn)QQ群聊的詳細內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊!
免責(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)容。