没安装php的服务器php文件返回不了

没安装php的服务器php文件返回不了,第1张

是。PHP即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中,没安装是不能返回php文件的,PHP语法学习了C语言,吸纳Java和Perl多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己。

PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页。当一个访问者打开主页时,服务端便执行PHP的命令并将执行结果发送至访问者的浏览器中,这类似于ASP和CoildFusion,然而PHP和他们不同之处在于PHP开放源码和跨越平台,PHP可以运行在WINDOWS NT和多种版本的UNIX上。它不需要任何预先处理而快速反馈结果,它也不需要mod_perl的调整来使您的服务器的内存映象减小。PHP消耗的资源较少,当PHP作为Apache Web服务器一部分时,运行代码不需要调用外部二进制程序,服务器不需要承担任何额外的负担。
除了能够 *** 作您的页面外,PHP还能发送HIIP的标题。您可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有DBC),集成各种外部库来做用PDF文档解析XML的任何事情。
有了PHP就无需特殊的开发环境和IDE,您可以以<?php 作为程序块的开始,可以以 ?>作为PHP代码块的结束,当然您也可以用带有 <% %>的标记甚至用<script LANGUAGE=“php”></script>的ASP的格式来配置 PHP,PHP会在那些标志间处理所有的事情。
PHP的编程语言类似与C和Perl。在使用它们之前您没必要声明任何变量,而且建立数组和Hash是很简单的事情。PHP还有一些面向对象的特征,可以为组织和打包您的代码提供很好的帮助。

2021年学PHP还有前景,市场需求还是蛮大的。

PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。

PHP语法学习了C语言,吸纳Java和Perl多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己,例如java的面向对象编程,该语言当初创建的主要目标是让开发人员快速编写出优质的web网站。

内置函数

PHP有很多标准的函数和结构。还有一些函数需要和特定的扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。例如,要使用image函数中的imagecreatetruecolor(),需要在编译PHP的时候加上GD的支持。

或者要使用mysqli_connect()函数,就需要在编译PHP的时候加上MySQLi支持。有很多核心函数已包含在每个版本的PHP中如字符串和变量函数。

调用phpinfo()或者get_loaded_extensions()可以得知PHP加载了那些扩展库。同时还应该注意,很多扩展库默认就是有效的。

