本文由PHP中文网认证作者:为了“本月”投稿,欢迎加入PHP中文网有偿投稿计划!
问:
使用面向对象编程实现以下业务逻辑:
1.张三使用账户a,密码b登录QQ
2.显示张三上次登录的时间
3.张三在一小时内查看了行政部门的信息。(这群人中有张三、李四、王五,其中张三是君主。)
4.输出张三看到的这个信息
5.突然,张三收到了朋友董事的信息。信息是张三,我是董事。你在做什么?张三创建了朋友集团,其中有朋友董事。)
6.张三丽莎:我在想你。
我先分析一下。
1、流程分析。
1.张三使用账户a,密码b登录QQ
2.显示张三上次登录的时间
3.张三在一小时内查看了行政部门集团的信息。(这群人中有张三、李四、王五,其中张三是君主。)
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成员表
om=ar;x-expires=1705766796&x-signature=bytkqw4pDJurymAhIGroXid3v9U%3D&index=3" width="640" height="271"/>创建表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
<?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
<?php
require_once "MySql.cla;;
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 "创建了群";
}
}
?>
Me
<?php
require_once dirname(__FILE__)."/MySql.cla;;
// 会员消息类
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
<?php
//引入UserLoginInfo
require_once "MySql.cla;;
require_once "UserLoginInfo.cla;;
require_once "Message.cla;;
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
<?php
require_once "Mysql.cla;;
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
<?php
require_once "Mysql.cla;;
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.cla;;
require_once "model/User.cla;;
require_once "model/UserGroupRelation.cla;;
require_once "model/UserLoginInfo.cla;;
//张三登录
$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 "张三回复了李四,说“我在想你呀”";
?>
运行结果如下:
张三使用账号a和密码b 登录了张三最后登录时间为2020-06-01 12:40:20张三查看了 1小时内的行政部门群的信息张三看到的信息是【发送人id】:3【内容】:张三,我是王五李四发了信息给张三,说“张三,我是李四,你在干嘛”张三回复了李四,说“我在想你呀”
我们再来看数据库里的表有哪些变化
登录信息表数据增加了
消息表数据增加了
总结:
1、讲解了一个简单的qq会员登录聊天的场景