• 写给2019

    • 一眨眼的功夫,2019年就完事了,为何今年过得特别特别快,那是因为很忙。当你很闲的时候,会觉得度日如年,当你特别忙的时候,会觉得时间如流水,匆匆而止。

      回首2019年,每个月都发生的事都历历在目:

      1. 第二个驾校的软件单,失败
      2. 第三个汽修的软件单,失败
      3. 第四个IDC软件单,超时,未上线
      4. 邻居3万家庭单,被拒保,失败
      5. 外地原兄弟公司6万团险单,失败
      6. 公司贸然招聘两员工,失败
      7. 开车睡觉,冲到绿化带

      2019最大的收获是认识了很多新朋友,联络了很多老朋友,重新回归师傅门下进修学习,没交学费,师傅还给了项目做,感恩有您,感恩2019,虽然今年失败的事很多,但是也有不少成功的事:

      1. 加入中信保诚人寿四川分公司,技术转型销售,精神状态直线上升
      2. 同时拍了我人生第一张职业装照(比当新郎官的照片还帅)
      3. 签了我的第一个大单,刘同学的家庭单
      4. 萨莫尔科技拿到营业执照
      5. 公司组织日本游,拿到全国新人TOP10
      6. 父亲因为眼晴两次住院,一直陪在父亲身边
      7. 今年接的第一个医院体检软件单,原计划15天完成,实际5天完成
      8. 俯卧撑减肥20斤
      9. 第一个跨本台软件1.0版本完成开发
      10. 今年对Linux服务器有了更多操作层面的学习
      11. 学习了HTML5、Bootstrap、jQuery、CSS
      12. 学习了Chorme二次开发
      13. 重金收购了sacrm.com和it028.com两域名
      14. 注册了Dayong.wang(本站新域名)
      15. 注册10个商标(正在审核中)
      16. 提交一个软件著作权

      转型中,总结失败原因, 2020年继续努力,最后放1张今年的照片吧

      IMG_20190812_085348.jpg

    • 统计MSSQL中各表的行数及空间

    • CREATE TABLE #table_stat 
      ( 
          [Name]          varchar(100),       --表名称 
          [Rows]          int,                --表行数 
          [Reserved]      varchar(1000),      --表分配空间总量 
          [Data]          varchar(1000),      --数据使用空间量 
          [Index_size]    varchar(1000),      --索引使用空间量 
          [Unused]        varchar(1000)       --未用空间量 
      ); 
       
      EXEC sp_MSForEachTable N'INSERT INTO #table_stat EXEC sp_spaceused N''?''' 
      SELECT * FROM #table_stat ORDER BY Rows DESC 
      DROP TABLE #table_stat 
    • JS使用setInterval或setTimeout隔几秒后跳转页面

    • 跳转页面主要使用window的两个对象方法,setInterval()和setTimeout()

      setInterval(code,millisec)

      定义和用法
      setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
      setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

      语法
      setInterval(code,millisec[,"lang"])

      参数 描述
      code 必需。要调用的函数或要执行的代码串。
      millisec 必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。

      setTimeout(code,millisec)

      语法
      setTimeout(code,millisec)

      参数 描述
      code 必需。要调用的函数后要执行的 JavaScript 代码串。
      millisec 必需。在执行代码前需等待的毫秒数。

      setInterval实例

      <p id="page_div">将在5秒后自动跳转到首页</p>
       
      <script language="javascript">
          var num = 4; //倒计时的秒数
          var URL = "index.html";
          var id = window.setInterval('doUpdate()', 1000); 
          function doUpdate() {
              document.getElementById('page_div').innerHTML = '将在'+num+'秒后自动跳转到首页' ;
              if(num == 0) {
                  window.clearInterval(id);
                  window.location = URL; 
              }
              num --;
          }
      </script>
      

      setTimeout实例

      <p id="page_div">将在5秒后自动跳转到首页</p>
       
      <script language="javascript">
          var num = 4; //倒计时的秒数
          var URL = "index.html";
          window.setTimeout("doUpdate()", 1000);
          function doUpdate(){
              if(num != 0){
                  document.getElementById('page_div').innerHTML = '将在'+num+'秒后自动跳转到首页' ;
                  num --;
                  window.setTimeout("doUpdate()", 1000);
              }else{
                  num = 4;
                  window.location = URL; 
              }
          }
      </script>
    • php字符串大小写转换

    • PHP共有8个字符串大小写转换的函数:
      strtoupper()、strtolower()、ucfirst()、ucfirst()、ucwords()、mb_strtoupper()、mb_strtolower()和mb_convert_case()

      这八个函数的区别和联系:

      函数名称-------使用范围-------功能

      strtoupper-------PHP4、PHP5-------将字符串转化为大写
      strtolower-------PHP4、PHP5-------将字符串转化为小写
      ucfirst-------PHP4、PHP5-------将字符串的首字母转化为大写
      lcfirst-------PHP5>= 5.3.0-------将字符串的首字母转化为小写
      ucwords-------PHP4、PHP5-------将字符串中每个单词的首字符转化为大写
      mb_strtoupper-------PHP4>=4.3.0,PHP 5-------将字符串转化为大写(与strtoupper函数有区别)
      mb_strtolower-------PHP4>=4.3.0,PHP 5-------将字符串转化为小写(与strtolower函数有区别)
      mb_convert_case-------PHP4>=4.3.0,PHP 5-------按照不同的模式对字符串进行转换

    • PHP output_buffering的问题

    • 今天遇到一问题,现象是可以设置Cookie,但是无法读取Cookie内容,用Google浏览器跟踪,发现根本没有Cookie内容输出,导致程序无法进行Cookie验证。

      在网上找了一圈,检查了程序,找BUG,最后发现是PHP环境的问题

      将PHP.ihi文件中,设置[scode type="green"]output_buffering = On[/scode]解决问题

      为了表格token验证,可害苦了啊,搞了一下午

      不过这个问题解决之后,表单可以自动设置token验证,也是大事一件,吼吼

    • jQuery取得select选择的文本与值

    • 获取select

      获取select 选中的 text :

      $("#ddlregtype").find("option:selected").text();
      

      获取select选中的 value:

      $("#ddlregtype ").val();
      

      获取select选中的索引:

      $("#ddlregtype ").get(0).selectedindex;
      

      设置select

      设置select 选中的索引:

      $("#ddlregtype ").get(0).selectedindex=index;//index为索引值
      

      设置select 选中的value:

      $("#ddlregtype ").attr("value","normal“);
      $("#ddlregtype ").val("normal");
      $("#ddlregtype ").get(0).value = value;
      

      设置select 选中的text:

      var count = $("#ddlregtype option").length;
      for (var i = 0; i < count; i++) {
          if ($("#ddlregtype ").get(0).options[i].text == text) {
              $("#ddlregtype ").get(0).options[i].selected = true;
              break;
          }
      }
      $("#select_id option[text='jquery']").attr("selected", true);
      

      设置select option项:

      $("#select_id").append("<option value='value'>text</option>"); //添加一项option
      $("#select_id").prepend("<option value='0'>请选择</option>"); //在前面插入一项option
      $("#select_id option:last").remove(); //删除索引值最大的option
      $("#select_id option[index='0']").remove(); //删除索引值为0的option
      $("#select_id option[value='3']").remove(); //删除值为3的option
      $("#select_id option[text='4']").remove(); //删除text值为4的option
      

      清空 select:

      $("#ddlregtype ").empty();
      

      工作需要,要获得两个表单中的值。如图:

      如何获得从左边选择框添加到右边选择框中的值?我想了想用网页特效可以获得,这里用了比较流行的jquery。
      js代码如下:

      //获取所有属性值 var item = $("#select1").val();
      $(function() {
          $('#select1').each( //获得select1的所有值
              function() {
                  $('button').click(function() {
                      alert($('#select2').val()); //获得select2中的select1值
                  });
              });
      })
      
      

      值得注意的是,不能直接写成

      $(function() {
          $('#select2').each( //获得select1的所有值,因为前面讲选项从左边添加到右边,jquery其实并没有真正将值从左边传到右边。
              function() {
                  $('button').click(function() {
                      alert($(this).val()); //获得select2中的select1值
                  });
              });
      })
      
      

      html:

      <div class="centent">
          <select multiple="multiple" id="select1" name="dd" style="width:100px;height:160px;">
              <option value="1">选项1</option>
              <option value="2">选项2</option>
              <option value="3">选项3</option>
              <option value="4">选项4</option>
              <option value="5">选项5</option>
              <option value="6">选项6</option>
              <option value="7">选项7</option>
          </select>
          <div>
              <span id="add">选中添加到右边&gt;&gt;</span>
              <span id="add_all">全部添加到右边&gt;&gt;</span>
          </div>            
      </div>
      
      <div class="centent">
          <select multiple="multiple" id="select2" name="sel" style="width: 100px;height:160px;">
          </select>
          <div>
              <span id="remove">&lt;&lt;选中删除到左边</span>
              <span id="remove_all">&lt;&lt;全部删除到左边</span>
          </div>            
      </div>
      

      使用JQuery,Ajax调用动态填充Select的option选项

      //绑定ClassLevel1单击事件
      $("#ClassLevel1").change(function() {
          var id = $("#ClassLevel1").val();
          var level2 = $("#ClassLevel2");
          level2.empty();
          $("#ClassLevel3").hide();
          $.ajax({
              url: "./askCommon.ashx?action=getclasslevel&pid=" + id,
              data: {
                  "type": "ajax"
              },
              datatype: "json",
              type: "get",
              success: function(data) {
                  var json = eval_r(data);
                  for (var ind in json) {
                      level2.append($("<option value='" + json[ind].id + "'>" + json[ind].typename + "</option>"));
                  }
      
              }
          });
      })
      
      
    • PHP 文件分块下载实例

    • 调用方法:download_file($file);

      public function download_file($file)
      {
          $file = "https://www.inbeijing.org/people_snake.mp4";
          $range = "0-1";
          $response = $this->curl_get_with_head($file, array(
              "Range: bytes={$range}"
          ));
          $eTag = $response['etag'];
          $length = $response['length'];
          dd($length);
          $chunkCount = 100;
          $step = ceil($length / $chunkCount);
          for($i=0;$i<$chunkCount;$i++) {
              $start = $i * $step;
              $end = (($i+1) * $step) -1;
              if($end > $length) {
                  $end = $length;
              }
              $range = $start. '-'. $end;
              $con = $this->curl_get_with_body('https://www.inbeijing.org/people_snake.mp4', $range);
              file_put_contents('c:\\snake.mp4', $con, FILE_APPEND);
              echo("总大小{$length},共计{$chunkCount}片,第{$i}片下载完成, range:". $range ."\n");
          }
      }
      
      
      //get请求
      public function curl_get_with_head($url, $header)
      {
          $curl = curl_init();
      
          curl_setopt_array($curl, array(
              CURLOPT_URL => $url,
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_ENCODING => "",
              CURLOPT_MAXREDIRS => 10,
              CURLOPT_TIMEOUT => 30,
              CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
              CURLOPT_CUSTOMREQUEST => "HEAD",
              CURLOPT_POSTFIELDS => "",
              CURLOPT_SSL_VERIFYPEER => false,
              CURLOPT_SSL_VERIFYHOST => 2,
              //CURLINFO_HEADER_OUT => TRUE,    //获取请求头
              CURLOPT_HEADER => true, //获取响应头
              CURLOPT_NOBODY => true, //不需要响应正文
              CURLOPT_HTTPHEADER => $header,
          ));
      
          $response = curl_exec($curl);
          $err = curl_error($curl);
          curl_close($curl);
          $responseHeader = explode("\r\n", $response);
          $totalLength = $eTag = '';
          foreach($responseHeader as $response) {
              if($response){
                  //获取文件总长度
                  if(strpos($response, 'Content-Range:', 0) !== false) {
                      $totalLength = explode(':', $response);
                      $totalLength = array_pop($totalLength);
                      $totalLength = explode('/', $totalLength);
                      $totalLength = array_pop($totalLength);
                  }
                  //获取文件etag
                  if(strpos($response, 'ETag:', 0) !== false) {
                      $eTag = explode(':', $response);
                      $eTag = array_pop($eTag);
                      $eTag = trim(str_replace('"', '', $eTag));
                  }
              }
      
          }
      
          if ($err) {
              return "cURL Error #:" . $err;
          } else {
              return ['length' => $totalLength, 'etag' => $eTag];
          }
      }
      
      
      //get请求获取body体
      public function curl_get_with_body($url, $range)
      {
          $curl = curl_init();
      
          curl_setopt_array($curl, array(
              CURLOPT_URL => $url,
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_ENCODING => "",
              CURLOPT_MAXREDIRS => 10,
              CURLOPT_TIMEOUT => 30,
              CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
              CURLOPT_CUSTOMREQUEST => "GET",
              CURLOPT_POSTFIELDS => "",
              CURLOPT_SSL_VERIFYPEER => false,
              CURLOPT_SSL_VERIFYHOST => 2,
              CURLOPT_HTTPHEADER => array(
                  "Range: bytes={$range}"
              ),
          ));
      
          $response = curl_exec($curl);
          $err = curl_error($curl);
          curl_close($curl);
      
          if ($err) {
              return "cURL Error #:" . $err;
          } else {
              return $response;
          }
      }
      
    • PHP Unicode编码与解码

    • PHP Unicode编码方法,将中文转为Unicode字符

      字符串转换为Unicode编码

      例如将字符串转换为unicode字符串,代码如下:

      /将内容进行UNICODE编码

      public function utf8_unicode($name){  
          $name = iconv('UTF-8', 'UCS-2', $name);  
          $len  = strlen($name);  
          $str  = '';  
          for ($i = 0; $i < $len - 1; $i = $i + 2){  
              $c  = $name[$i];  
              $c2 = $name[$i + 1];  
              if (ord($c) > 0){   //两个字节的文字  
                  $str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);  
                  //$str .= base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);  
              } else {  
                  $str .= '\u'.str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);  
                  //$str .= str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);  
              }  
          }  
          $str = strtoupper($str);//转换为大写  
          return $str;  
      }  
      
      

      unicode解码方法

      将上面的unicode字符转换成中文,代码如下:

      //unicode 转 utf-8 
      public function unicode_decodessss($name)  
      {  
          $name = strtolower($name);  
          // 转换编码,将Unicode编码转换成可以浏览的utf-8编码  
          $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';  
          preg_match_all($pattern, $name, $matches);  
          if (!empty($matches))  
          {  
              $name = '';  
              for ($j = 0; $j < count($matches[0]); $j++)  
              {  
                  $str = $matches[0][$j];  
                  if (strpos($str, '\\u') === 0)  
                  {  
                      $code = base_convert(substr($str, 2, 2), 16, 10);  
                      $code2 = base_convert(substr($str, 4), 16, 10);  
                      $c = chr($code).chr($code2);  
                      $c = iconv('UCS-2', 'UTF-8', $c);  
                      $name .= $c;  
                  }  
                  else  
                  {  
                      $name .= $str;  
                  }  
              }  
          }  
          return $name;  
      }  
       
      $unicode_str = "\u50bb\u732b\u7f51\u7edc\u65e5\u5fd7";
      echo unicodeDecode($unicode_str);
      
      

      总结:unicode的编码解码虽然代码不多,但是真要你写出来的话,一般情况下我们还不会,因此做个笔记记下来是一个不错的选择。

    • PHP数组与JSON之间的转换

    • 这两天在做项目过程,日志要记录修改信息,于是我就想到了将$_POST提交的内容记录到日志里,但是直接写入数据时,值显示array,需要将POST提交的数组格式化一下,将POST数组转换为JSON串即可,使用json_encode函数就行,存储到数据库的值是Unicode编码后的,即汉字已经转换为Unicode编码,如果要查看日志内容,需要将内容反向解码即可.

      PHP unicode解码方法见这里 [button color="info" icon="" url="https://samool.com/PHP-UnicodeEncode-unicodeDecode.html" type=""]解码方法[/button]

      在线解码看这里 [button color="success" icon="" url="https://www.w3cschool.cn/tools/index?name=unicode_chinese" type=""]点我[/button]

      <?php
         $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
         echo json_encode($arr);
      ?>
      

      以上代码执行结果为:
      {"a":1,"b":2,"c":3,"d":4,"e":5}

      JSON 函数

      函数 描述
      json_encode 对变量进行 JSON 编码
      json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
      json_last_error 返回最后发生的错误

      json_encode

      PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。

      语法
      string json_encode ( $value [, $options = 0 ] )

      参数
      value: 要编码的值。该函数只对 UTF-8 编码的数据有效。
      options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT

      实例如何将 PHP 对象转换为 JSON 格式数据:

      <?php
         class Emp {
             public $name = "";
             public $hobbies  = "";
             public $birthdate = "";
         }
         $e = new Emp();
         $e->name = "sachin";
         $e->hobbies  = "sports";
         $e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
         $e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));
       
         echo json_encode($e);
      ?>
      

      以上代码执行结果为:
      {"name":"sachin","hobbies":"sports","birthdate":"08/05/1974 12:20:03 pm"}

      json_decode

      PHP json_decode() 函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量。

      语法
      mixed json_decode ($json_string [,$assoc = false [, $depth = 512 [, $options = 0 ]]])

      参数
      json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
      assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
      depth: 整数类型的参数,它指定递归深度
      options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING

      以下实例演示了如何解码 JSON 数据:

      <?php
         $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; 
         var_dump(json_decode($json));
         var_dump(json_decode($json, true));
      ?>
      

      以上代码执行结果为:

      object(stdClass)#1 (5) {
          ["a"] => int(1)
          ["b"] => int(2)
          ["c"] => int(3)
          ["d"] => int(4)
          ["e"] => int(5)
      }
       
      array(5) {
          ["a"] => int(1)
          ["b"] => int(2)
          ["c"] => int(3)
          ["d"] => int(4)
          ["e"] => int(5)
      }
      

      如果您觉得本文对你有帮助,请给我点【赞】

    • SACRM的来源

    • 15年前,我的第一份工作是做公司网站(当时用PHP+MYSQL做),后来公司需要客户资料管理系统,于是就转Delphi应用软件开发了,不知不觉做了15年的桌面应用软件开发,主要是数据库相关,BOSS系统开发,侧重于CRM系统开发。

      5前年,有一个机会转WEB开发的,我的师傅波哥让我给他们开发一套IDC管理系统,我们当时商量就用WEB开发,由于我刚跳到新公司,工作比较忙,这个事就一直拉下来了,5年后这个重担还是落在我的肩上,哈哈

      如果只是为了应付IDC系统开发,完全可以在网上找个框架开发一套类似CMS的系统即可,我选了一条最笨的办法,使用PHP+MYSQL从底层开始开发,目标很明确,主要是解决以下三个问题:

      1、跨平台的问题(之前做的应用软件主要在windows环境下运行,无法实现跨平台)
      2、新技术应用的问题(之前是Delphi作为主要开发语言,但是这几年Delphi逐渐走向衰败,必须要使用新的技术手段)
      3、系统颜值问题(之前给公司做系统,主要精力都在功能实现上面,UI界面嘛,看得过去就行,但是现在公司要做产品,必须要一套颜值过硬的才行)

      为了解决这三个问题,我选了Centos作为服务器环境,宝塔面板,Apache+PHP+MYSQL作为开发平台
      主要HBuilder X作为开发工具,采用了开源框架PHPgrace+Bootstrap

      花了很多时间在底层框架开发上,因为我知道磨刀不误砍柴工,底层框架做好了,在上面做业务应用是非常方便的,通过底层框架可以封装很多常用的函数功能,同时对开源框架也会有深刻的理解,这段时间一直在磨刀,哈哈

      做了一个多月,把我之前15年应用软件开发慢慢转化到WEB上,把好的开发思维都转移到WEB开发上来,因为有开发经验,所以换种语言做开发,学习速度其实是很快的,起点比较高,并非是从0开始。

      我把这个系统取名为【轻武CRM】,英文名【SACRM】

      Samll Arms, although small, but lethal

      轻武即为轻型武器,虽小、但有杀力
      生于2019年,源于15年CRM开发经验总结

      追求卓越是我们永远不变目标
      虽然我是一个新生命,但是我每天都在长大

      测试地址:https://www.sacrm.cn/ 测试帐号:admin 密码:888888

      SACRM是一套框架,在这个框架上可以开发各种应用系统。

      需要定制软件开发的朋友,欢迎扫码加微信洽谈

      我的微信.jpg

      下面是系统截图展示

      [album]
      [
      login.png
      仪表盘.png
      更新日志.png
      系统信息.png
      参数设置.png
      角色编辑.png
      操作员管理.png
      操作日志.png
      登录日志.png
      基础数据管理.png
      产品管理.png
      故障管理.png
      故障信息.png
      机房查看.png
      客户管理界面.png
      添加客户.png
      新增基础数据.png
      ]
      [/album]

Powered by Typecho)))   ICP:蜀ICP备05009250号