使用物件導向程式設計的方式實現以下業務邏輯:
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']); } } ?>
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【內容】:張三,我是王五
李四發了資訊給張三,說「張三,我是李四,你在幹嘛」
張三回復了李四,說「我在想你呀」
我們再來看資料庫裡的表有哪些變化
登入資訊表資料增加了
訊息表資料增加了
1、講解了一個簡單的qq會員登入聊天的場景
以上就是一個簡單QQ群聊案例程式碼解析(PHP實現)的詳細內容,更多請關注TW511.COM其它相關文章!