>  기사  >  백엔드 개발  >  간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)

간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)

易达
易达원래의
2020-06-01 12:48:283581검색

질문:

객체 지향 프로그래밍을 사용하여 다음 비즈니스 로직을 구현하세요.

1. Zhang San은 계정 a와 비밀번호 b를 사용하여 qq에 로그인했습니다.

2 Zhang San의 마지막 로그인 시간이 표시됩니다

3. San 1시간 이내에 행정 부서 그룹의 정보를 확인했습니다. (이 그룹에는 Zhang San, Li Si, Wang Wu가 있으며 그 중 Zhang San이 그룹 리더입니다.)

4 Zhang San이 본 정보를 출력합니다

5 갑자기 Zhang San은 친구 Li Si로부터 메시지를 받았습니다. 메시지는 다음과 같습니다: Zhang San, 나는 Li Si입니다. 지금 뭐하고 있나요 (Zhang San은 친구 Li Si와 함께 친구 그룹을 만들었습니다)

6.  Zhang San이 대답했습니다. 리시에게: 보고 싶었어요

먼저 분석해 보겠습니다

1. 프로세스 분석

1. 장삼은 계정 a와 비밀번호 b

2로 QQ에 로그인했습니다. .Zhang San은 1시간 이내에 행정 부서 그룹의 정보를 확인했습니다. (이 그룹에는 Zhang San, Li Si 및 Wang Wu가 있으며 그 중 Zhang San이 그룹 리더입니다.)

4 Zhang San이 본 정보를 출력합니다

5. Li Si가 Zhang San에게 메시지를 보냈습니다. 메시지 내용은 다음과 같습니다: Zhang San, 저는 Li Si입니다. 뭐하고 있나요?

6. Zhang San이 Li Si에게 메시지를 보냈습니다. 메시지는 다음과 같습니다: 나는 당신을 생각하고 있습니다

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. 멤버를 기준으로 그녀의 모든 그룹 보기 = 모든 그룹 가져오기 of the member

2. 그룹에 따라 이 그룹의 모든 구성원을 볼 수 있습니다

3. 데이터베이스 분석:

1. QQ 구성원: 속성은 테이블의 필드에 해당합니다

2. QQ 멤버 메시지: 속성은 테이블 필드

3에 해당합니다. QQ 멤버 그룹: 테이블의 필드에 해당합니다

4. QQ 멤버 및 그룹의 중간 테이블: 한 멤버가 여러 멤버에 속할 수 있기 때문입니다. 그룹, 이 테이블이 필요합니다

필드: id, 회원 ID, 그룹 ID, 그룹 가입 시간

5. QQ 회원 로그인 정보 목록

분석이 완료되면 구체적인 작업을 해보자

1 . 데이터베이스 생성, 데이터 초기화

데이터베이스 생성, 이름 최대한 이해하기 쉽게 qq라고 부르세요

간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현) 테이블 생성 qq_group 테이블 멤버 그룹

간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현) 테이블 생성 qq_msg 메시지 테이블

간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현) 테이블 생성 qq_user 회원 테이블

간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현) 테이블 생성 qq_user_group_relation 회원과 그룹 간의 관계 테이블

간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)테이블 생성 qq_user_login_record 회원 로그인 정보 기록 테이블

간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)

초기화 데이터란 무엇인가요? 프로젝트 시작 데이터

1. 구성원은 Zhang San, Li Si, Wang Wu이며 각각 계정과 비밀번호를 가지고 있습니다


2. 관리 부서 그룹과 친구 그룹 2개 그룹이 있습니다.

3. Zhang San은 행정 부서 그룹을 생성했습니다.

4. Zhang San은 Li Si를 포함하는 친구 그룹도 생성했습니다. . 데이터베이스를 입력하세요

1. 멤버는 각각 계정 비밀번호(qq_user)를 가지고 있습니다

1간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)2.

2간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)3. Zhang San은 행정 부서 그룹을 만들었습니다. Zhang San, Li Si, Wang Wu는 모두 이 그룹에 있습니다

4. Zhang San도 Li Si(qq_user_group_relation)를 포함하는 친구 그룹을 만들었습니다.

관리 그룹에 메시지를 넣기 위해 먼저 메시지 테이블에 레코드를 추가하려고 합니다3간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)

4간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)2. 클래스 생성 및 구현

분석에 따르면, 최소 5개 이상의 클래스를 생성하지만 모든 클래스는 데이터베이스 연결이 필요하므로 별도로 데이터베이스 클래스를 생성할 수 있으므로 6개의 클래스를 생성해야 합니다관리를 용이하게 하기 위해 이러한 클래스를 모델 디렉터리에 넣습니다

모델/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. 작성 과정

Create 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[&#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 "张三回复了李四,说“我在想你呀”";
?>
실행 결과는 다음과 같습니다.

Zhang San은 계정 a와 비밀번호 b를 사용하여 로그인했습니다

장산의 마지막 로그인 시간은 2020-06-01 12:40:20

장산이 1시간 이내에 행정 부서 그룹의 정보를 확인했습니다

장삼이 본 정보는

[발신자 ID]:3[내용 ]: 장산, 저는 왕우입니다


리시가 장삼에게 메시지를 보냈습니다. "장산, 저는 리시입니다. 뭐하세요?"

장삼은 리시에게 답장을 보내 "생각하고 있어요." of you"


다시 확인하겠습니다. 데이터베이스의 테이블에 어떤 변경이 있었는지

로그인 정보 테이블 데이터가 증가했습니다

메시지 테이블 데이터가 증가했습니다

222간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)

요약:

111간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)

1.간단한 QQ 회원 로그인 채팅 시나리오를 설명했습니다

위 내용은 간단한 QQ 그룹 채팅 사례의 코드 분석(PHP 구현)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.