问题:

使用面向对象编程的方式实现以下业务逻辑:

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 登录了
";

//输出最后登录时间

$logininfoModel = new UserLoginInfo();

//获取最后登录信息

$lastLoginInfo = $logininfoModel->getLastLoginInfo($zhangsan->id);

$lastLoginTime = date("Y-m-d H:i:s",$lastLoginInfo['login_time']);

echo $zhangsan->name."最后登录时间为".$lastLoginTime."
";

// 2.张三查看了 1个小时内的行政部门群的信息(这个群里有张三,李四,王五,其中张三是群主)

$startTime= strtotime("-1 hour");

$endTime = time();

$msglist = $zhangsan->getMessage($startTime,$endTime,1);//查看行为

echo "张三查看了 1小时内的行政部门群的信息
";

echo "张三看到的信息是
";

//3.输出张三看到的这些信息

// print_r($msglist);

foreach( $msglist as $msg ){

echo "【发送人id】:".$msg["send_user_id"]."【内容】:".$msg["content"]."
";

}

echo "
";

//4.突然张三收到好友李四的信息:信息叫:张三,你在干嘛

//相当于是李四给张三发送了消息

$lisi = new User(2,"李四","lisi","123456");

$lisi->sendMessage("张三,我是李四,你在干嘛",$zhangsan->id,2);

echo "李四发了信息给张三,说“张三,我是李四,你在干嘛”
";

//5.张三回复李四:我在想你呀

$zhangsan->sendMessage("我在想你呀",$lisi->id,2);

echo "张三回复了李四,说“我在想你呀”";

?>

运行结果如下:张三使用账号a和密码b 登录了

张三最后登录时间为2020-06-01 12:40:20

张三查看了 1小时内的行政部门群的信息

张三看到的信息是

【发送人id】:3【内容】:张三,我是王五

李四发了信息给张三,说“张三,我是李四,你在干嘛”

张三回复了李四,说“我在想你呀”

我们再来看数据库里的表有哪些变化

登录信息表数据增加了

消息表数据增加了

总结:

1、讲解了一个简单的qq会员登录聊天的场景

php 跳转qq群代码_一个简单QQ群聊案例代码解析(PHP实现)相关推荐

  1. python简单小游戏代码_一个简单的python小游戏---七彩同心圆

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...

  2. socket通信 _ 一个简单的群聊系统

    群聊系统要用到通信socket协议,在java中要用到两个类java.net.ServerSocket和 Java.net.Socket.ServerSocket用于创建服务器,而Socket用于创建 ...

  3. 一段简单的python代码_一个简单的python写的C/S程序

    前段时间闲来无聊,打算学习下python,看了半个月的书,貌似啥都没学会.有个朋友让说,让我帮他写个批量管理linux服务器的程序,我一想就用python来写吧,于是看了下书,然后修修改改,一个soc ...

  4. mcem r语言代码_一个简单文本分类任务-EM算法-R语言

    一.问题介绍 概率分布模型中,有时只含有可观测变量,如单硬币投掷模型,对于每个测试样例,硬币最终是正面还是反面是可以观测的.而有时还含有不可观测变量,如三硬币投掷模型.问题这样描述,首先投掷硬币A,如 ...

  5. 入门攻略丨教你用低代码实现一个简单的页面跳转功能

    一.介绍 HUAWEI DevEco Studio(后文简称:IDE)自2020年9月首次发布以来,经10次迭代升级,不断为HarmonyOS应用开发增强能力.3月31日,IDE再度升级到DevEco ...

  6. linux实验:基于mykernel的一个简单的时间片轮转多道程序内核代码分析

    学号后三位:288 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 1.mykernel mykernel是由中科大孟宁老师建立的用于开发 ...

  7. android仿qq强制下线服务器,qq强制下线(实现一个类似QQ的强制下线功能)

    qq强制下线(实现一个类似QQ的强制下线功能),哪吒游戏网给大家带来详细的qq强制下线(实现一个类似QQ的强制下线功能)介绍,大家可以阅读一下,希望这篇qq强制下线(实现一个类似QQ的强制下线功能)可 ...

  8. 一个简单的录音软件程序代码【C++】

    一个简单的录音软件程序代码[C++]今天的院内绿草茵茵的 录音软件,岁月一去不回返,顽强拼搏,我将来的录音软件家是一栋三层的别墅,因为小树给我留下的是顽强拼搏,你见状,可你的眼睛好像在说,那盛夏的梧桐 ...

  9. 用opengl编写一个简单的画图软件示例代码

    //用opengl编写一个简单的画图软件示例代码(存在闪烁问题) //本代码,抄写自一本教授opengl的书,可惜,里面的代码存在一些问题,导致不能正常显示,现在是增加了一些语句的代码 #includ ...

最新文章

  1. c++ - Create empty json array with jsoncpp - Stack Overflow
  2. call_once/once_flag
  3. vue - blog开发学习2
  4. scrapy框架之递归解析和post请求
  5. comparator 字符串比较大小_java – 如何使用Comparator比较空值?
  6. 织梦dedecms内核自适应移动POS机刷卡机招商加盟企业网站源码
  7. linux中断机制--理解中断上半部/下半部、软中断、tasklet、工作队列(可调度、可睡眠)
  8. wordpress主页php,wordpress主页在哪里设置
  9. 能发出调子的c语言程序,求关于单片机的电子琴C程序
  10. matplotlib 可视化 —— matplotlib.patches
  11. linux函数删除某文件,Linux环境下用C++删除指定文件
  12. svn修改ip windows_svn服务地址怎么更换成ip - 卡饭网
  13. ffmpeg-linux录音录像
  14. Echarts柱状图,实现不同系列,柱体之间的部分重叠效果
  15. “Parallels Desktop” 已损坏,无法打开。您应该推出磁盘映像。处理办法
  16. 音标课件软件测试,宝宝益智英语字母音标(测试版)
  17. Google Translate API
  18. keil的debug使用
  19. 洛谷 P2327 [SCOI2005]扫雷
  20. java object数组转list_java 如何将ListObject[]转换成List实体?

热门文章

  1. 【网页设计】期末大作业:化妆品主题——绿色大气的html5响应式化妆品护肤品肌肤网页设计(11页)...
  2. 概率论与数理统计 浙江大学 第38-43讲单元测验
  3. 如何查看自己安装的MySQL版本?
  4. charles+SwitchyOmega抓取https网站
  5. Linux安装Mysql8.0.23
  6. 【分享】windows通信端口初始化失败
  7. 520拿去表白,表白不成功你打我(Matlab代码动态图)
  8. mMySQL中触发器和游标的介绍与使用L8.0.23免安装版配置详细教程 msi安装超详细教程
  9. 【KBOX】渗透测试学前知识
  10. 少儿计算机兴趣小组活动记录,舞蹈兴趣小组的相关活动记录