您正在查看: yhbin 发布的文章

/dev/null 2>&1 用法

1. >/dev/null

这条命令的作用是将标准输出1重定向到/dev/null中。 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。

2. 2>&1

这条命令用到了重定向绑定,采用&可以将两个输出绑定在一起。这条命令的作用是错误输出将和标准输出同用一个文件描述符,说人话就是错误输出将会和标准输出输出到同一个地方。

默认是标准输出:

如果添加输出到文件,则不会在屏幕显示,会写进文件中:

报错时候会显示在屏幕上:

如果则没有 2>&1 则还是会显示在屏幕上,因为只是指定标准输出到文件里,没有指定错误输出到文件里:

添加上之后就会将错误信息写进文件里:

Linux错误排查工具 iftop

[root@localhost ~]# yum install libpcap libpcap-devel ncurses ncurses-devel
[root@localhost ~]# yum install fl ex byacc
[root@localhost ~]# wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
[root@localhost ~]# rpm -ivh epel-release-6-8.noarch.rpm
[root@localhost ~]# yum install iftop

jQuery $.each()常见的几种使用方法

<code class="language-html">
<!doctype html>
<html>        
<head>          
<meta charset="UTF-8">          
<title</title>          
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,userscalable=no" />          
<link href="../css/mui.min.css" rel="stylesheet" />      
</head>        
<body>          
<input name="aaa" type="hidden" value="111" />  <input name="bbb" type="hidden" value="222" />  <input name="ccc" type="hidden" value="333" />  <input name="ddd" type="hidden" value="444" />  <script src="../js/mui.min.js</script>          <script type="text/javascript" src="../js/jquery.js"></script>
<script type="text/javascript"> 
mui.init()  //处理一维数组              
var arr1 = ["aaa", "bbb", "ccc"];              
$.each(arr1, function(i, val) {                  console.log(i + val);}); //处理二维数组              
var arr2 = [                  
    ['a', 'aa', 'aaa'],                  
    ['b', 'bb', 'bbb'],                  
    ['c', 'cc', 'ccc']              
];              
$.each(arr2, function(i, item) {            console.log(i + "====" + item);                 $.each(item, function(j, val) {                     console.log(j + "====" + val)            
});              
}); //处理json数据              
var obj = {
    one: 1,                 
    two: 2,                  
    three: 3              
};              
$.each(obj, function(key, val) {               
    console.log(key + "===" + val)              
})//处理dom元素              
$.each($("input:hidden"), function(i, val) {       
    console.log("i===" + i)                  
    console.log(val.name)                  
    console.log(val.value)              
 })          
 </script>      
 </body>    
 </html>
 </code>

JSON.stringify()和JSON.parse()分别是什么

JSON.stringify() 从一个对象中解析出字符串

JSON.stringify({"a":"1","b":"2"})

结果是:"{"a":"1","b":"2"}"

JSON.parse()从一个字符串中解析出JSON对象

var str = '{"a":"1","b":"2"}';

JSON.parse(str);

结果是:Object{a:"1",b:"2"}

linux学习

1、gpasswd -a 用户名 用户组
2、查看登录的用户属于哪些组   groups
3、读ls可用,写touch、mkdir可用,执行cd可用
4、读写执行权限{1.浏览器,只针对拥有者,   2.命令行,只针对当前登录用户,先后顺序是拥有者>所属组>其他人,即是拥有者则判断拥有者权限,其次是如果当前用户跟文件所属组是一个组,则判断所属组权限,再就是判断其他人权限}
3、命令行当前登录用户,上级目录没有写权限,但是子目录里有个文件夹有写权限,则进入其中也是可以写文件的,不受上级目录权限限制

e.target

$(e.target)是jQuery对象,e.target是DOM对象,比如$(e.target)可以通过$(e.target).html()获取元素内容,e.target可以通过e.target.innerHTML获取元素内容
.val() 能够取到 针对text,hidden可输入的文本框的value值。

而 .attr('value') 可以取到html元素中所设置的属性 value的值,不能获取动态的如input type="text" 的文本框手动输入的值。

Tp5开发规范

命名规范

ThinkPHP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:

目录和文件

目录使用小写+下划线;
类库、函数文件统一以.php为后缀;
类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;
类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);

函数和类、属性命名

类的命名采用驼峰法(首字母大写),例如 User、UserType,默认不需要添加后缀,例如UserController应该直接命名为User;
函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;
方法的命名使用驼峰法(首字母小写),例如 getUserName;
属性的命名使用驼峰法(首字母小写),例如 tableName、instance;
以双下划线“__”打头的函数或方法作为魔术方法,例如 __call 和 __autoload;

常量和配置

常量以大写字母和下划线命名,例如 APP_PATH和 THINK_PATH;
配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert;

数据表和字段

