TP5.0的response数据拦截处理

作者:matrix 发布时间:2018年5月8日星期二 分类:TP5

处理返回数据的时候进行json编码/解码可能会因为不是标准的json字符导致出现一系列的连锁反应问题,没有正确的拦截错误信息的显示。
TP5获取器getAttr中进行json处理,结果出现不可预料的false值,且抛出异常 syntax error 语法错误。很蛋疼啊,明明相应的处理判断,但是错误定位行却是json_encode进行json编码的操作。

后面替换掉以前使用的默认全局函数json()进行自定义json字符输出,解决。

创建自定义Json类

继承\think\response\Json

<?php
/**
 * Created by PhpStorm.
 * User: panc
 * Date: 2018/5/8
 * Time: 上午11:24
 *
 * 自定义处理json的数据【避免json_encode报错:Syntax error 以及各种杂七杂八的问题】
 */

namespace app\common\output;//自定义命名空间


class json extends \think\response\Json
{
//    protected function output($data)  //可以自定义重写数据输出即可  
}

调用Response类输出

控制器中调用执行

//        return json($result);
return new \app\common\output\Json($result);

关键操作如上,虽然只是继承没有任何重写,但是实际上是解决了大问题。可以跟好的控制输出的结果和抛错。

peace~

mysql的分组排序limit问题

作者:matrix 发布时间:2018年5月3日星期四 分类:

业务要求按照type,city分组,然后各取前面的100条数据输出,网上找到了类似的需求直接sql语句就可以解决。

测试表结构


CREATE TABLE `esc_catch` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `city` varchar(20) NOT NULL DEFAULT '' COMMENT '城市', `price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '报价', `type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1,2', `add_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB   DEFAULT CHARSET=utf8mb4

解决办法


set @row=0;set @city=''; set @type=''; select a.city,a.price,a.type ,from_unixtime(a.add_time,'%Y-%m-%d %H:%i:%s') as add_time from esc_catch as a inner join ( SELECT id,add_time, case when (@city = city and @type= type) then @row:=@row+1 else @row:=1 end as rownum, @city:=city as city , @type:=type as type FROM esc_catch order by type,city,add_time desc ) as b on b.id = a.id where b.rownum>=100 order by b.type,b.city ;

说明:

头部事先声明变量
row 用于统计指定分组下出现的次数,
citytype是分组条件

核心在于inner join的的临时表操作,其中使用变量操作追加rownum字段
如果变量citytype值等同于临时表的同名字段则该行数据排序下标row++,否则为1

@city:=city as city , @type:=type as type 表示给每行数据的字段值赋给变量

之后在inner join内联表 之后使用自定义的rownum字段b.rownum<=100进行数量条件的限制即可,最后order by 操作便于查看数据

参考:

https://blog.csdn.net/ylqmf/article/details/39005949

https://blog.csdn.net/woshihaiyong168/article/details/78803655

https://zhidao.baidu.com/question/618263527798895012.html

PEACE~

微基因WeGene初试

作者:matrix 发布时间:2018年4月24日星期二 分类: 零零星星

图片3953-微基因WeGene初试

去年@TESTV BBT系列  看到女后期的基因测序,种草已久。网上找到其他很多相关的是国外的23andMe,蛋疼的是不支持中国地区。后来跟同事聊过,大多觉得没卵用,感觉是自己语言表达能力不够  没能安利出去啊(感觉被说微商了)。我不管。。反正我很想知道像我一样来自四川盆地边缘的非少数民族说63话的祖源分析图。对~  我对此很感兴趣。。

WeGene算是国内较大的一家了,至少很容易找到它。交钱后等待收到采集器,之后采集自己的口水填信息后寄回去等待报告就好。高科技算命就是这么的容易。

21号提交的订单,昨天到的口水采集器,回家按照WeGene官网提示进行口水装填作业。今天中午直接丢去丰巢快递柜 顺丰到付。期待后面的报告~
图片3958-微基因WeGene初试

图片3959-微基因WeGene初试

图片3960-微基因WeGene初试

图片3961-微基因WeGene初试

后续 更新:
04-27 到达
05-08 DNA提取
05-10 上机检测
05-14 检测完成

祖源分析

85的北方汉族,很是意外.没一点和巴蜀沾边

图片3991-微基因WeGene初试

报告预览

图片3992-微基因WeGene初试

