umming 发布的文章

 // 获取access_token
    private function getAccessToken($url, $header)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_TIMEOUT, 1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        return curl_exec($curl);
    } 
  // 微信授权登录
 function wxAuthLogin()
    {
       // $param = $this->request->param();
        $code = $this->frparam('code',1,'','POST');
        $appid = 'appid';
        $secret = 'appSecrect';
        $url = "https://api.weixin.qq.com/cgi-bin/token?appid=$appid&secret=$secret&grant_type=client_credential";
        try {
            $header = array('Accept: application/json',);
            // 获取access_token
            $wx_access_token = json_decode($this->getAccessToken($url, $header), true);
 
            $url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" . $wx_access_token['access_token'];
            $data = array('code' => $code); // 请确保$code变量已经定义
            $options = array(
                'http' => array(
                    'header' => "Content-Type: application/json\r\n",
                    'method' => 'POST',
                    'content' => json_encode($data)
                )
            );
            $context = stream_context_create($options);
            $response = file_get_contents($url, false, $context);
            $result = json_decode($response, true);
            if ($result['errcode'] != 0) {
                JsonReturn(["code" => 1, "msg" => '登录失败']);
            }else{
               $tel = $result['phone_info']['phoneNumber'];
               $m = M('member')->find(['tel'=>$w['tel']]);
              if($m){
                  //走登录流程
                  $update['logintime'] = time();
                   M('member')->update(array('id'=>$m['id']),$update);
                   
                   $payload = [
                        'userId' => $m['id'], 
                        'exp' => time() + 60,     // 1小时后过期
                        'tel' => $tel          // 自定义数据
                        ];
                   $userInfo['name']=$m['username'];
                   $userInfo['id']=$m['id'];
                   $userInfo['litpic']=$m['litpic'];
                   $token =TokenManager::generateToken($payload);
                  
                   JsonReturn(['code'=>0,'msg'=>'登录成功!','token'=>$token,userInfo=>$userInfo]);
               }else{
                   //新增用户
                     //$w['username'] = getRandChar(6);
                     $w['username'] = '微信用户';
                    $w['tel'] = $tel;
                    $w['gid'] = 1;
                    $w['litpic'] = 'https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132';
                    $w['regtime']=time();
                    $r = M('member')->add($w);  
                    if($r){
                        //走登录流程
                       $payload = [
                            'userId' => $r['id'], 
                            'exp' => time() + 60,     // 1小时后过期
                            'tel' => $tel          // 自定义数据
                            ];
                       $userInfo['name']=$w['username'];
                       $userInfo['id']=$r['id'];
                       $userInfo['litpic']=$w['litpic'];
                       $token =TokenManager::generateToken($payload);
                       JsonReturn(['code'=>0,'msg'=>'登录成功!','token'=>$token,userInfo=>$userInfo]); 
                            
                        
                    }
               }

              
            }
           

        } catch (Exception $exception) {
            return json(["code" => 0, "msg" => $exception->getMessage()]);
        }
    }

时间紧、面向现代用户:选 loading=lazy。

需全兼容或复杂效果:用 lazyload 插件。

折中方案:用 loading=lazy 为主,针对不支持的浏览器引入轻量级插件:

<script>
if ('loading' in HTMLImageElement.prototype === false) {
  var script = document.createElement('script');
  script.src = 'https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.3.2/lazysizes.min.js';
  document.body.appendChild(script);
}
</script>
<img src="your-image.jpg" alt="示例图片" loading="lazy" class="lazyload">

首先,确保你的 Node.js 版本为 12 或更高。然后使用 npm 全局安装 google-font-splitter:
npm install -g google-font-splitter

找一个空文件夹,并执行如下命令(字体下载会自动生成css文件)

google-font-splitter "https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;400;700&display=swap" //100~900 思源黑体

google-font-splitter "https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@300;500;700&display=swap" //200~900思源宋体

google-font-splitter "https://fonts.googleapis.com/css2?family=Ma+Shan+Zheng:wght@400&display=swap" 

google-font-splitter "https://fonts.googleapis.com/css2?family=WDXL+Lubrifont+SC:wght@400&display=swap" 

google-font-splitter "https://fonts.googleapis.com/css2?family=ZCOOL+XiaoWei:wght@400&display=swap"

google-font-splitter "https://fonts.googleapis.com/css2?family=Zhi+Mang+Xing:wght@400&display=swap" 

google-font-splitter "https://fonts.googleapis.com/css2?family=Long+Cang:wght@400&display=swap" 

google-font-splitter "https://fonts.googleapis.com/css2?family=Liu+Jian+Mao+Cao:wght@400&display=swap" 

function view(){
    if($_POST){
         $id = $this->frparam('tid',1);
         if($id){
             $view_time = time();
             $view_key = getRandChar(8);
             $res = M('classtype')->update(['id'=>$id],['view_key'=>$view_key,'view_time'=>$view_time]);
             if($res){
                 JsonReturn(['code'=>0,'msg'=>'链接生成!','url'=>'http://u.upic.top/case.html?key='.$view_key]); 
             }else{
                 JsonReturn(['code'=>1,'msg'=>'链接生成失败!']); 
             } 
         }
         
          else{
          JsonReturn(['code'=>1,'msg'=>'参数错误!']); 
          }
    }    
}