运行PHP脚本程序,必须借助PHP预处理器、WEB服务器和WEB浏览器,必要时还需借助数据库服务器。
1WEB浏览器
也叫网页浏览器,简称浏览器。常见的浏览器有微软的Internet Explorer(IE)浏览器、Mozilla的Firefox浏览器等。
2PHP预处理器
PHP Preprocessor的功能是将PHP程序中的代码解释为文本信息,这些文本信息中可以包含HTML代码。
3WEB服务器
WEB Server也称为)服务器,功能是解析>进行 Web 开发时,您有许多选择。这些方法中许多都涉及到预处理 — 即,利用特定的标记将代码嵌入到 HTML 页面中,这些标记告诉预处理器,它们包含代码,并且应对它们作出处理。与 CGI 非常相似,这些代码在服务器上运行,并返回一些内容,这些内容表现为发回给浏览器的结果 HTML 页面的部分外观。开放源代码脚本语言 PHP 和 Microsoft 的 ASPNET 框架中的语言都属于这种类型;JavaServer Pages (JSP) 和 Perl/Mason 也以这种方式运行。
在此,我将重点讲述 PHP — Oracle 已选择合并到其产品中的技术 — 和 ASPNET。我将概述两者的各种优势和弱点,并着重讨论那些将帮助您决定开发项目应选择哪种技术的因素。有很多因素需要考虑,不同的项目可能诉诸于不同的技术。总之,您将看到在价格、速度和效率、安全性、跨平台支持等方面的逐项比较,以及开放源代码解决方案的优势。
什么是 ASPNET
ASP 最新的版本 ASPNET 并不完全与 ASP 早期的版本后向兼容,因为该软件进行了完全重写。早期的 ASP 技术实际上与 PHP 的共同之处比与ASPNET 与 PHP的共同之处多得多,ASPNET 是用于构建 Web 应用程序的一个完整的框架。这个模型的主要特性之一是选择编程语言的灵活性。ASPNET 可以使用脚本语言(如 JScript、VBScript、Perlscript 和 Python)以及编译语言(如 VB、C#、C、Cobol、Smalltalk 和 Lisp)。新框架使用通用的语言运行环境 (CLR);先将您语言的源代码编译成 Microsoft 中间语言代码,然后 CLR 执行这些代码。
这个框架还提供真正的面向对象编程 (OOP),并支持真正的继承、多态和封装。NET 类库根据特定的任务(例如,使用 XML 或图像处理)组织成可继承的类。
除了编程语言和方法之外,当您用 ASPNET 编程时,可以用 ODBC 来集成数据库;ODBC 提供了一组一致的调用函数来访问您的目标数据库。
优势和弱点
ASPNET 的优势很明显在于它简洁的设计和实施。这是面向对象的编程人员的梦想:语言灵活,并支持复杂的面向对象特性。在这种意义下,它真正能够与编程人员现有的技能进行互 *** 作。
ASPNET 的另一个优势是其开发环境。例如,开发人员可以使用 WebMatrix(一个社区支持的工具)、Visual Studio NET 或各种 Borland 工具(如 Delphi 和 C++ Builder)。例如,Visual Studio 允许设置断点、跟踪代码段和查看调用堆栈。总而言之,它是一个复杂的调试环境。许多其他第三方的 ASPNET IDE 解决方案也将必然出现。
但是ASPNET强健性,是以损失效率为代价的。ASPNET 在内存使用和执行时间方面耗费非常大,这大部分归因于较长的代码路径。对基于 Web 的应用程序,这些局限可能是一个严重的问题,因为在 Web 上,您的应用程序可能扩展为每秒成千上万的用户。内存使用率还可能成为 Web 服务器上的一个问题。
什么是 PHP
PHP 是基于预处理 HTML 页面模型的一种脚本语言。当 Web 服务器中的 PHP 预处理器发现像下面这样的 PHP 语言标记时,将调用 PHP 引擎来执行该代码:
<php
代码
>
使用过命令式编程语言的编程人员都将会对 PHP 非常熟悉;您会发现它与 Perl、C 和 Java 在语法上很相似。严格来讲,Java 是一种命令式编程语言,但它也利用了面向对象的结构和概念。PHP 在适宜的时候借鉴了这种结构,但它不是一种纯粹的 OOP 语言。
在上面对 ASPNET 的讨论中,我提到了 ODBC 驱动程序,以及在考虑数据库抽象的情况下如何构建应用程序。在 PHP 中,您也可以使用 ODBC 与数据库对话,因此您已经有了一系列支持的数据库可供选择。也有 MySQL、Oracle 和 Postgres 的原生驱动程序。此外,如果要使用 Oracle,则有一个特殊的 OCI8 库将提供对 Oracle 更多访问功能,从而允许您使用诸如 LOB、BLOB、CLOB 和 BFILE 之类的特性。
这时您可能会问“为什么与数据库相关的资料库被称为 PHP 的特性?”数据库抽象或独立性是您在设法构建使用多种数据库或需要在数据库间移植(例如,从开发到投产时的移植)的应用程序时所要考虑的一个因素。而这些确实是应该关心和考虑的。
但正如 Tom Kyte 在他的新书 — Effective Oracle by Design (Oracle 出版社) — 中指出的那样,数据库相关性将成为您真正的目标,因为这将使您在该技术中的投资最大化。如果您对 Oracle 进行一般的访问 — 无论通过 ODBC 或 Perl 的 DBI 库,那么您将无法使用其他数据库所不具有的特性。此外,优化查询在各个数据库中各不相同。
Zend Technologies 是一家商业软件公司,它对 PHP 作出了重大贡献。它创建了一个称为 Zend Studio 的商业开发环境,这个环境包含了一个复杂的调试器、一个监测器和其他特性。该公司还构建了免费的 Zend Optimizer,它与 Zend Encoder 结合使用来编译 PHP 代码,以提升性能。还有其他商业产品,如 Zend Performance Suite,它可以缓存预编译的 PHP 页面,从而进一步显著提升总体性能。
优势和弱点
到测试版 4 为止,PHP 5 仍然有一些缺点,包括缺少异常和基于事件的错误处理例程 — 它们能够中断正常的程序流,并将代码跳转到一个特殊的错误处理部分。Java 也提供了用于错误处理的异常,而 C++ 通过 try、catch 和 throw 语法提供异常处理。当然,您仍然可以在 PHP 中管理错误,但其结构不是标准化的,因而使得编程人员必须使用自己的工具来决定执行错误处理的方式,这将导致更低的一致性并往往导致推倒重来。
另一个弱点是 PHP 的函数名是不区分大小写的。虽然这不是一个严重的缺点,但有些程序员可能会觉得这一特性很讨厌。
不过,我的确对 PHP 的对象模型心存疑虑。PHP 不是专门设计为一种面向对象的语言。这些特性中的一部分是后来添加的 — 尽管注意了保持与 PHP 3 的后向兼容性,因此两种模型的特性都留有一些。实际上,在 PHP 5 中这些弱点中的许多都得到了解决。请留心关注。
PHP 在一些领域中缺少什么,它就会在擅长的领域中迅速地弥补什么。价格合理,因此您不需要担心许可问题。它也是开放源代码的,因此整个社区将密切关注开发过程:发现错误并将其修复。如果有一个特性您不喜欢,那么您可以修改代码。此外,PHP 可与 Apache 自然结合:它可以作为一个模块编译,或直接编译成 Apache 二进制文件。
但在 Apache 上运行意味着,利用 PHP,您能够利用您已经在任意服务器投资,这是因为 Apache 能够运行在 Windows、Linux、Solaris 和各种其他 Unix 平台上。此外,使用拥有 Apache 的跟踪记录的 web 服务器意味着安全性能够保持在最高的优先级上。最后,PHP 拥有更小的代码路径,这意味着更少的分析和执行 PHP 页面服务器端代码,这将带来更高效的内存和使用率以及更快的运行。
在 PHP 5 中新增了哪些特性?
PHP 5 的第 4 个测试版在 2003 年 12 月底推出,更改日志清楚地显示已发现许多错误并已将其消除。虽然它仍在进行测试,但它的所有新特性和进步都确实值得关注。
PHP 5 的主要新成就在于它的异常处理和一个新对象,这个新对象引入的特性赋予了 PHP 真正的 OOP。异常处理无疑是 PHP 4 中最显著的缺憾之一,而 PHP 5 对异常处理的引入无疑是一个成熟的标志。异常处理意味着您在您的软件中拥有了根据语言定义的和标准化的错误处理方法。只需使用 try、catch 和 throw 方法,您的 PHP 代码就变得更加强健和简洁。
<php
class blue {
function openFile ($inFile) {
if (file_exists ($inFile)) {
# code to open the file here
} else {
throw new Exception
("Cannot open file:$inFile");
}
}
}
$blueObj = new blue ();
try {
$blueObj->openFile ('/home/shull/filetxt');
} catch (Exception $myException) {
echo $myException->getMessage ();
# rest of exception handling code here
}
# rest of blue methods here
>
新的对象模型为用 PHP 编写的程序带来许多积极的影响。在 PHP 4 中,当把将一个对象传递给函数或方法时,是通过值来传递的 — 除非您另行显式告知 PHP。这个过程意味着必须复制对象的一个副本(内存中的所有数据结构)。这个步骤使用内存,使得访问变慢和拥塞。而在 PHP 5 中,通常通过引用传递对象。
PHP 5 中新的面向对象的特性(包括构造器和析构器)值得关注。与 C++ 和 Java 相同,它们提供了一种标准方法,即通过一个构造器方法来创建对象、分配内存和执行任何必要的设置,并通过一个析构器方法来执行清理。
PHP 5 还引入了对类中方法和变量的更精细控制。在 PHP 4,一切都是公有的:您可以从类外或在继承类中访问您类中的变量。在 PHP 5 中,您仍然可以使变量或方法为公有,但您也可以使它们为私有,以使得只能在类本身中使用它们。还可以将它们保护起来,也就是说,可以在类内或在子类中查看方法和变量。
此外,PHP 5 引进了类型提示或更好的类型检查。当您将一个对象传递给一个例程时,PHP 能够检查它是否是正确的类型,并在检查失败时产生类型不匹配错误。
还有其他特性(如静态方法和变量以及抽象类)。

参考资料:

>

在本文中 我将介绍使用 LESS Framework 动态生成 CSS 内容的 Web 开发

毫无疑问 CSS 代表一大飞跃 它有望将内容与网页显示完全分离 而且在很大程度上实现了这一点 尽管 CSS 属于(或应该属于)设计人员关注的范畴 它率先提出了关注点分离原则 几乎每个开发人员都对此非常敏感 因此 CSS 很快获得采用 它在 Web 开发过程中如此根深蒂固 以致于有时难于满足最新网站的需求

问题并不是 CSS 不足以满足样式最新 图形丰富并且外观吸引人的网站需求 而是纯粹的声明语言并非始终适合表现复杂的互联样式声明 好在只要编写正确 CSS 对于浏览器仍然合理 但对人来说也是如此吗?

Web 开发中一个相对较新的方向是围绕 CSS 构建基础结构 使开发人员和设计人员能够以可持续性更高的方式生成相同的 CSS 最终的浏览器样式表并无变化 但其生成方式应有所不同 更易读也更容易管理

这一 Web 开发领域出现于几年前 现在日渐成熟 有几个可用的框架可以帮助您进行动态 CSS 内容生成 我将提供其中一个框架 也就是 LESS Framework 的执行概要 并演示它如何与 ASP NET MVC 解决方案集成

为何采用 LESS?

开发人员借助 LESS 解决的最大问题之一 是信息的重复 作为软件开发人员 您可能了解 切勿重复 (DRY) 原则并且每天都在应用 DRY 的主要优点在于 它减少了相同信息的存储位置 因而减少了应更新该信息的位置的数量

对于普通 CSS 您根本不会遇到 DRY 问题 例如 在某些其他情况下 如果多个类中使用某种颜色 而您需要对其进行更改 可能除了逐一更新之外没有更好的办法了 使用 CSS 类可以定义特定元素的外观 并针对样式相关的元素以相同的方式跨页面重复使用 尽管 CSS 类确实可以减少重复 但有时在其他方面显得不足

CSS 类的一个问题是它们在语义 HTML 元素的级别运行 在构建各种 CSS 类时 经常需要重复颜色或宽度等细节信息 对这些可重复细节中的每一个使用同一个类并不方便 即使设法用一个 CSS 类表示几乎所有可重复样式 如颜色和宽度 当开始对语义元素(如容器)应用样式时 还是应该连用多个 CSS 类以便实现所需的效果

如果您曾用 Bootstrap 等框架设计过网页 就会明白我的意思 例如

<a class= btn btn primary />

首先将锚点设置为一个按钮(类 btn) 然后设置为特定风格的按钮(类 btn primary) 这种方法有效 但可能需要进行大量工作提前计划所需的类 这会增加 Web 项目的工作量 而项目往往时间紧迫

LESS 这样的动态样式表语言表示一种横向思维 您不必花时间尝试使普通 CSS 变得更加智能 只需使用不同的工具(一般是语言)进行生成即可 因此 LESS 是一种框架 它向 CSS 编码添加了编程人员友好的概念 如变量 块和函数

与动态 CSS 生成严格相关的 是将其处理为普通 CSS 供浏览器使用的问题 客户端可以通过临时 JavaScript 代码处理 LESS 代码 也可以在服务器上对其进行预处理 使浏览器只接收最终的 CSS

在 ASP NET MVC 中设置 LESS

我将演示从 ASP NET MVC 应用程序中使用 LESS 所需的 *** 作 首先 我将重点介绍 LESS 代码的客户端处理 在布局文件的 HEAD 部分添加以下内容

<link rel= stylesheet/less type= text/css href= @Url Content( ~/content/less/mysite less ) /> <script type= text/javascript src= @Url Content( ~/content/scripts/less min js ) ></script>

这里假设您已在项目中创建了 Content/Less 文件夹以包含所有 LESS 文件 您需要一个 JavaScript 文件 以便在浏览器中进行实际的 LESS 到 CSS 处理 您可以从 获取该脚本文件 我将回顾一些可证明 LESS 有用的场景

运行中的 LESS 变量

观察 CSS 渐变是了解 LESS 变量作用的好方法 多年以来 设计人员使用小的 GIF 文件绘制 HTML 容器的渐变背景 最近 浏览器增加了 CSS 渐变支持 这也是官方 CSS 标准的一部分 通过线性渐变语法及其变体实现 很遗憾 如果要确保尽量多的浏览器采用这种渐变 必须借助一些东西 如 中的代码

中的代码几乎不可读 更糟的是 在需要渐变的任何地方都必须重复使用这些代码 此外 如果要稍微更改一下渐变颜色(或只更改饱和度或淡化效果) 唯一的办法是在所有位置进行手动编辑 直截了当地说 这非常困难 但是 这是对于普通 CSS 唯一可行的方法

图 在多种浏览器中显示渐变的综合代码

/ Old browsers fallback / background color: #ff ; background: url(images/red_gradient png); background repeat: repeat x; / Browser specific syntax / background: moz linear gradient( left #fceabb % #fccd d % #f b % #fbdf %); background: Webkit linear gradient( left #fceabb % #fccd d % #f b % #fbdf %); background: o linear gradient( left #fceabb % #fccd d % #f b % #fbdf %); background: ms linear gradient( left #fceabb % #fccd d % #f b % #fbdf %); / Standard syntax / background: linear gradient( to right #fceabb % #fccd d % #f b % #fbdf %);

为找到更好的解决方案 您需要跳出 CSS 试试 LESS 在 LESS 中 您只需定义一次渐变 CSS 然后在适当的位置按名称引用即可 例如

background gradient orange { background: #fceabb;              }   &ntainer { background gradient orange; }          

名为 background gradient orange 的类按名称在适当的位置嵌入到类容器和任意其他类中 而渐变定义保存在一个位置

从开发人员的角度来看 这并不是什么革命性的改变 不过 它使用了变量功能 这是 CSS 中没有的 事实上 如果将文件保存为普通样式表并引用的话 前面的语法并不可行 需要一些代码将扩展语法转换为普通 CSS 这正是 LESS JavaScript 分析器的功能 它将变量扩展为其实际 CSS 内容

变量还适用于颜色或大小等标量值 请考虑以下 LESS 代码

@black: # ;    #main {  color: @black; }     header { background color: @black; }          

分析器将 @black 变量扩展为分配的值并进行全文件替换 最终效果是 在一处更改实际颜色 整个文件中的相应内容会自动更改 运行中的 LESS Imports

如果需要 您可以将 LESS 代码拆分到多个文件 引用文件和包含的类中 例如 假设您创建一个 gradients less 文件 内容如下

background gradient orange { background: #fceabb;              }          

在另一个 LESS 文件中 如 main less 您可以通过导入该文件引用任何渐变

@import "gradients";   &ntainer { background gradient orange; }          

如果 gradients less(扩展名不是严格必需的)位于其他文件夹中 则应在调用中指示路径信息以便导入 LESS Mixin

我调用该 LESS 项目进行变量渐变 严格来说 这并不完全正确 在 LESS 中 一个变量包含一个单一值 一个 CSS 类容器被称为一个 mixin 这类似于函数 但不包含任何自定义逻辑 就像函数一样 LESS 可以接受和处理参数 请看看图 中演示 mixin 的代码

在图 中 一个名为 shadow 的 mixin 定义了框阴影样式 并将颜色作为外部参数公开 与之类似 text box mixin 定义输入字段的基本外观 它导入阴影定义并保持宽度为参数化形式 通过这种方式 为不同大小(mini normal 和 large)的输入字段定义三个类就非常简单了 更重要的是 它只需进行少量编辑工作 更新也非常简单(请参阅图 )

图 LESS Framework 中的 Mixin

/  Mixins  /     shadow(@color) {      box shadow: px px px @color;    }     text box(@width) {       shadow(# );      border: solid px # ;      background color: #dddd ;      padding: px;      width: @width;    }    /  CSS classes  /     text box mini {       text box( px);    }     text box normal {       text box( px);    }     text box large {       text box( px);    }

图 运行中的 LESS Mixin

Mixin 可以接受多个参数或可变数量的参数 此外 每个参数都支持默认值

mixin(@color: #ff ) {              }          

LESS 并不是富编程语言表示 它的设计缺少命令来指示条件或循环 但 mixin 的行为仍然可以根据所传递的值发生变化 假设您要对一个较大的按钮使用较粗的边框和字体 您定义一个名为 button 的参数化 mixin 使用关键字 when 将设置与条件绑定 条件必须基于一个参数

button (@size) when (@size < px) {     padding: px;     font size: em;     width: @size ;    }     button (@size) when (@size >= px) {      padding: px;      font size: em;      font weight: ;      background color: red;      width: @size ;    }          

您应用不同的设置 但也可以使用基本 *** 作通过一个系数将大小扩大为数倍 然后在实际 CSS 类中使用 mixin

push button large {       button( px);    }     push button all {       button( px);    }          

运行此代码的结果如 所示

图 在 CSS 类中使用 LESS Mixin 的效果

LESS 附带很多可 *** 作颜色的预定义函数 您可以使用函数按百分比调整颜色亮度和饱和度 也可以按百分比设置颜色淡入和淡出 如下所示

push button {      background color: fade(red %);    }          

有关 LESS 支持的函数的完整文档 请参阅 嵌套类

我个人觉得需要重复 CSS 块指示同级样式非常讨厌 下面是一个典型示例

#container h {              }    #container p {              }    #container p a {              }    #container img {              }          

在编写得很好的普通 CSS 中 实际上可以避免很多重复 但使用平面列表布局样式的方式并不是最好的 在这种情况下 最好使用一些层次结构 在 LESS 中 可以像这样嵌套样式规则

&ntainer {      h {        font size: em;       color: fade(# %);       a {         color: # ;         &:hover {color: red;}        }      }    }          

经过处理后 前面的 LESS 代码会产生下面的样式

&ntainer h   &ntainer h a   &ntainer h a:hover          

服务器端处理

您可以原样下载 LESS 代码 在客户端通过 JavaScript 代码对其进行处理 也可以在服务器上进行预处理 然后将它作为普通 CSS 下载到客户端 在前一种情况下 完全像使用普通 CSS 文件一样 服务器端更改在下一次页面刷新时应用到客户端

如果您注重性能 处理的是大型复杂 CSS 文件 则服务器端预处理可能是更好的选择 服务器端预处理发生在您每次修改服务器上的 CSS 时 您可以在生成过程结束时手动完成额外的步骤 使用 LESS 编译器从命令行将 LESS 代码预处理为 CSS 此编译器是为服务器端工作安装的 less NuGet 软件包的一部分

不过 在 ASP NET MVC 中 可以将 LESS Framework 与捆绑机制集成 有关捆绑机制 请参阅我在 年 月的专栏 CSS 编程 捆绑和缩小 (msd/magazine/dn ) 这确保只要请求 LESS 文件 就会执行 LESS 到 CSS 的转换 还确保通过 If Modified Since 标头正确管理缓存 最后 您可以将分析和缩小混合起来 要在 ASP NET MVC 中集成 LESS 首先需要下载并安装 less NuGet 软件包 然后将以下代码添加到 BundleConfig 类

var lessBundle =      new Bundle("~/myless") IncludeDirectory("~/content/less" " less");    lessBundle Transforms Add(new LessTransform());    lessBundle Transforms Add(new CssMinify());    bundles Add(lessBundle);          

捆绑将打包在指定文件夹中找到的所有 less 文件 LessTransform 类负责 LESS 到 CSS 的转换 该类使用 less API 分析 LESS 脚本 LessTransform 的代码非常简单

public class LessTransform : IBundleTransform    {      public void Process(BundleContext context BundleResponse response)      {        response Content = dotless Core Less Parse(response Content);        response ContentType = "text/css";      }    }          

更多智能工具

lishixinzhi/Article/program/Web/201404/30643


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13496214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-18
下一篇 2023-08-18

发表评论

登录后才能评论

评论列表(0条)

保存