問題:
使用物件導向程式設計的方式實現以下業務邏輯:
##1. 張三使用帳號a,密碼b登入了qq2. 顯示出張三最後的登入的時間3. 張三查看了1小時內的行政部門群的資訊(這個群裡有張三,李四,王五,其中張三是群主) 4. 輸出張三看到的這些訊息5. 子三收到好友李四的訊息:訊息叫聲:張三,我是李四,你在幹嘛(張三創建了一個好友組,裡面有好友李四)6. 張三回覆李四:我在想你呀首先我們來分析一下1、流程分析
1.張三使用帳號a,密碼b登入了qq2.顯示出張三最後的登入的時間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會員:#QQ會員:
#方法:
1.登入 ,
2.檢視訊息
3.傳送訊息
#QQ會員登入資料:
## 資訊 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會員和群組的關係表
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.phpmodel/UserLoginInfo.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; } } ?>登入後複製
<?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; } } ?>
建立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 "张三回复了李四,说“我在想你呀”"; ?>
運行結果如下:
以上是一個簡單QQ群聊案例程式碼解析(PHP實作)的詳細內容。更多資訊請關注PHP中文網其他相關文章!