ホームページ >バックエンド開発 >PHPチュートリアル >単純な QQ グループ チャット ケースのコード分析 (PHP 実装)
質問:
オブジェクト指向プログラミングを使用して、次のビジネス ロジックを実装します:
1. Zhang San は、アカウント a とパスワード b
2 を使用して qq にログインしました。表示 Zhang San の最終ログイン時刻を取得します
3. Zhang San は 1 時間以内に管理部門グループの情報を確認しました (このグループには Zhang San、Li Si、Wang Wu がいます。Zhang San はそのうちの 1 人です)
4. Zhang San の情報を出力します
5. 突然、Zhang San は友人 Li Si の情報を受け取りました: 情報というもの: Zhang San、私は Li Si です、何をしていますか? (Zhang San は友人 Li Si を含む友人グループを作成しました)
6. Zhang San は Li Si に次のように返信しました: 私はあなたのことを考えています
まず分析しましょう
1. プロセス分析
1. Zhang San はアカウント a とパスワード b を使用して qq にログインしました
2. Zhang San の最終ログイン時刻を表示します
3 Zhang San は 1 時間以内に管理部門グループの情報をチェックしました (このグループには Zhang San、Li Si、Wang Wu がおり、Zhang San がグループ リーダーです)
4. Zhang これらを出力しますSan が見たメッセージ
5. Li Si が Zhang San にメッセージを送信しました。メッセージは次のとおりです: Zhang San, I am Li Si, what do you do?
6. Zhang San は、 Li Si へのメッセージ、メッセージは次のとおりです: 私はあなたのことを考えています
#2. 機能分析:
##1. オブジェクトの特定QQ メンバー、QQ メンバーのログイン情報、QQ メンバーのメッセージ、QQ メンバー グループ、QQ メンバーとグループの関係 (1 対多)
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. グループを作成します (Zhang San は管理部門のグループを確認し、このグループが誰かが作成したはずです)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。メンバーには Zhang San、Li Si、Wang Wu が含まれます。彼らのアカウント パスワードは
管理部門グループと友人グループ
の 2 つのグループがあります。3. Zhang San は管理部門グループを作成しました。Zhang San、Li Si、および Wang Wu はすべてこのグループに属しています
4. Zhang San はまた、Li Si を含む友人グループも作成しました
次に、これらのデータをデータベースに入力します
##1。メンバーは Zhang San、Li Si、Wang Wu です。それぞれアカウント パスワード (qq_user) を持っています#2. 管理部門グループが 2 つあり、フレンド グループ (qq_group)
##3. Zhang San が管理部門グループ Zhang San, Li を作成しました4 番目に、Wang と Wu は両方ともグループに属しています
4。Zhang San も友人グループを作成しました。このグループには Li Si (qq_user_group_relation)が含まれています#管理グループにメッセージを含めるために、まずメッセージ テーブルにレコードを追加しようとします
2クラス、実装クラスの作成
分析によると、少なくとも 5 つのクラスを作成する必要がありますが、すべてのクラスはデータベース接続を必要とするため、データベース クラスを個別に作成できるため、6 つのクラスを作成する必要があります
管理を容易にするために、これらのクラスをモデル ディレクトリに配置します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 "张三回复了李四,说“我在想你呀”";
?>
の作成
実行結果は次のとおりです:
Zhang San はアカウント a とパスワード b を使用してログインしました
Zhang San の最終ログイン時間は 2020-06-01 12:40:20 でしたメッセージ テーブル データを追加しました 概要:1. 簡単な QQ メンバーについて説明しましたログインチャットシナリオログイン情報テーブルのデータが増加しました
Zhang San は 1 時間以内に管理部門グループの情報を確認しました。
Zhang San が見た情報は、
[送信者 ID]:3[内容]: Zhang San、私は王武です
李四は張三にメッセージを送り、「張三、私は李四です、何をしているのですか?」
張三が李四に返信しました。
#データベース内のテーブルの変更を見てみましょう
以上が単純な QQ グループ チャット ケースのコード分析 (PHP 実装)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。