做灯箱片的设计网站,福州建网站的公司,百度文库推广网站,南京网站建设公司排名由于笔者是刚入门thinkphp#xff0c;所以学习时对照thinkphp的官网#xff0c;各位读者也可以对照官网学习。还麻烦各位笔者一键三连#xff0c;谢谢。 1.请求对象
当前的请求对象由think\Request类负责#xff0c;该类不需要单独实例化调用#xff0c;通常使用依赖注入… 由于笔者是刚入门thinkphp所以学习时对照thinkphp的官网各位读者也可以对照官网学习。还麻烦各位笔者一键三连谢谢。 1.请求对象
当前的请求对象由think\Request类负责该类不需要单独实例化调用通常使用依赖注入即可。在其它场合则可以使用think\facade\Request静态类操作。
项目里面应该使用app\Request对象该对象继承了系统的think\Request对象但可以增加自定义方法或者覆盖已有方法。项目里面已经在provider.php中进行了定义所以你仍然可以和之前一样直接使用容器和静态代理操作请求对象。
构造方法注入
一般适用于没有继承系统的控制器类的情况。
?phpnamespace app\index\controller;use think\Request;class Index
{/*** var \think\Request Request实例*/protected $request;/*** 构造方法* param Request $request Request对象* access public*/public function __construct(Request $request){$this-request $request;}public function index(){return $this-request-param(name);}
}操作方法注入
另外一种选择是在每个方法中使用依赖注入。
?phpnamespace app\index\controller;use think\Request;class Index
{public function index(Request $request){return $request-param(name);}
}无论是否继承系统的控制器基类都可以使用操作方法注入。
静态调用
在没有使用依赖注入的场合可以通过Facade机制来静态调用请求对象的方法注意use引入的类库区别。
?phpnamespace app\index\controller;use think\facade\Request;class Index
{public function index(){return Request::param(name);}
}该方法也同样适用于依赖注入无法使用的场合。
助手函数
为了简化调用系统还提供了request助手函数可以在任何需要的时候直接调用当前请求对象。
?phpnamespace app\index\controller;class Index
{public function index(){return request()-param(name);}
}自定义请求对象
你可以在项目里面自定义Request对象修改已有的方法或者增加新的方法默认已经在项目里面为你准备了app\Request类你只需要直接修改该类就可以为你的项目单独自定义请求对象。
自定义请求对象不支持为多应用的某个应用自定义只能是全局自定义如果你需要为某个应用定义不同的请求对象可以在入口文件里面修改。例如
// 执行HTTP应用并响应
$request new app\common\Request();
$http (new App())-http;
$response $http-run($request);
$response-send();
$http-end($response);?php
namespace app\controller;
use app\BaseController;
use think\facade\Request;
use think\facade\View;
use think\facade\Route;
class RequestTest extends BaseController{//使用类有两种方式//1.先use再直接拿类名使用//2.直接使用空间名\类名public function test (){echo 1-----测试成功~~~~;//通过请求对象来获取请求信息//使用请求类得到请求对象 think\Request//1.获取请求对象-静态获取dump(Request::method());}public function test1(\think\Request $request){//2.动态获取请求对象参数绑定dump($request-method());}//3.继承父类的request属性(就是请求对象)public function test2(){dump($this-request-method());}//请求方法public function test3(){//客户端ip地址dump($this-request-ip());//当前访问的域名dump($this-request-host());//当前请求的url地址dump($this-request-url());//当前请求的路由信息dump($this-request-route());//当前请求的请求类型dump($this-request-isGet());//当前请求的请求参数dump($this-request-param());}public function test4(){//get请求//http://localhost:8000/RequestTest/test4?123dump($this-request-get());//pathinfo请求//http://localhost:8000/RequestTest/test4/123123dump($this-request-pathinfo());//通用请求dump($this-request-param());}public function add(){dump($this-request-method());if($this-request-isPost()){//获取表单提交的数据$post$this-request-param();//什么都不传默认获取全部数据$postName$this-request-param(name);dump($post);dump($postName);}else{//get请求,展示表单}return View::fetch();}}
?!DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/title
/head
bodyform action/RequestTest/add methodpost姓名input typetext namenamebr性别input typeradio namesex valuemale男input typeradio namesex valuefemale女br年龄input typenumber nameagebr邮箱input typeemail nameemailbr密码input typepassword namepasswordbr爱好input typecheckbox namehobby[] valuereading 阅读input typecheckbox namehobby[] valueswimming 游泳input typecheckbox namehobby[] valuerunning 跑步br学历select nameeducationoption valueprimary小学/optionoption valuemiddle初中/optionoption valuehigh高中/optionoption valuecollege大学/option/selectbrinput typesubmit value提交a href/RequestTest/run跳/a/form
/body
/html2.请求信息
Request对象支持获取当前的请求信息包括
方法含义host当前访问域名或者IPscheme当前访问协议port当前访问的端口remotePort当前请求的REMOTE_PORTprotocol当前请求的SERVER_PROTOCOLcontentType当前请求的CONTENT_TYPEdomain当前包含协议的域名subDomain当前访问的子域名panDomain当前访问的泛域名rootDomain当前访问的根域名url当前完整URLbaseUrl当前URL不含QUERY_STRINGquery当前请求的QUERY_STRING参数baseFile当前执行的文件rootURL访问根地址rootUrlURL访问根目录pathinfo当前请求URL的pathinfo信息含URL后缀ext当前URL的访问后缀time获取当前请求的时间type当前请求的资源类型method当前请求类型rule当前请求的路由对象实例
对于上面的这些请求方法一般调用无需任何参数但某些方法可以传入true参数表示获取带域名的完整地址例如
use think\facade\Request;
// 获取完整URL地址 不带域名
Request::url();
// 获取完整URL地址 包含域名
Request::url(true);
// 获取当前URL不含QUERY_STRING 不带域名
Request::baseFile();
// 获取当前URL不含QUERY_STRING 包含域名
Request::baseFile(true);
// 获取URL访问根地址 不带域名
Request::root();
// 获取URL访问根地址 包含域名
Request::root(true);获取当前控制器/操作
可以通过请求对象获取当前请求的控制器/操作名。
方法含义controller当前请求的控制器名action当前请求的操作名
获取当前控制器
Request::controller();返回的是控制器的驼峰形式首字母大写和控制器类名保持一致不含后缀。
如果需要返回小写可以使用
Request::controller(true);如果要返回小写下划线的方式可以使用
parse_name(Request::controller());获取当前操作
Request::action();返回的是当前操作方法的实际名称如果需要返回小写可以使用
Request::action(true);如果要返回小写下划线的方式可以使用
parse_name(Request::action());如果使用了多应用模式可以通过下面的方法来获取当前应用
app(http)-getName();3.输入变量
可以通过Request对象完成全局输入变量的检测、获取和安全过滤支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量以及文件上传信息。
use think\facade\Request;检测变量是否设置
可以使用has方法来检测一个变量参数是否设置如下
Request::has(id,get);
Request::has(name,post);变量检测可以支持所有支持的系统变量包括get/post/put/request/cookie/server/session/env/file。
变量获取
变量获取使用\think\Request类的如下方法及参数 变量类型方法(‘变量名/变量修饰符’,‘默认值’,‘过滤方法’) 变量类型方法包括
方法描述param获取当前请求的变量get获取 $_GET 变量post获取 $_POST 变量put获取 PUT 变量delete获取 DELETE 变量session获取 SESSION 变量cookie获取 $_COOKIE 变量request获取 $_REQUEST 变量server获取 $_SERVER 变量env获取 $_ENV 变量route获取 路由包括PATHINFO 变量middleware获取 中间件赋值/传递的变量file获取 $_FILES 变量all V6.0.8获取包括 $_FILES 变量在内的请求变量相当于paramfile
获取PARAM变量
PARAM类型变量是框架提供的用于自动识别当前请求的一种变量获取方式是系统推荐的获取请求参数的方法用法如下
// 获取当前请求的name变量
Request::param(name);
// 获取当前请求的所有变量经过过滤
Request::param();
// 获取当前请求未经过滤的所有变量
Request::param(false);
// 获取部分变量
Request::param([name, email]);param方法会把当前请求类型的参数和路由变量以及GET请求合并并且路由变量是优先的。 其它的输入变量获取方法和param方法用法基本一致。
你无法使用get方法获取路由变量例如当访问地址是
http://localhost/index.php/index/index/hello/name/thinkphp下面的用法是错误的
echo Request::get(name); // 输出为空正确的用法是
echo Request::param(name); // 输出thinkphp除了server和env方法的变量名不区分大小写会自动转为大写后获取其它变量名区分大小写。 默认值
获取输入变量的时候可以支持默认值例如当URL中不包含$_GET[name]的时候使用下面的方式输出的结果比较。
Request::get(name); // 返回值为null
Request::get(name,); // 返回值为空字符串
Request::get(name,default); // 返回值为default前面提到的方法都支持在第二个参数中传入默认值的方式。
变量过滤 框架默认没有设置任何全局过滤规则你可以在app\Request对象中设置filter全局过滤属性 namespace app;class Request extends \think\Request
{protected $filter [htmlspecialchars];
}也支持使用Request对象进行全局变量的获取过滤过滤方式包括函数、方法过滤以及PHP内置的Types of filters我们可以设置全局变量过滤方法支持设置多个过滤方法例如
Request::filter([strip_tags,htmlspecialchars]),也可以在获取变量的时候添加过滤方法例如
Request::get(name,,htmlspecialchars); // 获取get变量 并用htmlspecialchars函数过滤
Request::param(username,,strip_tags); // 获取param变量 并用strip_tags函数过滤
Request::post(name,,org\Filter::safeHtml); // 获取post变量 并用org\Filter类的safeHtml方法过滤可以支持传入多个过滤规则例如
Request::param(username,,strip_tags,strtolower); // 获取param变量 并依次调用strip_tags、strtolower函数过滤如果当前不需要进行任何过滤的话可以使用
// 获取get变量 并且不进行任何过滤 即使设置了全局过滤
Request::get(name, , null);对于body中提交的json对象你无需使用php://input去获取可以直接当做表单提交的数据使用因为系统已经自动处理过了 获取部分变量
如果你只需要获取当前请求的部分参数可以使用
// 只获取当前请求的id和name变量
Request::only([id,name]);采用only方法能够安全的获取你需要的变量避免额外变量影响数据处理和写入。 only方法可以支持批量设置默认值如下
// 设置默认值
Request::only([id0,name]);表示id的默认值为0name的默认值为空字符串。
默认获取的是当前请求参数PARAM类型变量如果需要获取其它类型的参数可以在第二个参数传入例如
// 只获取GET请求的id和name变量
Request::only([id,name], get);
// 等效于
Request::get([id, name]);
// 只获取POST请求的id和name变量
Request::only([id,name], post);
// 等效于
Request::post([id, name]);也支持排除某些变量后获取例如
// 排除id和name变量
Request::except([id,name]);同样支持指定变量类型获取
// 排除GET请求的id和name变量
Request::except([id,name], get);
// 排除POST请求的id和name变量
Request::except([id,name], post);变量修饰符
支持对变量使用修饰符功能可以一定程度上简单过滤变量更为严格的过滤请使用前面提过的变量过滤功能。
用法如下 Request::变量类型(‘变量名/修饰符’); 支持的变量修饰符包括
修饰符作用s强制转换为字符串类型d强制转换为整型类型b强制转换为布尔类型a强制转换为数组类型f强制转换为浮点类型
下面是一些例子
Request::get(id/d);
Request::post(name/s);
Request::post(ids/a);中间件变量
可以在中间件里面设置和获取请求变量的值这个值的改变不会影响PARAM变量的获取。
?phpnamespace app\http\middleware;class Check
{public function handle($request, \Closure $next){if (think $request-name) {$request-name ThinkPHP;}return $next($request);}
}助手函数
为了简化使用还可以使用系统提供的input助手函数完成上述大部分功能。
判断变量是否定义
input(?get.id);
input(?post.name);获取PARAM参数
input(param.name); // 获取单个参数
input(param.); // 获取全部参数
// 下面是等效的
input(name);
input();获取GET参数
// 获取单个变量
input(get.id);
// 使用过滤方法获取 默认为空字符串
input(get.name);
// 获取全部变量
input(get.);使用过滤方法
input(get.name,,htmlspecialchars); // 获取get变量 并用htmlspecialchars函数过滤
input(username,,strip_tags); // 获取param变量 并用strip_tags函数过滤
input(post.name,,org\Filter::safeHtml); // 获取post变量 并用org\Filter类的safeHtml方法过滤使用变量修饰符
input(get.id/d);
input(post.name/s);
input(post.ids/a);4.请求类型
获取请求类型
在很多情况下面我们需要判断当前操作的请求类型是GET、POST、PUT、DELETE或者HEAD一方面可以针对请求类型作出不同的逻辑处理另外一方面有些情况下面需要验证安全性过滤不安全的请求。
请求对象Request类提供了下列方法来获取或判断当前请求类型
用途方法获取当前请求类型method判断是否GET请求isGet判断是否POST请求isPost判断是否PUT请求isPut判断是否DELETE请求isDelete判断是否AJAX请求isAjax判断是否PJAX请求isPjax判断是否JSON请求isJson判断是否手机访问isMobile判断是否HEAD请求isHead判断是否PATCH请求isPatch判断是否OPTIONS请求isOptions判断是否为CLI执行isCli判断是否为CGI模式isCgi method方法返回的请求类型始终是大写这些方法都不需要传入任何参数。 没有必要在控制器中判断请求类型再来执行不同的逻辑完全可以在路由中进行设置。 请求类型伪装
支持请求类型伪装可以在POST表单里面提交_method变量传入需要伪装的请求类型例如
form methodpost actioninput typetext namename valueHelloinput typehidden name_method valuePUT input typesubmit value提交
/form提交后的请求类型会被系统识别为PUT请求。 你可以设置为任何合法的请求类型包括GET、POST、PUT和DELETE等但伪装变量_method只能通过POST请求进行提交。 如果要获取原始的请求类型可以使用
Request::method(true);在命令行下面执行的话请求类型返回的始终是GET。 如果你需要改变伪装请求的变量名可以修改自定义Request类的varMethod属性
AJAX/PJAX伪装
可以对请求进行AJAX请求伪装如下
http://localhost/index?_ajax1或者PJAX请求伪装
http://localhost/index?_pjax1如果你需要改变伪装请求的变量名可以修改自定义Request类的varAjax和varPjax属性 _ajax和_pjax可以通过GET/POST/PUT等请求变量伪装。 5.HTTP头信息
可以使用Request对象的header方法获取当前请求的HTTP请求头信息例如
$info Request::header();
echo $info[accept];
echo $info[accept-encoding];
echo $info[user-agent];也可以直接获取某个请求头信息例如
$agent Request::header(user-agent);HTTP请求头信息的名称不区分大小写并且_会自动转换为-所以下面的写法都是等效的
$agent Request::header(user-agent);
$agent Request::header(USER_AGENT);6.伪静态
URL伪静态通常是为了满足更好的SEO效果ThinkPHP支持伪静态URL设置可以通过设置url_html_suffix参数随意在URL的最后增加你想要的静态后缀而不会影响当前操作的正常执行。例如我们在route.php中设置
url_html_suffix shtml的话我们可以把下面的URL
http://serverName/blog/read/id/1变成
http://serverName/blog/read/id/1.shtml后者更具有静态页面的URL特征但是具有和前面的URL相同的执行效果并且不会影响原来参数的使用。
默认情况下伪静态的设置为html如果我们设置伪静态后缀为空字符串
url_html_suffix则支持所有的静态后缀访问如果要获取当前的伪静态后缀可以使用Request对象的ext方法。
例如
http://serverName/blog/3.html
http://serverName/blog/3.shtml
http://serverName/blog/3.xml
http://serverName/blog/3.pdf都可以正常访问。
我们可以在控制器的操作方法中获取当前访问的伪静态后缀例如
$ext Request::ext();如果希望支持多个伪静态后缀可以直接设置如下
// 多个伪静态后缀设置 用|分割
url_html_suffix html|shtml|xml那么当访问 http://serverName/blog/3.pdf 的时候会报系统错误。
如果要关闭伪静态访问可以设置
// 关闭伪静态后缀访问
url_html_suffix false,关闭伪静态访问后不再支持伪静态方式的URL访问并且伪静态后缀将会被解析为最后一个参数的值例如
http://serverName/blog/read/id/3.html最终的id参数的值将会变成 3.html。
7.参数绑定
参数绑定是把当前请求的变量作为操作方法也包括架构方法的参数直接传入参数绑定并不区分请求类型。 参数绑定传入的值会经过全局过滤如果你有额外的过滤需求可以在操作方法中单独处理。 参数绑定方式默认是按照变量名进行绑定例如我们给Blog控制器定义了两个操作方法read和archive方法由于read操作需要指定一个id参数archive方法需要指定年份year和月份month两个参数那么我们可以如下定义
?php
namespace app\controller;class Blog
{public function read($id){return id . $id;}public function archive($year, $month01){return year . $year . month . $month;}
}注意这里的操作方法并没有具体的业务逻辑只是简单的示范。 URL的访问地址分别是
http://serverName/index.php/blog/read/id/5
http://serverName/index.php/blog/archive/year/2016/month/06两个URL地址中的id参数和year和month参数会自动和read操作方法以及archive操作方法的同名参数绑定。 变量名绑定不一定由访问URL决定路由地址也能起到相同的作用 输出的结果依次是
id5
year2016month06按照变量名进行参数绑定的参数必须和URL中传入的变量名称一致但是参数顺序不需要一致。也就是说
http://serverName/index.php/blog/archive/month/06/year/2016和上面的访问结果是一致的URL中的参数顺序和操作方法中的参数顺序都可以随意调整关键是确保参数名称一致即可。
如果用户访问的URL地址是
http://serverName/index.php/blog/read那么会抛出下面的异常提示 参数错误:id
报错的原因很简单因为在执行read操作方法的时候id参数是必须传入参数的但是方法无法从URL地址中获取正确的id参数信息。由于我们不能相信用户的任何输入因此建议你给read方法的id参数添加默认值例如
public function read($id 0)
{return id . $id;
}这样当我们访问 http://serverName/index.php/blog/read/ 的时候 就会输出
id0始终给操作方法的参数定义默认值是一个避免报错的好办法依赖注入参数除外 为了更好的配合前端规范支持自动识别小写下划线的请求变量使用驼峰注入例如
http://serverName/index.php/blog/read/blog_id/5可以使用下面的方式接收blog_id变量所以请确保在方法的参数使用驼峰首字母小写规范。
public function read($blogId 0)
{return id . $blogId;
}8.请求缓存
支持请求缓存功能支持对GET请求设置缓存访问并设置有效期。 请求缓存仅对GET请求有效 有两种方式可以设置请求缓存
路由设置
可以在路由规则里面调用cache方法设置当前路由规则的请求缓存例如
// 定义GET请求路由规则 并设置3600秒的缓存
Route::get(new/:id,News/read)-cache(3600);第二次访问相同的路由地址的时候会自动获取请求缓存的数据响应输出并发送304状态码。
默认请求缓存的标识为当前访问的pathinfo地址可以定义请求缓存的标识如下
// 定义GET请求路由规则 并设置3600秒的缓存
Route::get(new/:id,News/read)-cache([ new/:id/:page, 3600]
);:id、:page表示使用当前请求的param参数进行动态标识替换也就是根据id和page变量进行3600秒的请求缓存。 如果cache参数传入false则表示关闭当前路由的请求缓存即使开启全局请求缓存。 // 定义GET请求路由规则 并关闭请求缓存即使开启了全局请求缓存
Route::get(new/:id,News/read)-cache(false);支持给一组路由设置缓存标签
// 定义GET请求路由规则 并设置3600秒的缓存
Route::get(new/:id,News/read)-cache([ new/:id/:page, 3600, page]
);这样可以在需要的时候统一清理缓存标签为page的请求缓存。
全局请求缓存
如果需要开启全局请求缓存只需要在全局或者应用的中间件定义文件middleware.php中增加 think\middleware\CheckRequestCache,然后只需要在route.php配置文件中设置全局缓存的有效时间秒
request_cache_expire 3600,就会自动根据当前请求URL地址只针对GET请求类型进行请求缓存全局缓存有效期为3600秒。
如果需要对全局缓存设置缓存规则可以直接设置request_cache_key参数例如
request_cache_key __URL__,
request_cache_expire 3600,缓存标识支持下面的特殊定义
标识含义__CONTROLLER__当前控制器名__ACTION__当前操作名__URL__当前完整URL地址包含域名
全局请求缓存支持设置排除规则使用方法如下
request_cache_key true,
request_cache_expire 3600,
request_cache_except [/blog/index,/user/member,
],排除规则为不使用请求缓存的地址不支持变量开头部分不区分大小写。 public function run(){//URL生成echo Route::buildUrl().br;//生成当前控制器的URLecho Route::buildUrl(add).br;//访问其他控制器的URLecho Route::buildUrl(Index/index).br;//其他应用下的URLecho Route::buildUrl(admin/index/index).br;//访问时带参数echo Route::buildUrl(add, [id 123]).br;//访问时带多个参数echo Route::buildUrl(add, [id 123, name thinkphp]).br;//config下的route.ph可以修改静态路由规则//修改伪静态后缀名echo Route::buildUrl(RequestTest/test, [], .shtml).br;//带上域名echo Route::buildUrl(RequestTest/test, [], .shtml)-domain(www.thinkphp.cn).br;return 跳过;}如果您在浏览文章的时候发现了错误还请您在评论区留言笔者看到后会在第一时间处理谢谢。
文章转载自: http://www.morning.srkzd.cn.gov.cn.srkzd.cn http://www.morning.cbpmq.cn.gov.cn.cbpmq.cn http://www.morning.cfnsn.cn.gov.cn.cfnsn.cn http://www.morning.kmldm.cn.gov.cn.kmldm.cn http://www.morning.dkgtr.cn.gov.cn.dkgtr.cn http://www.morning.hryhq.cn.gov.cn.hryhq.cn http://www.morning.zxznh.cn.gov.cn.zxznh.cn http://www.morning.xhrws.cn.gov.cn.xhrws.cn http://www.morning.rxhn.cn.gov.cn.rxhn.cn http://www.morning.ldspj.cn.gov.cn.ldspj.cn http://www.morning.nlygm.cn.gov.cn.nlygm.cn http://www.morning.qtzqk.cn.gov.cn.qtzqk.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.zcwwb.cn.gov.cn.zcwwb.cn http://www.morning.jcxyq.cn.gov.cn.jcxyq.cn http://www.morning.jzlfq.cn.gov.cn.jzlfq.cn http://www.morning.skrrq.cn.gov.cn.skrrq.cn http://www.morning.tnqk.cn.gov.cn.tnqk.cn http://www.morning.zlff.cn.gov.cn.zlff.cn http://www.morning.qkrzn.cn.gov.cn.qkrzn.cn http://www.morning.tdwjj.cn.gov.cn.tdwjj.cn http://www.morning.mgnrc.cn.gov.cn.mgnrc.cn http://www.morning.rsqpc.cn.gov.cn.rsqpc.cn http://www.morning.nmfxs.cn.gov.cn.nmfxs.cn http://www.morning.bpmns.cn.gov.cn.bpmns.cn http://www.morning.mrpqg.cn.gov.cn.mrpqg.cn http://www.morning.qnzpg.cn.gov.cn.qnzpg.cn http://www.morning.mxftp.com.gov.cn.mxftp.com http://www.morning.mwrxz.cn.gov.cn.mwrxz.cn http://www.morning.twmp.cn.gov.cn.twmp.cn http://www.morning.rbkml.cn.gov.cn.rbkml.cn http://www.morning.ssjtr.cn.gov.cn.ssjtr.cn http://www.morning.nktgj.cn.gov.cn.nktgj.cn http://www.morning.znpyw.cn.gov.cn.znpyw.cn http://www.morning.xqqcq.cn.gov.cn.xqqcq.cn http://www.morning.ndynz.cn.gov.cn.ndynz.cn http://www.morning.qzmnr.cn.gov.cn.qzmnr.cn http://www.morning.xlpdm.cn.gov.cn.xlpdm.cn http://www.morning.znrlg.cn.gov.cn.znrlg.cn http://www.morning.nkllb.cn.gov.cn.nkllb.cn http://www.morning.tmrjb.cn.gov.cn.tmrjb.cn http://www.morning.xwnnp.cn.gov.cn.xwnnp.cn http://www.morning.rzcfg.cn.gov.cn.rzcfg.cn http://www.morning.nbmyg.cn.gov.cn.nbmyg.cn http://www.morning.xnnxp.cn.gov.cn.xnnxp.cn http://www.morning.tkzrh.cn.gov.cn.tkzrh.cn http://www.morning.snnkt.cn.gov.cn.snnkt.cn http://www.morning.ftnhr.cn.gov.cn.ftnhr.cn http://www.morning.frtb.cn.gov.cn.frtb.cn http://www.morning.wgcng.cn.gov.cn.wgcng.cn http://www.morning.ffhlh.cn.gov.cn.ffhlh.cn http://www.morning.wrkhf.cn.gov.cn.wrkhf.cn http://www.morning.mqwdh.cn.gov.cn.mqwdh.cn http://www.morning.iknty.cn.gov.cn.iknty.cn http://www.morning.wklmj.cn.gov.cn.wklmj.cn http://www.morning.qggm.cn.gov.cn.qggm.cn http://www.morning.ntwxt.cn.gov.cn.ntwxt.cn http://www.morning.srgwr.cn.gov.cn.srgwr.cn http://www.morning.ishoufeipin.cn.gov.cn.ishoufeipin.cn http://www.morning.bszmy.cn.gov.cn.bszmy.cn http://www.morning.yrms.cn.gov.cn.yrms.cn http://www.morning.wpspf.cn.gov.cn.wpspf.cn http://www.morning.fpngg.cn.gov.cn.fpngg.cn http://www.morning.gycyt.cn.gov.cn.gycyt.cn http://www.morning.wlbwp.cn.gov.cn.wlbwp.cn http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.pjftk.cn.gov.cn.pjftk.cn http://www.morning.jtrqn.cn.gov.cn.jtrqn.cn http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn http://www.morning.mkrqh.cn.gov.cn.mkrqh.cn http://www.morning.rzcmn.cn.gov.cn.rzcmn.cn http://www.morning.tyklz.cn.gov.cn.tyklz.cn http://www.morning.bfcrp.cn.gov.cn.bfcrp.cn http://www.morning.ryfq.cn.gov.cn.ryfq.cn http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn http://www.morning.tnmmp.cn.gov.cn.tnmmp.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.tcxk.cn.gov.cn.tcxk.cn http://www.morning.xhklb.cn.gov.cn.xhklb.cn http://www.morning.qywfw.cn.gov.cn.qywfw.cn