admin 管理员组

文章数量: 887021


2024年1月24日发(作者:c语言数字对应ascii码)

下面我们将通讲解一个留言本实例,来帮助你更好的掌握PHPCMS V9的二次开发流程。并在开发过程中体验PHPCMS V9。

在此我们只做基本功能的演示,更多的功能开发,期待你的继续挖掘。

4.1需求分析

本实例用PHPCMS V9基础功能开发设计一个留言本管理系统,要求如下:

后台:

可管理、回复、删除留言信息

可控制留言是否前台显示

可对留言系统配置设置选项,例如是否起用验证码,默认是否显示、是否允许游客留言等配置。模块配置信息可多站点存储。

可批量管理所有未回复留言

后台管理演示效果如下图所示:

前台:

根据后台模块配置选项,控制是否显示在线留言填写表单。

在线提交留言,根据后台配置选项,是否显示验证码,是否需管理员审核显示。

留言列表页,需根据后台配置每页条数进行分页。

前台演示效果如下图所示:

4.2数据库和数据表的设计

这里使用Mysql数据库来存储信息。

首先构建一个留言信息表 guestbook , 它有12个字段,即消息编号(gid),站点ID(siteid),标题(title),内容(content),回复内容(reply),回复状态(reply_status),会员ID(uid),会员姓名(username),审核状态(passed) ,留言时间(inputtime),回复人(replyer),回复时间(replytime)。下面是创建该表的SQL代码:

CREATE TABLE `phpcms_guestbook` (

`gid` smallint(5) NOT NULL auto_increment,

`title` char(80) NOT NULL,

`content` text NOT NULL,

`reply` text NOT NULL,

`userid` mediumint(8) unsigned NOT NULL default '0',

`username` char(20) NOT NULL,

`gender` tinyint(1) unsigned NOT NULL default '0',

`head` tinyint(3) unsigned NOT NULL default '0',

`email` char(40) NOT NULL,

`qq` char(15) NOT NULL,

`homepage` char(25) NOT NULL,

`hidden` tinyint(1) unsigned NOT NULL default '0',

`passed` tinyint(1) unsigned NOT NULL default '0',

`ip` char(15) NOT NULL,

`addtime` int(10) unsigned NOT NULL default '0',

`replyer` char(20) NOT NULL,

`replytime` int(10) unsigned NOT NULL default '0',

PRIMARY KEY (`gid`),

KEY `hidden` (`hidden`,`gid`));

4.3创建模块目录

PHPCMS v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块,如果要创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了。

当前我们要开发一个叫做guestbook的留言本模块,那么首先在 phpcms/modules 目录下创建文件夹,并将其命名为guestbook。 如下图所示:

guestbook 模块的标准结构通常是这样的,如下图所示:

其中

classes 为模块类库包

functions 为模块函数库包

templates 为模块模板包 这里通常放置含有权限控制的控制器模板,也就是后台模板。

如果您的模块有单独的前台模版,你需要在phpcms/templates/default下创建一个您的模块同名目录来放置前台模板,“default”为你的风格包名称,我们默认适用default。

4.4创建数据模型类文件

建好数据表,创建完模块文件夹以后,接下来进行留言本数据模型的创建。

数据库模型位于:phpcms/model/ 目录下。

数据模型文件的命名规则建议为数据表名称+'_'

如果在我们的创建的模块中我要使用一个数据表“test”,首先需要建立一个数据库模型文件,文件名称为'test_',程序结构如下图:

defined('IN_PHPCMS') or exit('No permission resources.');

pc_base::load_sys_class('model', '', 0);

class test_model extends model {

public function __construct() {

$this->db_config = pc_base::load_config('database');

$this->db_setting = 'default';

$this->table_name = 'test';

parent::__construct();

}

}

>

在实例中,只需要把加粗字换成当前数据表名即可。

在本例中guestbook_数据模型文件为留言本信息表数据模型,结构如下:

defined('IN_PHPCMS') or exit('No permission resources.');

pc_base::load_sys_class('model', '', 0);

class

guestbook_model extends model {

}

function __construct() {

$this->db_config = pc_base::load_config('database');

$this->db_setting = 'default';

$this->table_name = 'guestbook';

parent::__construct();

}

说明:任何自定义模块的数据模型类,均继承于 数据模型基类。在此基类中PHPCMS 系统已经把最常用的数据库操作方法进行了封装。 二次开发者不必关于如何操作数据库,只需要根据需要用到的,已定义操作方法的要求,传递参数即可。系统会自动对数据进行处理,并返回定义结果。

4.5开发模块控制器和函数

在上面的创建模块中我们已经创建好了一个名为“guestbook”的留言本模块,接下来我们继续为这个模块添加两个控制器类。

PHPCMS V9的控制器就是模块的类文件,位于phpcms/modules/模块/目录下面。类名也就是文件名+.php,例如一个名为guestbook的控制器,那么他的命名为即可。控制器类默认继承系统的函数库,可以直接使用。需要注意的是:控制器类的类名称与控制器文件名必须相同。

