【原】PHP从入门到精通2小时【图文并茂】
原创内容,转载请注明。
主要内容:
- 搭建PHP开发环境
- 第一个helloworld程序
- 变量
- 全局变量
- 循环结构
- 函数
- 数组
- 面向对象编程
- 继承
- 接口
- 多态
- 日志
- 文件的读写
- 时间格式和时区
- 创建图形
- 从远程获取图形
- 生成二维码
- php与数据库mysql的连接
- mysql数据库面向对象编程
- cookie技术
- 查看cookie
- session技术
- 查看session
- 文件上传
PHP(Hypertext Preprocessor)PHP超文本预处理程序,是一种嵌入HTML的脚本语言,运行在服务器。
如果有一定的编程基础,1小时之内看完so easy!
搭建PHP开发环境
PHP开发环境主要3部分:服务器Apache,编程语言PHP,数据库MySQL。搭建开发环境,直接使用XAMPP集成安装就可以。
XAMPP=Apache+MySQL+PHP+Perl,X表示的是跨平台。
官网下载安装即可:https://www.apachefriends.org/zh_cn/index.html
( 安装太简单了,没有什么可说的,不过如果以前安装过tomcat,apache,MySQL等,xampp的部分功能可能不能使用,解决办法网上很多,不再赘言)
第一个helloworld程序
php可以使用note++进行编辑。
helloworld.php
1 2 3 | <?php echo "hello world!" ; ?> |
然后运行XAMPP的控制面板,点击Apache的start,绿色就是正常运行了。
然后将helloworld.php文件放在路径:C:\xampp\htdocs
浏览器输入:http://localhost/helloworld.php
ok,我们的第一个PHP程序就完成了。
ps:以后我们将php文件放在一个单独的文件夹basic中,便于管理
变量
变量,存储数据的容器,在php中,使用$(美元符号)开头的就是变量,可以给变量赋值,或者输出变量的值。
另外,php语句以;(英文状态半角的分号)结束。
1 2 3 4 5 6 7 8 | <?php //$定义变量 $text= 'this is a text' ; //输出变量 echo $text; ?> |
全局变量
全局变量就是在所有的php文件范围内都可以使用的变量(变量的概念,存储数据的容器)
最常用的全局变量有$_GLOBAL,$_SERVER,$COOKIE,$_SESSION,__FILE__(注意是2个下划线),__LINE__
php文件是嵌入到html、的一种语言,运行在服务器端,可以和html语言混合书写。
这里的.(点号)表示拼接字符串,echo可以输出字符串。
global.php
1 2 3 4 5 6 7 8 9 10 11 | <?php echo '当前执行脚本文件名:' .$_SERVER[ 'PHP_SELF' ]. '<br/>' ; echo '当前执行脚本根目录:' .$_SERVER[ 'DOCUMENT_ROOT' ]. '<br/>' ; //单行注释 echo '当前执行脚本绝对路径:' .$_SERVER[ 'SCRIPT_FILENAME' ]. '<br/>' ; //print_r($_SERVER); //返回当前文件名,行号 echo '当前文件名称:<strong>' .__FILE__. '</strong><br/>' ; echo '当前行号:<strong>' .__LINE__. '</strong><br/>' ; ?> |
打开浏览器,输入:http://localhost/basic/global.php
循环结构
循环主要就是for循环,和while循环,可以重复执行某一个动作,直到满足条件
for(初始化计数值; 满足条件就继续执行 ; 执行后的操作,将计数值+1){ 执行的代码; }
while( 满足条件就继续执行){ 执行的代码; 将计数值+1 ; }
for_while.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php //for循环 for ($i=0;$i<10;$i++){ echo 'good! ' ; } echo '<br/>' ; //while循环 $j=0; while ($j<5){ echo 'do... ' ; $j++; } ?> |
打开浏览器,输入:http://localhost/basic/for_while.php
函数
这是任何一种语言的重点,包括php
func.php
1 2 3 4 5 6 7 8 9 10 | <?php sum(1,3); //定义求和函数,带2个参数 function sum($a,$b){ echo "$a+$b=" .($a+$b); //双引号会输出变量,单引号输出字符串 echo '<br/>' ; echo '$a+$b=' .($a+$b); } ?> |
1 | ?> |
打开浏览器,输入:http://localhost/basic/func.php
数组
数组分为索引数组,关联数组,使用print_r(数组)来输出数组内容
var_dump(数组)查看详细信息
可以使用foreach(数组 as 键 = > 值){ } 来循环输出数组
array.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php //索引数组 $arr=array( '小李' , '25' , '男' , '开发工程师' ); print_r($arr); //Array ( [0] => 小李 [1] => 25 [2] => 男 [3] => 开发工程师 ) //关联数组 $array=array( '姓名' => '小明' , '年龄' => '25' , '性别' => '男' , '职业' => '开发工程师' ); print_r($array); //Array ( [姓名] => 小明 [年龄] => 25 [性别] => 男 [职业] => 开发工程师 ) echo '<br/>' ; //输出详细信息 var_dump($arr); /*array(4) { [0]=> string(6) "小李" [1]=> string(2) "25" [2]=> string(3) "男" [3]=> string(15) "开发工程师" }*/ echo '<br/>' ; //循环输出数组 foreach ($array as $k=>$v){ echo "键值对:$k --> $v" . '<br/>' ; } /** 键值对:姓名 --> 小明 键值对:年龄 --> 25 键值对:性别 --> 男 键值对:职业 --> 开发工程师 */ ?> |
以下内容就是编程技术的分水岭,面向对象编程
面向对象编程
在面向对象编程的思想中,有最重要的2句话:
- 类用来封装代码
- 对象用来封装数据
首先来学习怎么样定义一个类:
类名前+class,类中有public的属性,如$name,$sex,$age,还有public的方法say()
在类中,只要new一个对象,就自动会执行__construct构造方法
一个类被销毁,或者程序执行完毕,自动执行__destruct()解构方法
类的属性和方法,通过对象->指针符号调用
$this 表示当前对象。
classMehtod.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?php //定义一个类 class ren{ public $name; public $sex; public $age; //成员方法 public function say(){ echo '我的名字是' .$ this ->name. ',性别是' .$ this ->sex. ',' .$ this ->age. '岁了<br/>' ; } //构造方法,只要new 就会执行 function __construct($name,$sex,$age){ $ this ->name=$name; $ this ->sex=$sex; $ this ->age=$age; echo '构造对象' .$ this ->name. '<br/>' ; } //解构方法,程序结束,对象销毁时执行 function __destruct(){ echo '解构对象' .$ this ->name. '<br/>' ; } } //实例化对象 $xiaoli= new ren( '小李' , '男' , '25' ); $xiaoli->say(); /*输出: 构造对象小李 我的名字是小李,性别是男,25岁了 解构对象小李 */ ?> |
继承
面向对象编程思想中,有3个核心概念:
- 封装
- 继承
- 多态
封装其实就是类,定义类就是将代码封装起来了。
其次就是继承!
继承的关键字:extends
$this 表示当前对象。
一个B类继承另外一个类A,B会自动拥有A的所有的属性和方法,而不用再书写一遍(继承的思想,程序员懒惰的直接体现,要是程序员也有一个有钱的爹可以继承财富该多好。。。)
inherit.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php //申明tool类 class tool{ function on (){ echo '<br/>启动<br/>' ; } function run(){ echo '<br/>运行<br/>' ; } function off(){ echo '<br/>关闭<br/>' ; } } //继承inherit class fan extends tool{ function app(){ $ this -> on (); $ this ->run(); $ this ->off(); } } //简化使用 $haierFan= new fan(); $haierFan->app(); ?> |
接口
接口是一种更加高级的继承方法
定义接口的关键字:interface
实现(继承)接口的关键字:implements
接口中的所有的方法都是默认public的,而且只要定义,不用实现(在实现类中实现具体方法)
interface.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php //申明接口 interface tool{ function on (); function run(); function off(); } //实现接口 class fan implements tool{ public $name; function on (){ echo '<br/>' .$ this ->name. '风扇启动<br/>' ; } function run(){ echo '<br/>' .$ this ->name. '风扇运行<br/>' ; } function off(){ echo '<br/>' .$ this ->name. '风扇关闭<br/>' ; } function __construct($name){ $ this ->name=$name; } } //继承inherit class haierfan extends fan{ function app(){ $ this -> on (); $ this ->run(); $ this ->off(); } } //实例化 $fan= new fan( '美的 ' ); $fan-> on (); $fan->run(); $fan->off(); echo '<br/> ------------分割线------------ <br/>' ; //实例化 $haierfan= new haierfan( '海尔 ' ); $haierfan->app(); ?> |
多态
作为面向对象编程的3大思想之一,多态也是一种高级技能
多态一般都是通过接口来实现的
就是调用同一个方法,执行得到的结果却不同!!!
通过输入参数的不同,执行结果不同,这就是多态
polymorphism.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <?php //申明接口 interface tool{ function on (); function run(); function off(); } //实现接口 class fan implements tool{ public $name; function on (){ echo '<br/>' .$ this ->name. '风扇启动<br/>' ; } function run(){ echo '<br/>' .$ this ->name. '风扇运行<br/>' ; } function off(){ echo '<br/>' .$ this ->name. '风扇关闭<br/>' ; } function __construct($name){ $ this ->name=$name; } } //实现接口 class engine implements tool{ public $name; function on (){ echo '<br/>' .$ this ->name. '发动机启动<br/>' ; } function run(){ echo '<br/>' .$ this ->name. '发动机运行<br/>' ; } function off(){ echo '<br/>' .$ this ->name. '发动机关闭<br/>' ; } function __construct($name){ $ this ->name=$name; } } //状态类 class toolStatus{ function ts($tool){ $tool-> on (); $tool->run(); $tool->off(); } } //应用多态polymorphism $fan= new fan( '海尔 ' ); $engine= new engine( '奥迪 ' ); $toolStatus= new toolStatus(); $toolStatus->ts($fan); $toolStatus->ts($engine); ?> |
这又是一条牛逼的分割线,php基本功能就是以上的内容,下面是一些更加高阶玩法。
日志
log.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?php /* 1、设置php.ini文件 2、日志分类 3、查看日志 */ //生成运行日志 error_log( "FORM " .__FILE__. " ERROR LINE:" .__LINE__); /*需要设置正确的日志路径,确保路径存在 [15-Sep-2018 09:31:45 Europe/Berlin] 这是来自C:/xampp/htdocs/basic/log.php 的一段自定义的报错日志信息 */ //生成系统日志 openlog( 'PHP7' ,LOG_PID,LOG_USER); syslog(LOG_WARNING, '向syslog发送自定义信息' ); closelog(); try { $a=10; if (isset($b)){ echo "程序正常执行" ; } else { throw new Exception(); } } catch (Exception $e){ ERROR_LOG( "错误代码所在路径:" .$e->getFile()); ERROR_LOG( "错误代码所在行号:" .$e->getLine()); } echo "<br/>程序执行完毕<br/>" ; /* [15-Sep-2018 09:44:41 Europe/Berlin] 错误代码所在路径:C:\xampp\htdocs\basic\log.php [15-Sep-2018 09:44:41 Europe/Berlin] 错误代码所在行号:26 */ //输出日志 依赖于文件的读写操作,后续将会学习 ?> |
查看运行日志
查看系统日志
显示乱码主要是编码字符集的问题,将log.php文件保存为ANSI格式即可看到中文正常显示,解决方法网上很多。
文件的读写
fileIO.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php //读取文件 //readfile('./test.txt'); //访问远程文件,需要设置php.ini的 allow_fopen=On $html=file_get_contents( 'http://www.baidu.com' ); //输出html页面 //echo $html; //设置时区 //可以在文件开头位置设置默认配置的时区,也可以在php.ini中进行设置 ini_set( 'date.timezone' , 'Asia/Shanghai' ); //date_default_timezone_set('asia/shanghai'); //向文件中写入内容 /* 1、打开文件 2、写入数据 3、关闭文件 */ //$file=fopen('./test.txt','a+');//追加模式 //$file=fopen('./test.txt','r+');//半覆盖(数据多少覆盖多少) $file=fopen( './test.txt' , 'w+' ); //全覆盖 if ($file){ fwrite($file, '写数据123!\r\n换行了吗?\r\n' ); //单引号不会换行 fwrite($file, "写数据123!\r\n换行了吗?\r\n" ); //双引号换行 echo date( "Y-m-d H:i:s" ). '写入数据成功' .date( "Ymd His" ); fclose($file); } ?> |
时间格式和时区
time.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php //设置时区 echo '<br/>默认时区时间:' .date( "Y-m-d H:i:s" ). '<br/>' ; //可以在文件开头位置设置默认配置的时区 //也可以在php.ini中进行设置date.timezone(所有文件生效) ini_set( 'date.timezone' , 'Asia/Shanghai' ); echo '<br/>上海时区时间:' .date( "Y-m-d H:i:s" ). '<br/>' ; //或者直接设置时间格式 date_default_timezone_set( 'asia/tokyo' ); echo '<br/>东京时区时间:' .date( "Y-m-d H:i:s" ). '<br/>' ; echo '<br/>格式化时间:' .date( "YmdHis" ). '<br/>' ; /* 默认时区时间:2018-09-15 10:44:03 上海时区时间:2018-09-15 16:44:03 东京时区时间:2018-09-15 17:44:03 格式化时间:20180915174403 */ ?> |
创建图形
image.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php //创建画布 $img=imagecreate(500,500); //设置颜色 //背景色 $white=imagecolorallocate($img,255,255,255); //画笔 $black=imagecolorallocate($img,0,0,0); //矩形 imagerectangle($img,100,100,300,300,$black); //输出图像前清理输出缓冲 ob_clean(); //解决chrome兼容性问题 header( "Content-type:image/jpeg" ); //输出图像到浏览器 imagejpeg($img) or die( "创建图像失败<br/>" ); //释放资源 imagedestroy($img); ?> |
从远程获取图形
imageUrl.php
1 2 3 4 5 6 7 8 9 | <?php $img=imagecreatefromjpeg( 'https://b-ssl.duitang.com/uploads/item/201607/04/20160704052649_WLyfB.jpeg' ); ob_clean(); header( 'Content-type:image/jpeg' ); imagejpeg($img) or die( '创建图形失败' ); imagedestroy($img); ?> |
生成二维码
vcode.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php vcode(150,100); //生成验证码 function vcode($width,$high){ //创建画布 $img=imagecreate($width,$high); //设置背景色 黑色 $black=imagecolorallocate($img,0,0,0); //设置画笔 白色 $white=imagecolorallocate($img,255,255,255); //产生随机干扰线条 for ($i=0;$i<$width/20;$i++){ imageline($img,rand(0,$width),rand(0,$high),rand(0,$width),rand(0,$high),$white); } //产生随机干扰点 for ($i=0;$i<$width;$i++){ imagesetpixel($img,rand(0,$width),rand(0,$high),$white); } //产生4个随机字母,数字 $data= '' ; for ($i=0;$i<4;$i++){ switch (rand(1,3)){ case '1' :$ch=rand(0,9); break ; case '2' :$ch=sprintf( '%c' ,rand(65,90)); break ; case '3' :$ch=sprintf( '%c' ,rand(97,122)); break ; } $data=$data.$ch; } //绘制truetype文字 imagettftext($img,$high/3,rand(1,15),$width*0.1,$high*0.7,$white, 'C:/Windows/Fonts/Arial.ttf' ,$data); //清理缓存 ob_clean(); //解决chrome兼容性问题 header( 'Content-type:image/jpeg' ); //输出到浏览器 imagejpeg($img) or die( '创建画布失败' ); imagedestroy($img); } ?> |
php与数据库mysql的连接
mysql.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php //连接数据库 $host= 'localhost' ; $username= 'root' ; $password= '' ; $database= 'my_db' ; $conn=mysqli_connect($host,$username,$password,$database) or die( '数据库连接失败!' ); //echo '数据库连接成功!'; //操作数据库 $sql= 'select * from cartoon' ; $result=mysqli_query($conn,$sql); //读取返回信息 while ($obj=mysqli_fetch_assoc($result)){ echo $obj[ 'name' ]. '现在' .$obj[ 'age' ]. '岁了。<br/>' ; } //关闭数据库连接 mysqli_close($conn); ?> |
MySQL数据库面向对象编程
mysql_obj.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php // 创建连接 $conn = new mysqli( 'localhost' , 'root' , '' , 'my_db' )or die( "连接失败: " . $conn->connect_error); if ($conn){ echo "数据库连接<br/>" ; } //操作数据库 $sql = "SELECT * FROM cartoon;" ; $result=$conn->query($sql); while ($row=$result->fetch_assoc()){ echo "name:" .$row[ 'name' ]. "-country:" .$row[ 'country' ]. "<br/>" ; } /* name:校长-country:中国 name:西门庆-country:中国 name:武大郎-country:中国 name:武松-country:中国 */ //关闭连接 //$conn->close(); //$conn2=new mysqli('localhost','root','','my_db') or die('连接失败:'.$conn2->connect_error); $sql2= "SELECT * FROM cartoon;" ; //sql语句一定要用双引号!!! $result2=$conn->query($sql2); //print_r($conn2->query($sql2)); while ($row2=$result2->fetch_assoc()){ echo 'name:' .$row2[ 'name' ]. ',sex:' .$row2[ 'sex' ]. '<br/>' ; } $conn->close(); echo "数据库关闭<br/>" ; ?> |
cookie技术
cookie.php
cookie可以用于页面之间传值,没有设置有效时间,那么默认为浏览器关闭失效
这就是会话cookie,保存在内存中
(关闭页面不会失效,关闭浏览器才会失效)
cookie.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?php //访问时间 echo '访问时间<br/>' ; if (isset($_COOKIE[ 'visittime' ])){ echo '您上一次访问本网站是在:' .$_COOKIE[ 'visittime' ]. '<br/>' ; echo '本次访问时间是:' .date( 'Y-m-d H:i:s' ). '<br/>' ; setcookie( 'visittime' ,date( 'Y-m-d H:i:s' )); } else { setcookie( 'visittime' ,date( 'Y-m-d H:i:s' )); echo '这是您第一次访问本网站<br/>' ; } //访问次数 echo '访问次数<br/>' ; if (isset($_COOKIE[ 'num' ])){ setcookie( 'num' ,$_COOKIE[ 'num' ]+1); echo '这是您第' .$_COOKIE[ 'num' ]. '次访问本网站<br/>' ; } else { setcookie( 'num' ,1+1); echo '欢迎您首次访问本网站<br/>' ; } /* 访问时间 您上一次访问本网站是在:2018-09-16 05:09:22 本次访问时间是:2018-09-16 05:09:32 访问次数 这是您第2次访问本网站 */ //删除cookie,有效时候为过去时间即可,time()-1 setcookie( 'num' ,1,time()-1); echo '$_COOKIE[num]已被注销<br/>' ; print_r($_COOKIE); //再一次刷新页面时才会生效!!! ?> |
查看cookie
testcookie.php
1 2 3 4 5 6 7 8 | <?php //创建cookie $sta=setcookie( 'testcookiename' , 'testvalue' ,time()+60*60); if ($sta){ echo 'Cookie设置成功!' ; } ?> |
chrome浏览器查看cookie
打开浏览器的设置》高级设置》
隐私设置/内容设置》所有cookie和网站数据
》找到你的网站名,以及cookie的名字,点击打开即可看到保存到cookie的内容。
session技术
session存储在服务器,更安全,没有长度限制
而cookie存储在客户机,客户可以禁用cookie
session可以用于跨页面请求,有一个随机生成的唯一的session_id
典型的应用就是购物车
session.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php /* session技术 session存储在服务器,更安全,没有长度限制 而cookie存储在客户机,客户可以禁用cookie session可以用于跨页面请求,有一个随机生成的唯一的session_id 典型的应用就是购物车 */ //准备工作,设置php.ini的session.save_path="C:\xampp\tmp" //启动会话 session_start(); //设置session $_SESSION[ 'name' ]= 'Peter' ; $_SESSION[ 'password' ]= '12345' ; echo 'Session 创建成功!<br/>' ; /*打开服务器的session文件查看 name|s:5:"Peter";password|s:5:"12345"; */ print_r($_SESSION); //清空session,session文件只是清空 $_SESSION=array(); echo '<br/>注销当前回话session<br/>' ; print_r($_SESSION); //销毁session文件,session文件会被删掉 session_destroy(); echo '<br/>session已经彻底销毁<br/>' ; print_r($_SESSION); ?> |
查看session
如果销毁了session
文件上传
file_upload.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <html> <form method= 'post' enctype= 'multipart/form-data' > <input type= 'file' name= 'upfile' /> <input type= 'submit' value= '上传' /> </form> </html> <?php if (!empty($_FILES)){ print_r($_FILES); $tmpname=$_FILES[ 'upfile' ][ 'tmp_name' ]; //文件临时名 $name=$_FILES[ 'upfile' ][ 'name' ]; //文件原名 //文件会上传到与该页面文件同一个目录 move_uploaded_file($tmpname,$name) or die( '文件上传失败,程序退出!' ); echo '<br/>文件上传成功!<br/>' ; } else { echo '<br/>没有上传文件<br/>' ; } ?> |
ok,基本上php的内容学到这里,就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