后续

自己估算有6-7层较为符合情况

180916 中国之声《央广新闻》 报道 #11时12分28秒

60%真实性 消费者若有需求应该选择有资质的机构
http://cnvod.cnr.cn/audio2018/live/zgzs/201809/qlglx_20180916021905zgzs_h.m4a#2:12:32
http://www.radio.cn/pc-portal/erji/radioStation.html

过滤json中下划线字段名为驼峰式

作者:matrix 发布时间:2018年3月31日星期六 分类: 零零星星

项目中有需要将统一的json接口数据转换为驼峰式字段名,但是网上的确没找到能解决的代码。
还好难度不大,直接正则替换就好。代码都是去年的了,一直放在有道云笔记里面,早就想拉出来分享下,趁着还是3月份 补一片文章来占位。
代码是php的,其他语言同理用正则替换解决。

 /**
     * json编码处理 传入数组
     * json字段名统一输出为驼峰式
     * @param $data
     * @return array
     */
    protected function json_encode($data)
    {
        $data =  json_encode($data);
        return preg_replace_callback('/[_]([a-zA-Z])(?=[^"]*?":)/',
            function ($matches) {
                return strtoupper($matches[1]) ;
            }, $data);
    }

说明:
代码不需要过多解释,传入数组数据 结果值会返回json字符,字段名推统一替换为驼峰式。
核心在于[_]([a-zA-Z])(?=[^"]*?":)的正则表达式
PEACE~

wakatime 统计ide使用的编码时间

作者:matrix 发布时间:2018年1月25日星期四 分类: 零零星星

昨晚听DaoTangBill说了下wakatime,感悟以前代码都TM白了,连基本的时间记录都看不到 这工具简直是神器,没想过能统计编码时间,真是coder必备啊。
wakatime支持了很多IDE编辑器,IDEA家族,eclipse,sublime等 都有对应插件。只要编辑器是跨平台的,自然附加插件也就可以。
使用上只需要在IDE安装wakatime插件,输入key即可,完全不影响编码,不需要安装其余软件和设置开机启动操作。

官网

https://wakatime.com

获取账户 获取key

重新注册账户或者链接到GitHub之类的三方账户登录即可。

settings->account->Api Key

图片3868-wakatime 统计ide使用时间

安装IDE对应的插件

在ide的插件中搜索wakatime安装,最后输入key即可。

Quantify your coding

系统会自动默认会每周发送一周的统计报表到邮箱,使用中。。。 巴适
图片3869-wakatime 统计ide使用时间

参考:
http://www.iamlj.com/2016/07/recommend-tools-wakatime/

Ajax-hook拦截全局ajax请求操作

作者:matrix 发布时间:2017年12月13日星期三 分类: 零零星星

github项目地址:https://github.com/wendux/ajax-hook/blob/master/src/ajaxhook.js

项目页面中有很多ajax接口请求,每次需要手动判断数据code进行错误消息提示,再加上有些使用jQuery,有些使用fetch操作,要是能有一个统一的$.ajaxSetup那就爽翻。搜索下ajax的全局拦截,有大神好了,打开即食,NICE。代码量不大,大致的原理好像是把内置的XMLHttpRequest对象给代理了,克隆一份,进行伪装。请求操作都是通过的代理层,拦截、修改操作也都是可以的~

使用

加载ajaxhook.js文件,代码中给浏览器window对象注册全局方法:hookAjax,unHookAjax。

hookAjax //挂载拦截钩子
unHookAjax() //取消ajax请求代理

拦截处理操作

hookAjax方法注册拦截的切入点,执行回调操作。
这里用到onload 即请求完成获取数据的时候。
代码是放在vue项目里面,手动挂载DOM。若出现第一次错误请求没有成功拦截的情况,那就需要把代码放置在头部。

        //全局监听ajax请求,用于提示会话过期,和其他的错误消息。
        if ('function' === typeof(hookAjax)) {
            hookAjax({
                onload: function (xhr) {
                    if (xhr.status >= 500) return layer.alert('服务器报错,请联系管理员!'+"</br>请求地址:</br>"+xhr.responseURL, {icon: 2, title: '无形之刃 <3'});
                    var data = JSON.parse(xhr.responseText);
                    if (!!data) {
                        if (data.code !== 0) {
                            if (!!data.msg) {
                                layer.alert(data.msg, {icon: 2, title: 'ERROR'});
                            }
                        }
                    }
                }
            })
        }

拦截函数 如:onload 返回值是一个boolean,如果为true会阻断ajax请求,默认为false,不会阻断请求。

参考:
http://www.jianshu.com/p/9b634f1c9615

nginx配置proxy_cache缓存策略

作者:matrix 发布时间:2017年12月9日星期六 分类:

图片3703-nginx定向清理Proxy cache缓存
之前有使用脚本删除缓存的记录,但是没有留下下proxy的使用,今天正好配置下下。
>> nginx定向清理Proxy cache缓存

proxy是nginx的自带模块,作为前台代理后端的数据库请求,负载均衡啊什么的贼6

proxy配置

修改 nginx.conf文件配置 lnmp环境一般都是/usr/local/nginx/conf/nginx.conf
http代码块中添加proxy操作

> vi /usr/local/nginx/conf/nginx.conf #编辑文件

#添加如下内容
proxy_connect_timeout 2400;
proxy_read_timeout 240;
proxy_send_timeout 240;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_request_buffering off;
proxy_cache_lock on;
proxy_cache_valid 200 206 403 1d;#默认全局缓存200,206,403响应状态码 1天
proxy_cache_use_stale updating;
proxy_temp_file_write_size 128k;

#配置缓存目录,以及keys_zone作用域名称
proxy_temp_path /var/tmp/nginx/proxy_temp_dir;
proxy_cache_path /var/tmp/nginx/proxy_cache levels=1:2 keys_zone=link:2m inactive=1d max_size=1g;

#是否忽略后端返回的Cache-Control,Expires响应头。
#proxy_ignore_headers Cache-Control;
#proxy_ignore_headers Expires;
proxy_ignore_headers Set-Cookie;

#设置代理的客户端请求ip等数据
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Remote-Host $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

或者也可以在http代码块中使用 include "hhtjim_proxy.conf";方式载入。

#vhost配置proxy_pass
找到需要配置的vhost主机,修改conf文件中server代码块

        proxy_cache link;
        proxy_cache_valid 200 30d;
        proxy_cache_valid 301 302 303 10m;
        proxy_cache_valid any 5m;

        #添加返回响应头,X-Cache标记是否命中缓存。
        add_header X-Cache "$upstream_cache_status";

        #拦截所有请求 到link负载均衡策略
        location / {
        proxy_pass http://link;
        }

配置负载均衡

依旧在http块中添加上游upstream

#自定义link名称
upstream link { 
    ip_hash;#负载均衡ip hash定位
    server 127.0.0.1:8182 weight=3; #权重为3
    server 127.0.0.1:8084 weight=1; #权重为1
    keepalive 32;
}

若没有配置多余后端服务,直接使用当前nginx也是可以的。
完整vhost配置记录如下:

#入口拦截
server
    {
        listen 80;
        #listen [::]:80;
        server_name www.hhtjim.com ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/www.hhtjim.com/;

        include other.conf;


        include enable-php.conf;

        proxy_cache link;
        proxy_cache_valid 200 30d;
        proxy_cache_valid any 5m;


    add_header X-Cache "$upstream_cache_status";

        location / {
        proxy_pass http://link;
        }
    }


#模拟网站后台程序,数据库处理
server
    {
        listen 8182;
        #listen [::]:80;
        server_name localhost ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/www.hhtjim.com/;

        include other.conf;

        include enable-php.conf;

        #Slim Framework
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }


        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }
        access_log off;
    }

重启nginx

lnmp nginx start 

#或者 reload 未尝试
# lnmp nginx reload
# ./nginx -s reload 

踩坑

第一次配置完,nginx各种错误,什么缓存目录不存在,proxy_pass放置代码块不正确。

还有需要注意:后台服务器返回的响应头若是有Cache-Control,Expires注意值,若是nocache,private 那就真的不缓存,也就全部MISS
最后,修改

1.修改后端程序返回的响应头,可控性最高。
2.设置proxy_ignore_headers 忽略掉头部
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;

参考:
http://blog.csdn.net/gamay/article/details/73613741
https://www.lvtao.net/server/224.html
http://blog.csdn.net/zstack_org/article/details/53940047
http://blog.csdn.net/wzx19840423/article/details/50474650
http://blog.51yip.com/apachenginx/1018.html