作者: Mr.Li

  • 远程win10系统桌面时提示凭证不工作问题的终极解决办法

    环境说明

    被远程电脑(WIN10系统)

    远程连接客户机(WIN7,WIN8,WIN10)

    故障现象

         最近在使用远程桌面连接自己宿舍电脑,突然发现win10系统总是无法连接成功,提示“你的凭证不工作”,使用其他人的win7、win8的连接也是出现这个问题。

    打开本地组策略编辑器,看下有关系统安全设置的选项,看看是否有什么限制,多次尝试中,发现了解决方法,整理步骤如下:

         开始–>运行->gpedit.msc->计算机配置->Windows设置->安全设置->本地策略->安全选项->网络访问:本地帐户的共享和安全模型。

         修改为使用经典模式,如下图示

    保存后,再次连接,即刻生效!!

  • JS特效函数汇总

    <script type="text/javascript">
        //~ heart 点击显示心形
        ! function(c, d, g) {
            function f() {
                for(var a = 0; a < b.length; a++)
                    0 >= b[a].alpha ? (d.body.removeChild(b[a].el), b.splice(a, 1)) : (b[a].y–, b[a].scale += .004, b[a].alpha -= .013, b[a].el.style.cssText = “left:” + b[a].x + “px;top:” + b[a].y + “px;opacity:” + b[a].alpha + “;transform:scale(” + b[a].scale + “,” + b[a].scale + “) rotate(45deg);background:” + b[a].color + ";z-index:99999");
                requestAnimationFrame(f)
            }
            var b = [];
            c.requestAnimationFrame = c.requestAnimationFrame || c.webkitRequestAnimationFrame || c.mozRequestAnimationFrame || c.oRequestAnimationFrame ||
                c.msRequestAnimationFrame || function(a) { setTimeout(a, 1E3 / 60) };
            (function(a) { var b = d.createElement("style");
                b.type = "text/css"; try { b.appendChild(d.createTextNode(a)) } catch(e) { b.styleSheet.cssText = a } d.getElementsByTagName("head")[0].appendChild(b) })(".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}");
            (function() { var a = "function" == typeof c.onclick && c.onclick;
                c.onclick = function(c) { a && a(); var e = d.createElement("div");
                    e.className = "heart";
                    b.push({ el: e, x: c.clientX – 5, y: c.clientY – 5, scale: 1, alpha: 1, color: "rgb(" + ~~(255 * Math.random()) + "," + ~~(255 * Math.random()) + "," + ~~(255 * Math.random()) + ")" });
                    d.body.appendChild(e) } })();
            f()
        }(window, document);
        //~ copy  复制追加版权
        var Sys = {};
        var ua = navigator.userAgent.toLowerCase();
        if(window.ActiveXObject) { document.body.oncopy = function() { event.returnValue = false; var t = document.selection.createRange().text; var s = "<br/><br/>本文出自[Mr.Li’s Blog]<br/>转载请保留来源链接:" + location.href;
                clipboardData.setData('Text', t + '\r\n' + s); } } else {
            function addLink() { var body_element = document.getElementsByTagName('body')[0]; var selection;
                selection = window.getSelection(); var pagelink = " <br/><br/>本文出自[Mr.Li’s Blog] <br/>转载请保留来源链接:" + document.location.href; var copytext = selection + pagelink; var newdiv = document.createElement('div');
                newdiv.style.position = 'absolute';
                newdiv.style.left = '-99999px';
                body_element.appendChild(newdiv);
                newdiv.innerHTML = copytext;
                selection.selectAllChildren(newdiv);
                window.setTimeout(function() { body_element.removeChild(newdiv); }, 0); } document.oncopy = addLink; }
    </script>

  • PHP实用函数汇总

    1、数字金额转换成中文大写金额的函数
        /**
          *String Int  $num  要转换的小写数字或小写字符串
          *return 大写字母
          *小数位为两位
        **/
        function toChineseNumber($num){
            $c1 = "零壹贰叁肆伍陆柒捌玖";
            $c2 = "分角元拾佰仟万拾佰仟亿";
            $num = round($num, 2);
            $num = $num * 100;
            if (strlen($num) > 10) {
                return "数据太长,没有这么大的钱吧,检查下";
            } 
            $i = 0;
            $c = "";
            while (1) {
                if ($i == 0) {
                    $n = substr($num, strlen($num)-1, 1);
                } else {
                    $n = $num % 10;
                } 
                $p1 = substr($c1, 3 * $n, 3);
                $p2 = substr($c2, 3 * $i, 3);
                if ($n != '0' || ($n == '0' && ($p2 == '亿' || $p2 == '万' || $p2 == '元'))) {
                    $c = $p1 . $p2 . $c;
                } else {
                    $c = $p1 . $c;
                } 
                $i = $i + 1;
                $num = $num / 10;
                $num = (int)$num;
                if ($num == 0) {
                    break;
                } 
            }
            $j = 0;
            $slen = strlen($c);
            while ($j < $slen) {
                $m = substr($c, $j, 6);
                if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
                    $left = substr($c, 0, $j);
                    $right = substr($c, $j + 3);
                    $c = $left . $right;
                    $j = $j-3;
                    $slen = $slen-3;
                } 
                $j = $j + 3;
            } 
     
            if (substr($c, strlen($c)-3, 3) == '零') {
                $c = substr($c, 0, strlen($c)-3);
            }
            if (empty($c)) {
                return "零元整";
            }else{
                return $c . "整";
            }
        }

    2、生成唯一编号比如订单编号会员编号

      //生成订单编号
        public function createNO($table, $field, $prefix)
        {
            $billno = $prefix . date('YmdHis') . random(4, true);

            while (1) {
                $count = pdo_fetchcolumn('select count(*) from ' . tablename($table) . ' where ' . $field . '=:billno limit 1', array(':billno' => $billno));

                if ($count <= 0) {
                    break;
                }

                $billno = $prefix . date('YmdHis') . random(4, true);
            }

            return $billno;
        }

    3、Excel操作  点击下载 》phpexcel

    //excel导入导出

        public function column_str($key)
        {
            $array = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BQ', 'BR', 'BS', 'BT', 'BU', 'BV', 'BW', 'BX', 'BY', 'BZ', 'CA', 'CB', 'CC', 'CD', 'CE', 'CF', 'CG', 'CH', 'CI', 'CJ', 'CK', 'CL', 'CM', 'CN', 'CO', 'CP', 'CQ', 'CR', 'CS', 'CT', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'DG', 'DH', 'DI', 'DJ', 'DK', 'DL', 'DM', 'DN', 'DO', 'DP', 'DQ', 'DR', 'DS', 'DT', 'DU', 'DV', 'DW', 'DX', 'DY', 'DZ', 'EA', 'EB', 'EC', 'ED', 'EE', 'EF', 'EG', 'EH', 'EI', 'EJ', 'EK', 'EL', 'EM', 'EN', 'EO', 'EP', 'EQ', 'ER', 'ES', 'ET', 'EU', 'EV', 'EW', 'EX', 'EY', 'EZ');
            return $array[$key];
        }

        public function column($key, $columnnum = 1)
        {
            return $this->column_str($key) . $columnnum;
        }

        /**
         * 导出Excel
         * @param type $list
         * @param type $params
         */
        public function export($list, $params = array())
        {
            if (PHP_SAPI == 'cli') {
                exit('This example should only be run from a Web Browser');
            }

            require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel.php';
            $excel = new PHPExcel();
            $excel->getProperties()->setCreator('weichengtech')->setLastModifiedBy('weichengtech')->setTitle('Office 2007 XLSX Test Document')->setSubject('Office 2007 XLSX Test Document')->setDescription('Test document for Office 2007 XLSX, generated using PHP classes.')->setKeywords('office 2007 openxml php')->setCategory('report file');
            $sheet = $excel->setActiveSheetIndex(0);
            $rownum = 1;

            foreach ($params[‘columns’] as $key => $column) {
                $sheet->setCellValue($this->column($key, $rownum), $column[‘title’]);

                if (!empty($column[‘width’])) {
                    $sheet->getColumnDimension($this->column_str($key))->setWidth($column[‘width’]);
                }
            }

            ++$rownum;
            $len = count($params[‘columns’]);

            foreach ($list as $row) {
                $i = 0;

                while ($i < $len) {
                    $value = (isset($row[$params[‘columns’][$i][‘field’]]) ? $row[$params[‘columns’][$i][‘field’]] : '');
                    $sheet->setCellValue($this->column($i, $rownum), $value);
                    ++$i;
                }

                ++$rownum;
            }

            $excel->getActiveSheet()->setTitle($params[‘title’]);
            $filename = urlencode($params[‘title’] . '-' . date('Y-m-d H:i', time()));
            ob_end_clean();
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment;filename="' . $filename . '.xlsx"');
            header('Cache-Control: max-age=0');
            $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
            $this->SaveViaTempFile($writer);
            exit();
        }

        /**
         * @param $objWriter PHPExcel_Writer_IWriter
         */
        public function SaveViaTempFile($objWriter)
        {
            $filePath = '' . rand(0, getrandmax()) . rand(0, getrandmax()) . '.tmp';
            $objWriter->save($filePath);
            readfile($filePath);
            unlink($filePath);
        }

        /**
         * 生成模板文件Excel
         * @param type $list
         * @param type $params
         */
        public function temp($title, $columns = array())
        {
            if (PHP_SAPI == 'cli') {
                exit('This example should only be run from a Web Browser');
            }

            require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel.php';
            $excel = new PHPExcel();
            $excel->getProperties()->setCreator('weichengtech')->setLastModifiedBy('weichengtech')->setTitle('Office 2007 XLSX Test Document')->setSubject('Office 2007 XLSX Test Document')->setDescription('Test document for Office 2007 XLSX, generated using PHP classes.')->setKeywords('office 2007 openxml php')->setCategory('report file');
            $sheet = $excel->setActiveSheetIndex(0);
            $rownum = 1;

            foreach ($columns as $key => $column) {
                $sheet->setCellValue($this->column($key, $rownum), $column[‘title’]);

                if (!empty($column[‘width’])) {
                    $sheet->getColumnDimension($this->column_str($key))->setWidth($column[‘width’]);
                }
            }

            ++$rownum;
            $len = count($columns);
            $k = 1;

            while ($k <= 5000) {
                $i = 0;

                while ($i < $len) {
                    $sheet->setCellValue($this->column($i, $rownum), '');
                    ++$i;
                }

                ++$rownum;
                ++$k;
            }

            $excel->getActiveSheet()->setTitle($title);
            $filename = urlencode($title);
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment;filename="' . $filename . '.xls"');
            header('Cache-Control: max-age=0');
            $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
            $writer->save('php://output');
            exit();
        }

        public function import($excefile)
        {
            global $_W;
            require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel.php';
            require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel/IOFactory.php';
            require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel/Reader/Excel5.php';
            $path = IA_ROOT . '/addons/zhls_sun/data/tmp/';

            if (!is_dir($path)) {
                load()->func('file');
                mkdirs($path, '0777');
            }

            $filename = $_FILES[$excefile][‘name’];
            $tmpname = $_FILES[$excefile][‘tmp_name’];

            if (empty($tmpname)) {
                message('请选择要上传的Excel文件!', '', 'error');
            }

            $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
            if (($ext != 'xlsx') && ($ext != 'xls')) {
                message('请上传 xls 或 xlsx 格式的Excel文件!', '', 'error');
            }

            $file = time() . $_W[‘uniacid’] . '.' . $ext;
            $uploadfile = $path . $file;
            $result = move_uploaded_file($tmpname, $uploadfile);

            if (!$result) {
                message('上传Excel 文件失败, 请重新上传!', '', 'error');
            }

            $reader = PHPExcel_IOFactory::createReader($ext == 'xls' ? 'Excel5' : 'Excel2007');
            $excel = $reader->load($uploadfile);
            $sheet = $excel->getActiveSheet();
            $highestRow = $sheet->getHighestRow();
            $highestColumn = $sheet->getHighestColumn();
            $highestColumnCount = PHPExcel_Cell::columnIndexFromString($highestColumn);
            $values = array();
            $row = 2;

            while ($row <= $highestRow) {
                $rowValue = array();
                $col = 0;

                while ($col < $highestColumnCount) {
                    $rowValue[] = $sheet->getCellByColumnAndRow($col, $row)->getValue();
                    ++$col;
                }

                $values[] = $rowValue;
                ++$row;
            }

            return $values;
        }

        //excel导入导出

    4、直接调用$this->getPinyin($val, 'xxxx_');

    /*汉字换取拼音*/

        public function getPinyin($_String, $lstring, $flag = 1)
        {
            if ($flag) {
                $_Code = 'utf-8';
            } else {
                $_Code = 'gb2312';
            }

            if (!empty($lstring)) {
                $_String = $lstring . $_String;
            }

            $_DataKey = 'a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha' . '|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|' . 'cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er' . '|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui' . '|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang' . '|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang' . '|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue' . '|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne' . '|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen' . '|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang' . '|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|' . 'she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|' . 'tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu' . '|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you' . '|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|' . 'zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo';
            $_DataValue = '-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990' . '|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725' . '|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263' . '|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003' . '|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697' . '|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211' . '|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922' . '|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468' . '|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664' . '|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407' . '|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959' . '|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652' . '|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369' . '|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128' . '|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914' . '|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645' . '|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149' . '|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087' . '|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658' . '|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340' . '|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888' . '|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585' . '|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847' . '|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055' . '|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780' . '|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274' . '|-10270|-10262|-10260|-10256|-10254';
            $_TDataKey = explode('|', $_DataKey);
            $_TDataValue = explode('|', $_DataValue);
            $_Data = ('5.0' <= PHP_VERSION ? array_combine($_TDataKey, $_TDataValue) : $this->_Array_Combine($_TDataKey, $_TDataValue));
            arsort($_Data);
            reset($_Data);

            if ($_Code != 'gb2312') {
                $_String = $this->_U2_Utf8_Gb($_String);
            }

            $_Res = '';
            $i = 0;

            while ($i < strlen($_String)) {
                $_P = ord(substr($_String, $i, 1));

                if (160 < $_P) {
                    $_Q = ord(substr($_String, ++$i, 1));
                    $_P = (($_P * 256) + $_Q) – 65536;
                }

                $_Res .= $this->_Pinyin($_P, $_Data);
                ++$i;
            }

            return preg_replace('/[^a-z0-9]*/', '', $_Res);
        }

        public function _Pinyin($_Num, $_Data)
        {
            if ((0 < $_Num) && ($_Num < 160)) {
                return chr($_Num);
            }

            if (($_Num < -20319) || (-10247 < $_Num)) {
                return '';
            }

            foreach ($_Data as $k => $v) {
                if ($v <= $_Num) {
                    break;
                }
            }

            return $k;
        }

        public function _U2_Utf8_Gb($_C)
        {
            $_String = '';

            if ($_C < 128) {
                $_String .= $_C;
            } else if ($_C < 2048) {
                $_String .= chr(192 | ($_C >> 6));
                $_String .= chr(128 | ($_C & 63));
            } else if ($_C < 65536) {
                $_String .= chr(224 | ($_C >> 12));
                $_String .= chr(128 | (($_C >> 6) & 63));
                $_String .= chr(128 | ($_C & 63));
            } else {
                if ($_C < 2097152) {
                    $_String .= chr(240 | ($_C >> 18));
                    $_String .= chr(128 | (($_C >> 12) & 63));
                    $_String .= chr(128 | (($_C >> 6) & 63));
                    $_String .= chr(128 | ($_C & 63));
                }
            }

            return iconv('UTF-8', 'GB2312', $_String);
        }

        public function _Array_Combine($_Arr1, $_Arr2)
        {
            $i = 0;

            while ($i < count($_Arr1)) {
                $_Res[$_Arr1[$i]] = $_Arr2[$i];
                ++$i;
            }

            return $_Res;
        }

     

     

  • 密码保护:$W

    此内容受密码保护。如需查阅,请在下方输入密码。

  • 2020年最新最全的全国省市区五级四级三级地址数据库sql+excel版

    2020年最新全国省市区行政单位五级、四级、三级数据库sql+excel版

    五级联动、四级联动、三级联动       
    无需联系客服 百度云盘链接 自动发货

    微信扫码购买,券后1分钱(数量有限,限领1张)


  • ES6 之 作用域

    什么是作用域?

     

    几乎所有编程语言就是在变量中存储值,并且能读取和修改此值。事实上,在变量中存储值和取出值的能力,给程序赋予了状态。
    如果没有这样的概念,一个程序虽然可以执行一些任务,但是它们将会受到极大的限制而且不会非常有趣。
    但是这些变量该存储在哪,又给如何读取?为了完成这个目标,需要制定一些规则,这个规则就是:作用域。

     

    常见的作用域主要分为几个类型:全局作用域、函数作用域、块状作用域、动态作用域。

     

    对象 类型
    global/window 全局作用域
    function 函数作用域(局部作用域)
    {} 块状作用域
    this 动态作用域

     

    [!TIP]
    如果一个 变量 或者其他表达式不在 “当前的作用域”,那么 JavaScript 机制会继续沿着作用域链上查找直到全局作用域(global 或浏览器中的 window)如果找不到将不可被使用。 作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用

    全局作用域

     

    变量在函数或者代码块{}外定义,即为全局作用域。不过,在函数或者代码块{}内未定义的变量也是拥有全局作用域的(不推荐)。

     

    var carName = ' Volvo'
    
    // 此处可调用 carName 变量
    function myFunction() {
      // 函数内可调用 carName 变量
    }
    

     

    上述代码中变量 carName 就是在函数外定义的,它是拥有全局作用域的。这个变量可以在任意地方被读取或者修改,当然如果变量在函数内没有声明(没有使用 var 关键字),该变量依然为全局变量。

     

    // 此处可调用 carName 变量
    
    function myFunction() {
      carName = 'Volvo'
      // 此处可调用 carName 变量
    }
    

     

    以上实例中 carName 在函数内,但是拥有全局作用域,它将作为 global 或者 window 的属性存在。

     

    [!Warning]
    在函数内部或代码块中没有定义的变量实际上是作为 window/global 的属性存在,而不是全局变量。换句话说没有使用 var 定义的变量虽然拥有全局作用域,但是它是可以被 delete 的,而全局变量不可以。

    函数作用域

     

    在函数内部定义的变量,就是局部作用域。函数作用域内,对外是封闭的,从外层的作用域无法直接访问函数内部的作用域!

     

    function bar() {
      var testValue = 'inner'
    }
    
    console.log(testValue) // 报错:ReferenceError: testValue is not defined
    

     

    如果想读取函数内的变量,必须借助 return 或者闭包。

     

    function bar(value) {
      var testValue = 'inner'
    
      return testValue + value
    }
    
    console.log(bar('fun')) // "innerfun"
    

     

    这是借助 return 的方式,下面是闭包的方式:

     

    function bar(value) {
      var testValue = 'inner'
    
      var rusult = testValue + value
    
      function innser() {
        return rusult
      }
    
      return innser()
    }
    
    console.log(bar('fun')) // "innerfun"
    

     

    通俗的讲,return 是函数对外交流的出口,而 return 可以返回的是函数,根据作用域的规则,函数内部的子函数是可以获取函数作用域内的变量的。

     

    说到这其实大家会想到嵌套函数的作用域问题,如果 inner 函数再嵌套函数呢?这就涉及到另一个概念:作用域链。
    其实不难理解作用域链是什么,因为你可以按照原型链那样去理解。任何一个作用域链都是一个堆栈,首先先把全局作用域压入栈底,再按照函数的嵌套关系一次压入堆栈。在执行的时候就按照这个作用域链寻找变量。

     

    块状作用域

     

    在其他编程语言中,块状作用域是很熟悉的概念,但是在 JavaScript 中不被支持,就像上述知识一样,除了全局作用域就是函数作用域,一直没有自己的块状作用域。在 ES6 中已经改变了这个现象,块状作用域得到普及。关于什么是块,只要认识 {} 就可以了。

     

    if (true) {
      let a = 1
      console.log(a)
    }
    

     

    在这个代码中, if 后 {} 就是“块”,这个里面的变量就是拥有这个块状作用域,按照规则,{} 之外是无法访问这个变量的。

     

    ES6 中的 Let

     

    动态作用域

     

    在 JavaScript 中很多同学对 this 的指向时而清楚时而模糊,其实结合作用域会对 this 有一个清晰的理解。不妨先来看下这段代码:

     

    window.a = 3
    function test() {
      console.log(this.a)
    }
    
    test.bind({ a: 2 })() // 2
    test() // 3
    

     

    在这里 bind 已经把作用域的范围进行了修改指向了 { a: 2 },而 this 指向的是当前作用域对象,是不是可以清楚的理解了呢?

     

    接下来我们再思考另一个问题:作用域是在代码编写的时候就已经决定了呢,还是在代码执行的过程中才决定的?

     

    var carName = ' Volvo'
    
    // 此处可调用 carName 变量
    function myFunction() {
      // 函数内可调用 carName 变量
    }
    

     

    在看看这段代码,写代码的时候就知道 carName 就是全局作用域,函数内部的用 var 定义的变量就是函数作用域。这个也就是专业术语:词法作用域。
    通俗的讲变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。
    相反,只能在执行阶段才能决定变量的作用域,那就是动态作用域。

     

    function foo() {
      console.log(a)
    }
    
    function bar() {
      var a = 3
      foo()
    }
    
    var a = 2
    
    bar()
    

     

    为什么会这样?

     

    因为当 foo() 不能为 a 解析出一个变量引用时,它不会沿着嵌套的(词法)作用域链向上走一层,而是沿着调用栈向上走,以找到 foo() 是 从何处 被调用的。因为 foo() 是从 bar() 中被调用的,它就会在 bar() 的作用域中检查变量,并且在这里找到持有值 3 的 a。

     

  • 【实战】在Nginx/Tengine服务器上安装证书 附nginx.conf

    user www www;
    worker_processes auto;

    error_log /data/wwwlogs/error_nginx.log crit;
    pid /var/run/nginx.pid;
    worker_rlimit_nofile 51200;

    events {
      use epoll;
      worker_connections 51200;
      multi_accept on;
    }

    http {
      include mime.types;
      default_type application/octet-stream;
      server_names_hash_bucket_size 128;
      client_header_buffer_size 32k;
      large_client_header_buffers 4 32k;
      client_max_body_size 1024m;
      client_body_buffer_size 10m;
      sendfile on;
      tcp_nopush on;
      keepalive_timeout 120;
      server_tokens off;
      tcp_nodelay on;

      fastcgi_connect_timeout 300;
      fastcgi_send_timeout 300;
      fastcgi_read_timeout 300;
      fastcgi_buffer_size 64k;
      fastcgi_buffers 4 64k;
      fastcgi_busy_buffers_size 128k;
      fastcgi_temp_file_write_size 128k;
      fastcgi_intercept_errors on;

      #Gzip Compression
      gzip on;
      gzip_buffers 16 8k;
      gzip_comp_level 6;
      gzip_http_version 1.1;
      gzip_min_length 256;
      gzip_proxied any;
      gzip_vary on;
      gzip_types
        text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
        text/javascript application/javascript application/x-javascript
        text/x-json application/json application/x-web-app-manifest+json
        text/css text/plain text/x-component
        font/opentype application/x-font-ttf application/vnd.ms-fontobject
        image/x-icon;
      gzip_disable "MSIE [1-6]\.(?!.*SV1)";

      #If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
      open_file_cache max=1000 inactive=20s;
      open_file_cache_valid 30s;
      open_file_cache_min_uses 2;
      open_file_cache_errors on;

    ######################## default ############################
      server {
        listen 80;
        server_name www.xxxxxxx.com;
        rewrite ^(.*)$ https://$host$1 permanent;  #设置HTTP请求自动跳转HTTPS
        access_log /data/wwwlogs/access_nginx.log combined;
        root /data/wwwroot/default;
        index index.html index.htm index.php;
        #error_page 404 /404.html;
        #error_page 502 /502.html;
        location /nginx_status {
          stub_status on;
          access_log off;
          allow 127.0.0.1;
          deny all;
        }
        location ~ [^/]\.php(/|$) {
          #fastcgi_pass remote_php_ip:9000;
          fastcgi_pass unix:/dev/shm/php-cgi.sock;
          fastcgi_index index.php;
          include fastcgi.conf;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
          expires 30d;
          access_log off;
        }
        location ~ .*\.(js|css)?$ {
          expires 7d;
          access_log off;
        }
        location ~ /\.ht {
          deny all;
        }
      }

    # SSL
      server {
            listen 443;   
            server_name www.xxxxxxx.com;  
            ssl on;
            root /data/wwwroot/default;
            index index.html index.htm index.php;
            ssl_certificate cert/3359297_www.xxxxxxx.com.pem;   
            ssl_certificate_key cert/3359297_www.xxxxxxx.com.key;   
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; 
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   
            ssl_prefer_server_ciphers on;   
            location / {
                root /data/wwwroot/default;
                index index.php index.html index.htm;
            }
            location ~ [^/]\.php(/|$) {
              #fastcgi_pass remote_php_ip:9000;
              fastcgi_pass unix:/dev/shm/php-cgi.sock;
              fastcgi_index index.php;
              include fastcgi.conf;
            }
        }
    ########################## vhost #############################
      include vhost/*.conf;
    }
     

  • 在IIS服务器上安装SSL证书

    阿里云SSL证书服务支持下载SSL证书安装到IIS服务器上,从而使IIS服务器支持HTTPS安全访问。本文介绍了证书安装的具体操作。

    前提条件

    申请证书时需要选择系统自动创建CSR。

    申请证书时如果选择手动创建CSR,则不会生成证书文件。您需要选择其他服务器下载.crt证书文件后,使用openssl命令将.crt文件的证书转换成.pfx格式。

    操作步骤

    1. 在SSL证书页面,单击已签发标签,定位到需要下载的证书并单击证书卡片右下角的下载。

      下载

    2. 定位到IIS服务器类型并单击右侧操作栏的下载将IIS版证书压缩包下载到本地。
    3. 解压解压已下载保存到本地的IIS证书文件。您将看到文件中有一个证书文件(以.pfx为后缀或文件类型)和一个密钥文件(以.txt为后缀或文件类型)。证书文件

      说明 每次下载证书都会产生新的密码,该密码仅匹配本次下载的证书。如果需要更新证书文件,同时也要更新匹配的密码文件。

    4. 在控制台操作对话框中导入您解压的IIS证书文件。

      1. 单击开始 > 运行 > MMC打开控制台。

        打开控制台

      2. 单击文件 > 添加/删除管理单元打开添加/删除管理单元对话框。

        添加/删除管理单元

      3. 在可用的管理单元中单击证书 > 添加 > 计算机账户 > 下一步 > 本地计算机(运行此控制台的计算机) > 完成。

        可用的管理单元

      4. 在控制台左侧导航栏单击控制台根节点下的证书打开证书树形列表。

        打开证书树形列表

      5. 单击个人 > 证书 > 所有任务 > 导入打开证书导入向导对话框。

        打开证书导入向导

      6. 单击浏览导入下载的PFX格式证书文件。导入证书

        说明 在导入证书文件时,文件名右侧文件类型下拉菜单中请选择所有文件类型。

      7. 输入证书密钥文件里的密码。

        您可在下载的IIS证书文件中打开pfx-password .txt文件查看证书密码。输入证书秘钥

      8. 勾选根据证书类型,自动选择证书存储并单击下一步完成证书的导入。

        选择证书存储

    5. 分配服务器证书。

      1. 打开IIS8.0 管理器面板,定位到待部署证书的站点,单击绑定。
      2. 在网站绑定对话框中单击添加 > 选择https类型 > 端口选择443 > 导入的IIS证书名称 > 确定。

        说明 SSL 缺省端口为 443 端口,请不要修改。 如果您使用其他端口如:8443,则访问网站时必须输入https://www.domain.com:8443

     

  • 在Apache服务器上安装SSL证书

    阿里云SSL证书服务支持下载证书安装到Apache服务器,从而使Apache服务器支持HTTPS安全访问。本文介绍了证书安装的具体操作。

    前提条件

    • 已安装OpenSSL。
    • 本文档证书名称以domain name为示例,如证书文件名称为domain name_public.crt,证书链文件名称为domain name_chain.crt,证书密钥文件名称为domain name.key。
    • 申请证书时如果未选择系统自动创建CSR,证书下载压缩包中将不包含.key文件。

    说明 .crt扩展名的证书文件采用Base64-encoded的PEM格式文本文件,可根据需要修改成.pem等扩展名。 证书格式详细内容,请参见主流数字证书都有哪些格式?

    操作步骤

    1. 登录阿里云阿里云SSL证书控制台
    2. 在SSL证书页面,单击已签发标签,定位到需要下载的证书并单击证书卡片右下角的下载,打开证书下载侧页面。

      下载

    3. 在证书下载侧页面中定位到Apache服务器,单击右侧操作栏的下载。如果需要安装多个证书,需在SSL控制台下载这些证书。

      Apache版证书

      完成Apache版证书压缩包的下载,并保存到本地。

    4. 解压已下载保存到本地的Apache证书文件。解压后的文件夹中有3个文件:证书文件

      • 证书文件:以.crt为后缀或文件类型。
      • 证书链文件:以.crt为后缀或文件类型。
      • 密钥文件:以.key为后缀或文件类型。
    5. 在Apache安装目录中新建cert目录,并将解压的Apache证书、 证书链文件和密钥文件拷贝到cert目录中。如果需要安装多个证书,需在Apache目录中新建对应数量的cert目录,用于存放不同的证书 。

      说明 如果申请证书时选择了手动创建CSR文件,请将手动生成创建的密钥文件拷贝到cert目录中并命名为domain name.key。

    6. 修改httpd.conf配置文件。

      1. 在Apache安装目录下,打开Apache/conf/httpd.conf文件,并找到以下参数,按照下文中注释内容进行配置。

        #LoadModule ssl_module modules/mod_ssl.so  #删除行首的配置语句注释符号“#”加载mod_ssl.so模块启用SSL服务,Apache默认是不启用该模块的。如果找不到该配置,请重新编译mod_ssl模块。
        #Include conf/extra/httpd-ssl.conf  #删除行首的配置语句注释符号“#”。                 
      2. 保存httpd.conf文件并退出。
    7. 修改httpd-ssl.conf配置文件。

      1. 打开Apache/conf/extra/httpd-ssl.conf文件并找到以下参数,按照下文中注释内容进行配置。 证书路径建议使用绝对路径。

        说明 根据操作系统的不同,http-ssl.conf文件也可能存放在conf.d/ssl.conf目录中。

        <VirtualHost *:443>     
            ServerName   #修改为申请证书时绑定的域名www.YourDomainName1.com。                    
            DocumentRoot  /data/www/hbappserver/public          
            SSLEngine on   
            SSLProtocol all -SSLv2 -SSLv3 # 添加SSL协议支持协议,去掉不安全的协议。
            SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM   # 修改加密套件。
            SSLHonorCipherOrder on
            SSLCertificateFile cert/domain name1_public.crt   # 将domain name1_public.crt替换成您证书文件名。
            SSLCertificateKeyFile cert/domain name1.key   # 将domain name1.key替换成您证书的密钥文件名。
            SSLCertificateChainFile cert/domain name1_chain.crt  # 将domain name1_chain.crt替换成您证书的密钥文件名;证书链开头如果有#字符,请删除。
        </VirtualHost>
        
        #如果证书包含多个域名,复制以上参数,并将ServerName替换成第二个域名。 
        <VirtualHost *:443>     
            ServerName   #修改为申请证书时绑定的第二个域名www.YourDomainName2.com。                    
            DocumentRoot  /data/www/hbappserver/public          
            SSLEngine on   
            SSLProtocol all -SSLv2 -SSLv3 # 添加SSL协议支持协议,去掉不安全的协议。
            SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM   # 修改加密套件。
            SSLHonorCipherOrder on
            SSLCertificateFile cert/domain name2_public.crt   # 将domain name2替换成您申请证书时的第二个域名。
            SSLCertificateKeyFile cert/domain name2.key   # 将domain name2替换成您申请证书时的第二个域名。
            SSLCertificateChainFile cert/domain name2_chain.crt  # 将domain name2替换成您申请证书时的第二个域名;证书链开头如果有#字符,请删除。
        </VirtualHost>

        说明 需注意您的浏览器版本是否支持SNI功能,如果不支持,多域名证书配置将无法生效。

      2. 保存httpd-ssl.conf文件并退出。
    8. 重启Apache服务器使SSL配置生效。在Apache的bin目录下执行以下命令:

      1. 停止Apache服务。

        apachectl -k stop
      2. 开启Apache服务。

        apachectl -k start
    9. 可选: 修改httpd.conf文件,设置HTTP请求自动跳转HTTPS。

      在httpd.conf文件中的<VirtualHost *:80> </VirtualHost>中间,添加以下重定向代码。

      RewriteEngine on
      RewriteCond %{SERVER_PORT} !^443$
      RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]

    后续操作

    证书安装完成后,可通过登录证书绑定域名的方式验证证书是否安装成功。

    https://domain name   #domain name替换成证书绑定的域名

    如果网页地址栏出现小锁标志,表示证书安装成功。

    • DV SSL数字证书部署在服务器上后,用户浏览器访问网站时,展示如下:
    • OV SSL数字证书部署在服务器上后,用户浏览器访问网站时,展示如下:
    • EV SSL数字证书部署在服务器上后,用户浏览器访问网站时,展示如下:

    验证证书是否安装成功时,如果网站无法通过https正常访问,需确认您安装证书的服务器443端口是否已开启或被其他工具拦截。

  • Tomcat 安装PFX格式证书

    阿里云SSL证书服务支持下载证书安装到Tomcat服务器上。Tomcat支持PFX格式和JKS两种格式的证书,您可根据您Tomcat的版本择其中一种格式的证书安装到Tomcat上。本文档介绍了PFX格式证书安装的具体步骤。

    前提条件

    • 已安装OpenSSL工具。
    • 已下载Tamcat服务器所需要的证书文件。证书下载具体操作,请参见下载证书说明

      • 申请证书时如果未选择系统自动创建CSR,证书下载压缩包中将不包含.txt文件。需要您选择其他类型服务器下载.crt证书,并使用openssl命令生成pfx文件。
      • 如果您自己拥有其他证书,可使用openssl命令将您自己的证书文件转化为相应格式的文件,安装到Tomcat服务器上。
    • 已登录您的Tomcat服务器。

    背景信息

    • 本文教程以Tomcat 7为例。
    • Tomcat 9强制要求证书别名设置为tomcat。您需要使用以下keytool命令将protocol="HTTP/1.1"转换成protocol="org.apache.coyote.http11.Http11NioProtocol"

      keytool -changealias -keystore domain name.pfx -alias alias -destalias tomcat
    • 本文档证书名称以domain name为示例,如证书文件名称为domain name.pfx,证书密码文件名称为pfx-password.txt。

    操作步骤

    1. 解压已下载保存到本地的Tomcat证书文件。解压后您将看到文件夹中有2个文件,您可为两个证书文件重命名:

      • 证书文件(domain name.pfx):以.pfx为后缀或文件类型。
      • 密码文件(pfx-password.txt):以.txt为后缀或文件类型。

      证书文件

      说明 每次下载证书都会产生新的密码,该密码仅匹配本次下载的证书。如果需要更新证书文件,同时也要更新匹配的密码。

    2. 在Tomcat安装目录下新建cert目录,将解压的证书和密码文件拷贝到cert目录下。
    3. 修改配置文件server.xml,并保存。文件路径:Tomcat安装目录/conf/server.xml

      定位到<Connector port=”8443”<Connector port="443"标签内容,参照以下两部分内容修改server.xml文件:

      <!--
        <Connector  port="8443"
      protocol="HTTP/1.1"
        port="8443" SSLEnabled="true"
        maxThreads="150" scheme="https" secure="true"
        clientAuth="false" sslProtocol="TLS" />
      -->
      <Connector port="443"
          protocol="HTTP/1.1"
          SSLEnabled="true"
          scheme="https"
          secure="true"
          keystoreFile="domain name.pfx"
          keystoreType="PKCS12"
          keystorePass="证书密码"   
          clientAuth="false"
          SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
          ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>

      说明

      • 其中port属性根据实际情况修改(https默认端口为443)。如果使用其他端口号,则您需要使用https://yourdomain:port的方式来访问您的网站。
      • 其中keystoreFile代表证书文件的路径,请用您证书的文件名替换domain name。
      • 其中keystorePass代表证书密码,请替换为密码文件pfx-password.txt中的内容。
    4. 可选: 配置web.xml文件,开启HTTP强制跳转HTTPS。在文件</welcome-file-list>后添加以下内容:

      <login-config>  
          <!-- Authorization setting for SSL -->  
          <auth-method>CLIENT-CERT</auth-method>  
          <realm-name>Client Cert Users-only Area</realm-name>  
      </login-config>  
      <security-constraint>  
          <!-- Authorization setting for SSL -->  
          <web-resource-collection >  
              <web-resource-name >SSL</web-resource-name>  
              <url-pattern>/*</url-pattern>  
          </web-resource-collection>  
          <user-data-constraint>  
              <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
          </user-data-constraint>  
      </security-constraint>
    5. 重启Tomcat。

    后续操作

    证书安装完成后,可通过登录证书绑定域名的方式验证证书是否安装成功。

    https://domain name.com   #domain name替换成证书绑定的域名

    如果网页地址栏出现绿色小锁标志,表示证书安装成功。

    验证证书是否安装成功时,如果网站无法通过https正常访问,需确认您安装证书的服务器443端口是否已开启或被其他工具拦截。