Heim  >  Artikel  >  Backend-Entwicklung  >  Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

易达
易达Original
2020-06-01 12:48:283552Durchsuche

Frage:

Verwenden Sie objektorientierte Programmierung, um die folgende Geschäftslogik zu implementieren:

1. Zhang San hat sich mit Konto a und Passwort b bei qq angemeldet

2. Zeigen Sie den Zeitpunkt der letzten Anmeldung von Zhang San an

3. Zhang San hat die Informationen der Verwaltungsabteilungsgruppe innerhalb einer Stunde überprüft (in dieser Gruppe sind Zhang San, Li Si und Wang Wu, darunter Zhang San ist der Gruppenleiter)

4. Geben Sie die Informationen aus, die Zhang San gesehen hat

5. Plötzlich erhielt Zhang San eine Nachricht von seinem Freund Li Si: Die Nachricht war: Zhang San, ich bin Li Si, was machst du? (Zhang San hat eine Freundesgruppe mit Freund Li Si gegründet)

6. Zhang San antwortete Li Si: Ich denke an dich

Lass uns zuerst analysieren

1. Prozessanalyse

1. Zhang San hat sich mit Konto a und Passwort b angemeldet

2 Zeit

3. Zhang San überprüfte die Informationen der Verwaltungsabteilung innerhalb einer Stunde (in dieser Gruppe sind Zhang San, Li Si und Wang Wu, deren Gruppenleiter Zhang San ist)

4. Ausgabe Zhang Die Informationen, die San gesehen hat

5. Li Si hat eine Nachricht an Zhang San gesendet, die Nachricht war: Zhang San, ich bin Li Si, was machst du

6. Zhang San hat eine Nachricht an Li Si gesendet, die Nachricht lautet: Ich denke an dich

2. Funktionsanalyse:

1 das Objekt

QQ-Mitglieder, QQ-Mitglieds-Anmeldeinformationen, QQ-Mitgliedsnachrichten, QQ-Mitgliedsgruppen, die Beziehung zwischen QQ-Mitgliedern und Gruppen (eins-zu-viele)

2. Identifizieren Sie die Attribute des Objekts

QQ-Mitglied:

Attribute: ID, Name, Kontonummer, Passwort

Anmeldeinformationen für QQ-Mitglieder: (Ein Mitglied kann sich mehrmals anmelden und mehrere Anmeldedatensätze haben)

Attribute: ID, Mitglieds-ID, Anmeldezeit

QQ-Mitgliedsnachricht: Attribute: ID, Inhalt, Sendezeit, Absender, Empfänger, Status (gelesen, ungelesen), Anzeigezeit

QQ-Mitgliedsgruppe: Attribute: ID, erstelltes Mitglied, Gruppenname, Gruppenerstellungszeit

Beziehung zwischen QQ-Mitgliedern und Gruppen: (Diese Beziehung ist auch eine Klasse und kann auch viele Instanzen erzeugen)

Attribute: id, user_id, group_id, create_time

3. Methoden zur Identifizierung von Objekten

QQ-Mitglieder:

Methode:

1. Anmelden,

2. Nachrichten anzeigen

3. Nachrichten senden

Anmeldeinformationen für QQ-Mitglieder:

1. Anmeldeinformationen des Mitglieds speichern

2. Letzte Anmeldeinformationen des Benutzers abrufen

QQ-Mitgliedsnachricht:

Methode: Status ändern (kann sein geändert wie gelesen), Mitgliedernachrichten abrufen, Mitglieder hinzufügen Nachricht

QQ-Mitgliedsgruppe:

Methode: 1. Alle Gruppen abrufen 2. Gruppe erstellen (Zhang San überprüfte die Verwaltungsabteilungsgruppe, Dies zeigt an, dass diese Gruppe von jemandem erstellt worden sein muss.)

Die Beziehung zwischen QQ-Mitgliedern und Gruppen:

Methode: 1. Alle ihre Gruppen nach Mitglied anzeigen = Alle Gruppen abrufen Mitglied

2. Nach einer Gruppe können Sie diese Gruppe anzeigen. Alle Mitglieder in

3. Datenbankanalyse:

1.QQ-Mitglieder: Die Attribute entsprechen den Feldern in der Tabelle

2. QQ-Mitgliedsnachricht: Die Attribute entsprechen den Feldern in der Tabelle

3. QQ-Mitgliedsgruppe: Die Attribute entsprechen den Feldern in der Tabelle