数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表字段命名。
应用类库命名空间规范
应用类库的根命名空间统一为app(不建议更改,可以设置app_namespace配置参数更改,V5.0.8版本开始使用APP_NAMESPACE常量定义);
例如:appindexcontrollerIndex和appindexmodelUser。

宝塔添加网站,git更新

1.宝塔添加网站、ftp、数据库等
2.修改网站伪静态、配置文件的根目录
3.ssh到服务器网站目录下,运行git clone 出代码
4.git config --global credential.helper store
接下来输入的账号密码就会被保存
5.git config --global core.autocrlf false
转义

微信支付

1.获取prepay_id
2.根据prepay_id获取支付参数

后台

$wx_pay_config                   = [];
       $wx_pay_config['appid']          = config('appid');
       $wx_pay_config['appsecret']      = config('appsecret');
       $wx_pay_config['token']          = config('token');
       $wx_pay_config['encodingaeskey'] = config('encodingaeskey');
       $wx_pay_config['mch_id']         = config('mch_id');
       $wx_pay_config['partnerkey']     = config('partnerkey');
       $wx_pay_config['cert_key']       = config('cert_key');
       $wx_pay_config['cert_cert']      = config('cert_cert');

       $wechatpay    = new WechatPay( $wx_pay_config );
       $openid       = $order_info['openid'];
       $body         = $order_info['product_name'];
       $out_trade_no = $order_info['order_sn'];
       $total_fee    = $order_info['total_price'] * 100;
       $notify_url   = config('url_domain_root') .'mobile/Notify/index';
       $prepayid     = $wechatpay->getPrepayId( $openid, $body, $out_trade_no, $total_fee, $notify_url );
       $wx_res       = $wechatpay -> createMchPay( $prepayid );

      $jsticket    = new WechatScript( $this->option );
      $protocol    = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
      $url         = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
      $jssign_info = $jsticket -> getJsSign( $url );
      //return view( 'index', [ 'data'=> json_encode( $wx_res ) ] );
      return view( 'index', [ 'title' => '支付订单', 'data'=> $wx_res, 'obj'=> $jssign_info, 'order_info'=>$order_info] );

前台

<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
        <script>
          wx.config({
            debug: false,
            appId: '{$obj["appId"]}',
            timestamp: '{$obj["timestamp"]}',
            nonceStr: '{$obj["nonceStr"]}',
            signature: '{$obj["signature"]}',
            jsApiList: [
              // 所有要调用的 API 都要加到这个列表中
                'chooseWXPay',
              ]
          });
        </script>
        <script type="text/javascript">
            function getOrder(){
                wx.chooseWXPay({
                    timestamp: '{$data["timestamp"]}', // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                    nonceStr: '{$data["nonceStr"]}', // 支付签名随机串,不长于 32 位
                    package: '{$data["package"]}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id =***)
                    signType: '{$data["signType"]}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                    paySign: '{$data["paySign"]}', // 支付签名
                    success: function (res) {
                        // 支付成功后的回调函数
                        alert('支付成功!');
                        window.location.href = "{:url('Mycenter/index')}";
                    },
                    fail: function (res) {
                        alert(JSON.stringify(res));
                    }
                });
            }
        </script>

注意事项:
1.商户后台填写授权支付域名,如果带参数,最好带一个,其余参数可以根据这个去获取,如:http://xxxxxx/mobile/wxpay/index/order_id/33.html
这时候授权支付域名就是 http://xxxxxx/mobile/wxpay/index/order_id/
2.支付成功异步回调,一定不能继承逻辑代码的父类,最好单独一个类

微信获取config参数及共享地址

后台

$jsticket     = new WechatScript( $this->option );
        $protocol     = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url          = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        $jssign_info  = $jsticket -> getJsSign( $url );

前台

<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
     <script>
      wx.config({
        debug: false,
        appId: '{$obj["appId"]}',
        timestamp: '{$obj["timestamp"]}',
        nonceStr: '{$obj["nonceStr"]}',
        signature: '{$obj["signature"]}',
        jsApiList: [
          // 所有要调用的 API 都要加到这个列表中
            'checkJsApi',
            'openAddress',
            'editAddress'
          ]
      });
    </script>
    <script language="javascript">
        function callpay()
        {
            wx.openAddress({
                trigger: function (res) {
                   // alert('用户开始拉出地址');
                },
                success: function (res) {
                   var address_info = res.detailInfo + ' ' + res.userName + ' ' + res.telNumber;
                   $('#address').html( address_info );
                   $('#link_people').val( res.userName );
                   $('#link_phone').val( res.telNumber );
                },
                cancel: function (res) {
                   alert('地址拉取取消');
                },
                fail: function (res) {
                   alert('地址拉取失败');
                }
            });
        }
    </script>