本留言本模块有以下二个控制器

控制器名称

默认调用控制函数

init()

init()

说明

前台页面控制器

后台管理控制器

下面将对二个控制做分别一个详细介绍。

4.5.1前台控制器开发

前台控制器主要涉及前台留言显示、在线留言的提交处理等功能函数,以下为全部源代码,接下来我们将对每个功能块,做个详细介绍,代码如下图所示:

defined('IN_PHPCMS') or exit('No permission resources.');

class index {

function __construct() {

$this->guestbook_db = pc_base::load_model('guestbook_model');

$this->_username = param::get_cookie('_username');

$this->_userid = param::get_cookie('_userid');

//定义站点ID常量,选择模版使用

$siteid = isset($_GET['siteid']) ? intval($_GET['siteid']) : $this->get_siteid();

define("SITEID",$siteid);

//读取配置,设置分页条数

$setting = new_html_special_chars(getcache('guestbook', 'commons'));

$this->set = $setting[SITEID];

}

public function init() {

//读取配置,设置分页条数

$setting = new_html_special_chars(getcache('guestbook', 'commons'));

$set = $setting[SITEID];

$pagesize = $setting[SITEID]['pagesize'];

$where = array('passed'=>1,'siteid'=>SITEID);

$page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1;

$infos = $this->guestbook_db->listinfo($where, 'gid DESC',$page, $pages = $pagesize);

$infos = new_html_special_chars($infos);

$pages = $this->guestbook_db->pages;

pc_base::load_sys_class('form', '', 0);

include template('guestbook', 'index');

}

/**

* 在线留言

*/

public function ly() {

if(isset($_POST['dosubmit'])){

if(isset($_POST['code'])){

$code = isset($_POST['code']) && trim($_POST['code']) ?

trim($_POST['code']) : showmessage(L('input_code'), HTTP_REFERER);

if ($_SESSION['code'] != strtolower($code)) {

showmessage(L('code_error'), HTTP_REFERER);

}

}

$set = $this->set;

$link_db = pc_base::load_model(guestbook_model);

$_POST['ly']['addtime'] = SYS_TIME;

$_POST['ly']['userid'] = $this->_userid;

$_POST['ly']['username'] = $this->_username;

$_POST['ly']['siteid'] = SITEID;

$_POST['ly']['passed'] = $set['check_pass'];

$link_db->insert($_POST['ly']);

showmessage(L('add_success'), "?m=guestbook&c=index&siteid=$siteid");

} else {

echo $siteid.'adsf';exit;

$setting = getcache('guestbook', 'commons');

pc_base::load_sys_class('form', '', 0);

$SEO = seo(SITEID, '', L('application_links'), '', '');

include template('guestbook', 'ly');

}

}

}

>

接下来将对本控制程序的每一段代码后对其进行分析和解释。

defined('IN_PHPCMS') or exit('No permission resources.');

这段程序的作用是用来判断本段程序是否处于PHPCMS的运行范围内,如果不是,则页面提示No permission resources并终止,这在一定程度上避免了脚本包含调用错误引起的被入侵。其他文件中的相同代码段作用与此相同。

class index {

…… …..

}

接下来就是对控制器类的定义了,在前面也讲过控制器中类的定义,类名必须要

和本控制器名称相同,本控制器为,所以控制器类名也为index。

function __construct() {

$this->guestbook_db = pc_base::load_model('guestbook_model');

$this->_username = param::get_cookie('_username');

$this->_userid = param::get_cookie('_userid');

//定义站点ID常量,选择模版使用

$siteid = isset($_GET['siteid']) ? intval($_GET['siteid']) : $this->get_siteid();

define("SITEID",$siteid);

//读取配置,设置分页条数

$setting = new_html_special_chars(getcache('guestbook', 'commons'));

$this->set = $setting[SITEID];

}

上面这段代码是本类的构造函数的定义。在此函数中$this->guestbook_db

= pc_base::load_model('guestbook_model'); 为加载留言本的数据模型。

$this->_username = param::get_cookie('_username');

$this->_userid = param::get_cookie('_userid');

这段代码为取得当前登录会员的会员名(username)和会员ID(userid),以便在下面留言提交处理程序中使用。用于记录存储留言者的信息。

//定义站点ID常量,选择模版使用

$siteid = isset($_GET['siteid']) ? intval($_GET['siteid']) : $this->get_siteid();

define("SITEID",$siteid);

这段代码判断是否有站点ID(siteid)传递,如果存在则获取并转化为整型,没有获取到站点ID,则利用全局函数get_siteid();函数来获取siteid值。此函数定义于 文件中。最后把siteid值定义为一个常量,以便

接下来的程序使用。

//

读取配置,设置分页条数

$setting = new_html_special_chars(getcache('guestbook', 'commons'));

$this->set = $setting[SITEID];

接下来上面这段代码,通过getcache(‘guestbook’,’commons’)函数来读取留言本配置的缓存文件。因为此配置文件分多站点存储配置信息,以站点ID为下标存储的二维数组,所以利用当前站点的siteid,来获取当前站点的配置信息并赋值一个全局变量。在下面的函数中就可以直接调用当前站点留言本的配置信息。

public function init() {

//读取配置,设置分页条数

$pagesize = $this->set[‘pagesize’];

$where = array('passed'=>1,'siteid'=>SITEID);

$page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1;

$infos = $this->guestbook_db->listinfo($where,'gid DESC',$page, $pages = $pagesize);

$infos = new_html_special_chars($infos);

$pages = $this->guestbook_db->pages;

pc_base::load_sys_class('form', '', 0);

include template('guestbook', 'index');

}

上面这段代码,是index控制器默认执行的功能函数.前面已经有过介绍,如果用户访问时没有指定事件名字,也就是URL参数中a的值,那么默认a将调用init()功能函数。

此段代码的功能为获取留言数据,并根据配置选项进行显示。

在此段代码中,首先从获取的当前配置文件中,设置前台分页的条数。

$pagesize = $this->set[‘pagesize’];

$this->set为__construct()构造函数中,已经定义获取的当前站点配置数组。如果你不太清楚此配置数组都有那些字段和值,可以打印出来查看一下。

接着定义了一个查询条件语句,并取得当前页数。

$where = array('passed'=>1,'siteid'=>SITEID);

$page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1;

$where 条件语句以数组方式进行定义,PHPCMS V9会自动对其进行转化。当然也可以定义为普通条件语句。例如$where =’ siteid =1 ’。$where 条件为数组的格式如下:

$where = array('条件字段1'=>值,'条件字段2'=>值);

需要注意的是数组条件语句定义,只适用于字段定值查询。并不适用于字段区间范围值查询,如果where语句需要对查询字段值进行区间查询,则只能普通where 查询语句定义。看如下例子:

$where =" `message_time` >= '$start' AND `message_time` <= '$end' ";

获取当前页数就比较简单了,如果获取到当前页数,并且是常量。则直接获取,反之默认赋值为1。

$infos = $this->guestbook_db->listinfo($where,$order = 'gid DESC',$page, $pages =

$pagesize);

$infos = new_html_special_chars($infos);

上面这段代码,$this->guestbook_db为guestbook数据模型类的实例,guestbook数据模型类继承于model 数据模型基类,listinfo()为model 数据模型基类定义的公有方法,故继承的子类guestbook可直接调用此函数。 此函数的功能为查询多条数据并分页,详细的程序定义、参数传递请查阅model类中此函数的定义。

接着对返回的数据利用new_html_special_chars()函数,进行一下转换处理。

$pages = $this->guestbook_db->pages;

pc_base::load_sys_class('form', '', 0);

include template('guestbook', 'index');

此段代码加载系统form类,以便于在前台模块文件中生成验证码输入法时使用。最后include模块文件进行数据显示。

以上这一段章节,介绍了前台显示事件init()函数的定义。 里面介绍了如何定义where 查询语句、获取配置信息、以及如何调用数据模型基类函数listinfo()进行数据读取。中间涉及的一些相关函数的详细定义,以及参数的设置,请读者根据提示,进行查询相关类中的定义。

接下来这段代码是关于提交留言的处理事件函数:ly()的定义,其中涉及验证码的判断,提交数据如何存入数据库,下面将做个详细介绍:

首先先看一下完整代码,代码如下:

public function ly() {

if(isset($_POST['dosubmit'])){

if(isset($_POST['code'])){

$session_storage = 'session_'.pc_base::load_config('system','session_storage');

pc_base::load_sys_class($session_storage);

if(!isset($_SESSION)) {

session_start();

}

$code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) :

showmessage(L('input_code'), HTTP_REFERER);

if ($_SESSION['code'] != strtolower($code)) {

showmessage(L('code_error'), HTTP_REFERER);

}

}

$set = $this->set;

$_POST['ly']['addtime'] = SYS_TIME;

$_POST['ly']['userid'] = $this->_userid;

$_POST['ly']['username'] = $this->_username;

$_POST['ly']['siteid'] = SITEID;

$_POST['ly']['passed'] = $set['check_pass'];

$this->guestbook_db->insert($_POST['ly']);

showmessage(L('add_success'), "?m=guestbook&c=index&siteid= ".SITEID);

} else {

echo ‘请通过正常的方式提交留言,谢谢’;

}

}

代码最开始,首先isset($_POST['dosubmit'])判断是否是提交,如果没有提交,而直接调用此事件,则返回” 请通过正常的方式提交留言,谢谢”的提

示语句。

接下来 isset($_POST[‘code’]),判断提交过来的变量是否存在code这个字段。如果存在,则说明前台起用了验证码,那么接下来就需要进行验证码的判断了,如果没有这个字段,则跳过此段,直接继续向下执行,不在对验证码进行判断处理。

下面介绍此段代码,代码如下:

if(isset($_POST['code'])){

$session_storage = 'session_'.pc_base::load_config('system','session_storage');

pc_base::load_sys_class($session_storage);

if(!isset($_SESSION)) {

session_start();

}

$code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) :

if ($_SESSION['code'] != strtolower($code)) {

showmessage(L('code_error'), HTTP_REFERER);

}

showmessage(L('input_code'), HTTP_REFERER);

}

因为V9验证码的数值是通过SESSION传递,故在这段代码中,首先加载配置文件,取出当前系统配置中SESSION的存储方式。然后根据SESSION的存储方式,来加载对应的系统类库。接下来判断如果SESSION不存在,则触发session_start()。

接下就是获取提交过来的验证码值,并与session中的验证码的值相对比,如果提交的验证码不存在,或者为空,则提示“请输入验证码”。如果验证码存在,但并不等于session里面code的值,“则提示验证码不正确!”。

$set = $this->set;

$_POST['ly']['addtime'] = SYS_TIME;

$_POST['ly']['userid'] = $this->_userid;

$_POST['ly']['username'] = $this->_username;

$_POST['ly']['siteid'] = SITEID;

$_POST['ly']['passed'] = $set['check_pass'];

$this->guestbook_db->insert($_POST['ly']);

接下来上面这段代码为提交过来的数组添加一些新的元素,并赋值,SYS_TIME为当前系统时间,$this->_userid为当前登录用户的账号,$this->_username为用户名,SITEID常量为当前站点的ID,可能大家会想为什么要存储这个值呢,这是因为V9是一个支持站群的系统,一个模块可以应用到多个站点。所以提交过来的信息为了区分开来,那么就要存储一个siteid来记录。$set['check_pass']为当站点配置中是否审核的配置,在后台管理中,可以在where语句中通过对这个字段的定义来查询数据库,显示是否通过审核。

$this->guestbook_db->insert($_POST['ly']);

最后调用model数据模型基类中的insert()函数,把提交表单的数据存入数据库。此时$_POST[‘ly’]为数组,元素为字段名,键词为字段值。Insert()函数会自动进行处理,把对应数值存入guestbook对应数据表里,关于Insert()函数的定义,请查看文件的详细定义。

前台显示模版和前台控制器的定义是紧密相连的,介绍完前台控制器index的定义,接下我们介绍一下前台模块的情况,首先看一下,init()事件中调用的index模版,此前台模版的关键代码,代码如下:

{if $set['guestbook_status']}

我要留言

method="post" name="myform" id="myform">

{if $set['enablecheckcode']==1}

{/if}

标题
内容

验证码:

{form::checkcode('code_img','4','14',110,30)}

{/if}

上面这段代码,首先根据控制器里获取的当前站点配置信息是否开启留言设置,也就是$set['guestbook_status']的值 ,来判断是否显示提交表单。关于验证码了是如此处理,如果配置数组中$set['enablecheckcode']==1则显示验证码输入框,反之不显示验证这一项,这也就是后台配置,对前台显示的控制的一种表现。接下来这段代码就是对从数据库查询出来的留言数据进行显示,

if(is_array($infos)){

foreach($infos as $info){

>

{$info['title']}

{$info['content']}

{if $info['reply']}回复内容:

{$info['reply']}{/if}

}}

>

此代码中首先判断index控制器中,init()事件获取的$infos 变量是否为数组,如果是数组,则进行foreach()循环显示。$infos为根据查询条件而返回的留言信息。

小结:

本章节详细介绍了留言本前台控制器index的定义,其中涉及了V9的数据的存储与调用。条件查询语句的定义,缓存文件的读取,以及验证码的使用。读者可参考源码,根据需求添加更多的功能,例如增加留言提交时间间隔功能等功能,加深对PHPCMS V9控制器开发的理解。

4.5.2后台控制器开发

后台管理控制器含权限控制,只有特定管理员才有权限访问,所以这个控制器需要加载admin 模块下的admin类,并继承该类。 需要注意的是,因为添加的控制器继承了 admin 类,所以添加的控制器的方法名不能和父类具有相同方法名。否则会造成影响,具体请看admin 类中有哪些方法。

以下为该后台管理控制器 的相关定义:

首先,检查系统常量是否存,看是否是经过正规渠道,进入系统。如果系统常量不存在,则返回错误,存在则继续。

defined('IN_PHPCMS') or exit('No permission resources.');

接下来,实例化模块类 admin 类。

pc_base::

load_app_class('admin','admin',0);

创建控制器类 guestbook ,类名必须与文件名相同(这点在前面就已有介绍)继承于 admin 类 。

构造函数继承于admin 类构造函数,并加入guestbook 模块数据模型(在控制器类的函数会用到)。