4. Die Zwischentabelle zwischen QQ-Mitgliedern und -Gruppen: Da ein Mitglied mehreren Mitgliedergruppen angehören kann, besteht Bedarf für diese Tabelle

Felder: ID, Mitglieds-ID, Gruppe ID, Gruppenbeitrittszeit

5. Liste der Anmeldeinformationen für QQ-Mitglieder

Nach Abschluss der Analyse führen wir die spezifischen Vorgänge aus

1 Initialisieren Sie die Daten

Erstellen Sie die Datenbank so einfach wie möglich. Sie heißt qq

Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

Erstellen Sie die Tabelle qq_group Tabellenmitgliedergruppe

Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

Tabelle qq_msg-Nachrichtentabelle erstellen

Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

Tabelle qq_user-Mitgliedschaftstabelle erstellen

Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

Erstellen Sie die Tabelle „qq_user_group_relation“ für Mitglieder und Gruppenbeziehungen 🎜>

Initialisierungsdaten, was sind die Startdaten des Projekts?Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

1. Die Mitglieder sind Zhang San, Li Si und Wang Wu. Sie haben ein eigenes Konto und ein eigenes Passwort bzw.

Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung) 2. Es gibt 2 Gruppen, Verwaltungsabteilungsgruppe und Freundesgruppe

3. Zhang San hat eine Verwaltungsabteilungsgruppe erstellt, und Zhang San, Li Si und Wang Wu sind alle in dieser Gruppe

4 Zhang San hat auch eine Freundesgruppe erstellt, zu der auch Li Si gehört

Als nächstes tragen wir diese Daten in die Datenbank ein

1. Die Mitglieder sind Zhang San, Li Si und Wang Wu. Sie haben jeweils Kontopasswörter (qq_user)

1Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

2. Es gibt 2 Verwaltungsabteilungsgruppen, Freundesgruppe (qq_group)

2Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

3. Zhang San hat eine Verwaltungsabteilungsgruppe erstellt, Zhang San, Li 4 . Wang und Wu sind alle in dieser Gruppe

4. Zhang San hat auch eine Freundesgruppe erstellt, zu der auch Li Si (qq_user_group_relation)

3Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

gehört

Um Nachrichten in der Verwaltungsgruppe zu haben, versuchen wir zunächst, einen Datensatz in der Nachrichtentabelle hinzuzufügen

4Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

2. Klasse erstellen, Implementierungsklasse

Laut Analyse sollten wir mindestens 5 Klassen erstellen, aber alle Klassen erfordern eine Datenbankverbindung, sodass wir eine Datenbankklasse separat erstellen können, sodass 6 Klassen erstellt werden müssen

Um die Verwaltung zu erleichtern, legen wir diese Klassen im Modellverzeichnis

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"=>&#39;mysql&#39;,
           "hostname"=>"127.0.0.1",
           "database"=>"qq",
           "username"=>"root",
           "password"=>"root"
       );
       $this->link = mysqli_connect($config[&#39;hostname&#39;],$config[&#39;username&#39;],
        $config[&#39;password&#39;],$config[&#39;database&#39;]);
       
    }
}
?>

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=&#39;&#39;){
        //创建连接
        $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 (&#39;{$content}&#39;,".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(&#39;Y-m-d H:i:s&#39;,$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,&#39;&#39;,$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. Schreibprozess

Index.php erstellen


<?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[&#39;login_time&#39;]);

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 "张三回复了李四,说“我在想你呀”";
?>

Die laufenden Ergebnisse sind wie folgt:

Zhang San hat sich mit Konto a und Passwort b angemeldet


Zhang Sans letzte Anmeldezeit war 2020-06-01 12:40:20

Zhang San überprüfte die Informationen der Verwaltungsabteilung innerhalb einer Stunde

Die Informationen, die Zhang San sah, waren

[Absender-ID]: 3[Inhalt]: Zhang San, Ich bin Wang Wu


Li Si schickte eine Nachricht an Zhang San und sagte: „Zhang San, ich bin Li Si, was machst du?“

Zhang San antwortete Li Si: sagen: „Ich denke an dich“

Werfen wir einen Blick auf die Änderungen in den Tabellen in der Datenbank

Die Daten der Anmeldeinformationstabelle haben zugenommen

222Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

Die Nachrichtentabellendaten wurden erhöht

111Code-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung)

Zusammenfassung:


1. Erklärt eine einfache QQ-Mitgliederanmeldung Chat-Szenario

Das obige ist der detaillierte Inhalt vonCode-Analyse eines einfachen QQ-Gruppen-Chat-Falls (PHP-Implementierung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn