Welcome to Liuxinxiu'S Blog.
第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

HTTP的幂等性

[不指定 2018/06/27 03:32 | by 刘新修 ]

HTTP的幂等性

HTTP协议本身是一种面向资源的应用层协议,但对HTTP协议的使用实际上存在着两种不同的方式:一种是RESTful的,它把HTTP当成应用层协议,比较忠实地遵守了HTTP协议的各种规定;另一种是SOA的,它并没有完全把HTTP当成应用层协议,而是把HTTP协议作为了传输层协议,然后在HTTP之上建立了自己的应用层协议。本文所讨论的HTTP幂等性主要针对RESTful风格的,不过正如上一节所看到的那样,幂等性并不属于特定的协议,它是分布式系统的一种特性;所以,不论是SOA还是RESTful的Web API设计都应该考虑幂等性。下面将介绍HTTP GET、DELETE、PUT、POST四种主要方法的语义和幂等性。

HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。

HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.com/article/4231,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。

比较容易混淆的是HTTP POST和PUT。POST和PUT的区别容易被简单地误认为“POST表示创建资源,PUT表示更新资源”;而实际上,二者均可用于创建资源,更为本质的差别是在幂等性方面。在HTTP规范中对POST和PUT是这样定义的:

The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line ...... If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.

The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.

POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。而PUT所对应的URI是要创建或更新的资源本身。比如:PUT http://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。

在介绍了几种操作的语义和幂等性之后,我们来看看如何通过Web API的形式实现前面所提到的取款功能。很简单,用POST /tickets来实现create_ticket;用PUT /accounts/account_id/ticket_id?amount=xxx来实现idempotent_withdraw。值得注意的是严格来讲amount参数不应该作为URI的一部分,真正的URI应该是/accounts/account_id/ticket_id,而amount应该放在请求的body中。这种模式可以应用于很多场合,比如:论坛网站中防止意外的重复发帖。

总结

上面简单介绍了幂等性的概念,用幂等设计取代分布式事务的方法,以及HTTP主要方法的语义和幂等性特征。其实,如果要追根溯源,幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同,有兴趣的读者可以从Wikipedia上进一步了解。

Tags: , , ,

 ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范。commonjs主要应用于服务器,实现同步加载,如nodejs。AMD规范应用于浏览器,如requirejs,为异步加载。同时还有CMD规范,为同步加载方案如seaJS。

ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。

ES6模块主要有两个功能:export和import

export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口

import用于在一个模块中加载另一个含有export接口的模块。

也就是说使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。如下图(假设a和b文件在同一目录下)

JavaScript代码
  1. // a.js  
  2.   
  3. var sex="boy";  
  4. var echo=function(value){  
  5.   console.log(value)  
  6. }  
  7. export {sex,echo}    
  8. //通过向大括号中添加sex,echo变量并且export输出,就可以将对应变量值以sex、echo变量标识符形式暴露给其他文件而被读取到  
  9. //不能写成export sex这样的方式,如果这样就相当于export "boy",外部文件就获取不到该文件的内部变量sex的值,因为没有对外输出变量接口,只是输出的字符串。  
JavaScript代码
  1. // b.js  
  2. 通过import获取a.js文件的内部变量,{}括号内的变量来自于a.js文件export出的变量标识符。  
  3. import {sex,echo} from "./a.js"   
  4. console.log(sex)   // boy  
  5. echo(sex) // boy  

a.js文件也可以按如下export语法写,但不如上边直观,不太推荐。

JavaScript代码
  1. // a.js  
  2. export var sex="boy";  
  3. export var echo=function(value){  
  4.   console.log(value)  
  5. }  
  6.   
  7. //因为function echo(){}等价于 var echo=function(){}所以也可以写成  
  8. export function echo(value){  
  9.    console.log(value)  
  10. }  

以上是export与module的基本用法,再进行拓展学习

前面的例子可以看出,b.js使用import命令的时候,用户需要知道a.js所暴露出的变量标识符,否则无法加载。可以使用export default命令,为模块指定默认输出,这样就不需要知道所要加载模块的变量名。

JavaScript代码
  1. //a.js  
  2. var sex="boy";  
  3. export default sex(sex不能加大括号)  
  4. //原本直接export sex外部是无法识别的,加上default就可以了.但是一个文件内最多只能有一个export default。  
  5. 其实此处相当于为sex变量值"boy"起了一个系统默认的变量名default,自然default只能有一个值,所以一个文件内不能有多个export default。  
JavaScript代码
  1. // b.js  
  2. 本质上,a.js文件的export default输出一个叫做default的变量,然后系统允许你为它取任意名字。所以可以为import的模块起任何变量名,且不需要用大括号包含  
  3. import any from "./a.js"  
  4. import any12 from "./a.js"   
  5. console.log(any,any12)   // boy,boy  

 

Tags: , ,

ES6 fetch函数与后台交互

[不指定 2018/06/25 09:21 | by 刘新修 ]

 最近在学习react-native,遇到调用后端接口的问题.看了看官方文档,推荐使用es6的fetch来与后端进行交互,在网上找了一些资料.在这里整理,方便以后查询.

1.RN官方文档中,可使用XMLHttpRequest

var request = new XMLHttpRequest(); request.onreadystatechange = (e) => { if (request.readyState !== 4) { return; } if (request.status === 200) { console.log('success', request.responseText); } else { console.warn('error'); } }; request.open('GET', 'https://mywebsite.com/endpoint.php'); request.send();

这是http的原生方法,这里不做多的介绍.

2.RN官方文档中,推荐使用fetch

fetch('https://mywebsite.com/endpoint/', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ firstParam: 'yourValue', secondParam: 'yourOtherValue', }) }).then(function(res){
console.log(res)
})
body中的数据就是我们需要向服务器提交的数据,比如用户名,密码等;如果上述body中的数据提交失败,那么你可能需要把数据转换成如下的表单提交的格式:

fetch('https://mywebsite.com/endpoint/', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: 'key1=value1&key2=value2' }).then(function(res){

  console.log(res)
})
这样可以获取纯文本的返回数据.
如果你需要返回json格式的数据:
fetch('
https://mywebsite.com/endpoint/').then(function(res) {

    if (res.ok) {

        res.json().then(function(obj) {

            // 这样数据就转换成json格式的了

        })

    }

}, function(ex) {

    console.log(ex)

})

fetch模拟表单提交:

fetch('doAct.action', { 

    method: 'post'

    headers: { 

      "Content-type""application/x-www-form-urlencoded; charset=UTF-8" 

    }, 

    body: 'foo=bar&lorem=ipsum' 

  })

  .then(json) 

  .then(function (data) { 

    console.log('Request succeeded with JSON response', data); 

  }) 

  .catch(function (error) { 

    console.log('Request failed', error); 

  });

不过无论是ajax还是fetch,都是对http进行了一次封装,大家各取所好吧.
Tags: ,

Nuxt.js踩坑分享

[不指定 2018/05/22 09:11 | by 刘新修 ]

 

构建问题

1. 如何在 head 里面引入js文件?

背景: 在<head>标签中,以inline的形式引入flexible.js文件。本项目主要为移动端项目,引入flexible.js 实现移动端适配问题。

Nuxt.js 通过 vue-meta 实现头部标签管理,通过查看文档发现,可以按照如下方式配置:

// nuxt.config.js head: {   script: [     { innerHTML: 'console.log("hello")', type: 'text/javascript', charset: 'utf-8'}   ] }

结果,生成 html:

<script data-n-head="true" type="text/javascript" charset="utf-8">console.log(&quot;hello&quot;)</script>

我们发现 vue-meta 把引号做了转义处理,加入 __dangerouslyDisableSanitizers: ['script'] 后,就不会再对这些字符做转义了,该字段使用需慎重!

接下来,要把 console.log("hello") 的内容替换成 flexible.js,配置升级之后:

head: {   script: [{ innerHTML: require('./assets/js/flexible'), type: 'text/javascript', charset: 'utf-8'}],   __dangerouslyDisableSanitizers: ['script'] }

踩坑成功,下一个坑...

2. 如何使用预处理器

背景:在组件中的<template>, <script> 或 <style> 上使用各种预处理器,加上处理器后,控制台报错。
<style lang="sass"> .red   color: red </style>

这个问题解决方法非常简单,只需要安装这些依赖就好。

npm install --save-dev node-sass sass-loader

但是解决过程并不是很顺利的,在阅读中文文档时,忽略版本号,按照上面的提示进行操作,发现不能成功,后来各种debug,最后发现了该解决方案。后知后觉的发现了中文文档的版本号过低,如果需要查看文档,一定要看最新版本的英文文档!

3. 如何使用px2rem

背景:在css中,写入px,通过px2rem loader,将px转换成rem

在以前的项目中,是通过 px2rem loader实现的,但是在Nuxt.js项目下,添加 css loader 还是很费力的,因为涉及到vue-loader

想到了一个其他方案,可以使用 postcss 处理。可以在 nuxt.config.js 文件中添加配置,也可以在postcss.conf.js文件中添加。

build: {   postcss: [     require('postcss-px2rem')({       remUnit: 75 // 转换基本单位     })   ] },

4. 如何拓展 webpack 配置

背景:给 utils 目录添加别名

刚刚说到,Nuxt.js内置了 webpack 配置,如果想要拓展配置,可以在 nuxt.config.js 文件中添加。同时也可以在该文件中,将配置信息打印出来。

extend (config, ctx) {   console.log('webpack config:', config)   if (ctx.isClient) {     // 添加 alias 配置     Object.assign(config.resolve.alias, {       'utils': path.resolve(__dirname, 'utils')     })   } }

5. 如何添加 vue plugin

背景:自己封装了一个 toast vue plugin,由于 vue 实例化的过程没有暴露出来,不知道在哪个时机注入进去。

可以在 nuxt.config.js 中添加 plugins 配置,这样插件就会在 Nuxt.js 应用初始化之前被加载导入。

module.exports = {   plugins: ['~plugins/toast'] }

~plugins/toast.js 文件:

import Vue from 'vue' import toast from '../utils/toast' import '../assets/css/toast.css'  Vue.use(toast)

6.如何修改环境变量 NODE_ENV

背景:在项目中,设置 3个 NODE_ENV 的值,来对应不同的版本。development,本地开发;release,预发布版本;production,线上版本。其中,预发布版本比production版本,多出vconsole。
// package.json "scripts": {   "buildDev": "cross-env NODE_ENV=release nuxt build && backpack build",   "startDev": "cross-env NODE_ENV=release PORT=3000 node build/main.js"   },

打印 process.env.NODE_ENV 依旧是,production

在 backpack 的源码中,找到了答案,在 执行 backpack build 命令时,会把 process.env.NODE_ENV 修改为 production,并且是写死的不可配置的......

无奈下,只能在 process.env 下,添加 __ENV 属性,代表 NODE_ENV

clipboard.png

这时,在页面中打印出来的信息 process.env.__ENV undefined,但是可以打印出 process.env.NODE_ENV

可以通过配置 nuxt.config.js 中的,env属性,解决该问题。

env: {   __ENV: process.env.__ENV }

开发问题

1. Window 或 Document 对象未定义?

背景: 在引入第三方插件,或者直接在代码中写 window 时,控制台会给出警告,window 未定义。

发生在这个问题的原因时,node服务端并没有window 或 document 对象。解决方法,通过 process.browser 来区分环境。

if (process.browser) {   // 引入第三方插件   require('***')   // 或者修改window对象下某一属性   window.mbk = {} }

SyntaxError: Unexpected token ...

[不指定 2018/05/22 09:08 | by 刘新修 ]

 D:\code\nuxtjsdemo\node_modules\nuxt\lib\core\middleware\nuxt.js:72

      const policies = this.options.render.csp.policies ? {...this.options.rende r.csp.policies} : null  SyntaxError: Unexpected token ... 

平台环境
nodejs 8.2.0
vue-cli 2.9.3

 

写得很明确了

SyntaxError: Unexpected token ...

对象解构赋值语法报错

解决方案:

  1. 查一下 node 9.x 已经支持 对象解构赋值了没有,换更新的nodejs
  2. 如果还未支持,使用babel + babel 插件babel-plugin-transform-object-rest-spread

Vue2.0+组件库总结

[不指定 2018/05/18 08:26 | by 刘新修 ]

UI组件

开发框架

实用库

服务端

  • nuxt.js - 用于服务器渲染Vue app的最小化框架

  • express-vue - 简单的使用服务器端渲染vue.js

  • vue-ssr - 非常简单的VueJS服务器端渲染模板

  • vue-ssr - 结合Express使用Vue2服务端渲染

  • vue-easy-renderer - Nodejs服务端渲染

辅助工具

应用实例

Demo示例

 

C#代码
  1. mkdir -p /data/nodejs/htdocs/vue/nuxt/ycw  
  2. /data/nodejs/htdocs/vue/nuxt/ycw  
  3. wget http://192.168.180.91/CNMO/vue-nuxt2.tar  
  4. tar xvf vue-nuxt2.tar  
  5. npm i  
  6. npm run build  
  7. npm run start  
  8.  
  9. #########################################  
  10. vi node_modules/nuxt/bin/nuxt-start  
  11. host = "0.0.0.0"  
  12. #########################################  
  13. "config": {  
  14.     "nuxt": {  
  15.         "host""127.0.0.1",  
  16.         "port""3000"  
  17.     }  
  18. },  
  19. "config": {  
  20.     "nuxt": {  
  21.         "host""0.0.0.0",  
  22.         "port""3000"  
  23.     }  
  24. },  
  25.  
  26. #########################################  
  27. node node_modules/nuxt/bin/nuxt-start   
  28.  
  29. #########################################  
  30. 如果出现错误无法启动  
  31. ps | grep node  
  32. kill <id>  

Linux 搜索文件中的字符串

[不指定 2017/12/27 06:07 | by 刘新修 ]
C#代码
  1. [root@sd-cnmo-lidandan-web1 www]# find -type f -name '*.php'|xargs grep 'Plugin_Header'  
Tags: ,
PHP代码
  1. <?php  
  2.   
  3.     /****** 获取版本号 || 获取Cookie ******/  
  4.     if (isset($_COOKIE["BUILD_NUMBER"])){  
  5.         $_Assets = "?v=".$_COOKIE['BUILD_NUMBER'];  
  6.     }else{  
  7.         $_Assets = "";  
  8.     }  
  9.     /********** 2018年度节日汇总 || 2017-12-19 *************
  10.     元旦      -- yuandan  ||  - 201730、31-01
  11.     春节      -- chunjie  ||  - 20180215-21
  12.     元宵节    -- yuanxiao ||  - 20180302
  13.     情人节    -- qingren  ||  - 20180214
  14.     妇女节    -- funv     ||  - 20180308
  15.     劳动节    -- laodong  ||  - 20180501-
  16.     母亲节    -- muqin    ||  - 20180513
  17.     儿童节    -- ertong   ||  - 20180601
  18.     端午节    -- duanwu   ||  - 20180616-18
  19.     父亲节    -- fuqin    ||  - 20180616-18
  20.     七夕节    -- qixi     ||  - 20180817
  21.     教师节    -- jiaoshi  ||  - 20180910
  22.     中秋节    -- zhongqiu ||  - 20180922-24
  23.     国庆节    -- guoqing  ||  - 20181001-07
  24.     圣诞节    -- shengdan ||  - 20181225
  25.     双11      -- 1111     ||  - 20181111
  26.     双12      -- 1212     ||  - 20181212
  27.     京东618   -- 618      ||  - 20180618
  28.     苏宁818   -- 818      ||  - 20180818
  29.     *****************************************/  
  30.     $dayArr = array('yuandan=2017-12-30+1',    //3天-跨  
  31.                     'yuandan=2018-01-01+0',    //3天-跨  
  32.                     'chunjie=2017-02-15+6',    //7天  
  33.                     'qingren=2018-02-14+0',    //1天  
  34.                     'funv=2018-03-08+0',       //1天  
  35.                     'laodong=2018-04-29+1',    //3天-跨  
  36.                     'laodong=2018-05-01+0',    //3天-跨  
  37.                     'muqin=2018-05-13+0',      //1天  
  38.                     'ertong=2018-06-01+0',     //1天  
  39.                     'duanwu=2018-06-16+2',     //3天  
  40.                     'fuqin=2018-06-17+0',      //1天  
  41.                     'qixi=2018-08-17+0',       //1天  
  42.                     'jiaoshi=2018-09-10+0',    //1天  
  43.                     'zhongqiu=2018-09-22+2',   //3天  
  44.                     'guoqing=2018-10-01+6',    //7天  
  45.                     'shengdan=2018-12-25+0',   //1天  
  46.                     'd1111=2018-11-11+0',      //1天  
  47.                     'd1212=2018-12-12+0',      //1天  
  48.                     'd618=2018-06-18+0',       //1天  
  49.                     'd818=2017-12-12+0');      //1天  
  50.     /**********************************************
  51.      遍历数组判断,添加Class标记
  52.     **********************************************/  
  53.     $dayNux = count($dayArr);  
  54.     if(isset($_GET["day"])&&!emptyempty($_GET["day"])){  
  55.         $currentDate = $_GET["day"];  
  56.     }else{  
  57.         $currentDate = date('Ymd');  
  58.     }  
  59.     for($i=0;$i<$dayNux;++$i){  
  60.         $dayData = $dayArr[$i];  
  61.         $dayNums = substr(strrchr($dayData, "+"),1);  
  62.         $dayAlls = substr($dayData,0,strrpos($dayData,'+'));  
  63.         $dayStar = substr(strrchr($dayAlls, "="),1);  
  64.         $dayName = substr($dayAlls,0,strrpos($dayAlls,'='));  
  65.         $flagSt = $currentDate-(str_replace("-","",$dayStar));  
  66.         /****** 命中退出 ******/  
  67.         if($flagSt>-1&&$flagSt<=$dayNums){  
  68.             $dayClass=' '.$dayName;  
  69.             break;  
  70.         }else{  
  71.             if($i==$dayNux-1){  
  72.                $dayClass='';  
  73.             }  
  74.         }  
  75.     }  
  76.   
  77. ?>  

111

PHP代码
  1. <?php   
  2. /** 
  3.  * Ajax.class.php 
  4.  * ============================================== 
  5.  * Copy right 2016-2999 http://www.cnmo.com 
  6.  * ---------------------------------------------- 
  7.  * 修改之前请加上修改人和修改日志 
  8.  * ============================================== 
  9.  * @param 手机中国 - 平台中心 - TECH 
  10.  * @return return_type 
  11.  * @author: zhangyang 
  12.  * @date: 2016-10-10 
  13.  * @version: v1.0.0 
  14.  */  
  15. class Controller_Ajax extends CC_Core_Controller  
  16. {  
  17.     /** 
  18.      * @func: 大家都在玩 
  19.      * @date: 2016-10-10  
  20.      * @author: zhangyang 
  21.      * @return: 大家都在玩 
  22.      */  
  23.     public function doGetAllPlay()  
  24.     {  
  25.         $platform = (int) $_REQUEST['platform'];  
  26.           
  27.         $appInfo  = Service_Home :: getAppList($platform, 0, 4);  
  28.         $gameInfo = Service_Home :: getGameList($platform, 0, 4);  
  29.         $allPlayInfo = CC_Kit_String :: iconv('gbk','utf-8',array('appList' => $appInfo,'gameList' => $gameInfo));  
  30.         echo json_encode($allPlayInfo);  
  31.         die;  
  32.     }  
  33.       
  34.     /** 
  35.      * @desc: 获取投诉列表 
  36.      * @author: zhangyang 
  37.      * @date: 2016-10-10 
  38.      */  
  39.     public function doGetComplain()  
  40.     {  
  41.         $complain = Service_Home::getComplain();  
  42.         $complain = CC_Kit_String::iconv('gbk''utf-8'$complain);  
  43.           
  44.         echo json_encode($complain);  
  45.         die;  
  46.     }  
  47.       
  48.     /** 
  49.      * 活动包版 
  50.      * @author lidandan 
  51.      * @version 2016-12-28 
  52.      */  
  53.     // public function doActive()  
  54.     // {  
  55.     //     $nowtime = date('Y-m-d H:i:s', time());  
  56.               
  57.     //     $status = 0;  
  58.     //     if($nowtime >= '2016-12-30 10:00:00' && $nowtime <= '2017-01-02 23:59:59'){//奥运会包版  
  59.     //         $status = 1;  
  60.     //     }elseif($nowtime >= '2017-01-23 00:00:00' && $nowtime <= '2017-02-02 23:59:59'){//新年包版  
  61.     //         $status = 2;  
  62.     //     }elseif($nowtime >= '2017-02-10 16:00:00' && $nowtime <= '2017-02-12 23:59:59'){//元宵节  
  63.     //         $status = 3;  
  64.     //     }elseif($nowtime >= '2017-02-14 00:00:00' && $nowtime <= '2017-02-14 23:59:59'){//情人节  
  65.     //         $status = 4;  
  66.     //     }elseif($nowtime >= '2017-03-07 10:00:00' && $nowtime <= '2017-03-08 23:59:59'){//妇女节  
  67.     //         $status = 5;  
  68.     //     }elseif($nowtime >= '2017-04-01 13:30:00' && $nowtime <= '2017-04-04 23:59:59'){//清明节  
  69.     //         $status = 6;  
  70.     //     }elseif($nowtime >= '2017-04-27 12:00:00' && $nowtime <= '2017-05-02 12:00:00'){//五一  
  71.     //         $status = 7;  
  72.     //     }elseif($nowtime >= '2017-05-14 00:00:00' && $nowtime <= '2017-05-14 23:59:59'){//母亲节  
  73.     //         $status = 8;  
  74.     //     }elseif($nowtime >= '2017-05-27 12:00:00' && $nowtime <= '2017-05-30 23:59:59'){//端午  
  75.     //         $status = 9;  
  76.     //     }elseif($nowtime >= '2017-06-01 03:00:00' && $nowtime <= '2017-06-01 23:59:59'){//六一  
  77.     //         $status = 10;  
  78.     //     }elseif($nowtime >= '2017-06-18 00:00:00' && $nowtime <= '2017-06-18 23:59:59'){//父亲节  
  79.     //         $status = 11;  
  80.     //     }  
  81.       
  82.     //     echo $status;  
  83.     //     exit;  
  84.     // }  
  85.   
  86.   
  87.     /** 
  88.      * 活动包版 
  89.      * @author liuxinxiu 
  90.      * @version 2017-12-20 
  91.      */  
  92.     public function doActive()  
  93.     {  
  94.         /********** 2018年度节日汇总 || 2017-12-19 ************* 
  95.         ======================================= 
  96.         名称        代码(class)  ||   时间跨度 
  97.         ======================================= 
  98.         元旦      -- yuandan   ||  - 20171230、31-01 
  99.         春节      -- chunjie   ||  - 20180215=>21 
  100.         元宵节    -- yuanxiao  ||  - 20180302=>02 
  101.         情人节    -- qingren   ||  - 20180214=>14 
  102.         妇女节    -- funv      ||  - 20180308=>08 
  103.         劳动节    -- laodong   ||  - 20180429、30-01 
  104.         母亲节    -- muqin     ||  - 20180513=>13 
  105.         儿童节    -- ertong    ||  - 20180601=>01 
  106.         端午节    -- duanwu    ||  - 20180616=>18 
  107.         父亲节    -- fuqin     ||  - 20180616=>18 
  108.         七夕节    -- qixi      ||  - 20180817=>17 
  109.         教师节    -- jiaoshi   ||  - 20180910=>10 
  110.         中秋节    -- zhongqiu  ||  - 20180922=>24 
  111.         国庆节    -- guoqing   ||  - 20181001=>07 
  112.         圣诞节    -- shengdan  ||  - 20181225=>25 
  113.         双11      -- d1111     ||  - 20181111=>11 
  114.         双12      -- d1212     ||  - 20181212=>12 
  115.         京东618   -- d618      ||  - 20180618=>18 
  116.         苏宁818   -- d818      ||  - 20180818=>18 
  117.         *****************************************/  
  118.         /******* 公共声明 ********/  
  119.         header('Content-type: text/json');  
  120.         $dayArr = array('yuandan=2017-12-22 12:00>2018-01-01 23:59',    //3天-跨  
  121.                         'chunjie=2018-02-15 00:00>2018-02-21 23:59',    //7天-跨  
  122.                         'qingren=2018-02-14 00:00>2018-02-14 23:59',    //1天  
  123.                         'funv=2018-03-08 00:00>2018-03-08 23:59',       //1天  
  124.                         'qingming=2018-04-05 00:00>2018-04-07 23:59',   //3天-跨  
  125.                         'laodong=2018-04-29 00:00>2018-05-01 23:59',    //3天-跨  
  126.                         'muqin=2018-05-13 00:00>2018-05-13 23:59',      //1天  
  127.                         'ertong=2018-06-01 00:00>2018-06-01 23:59',     //1天  
  128.                         'duanwu=2018-06-16 00:00>2018-06-18 23:59',     //3天-跨  
  129.                         'fuqin=2018-06-17 00:00>2018-06-17 23:59',      //1天-合  
  130.                         'qixi=2018-08-17 00:00>2018-08-17 23:59',       //1天  
  131.                         'jiaoshi=2018-09-10 00:00>2018-09-10 23:59',    //1天  
  132.                         'zhongqiu=2018-09-22 00:00>2018-09-24 23:59',   //3天  
  133.                         'guoqing=2018-10-01 00:00>2018-10-07 23:59',    //7天  
  134.                         'shengdan=2018-12-25 00:00>2018-12-25 23:59',   //1天  
  135.                         'd1111=2018-11-11 00:00>2018-11-11 23:59',      //1天  
  136.                         'd1212=2018-12-12 00:00>2018-12-12 23:59',      //1天  
  137.                         'd618=2018-06-18 00:00>2018-06-18 23:59',       //1天  
  138.                         'd818=2018-06-18 00:00>2018-08-18 23:59');      //1天  
  139.         /********************************************** 
  140.          遍历数组判断,添加Class标记 
  141.         **********************************************/  
  142.         $dayNux = count($dayArr);  
  143.         if(isset($_GET["day"])&&!emptyempty($_GET["day"])){  
  144.             $currentDate = $_GET["day"];  
  145.         }else{  
  146.             $currentDate = date('Ymdhi');  
  147.         }  
  148.         for($i=0;$i<$dayNux;++$i){  
  149.             $dayData = $dayArr[$i];  
  150.             $dayEndx = substr(strrchr($dayData">"),1);  
  151.             $dayAlls = substr($dayData,0,strrpos($dayData,'>'));  
  152.             $dayStar = substr(strrchr($dayAlls"="),1);  
  153.             $dayName = substr($dayAlls,0,strrpos($dayAlls,'='));  
  154.             $dStar = str_replace(array("-",":"," "),"",$dayStar);  
  155.             $dEndx = str_replace(array("-",":"," "),"",$dayEndx);  
  156.             /****** 命中退出 ******/  
  157.             if($currentDate>=$dStar && $currentDate<=$dEndx){  
  158.                 $dayClass='"'.$dayName.'"';  
  159.                 break;  
  160.             }else{  
  161.                 if($i==$dayNux-1){  
  162.                    $dayClass=0;  
  163.                 }  
  164.             }  
  165.         }  
  166.         $jsonStr='{ 
  167.             "status":1, 
  168.             "info":"请求成功!", 
  169.             "dayClass":'.$dayClass.' 
  170.         }';  
  171.         echo $jsonStr;  
  172.         exit;  
  173.     }  
  174. }  

 

PHP替换字符串

[不指定 2017/12/19 10:03 | by 刘新修 ]
PHP代码
  1. <?php  
  2. $str =  "我_们_的_=家+园";  
  3. $str = str_replace(array("_","=","+"),"",$str);  
  4. echo  $str; //我们的家园  
  5. ?>  
Tags: ,
第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]