class guestbook extends admin {

function __construct() {

parent::__construct();//继承父类构造函数

$this->M = new_html_special_chars(getcache('guestbook',

'commons'));//读取留言本配置缓存文件

$this->guestbook_db =

pc_base::load_model('guestbook_model');

}

在构造函数里,做了以下几个操作:

首先继承父级构造函数。

parent::__construct();

读取guestbook模块配置缓存,后面修改配置时会用到读取的数据。

$this

->M= new_html_special_chars(getcache('guestbook', 'commons'));

加载留言本数据模型。

$this

->guestbook_db = pc_base::load_model('guestbook_model');

至此已经完成对guestbook 控制器的最基本定义,接下来就可以在这个控制器类里根据需要进行模块函数的定义开发。

1. 默认执行函数 init () :

在前面的章节,我们介绍过当访问模块控制器,未指定控制器模块函数名,则默认执行init() 函数。

例如:

/?m=guestbook&c=guestbook

/?m=guestbook&c=guestbook&a=init

上面二个URL的访问效果是一样的。

Init () 模块函数功能要求:

默认读取所有留言信息,并结合指定的后台模版界面显示出来。如传递参数

reply = no 则只显示未回复留言。

界面如下:

Init () 函数定义:

public function init() {

if($_GET['reply']=='no'){//显示未回复

$where = array('reply'=>'','siteid'=>$this->get_siteid());

}else{//默认显示全部

$where = array('siteid'=>$this->get_siteid());

}

$page = isset($_GET['page']) && intval($_GET['page']) ? intval($_GET['page']) : 1;

$infos = $this->guestbook_db->listinfo($where,$order = 'gid DESC',$page,

$pages = '10');

$pages = $this->guestbook_db->pages;

include $this->admin_tpl('guestbook_list');

下面对这段代码,做个详细介绍:

$where = array('siteid'=>$this->get_siteid());

查询当前站点下所的留言(V9支持站群系统,可能存在多站点留言系统) //

上面代码是对查询条件的定义,在PHPCMS V9中查询条件可以数组的方式定义。亦可直接写成SQL语句。需要注意的一点是,数组方式只适用于 支持字段名等于字段值的方式。不支持字段值区间查询,如果需要区间查询时,可利用自定义SQL语句完成。

自定义SQL where 语句例子:

$where = "AND `message_time` >= '$start' AND `message_time` <= '$end' ";

接下来,传递查询条件,调用listinfo()函数,并获取返回数据。

$infos=$this->guestbook_db->listinfo($where,$order='gid ESC',$page, $pages = '10');

$this->guestbook_db 为控制器构造函数时加载的guestbook 数据模型。

listinfo() 函数为V9系统在加载 guestbook 数据模型时,继承于model

的函数。具体参数配置请查看 phpcms/libs/classes/ 里面相关函数。

$pages = $this->guestbook_db->pages;

include $this->admin_tpl('guestbook_list');

include $this->admin_tpl(‘guestbook_list’); // 加载后台管理模版

guestbook_。 此文件位于phpcms/modules/模块/templates/ 由此即可明白,其它后台管理模版亦位于此目录,前面章节有相关介绍。

后台模版 guestbook_

在上面刚刚做过介绍,在init()函数定义的最后,加载后台模版来进行查询数据的显示。变量$infos 为查询返回的二维数据数组,数组的详细内容,可通过print_r($infos);打印查看。

下面就看一下guestbook_ 模版文件是如何定义的:

defined('IN_ADMIN') or exit('No permission resources.');

$show_dialog = 1;

>

include $this->admin_tpl('header', 'admin');

首先,进行正常登录后台的验证,如非法包含,未定义后台常量,将返回错误提示。接下来包含公共后台头部文件。

下面一段代码,对返回的二维数组进行显示:

if(is_array($infos)){

foreach($infos as $info){

>

align="center" width="35">$info['gid']?>">

未回复';}else{echo '已回复

首先判断$infos是否是数组,为真了,则进行 foreach()循环显示。在相

';}?>

')" title="回复留言">回复

|

'

onClick="return confirm('

array('message' => new_addslashes($info['title'])))?>')">

应位置显示变量,如标题、留言时间等,具体请看代码。

这里输出系统分页。分页函数定义于系统全局函数 中。

模版的其它代码,诸如form表单定义、jquery插件使用,请读者自行查看,在此不在做介绍。

小结

本小节简单介绍了PHPCMS V9模块控制器默认操作函数init()的定义,其中涉及数据查询语句的定义、数据模型函数listinfo()的使用和介绍。初学者

可以详细查看一下对应文件内容定义,以便后期方便使用。

2. 留言回复 reply() 定义

根据传入的gid 值显示相应留言信息,并可填写回复内容提交。效果如下图:

依功能要求,reply() 函数定义如下:

public function reply() {

if(isset($_POST['dosubmit'])){

$gid = intval($_GET['gid']);

if($gid < 1) return false;

$_POST['reply']['replytime'] = SYS_TIME;

$_POST['reply']['reply_status'] = '1';

'edit');

$this->guestbook_db->update($_POST['reply'],array('gid'=>$gid));

showmessage(L('operation_success'),'?m=guestbook&c=guestbook&a=init','',

} else {

}

$gid = intval($_GET['gid']);

if($gid < 1) return false;

$show_validator = $show_scroll = $show_header = true;

$info = $this->guestbook_db->get_one(array('gid'=>$_GET['gid']));

if(!$info) showmessage(L(guestbook_exit'));

extract($info);

include $this->admin_tpl('guestbook_reply');

程序分提交回复和未提交二种情况。

未提交回复:

$gid = intval($_GET['gid']);

if($gid < 1) return false;

GET方法获取列表页传递过来的gid,并进行验证处理。

$info = $this->guestbook_db->get_one(array('gid'=>$_GET['gid']));

if(!$info) showmessage(L(guestbook_exit'));

利用数据模型类get_one()函数,查询当前gid留言。赋值给$info变量。如果没有查到,则返回留言信息不存在提示。Showmessage() 为系统全局函数,可直接调用。

extract($info);

include $this->admin_tpl('guestbook_reply');

最后将返回数组利用函数extract() 解开, 并加载后台模版guestbook_,进行数据显示。

提交回复:

首先还是要判断传递的变量合法性,就不再叙述。

$_POST['reply']['replytime'] = SYS_TIME;

$_POST['reply']['reply_status'] = '1';

$this->guestbook_db->update($_POST['reply'],array('gid'=>$gid));

$_POST['reply']['replytime'] = SYS_TIME; 为提交过来的变量增加一键名replytime,并赋值。SYS_TIME为系统常量,定义于phpcms/文件。

$this->guestbook_db->update($_POST['reply'],array('gid'=>$gid));

更新当前留言数据。$_POST[‘reply’]为

要更新的数据内容,参数可以为数组也可以为字符串,建议数组。为数组时数组key为字段值,数组值为数据取值。update() 更详细的定义请看下图:

/**

* 执行更新记录操作

* @param $data 要更新的数据内容,参数可以为数组也可以为字符串,建议数组。

*

*

*

为数组时数组key为字段值,数组值为数据取值

为字符串时[例:`name`='phpcms',`hits`=`hits`+1]。

为数组时[例: array('name'=>'phpcms','password'=>'123456')]

*

数组的另一种使用array('name'=>'+=1', 'base'=>'-=1');程序会自动解析为`name` = `name` + 1, `base` = `base` - 1

* @param $where

* @return boolean

更新数据时的条件,可为数组或字符串

*/

final public function update($data, $where = '') {

if (is_array($where)) $where = $this->sqls($where);

return $this->db->update($data, $this->table_name, $where);

}

此函数定义于 phpcms/libs/classes/ 文件。

回复模版 guestbook_

在reply() 函数里,已经将返回的$info数组中的每个元素,键名用于变量名,键值用于变量值进行了处理,所以在模版文件里,可直接使用相关变量。

method="post" name="myform" id="myform">

标题:

内容:

留言时间:

回复内容:

回复时间:

是否通过审核:

  

name="reply[passed]" type="radio" value="0" >

 

echo L('submit')?> ">

echo $gid; ?>"

3. 删除留言

通过管理列表,可批量或单个删除留言信息,因删除留言只涉及功能,没有后台模版。代码如下:

/**

* 删除留言

* @param

*/

intval $gid 留言ID,递归删除

public function delete() {

if((!isset($_GET['gid']) || empty($_GET['gid'])) && (!isset($_POST['gid']) || empty($_POST['gid']))) {

showmessage(L('illegal_parameters'), HTTP_REFERER);

}

if(is_array($_POST['gid'])){

foreach($_POST['gid'] as $gid_arr) {

$gid_arr = intval($gid_arr);

$this->guestbook_db->delete(array('gid'=>$gid_arr));

}

showmessage(L('operation_success'),'?m=guestbook&c=guestbook');

$gid = intval($_GET['gid']);

if($gid < 1) return false;

$result = $this->guestbook_db->delete(array('gid'=>$gid));

if($result){

showmessage(L('operation_success'),'?m=guestbook&c=guestbook');

}else {

showmessage(L("operation_failure"),'?m=guestbook&c=guestbook');

}

}else{

这段代码中,首先对传递的gid值进行判断。gid变量有二种方式传递过来。一是单个删除时通过URL参数方式传递,使用get方式取值。二是多选批量删除时,使用的是表单提交,所以用POST方式取值。不管何种方式,程序开始的时候首先都要对传递的变量进行验证,确保数据安全有效。

如果数据通过验证有效,则继续向下进行删除操作。因为本功能操作,参数传递有二种情况,在表单多选提交删除操作上,传递的是数组。故删除程序也分了参数gid 是数组的情况和不是数组的情况。代码分别如下:

if(is_array($_POST['gid'])){

foreach($_POST['gid'] as $gid_arr) {//循环删除

$gid_arr = intval($gid_arr);

$this->guestbook_db->delete(array('gid'=>$gid_arr));

}

showmessage(L('operation_success'),'?m=guestbook&c=guestbook');

}

gid 为数组代码

$gid = intval($_GET['gid']);

if($gid < 1) return false;

$result = $this->guestbook_db->delete(array('gid'=>$gid));

if($result){

showmessage(L('operation_success'),'?m=guestbook&c=guestbook');

}else {

showmessage(L("operation_failure"),'?m=guestbook&c=guestbook');

}

gid 为非数组方式代码

4. 留言本配置

在制作留言本配置程序以前,首先了解一下V9模块的配置文件存储方式和位置。 PHPCMS V9 模块配置信息存储分为缓存文件存储和数据库存储二种。二者保持同步状态,以数据库为主。

缓存文件存储文件位于:/caches/caches_commons/caches_data/模块名.

数据库存储于:module表(模块表) 中对应模块记录。

一般只有在修改配置文件时读取数据库,其它程序如要用到配置选项,则直接读取配置缓存文件。以减少对数据库的频繁操作。

留言配置处理流程:

留言配置功能函数,首先读取数据库取出对应模块记录,取得配置文件字段,进行处理并结合模版显示。当修改配置并提交,则重新把配置信息写入对应配置缓存文件,并更新至模块表对应模块的记录。

另外一个需要注意的地方是:因PHPCMS V9 支持站群系统,故系统配置信息,亦要考虑配置多站点存放的问题,具体代码会在下面有介绍。首先效果如下图:

模块配置相关介绍

留言配置默认以文件方式存放于 /caches/caches_commons/caches_data/

目录(注意此目录需为可读取权限)。文件名为: 文件内容如下:

1 =>

array (

'guestbook_status' => '1',

'allow_guest' => '1',

'check_pass' => '1',

'pagesize' => '3',

'enablecheckcode' => '0',

),

2 =>

array (

'guestbook_status' => '1',

'allow_guest' => '1',

'check_pass' => '1',

'pagesize' => '5',

'enablecheckcode' => '0',

),);?>

配置选项以数组方式存储。其它程序需要留言本质配置选项时,只需读取读取这个缓存文件,并进行解析即可。

因考虑到V9多站点功能,留言本的配置也以各站点ID分别存储。不同站点存储不同的配置选项。

配置函数 setting() 定义

/**

* 留言本模块配置

*/

public function setting() {

//更新模型数据库,重设setting 数据.

$m_db = pc_base::load_model('module_model');

$set = $m_db->get_one(array('module'=>'guestbook'));

$setting = string2array($set ['setting']);

$now_setting = $setting[$this->siteid];//当前站点的配置

if(isset($_POST['dosubmit'])) {

$setting[$this->siteid] = $_POST['setting'];

setcache('guestbook', $setting, 'commons');

$set = array2string($setting);

$m_db->update(array('setting'=>$set), array('module'=>ROUTE_M));

showmessage('配置更新成功', '?m=guestbook&c=guestbook&a=init');

} else {

@extract($now_setting);

include $this->admin_tpl('setting');

}

}

首先配置程序开始处,加载模块数据(module_model)模型,查询数据库模块表(module)读取模块名为guestbook的对应记录,读取留言本项模块配置setting 字段值,代码如下:

$m_db = pc_base::load_model('module_model');

$set = $m_db->get_one(array('module'=>'guestbook'));

$setting = string2array($set ['setting']);

把读取的配置字段内容,利用系统函数 string2array($set['setting'])

转化为数组,以便下面程序使用。

前面有介绍,留言本的配置也以各站点ID分别存储。不同站点存储不同的

配置选项。所以还要取出当前站点的配置信息,代码如下:

$now_setting = $setting[$this->siteid];//当前站点的配置

接下来配置程序分为二个部分:

一、显示当前站点配置选项

@extract($now_setting);

include $this->admin_tpl('setting');

extract() 函数从当前站点配置的数组中把变量导入到当前的符号表中。然后加载配置模块.进行配置选项的显示。代码如下:

二、提交当前站点配置选项

提交配置时,首先将配置信息重新写入缓存文件。然后再对模块表对应guestbook记录进行更新,把新的配置更新至数据记录里。代码如下:

if(isset($_POST['dosubmit'])) {

$setting[$this->siteid] = $_POST['setting'];

setcache('guestbook', $setting, 'commons');

$set = array2string($setting);

$m_db->update(array('setting'=>$set), array('module'=>ROUTE_M));

showmessage('配置更新成功', '?m=guestbook&c=guestbook&a=init');

}

下面对上面代码进行分析:

首先取出当前提交的配置,赋值给对应变量。$setting 为前面取出来的配置信息转化而来的数组,更新此站点的配置,只需要更新$setting里对应站点的数组。

$setting[$this->siteid] = $_POST['setting'];

重新把配置写入缓存文件

setcache('guestbook', $setting, 'commons');

Setcache() 为系统共用函数,有三个参数,分别为要生成的缓存文件名称、内容、存放路径。更详细的定义内容,请查看 文件。

然后加载模块数据模型,把最新配置信息从数组形式转化为字符串,更新至数据库中。

$set = array2string($setting);

$m_db->update(array('setting'=>$set), array('module'=>ROUTE_M));

showmessage('配置更新成功', '?m=guestbook&c=guestbook&a=init');

小结:

本小节介绍了模块配置函数的开发,其中涉及了缓存的操作方法,读缓存setcache()函数和 写缓存setcache()函数。缓存文件的读写是系统很基本的一个功能,系统多处均有使用。初学者可以详细查看一下二函数的具体参数配置。

下面是诗情画意的句子欣赏,不需要的朋友可以编辑删除!!

谢谢

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. 清风湿润,茶烟轻扬。重温旧梦,故人已去。

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. 忍花开花落,云卷云舒,品人生似棋。

62. 我离开你这一种信仰又会以怎样全新的姿势去面临更深沉的挑战

63. 人生路,路迢迢,谁道自古英雄多寂寥,若一朝,看透了,一身清风挣多少。

64. 只有夕阳站在那里。灵魂像无数的雪花飘过,光明闪烁,渐渐清醒。

65. 终于为那一身江南烟雨覆了天下,容华谢后,不过一场,山河永寂。

66. 荏苒岁月覆盖的过往,白驹过隙,匆匆的铸成一抹哀伤。

67. 忘川水不枯,记忆不散;奈何桥不断,思卿不弃;今夕,彼岸花又放,佳期约又到,我轮回践约而来,等你归来。红尘路上,伊人在否?

68. 十年生死两茫茫,不思量,自难忘,千里孤坟,无处话凄凉,纵使相逢应不识,尘满面,鬓如霜。

69. 天空飘过一朵云,有时是晴,有时是阴。但白昼终归还是白昼。

70. 我知道回不去,但还是会想念会回忆会心疼到无法自拔。

71. 天空不曾留下鸟的痕迹,但是我已飞过、在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明。

72. 人生首先要是望远镜,看远;再就是显微镜,看细;接下来是放大镜,看透;其次是太阳镜,看淡;最后是哈哈镜,笑看生活。

73. 我不是公主,也不会有等待救赎我的王子。


本文标签: 配置 模块 留言 定义

更多相关文章

华为三层二层交换机双机热备份配置举例

8月前

华为三层二层交换机双机热备份配置举例

视频监控系统配置方案 (2)

8月前

视频监控系统配置方案 (2)

ESP8266 WIFI 模块和手机通信

7月前

[db:摘要]

2023全新ChatGPT网页程序源码V4.2版本+支持用户付费套餐有后台模块

7月前

[db:摘要]

Windows 模块安装程序必须更新,才能安装此程序包。 请更新计算机上的 Windows 模块安装程序,然后重试安装。问题解决

7月前

[db:摘要]

模块“DAO350.DLL”可能与你正在运行的windows版本不兼容

7月前

[db:摘要]

宁芝普拉姆键盘说明书及帮助文档支持宏定义

3月前

[db:摘要]

笔记本电脑的WIFI模块,突然不显示了,网络也连接不上

3月前

[db:摘要]

【电脑】Wifi模块消失,只剩下飞行模式

3月前

[db:摘要]

华硕电脑wifi模块消失问题

3月前

[db:摘要]

win7计算机管理没有用户模块,Win7系统下安装ipx协议提示找不到相应的模块如何解决...

3月前

[db:摘要]

让你的网站变得更智能 - B2 Pro主题问答模块新增OpenAI ChatGPT机器人自动回答功能

3月前

[db:摘要]

Python菜鸟之路:Python基础-模块

3月前

[db:摘要]

Air系列模块常见问题列表

3月前

[db:摘要]

Python——爬虫(selenium定义、用selenium打开浏览器、获取数据、处理数据、控制浏览器)

2月前

目录 1.selenium定义 2.安装selenium浏览器驱动器 1&#xff09;下载、安装驱动器 2&#xff09;检测驱动器 3.用selenium打开浏览器 4.用selenium获取数据 5.用s

Windons7中安装python的模块出现No module named setuptools错误

2月前

没错&#xff0c;标题肯定会让看到我上一篇博客的网友感觉奇怪&#xff0c;明明上篇博客里已经遇到并成功跳过来该问题&#xff0c;按道理来说现在不应该再有这样的问题了&#xff0c;我上篇博客所说的奇葩的

PIL Image模块 show函数不能正常显示图片

2月前

在win7下面使用PIL中Image的show()函数时&#xff0c;执行下列代码&#xff1a; from PIL import Image imgImage.open("G:\1.png")

Android 物联网WIFI模块配置

2月前

在过去的接近两个月&#xff0c;接了两个小小的物联网项目外包&#xff0c;所以对WiFi模块配置以及开发有了一定的研究。那么今天来说一下物联网WIFI模块配置。研究是基于STM32 智能家居开发的。 一、背景知识 1

PyAutoGUI模块非常全的详解

1月前

目录 安装 暂停和自动防故障装置、注销 坐标的概念 获取屏幕分辨率 获取鼠标指针位置 鼠标指针交互 移动鼠标指针 单击双击鼠标 左键单击 左键双击 右键单击 中键单击 拖动鼠标 滚动鼠标 MouseInfo

4g模块注册上网 移远_小熊派4G开发板初体验

1月前

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记! 前阵子小熊派发布了一款超高性价比的4G开发板(19.8元包邮),但是板子仅限量1000套。小熊派官方也给我送了一块,我们一起来学习学习: 开发板硬件资源介绍板子做得小

发表评论

全部评论 0
暂无评论