至尊技术网 https://www.zzwws.cn/ zh-CN 专注活动、软件、源码、教程,乐于分享! Fri, 28 Apr 2023 09:37:45 +0800 Fri, 28 Apr 2023 09:37:45 +0800 uni-app 部署到二级目录,打包H5空白页面或者刷新404 https://www.zzwws.cn/archives/6395/ https://www.zzwws.cn/archives/6395/ Fri, 28 Apr 2023 09:37:45 +0800 悠悠楠杉 部署到二级目录

打包H5空白页面或者刷新404

1、uni-app 打包H5空白页面或者刷新404,加入下面伪静态就可以解决了;
2、如果不想分2个域名去配置,想和后端thinkphp代码放在一起的话,可以在后端创建一个H5目录来放前端的文件,增加对应H5目录的伪静态重写规则,就可以正常访问了;
3、以下是伪静态的配置。

Nginx配置

location /h5/ {
  try_files $uri $uri/ /h5/index.html;
}

Apache配置
在h5目录里增加一个.htaccess文件

<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ /h5/index.html [L] 
IfModule>

如果单独配置一个前端域名的话,域名指向是h5目录的话,重写规则不需要带/h5

]]>
0 https://www.zzwws.cn/archives/6395/#comments https://www.zzwws.cn/feed/
Nginx负载均衡 https://www.zzwws.cn/archives/6393/ https://www.zzwws.cn/archives/6393/ Wed, 12 Apr 2023 10:44:00 +0800 悠悠楠杉 1、轮询
轮询是upstream模块负载均衡默认的策略,每个请求会按时间顺序逐个被分配到不同的后端服务器。轮询不需要额外的配置。

# 代理服务器
# 设置服务器组
upstream backend {
    server 111.173.115.2:80;
    server 111.173.115.3:80;
    server 111.173.115.4:80;
}
server {
    listen 80;
    server_name 111.173.115.1;
    
    location / {
        # backend 就是服务器组的名称
        proxy_pass http://backend/;
    }
}

2、weight加权(加权轮询)
weight=number:用来设置服务器的权重,默认为1,权重数字越大,被分配到请求的几率越大。该权重值主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。

# 代理服务器
# 设置服务器组
upstream backend {
    server 111.173.115.2:80 weight=10;
    server 111.173.115.3:80 weight=8;
    server 111.173.115.4:80 weight=6;
}
server {
    listen 80;
    server_name 111.173.115.1;
    
    location / {
        # backend 就是服务器组的名称
        proxy_pass http://backend/;
    }
}

3、ip_hash
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某一个IP的用户在后端Web服务器A上登录后,再访问该站点的其他URL,能保证其访问的还是后端web服务器A。
注意:使用ip_hash指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接受的请求少,而且设置后端服务器权重等方法将不起作用。

# 代理服务器
# 设置服务器组
upstream backend {
    ip_hash;
    server 111.173.115.2:80;
    server 111.173.115.3:80;
    server 111.173.115.4:80;
}
server {
    listen 80;
    server_name 111.173.115.1;
    
    location / {
        # backend 就是服务器组的名称
        proxy_pass http://backend/;
    }
}

4、least_conn
least_conn:最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

# 代理服务器
# 设置服务器组
upstream backend {
    least_conn;
    server 111.173.115.2:80;
    server 111.173.115.3:80;
    server 111.173.115.4:80;
}
server {
    listen 80;
    server_name 111.173.115.1;
    
    location / {
        # backend 就是服务器组的名称
        proxy_pass http://backend/;
    }
}

5、url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。

# 代理服务器
# 设置服务器组
upstream backend {
    hash $request_uri;
    server 111.173.115.2:80;
    server 111.173.115.3:80;
    server 111.173.115.4:80;
}
server {
    listen 80;
    server_name 111.173.115.1;
    
    location / {
        # backend 就是服务器组的名称
        proxy_pass http://backend/;
    }
}

6、fair
fair采用的不是内建负载均衡使用的均衡算法,而是可以根据页面大小、加载时间长短智能地进行负载均衡。那么如何使用第三方模块的fair负载均衡策略?

# 代理服务器
# 设置服务器组
upstream backend {
    fair;
    server 111.173.115.2:80;
    server 111.173.115.3:80;
    server 111.173.115.4:80;
}
server {
    listen 80;
    server_name 111.173.115.1;
    
    location / {
        # backend 就是服务器组的名称
        proxy_pass http://backend/;
    }
}

但是如果直接使用会报错,因为fair属于第三方模块实现的负载均衡。需要添加nginx-upstream-fair,如何添加对应的模块:

1.下载nginx-upstream-fair模块。

https://github.com/gnosek/nginx-upstream-fair

2.将下载的文件上传到服务器并进行解压缩。

unzip nginx-upstream-fair-master.zip

3.重命名资源。

mv nginx-upstream-fair-master fair

4.使用./configure命令将资源添加到Nginx模块中。

./configure --add-module=/root/fair

5.编译。

make

-编译可能会出现如下错误: nginx_http_upstream_srv_conf_t结构中缺少default_port

-解决方案 在Nginx的源码中src/http/nginx_http_upstream.h,找到ngx_http_upstream_srv_conf_s,在模块中添加default_port属性:
in_port_t default_port 然后再进行make。

6.更新Nginx。

1、将sbin目录下的nginx进行备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold

2、将安装目录下的objs中的nginx拷贝到sbin目录
cd objs
cp nginx /usr/local/nginx/sbin

3、更新
cd ../
make upgrade

7.编译测试使用Nginx。

]]>
0 https://www.zzwws.cn/archives/6393/#comments https://www.zzwws.cn/feed/
ThinkPHP6 excel表导入导出 https://www.zzwws.cn/archives/6389/ https://www.zzwws.cn/archives/6389/ Tue, 03 Jan 2023 14:12:00 +0800 悠悠楠杉 composer下载phpspreadsheet

composer require phpoffice/phpspreadsheet

PhpSpreadsheet中文简介

phpexcel由于版本陈旧性能低下官方放弃维护,转而开发PhpSpreadsheet用了最新得psr标准因而对php版本不向下兼容需要注意!

PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式

PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到

使用PhpSpreadsheet开发的PHP要求7.1或更高版本,并且支持链式操作

PhpSpreadsheet 支持的文件格式

文件路径extend/Excel.php

<?php
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use think\exception\ValidateException;

class Excel
{
    /**
     * 导入excel表格
     * @param array $file 文件路径
     * @return array|string
     */
    protected function importExcel($file)
    {
        try {
            // 截取后缀
            $fileExtendName = substr(strrchr($file, '.'), 1);
            // 有Xls和Xlsx格式两种
            if ($fileExtendName == 'xlsx') {
                $objReader = IOFactory::createReader('Xlsx');
            } else {
                $objReader = IOFactory::createReader('Xls');
            }
            // 设置文件为只读
            $objReader->setReadDataOnly(TRUE);
            // 读取文件,tp6默认上传的文件,在runtime的相应目录下,可根据实际情况自己更改
            $objPHPExcel = $objReader->load($_SERVER['DOCUMENT_ROOT'] . $file);
            //excel中的第一张sheet
            $sheet = $objPHPExcel->getSheet(0);
            // 取得总行数
            $highestRow = $sheet->getHighestRow();
            // 取得总列数
            $highestColumn = $sheet->getHighestColumn();
            Coordinate::columnIndexFromString($highestColumn);
            $lines = $highestRow - 1;
            if ($lines <= 0) {
                return '数据不能为空';
            }
            // 直接取出excle中的数据
            $data = $objPHPExcel->getActiveSheet()->toArray();
            // 删除第一个元素(表头)
            array_shift($data);
            // 返回结果
            return $data;
        } catch (ValidateException $e) {
            return $e->getMessage();
        }
    }

    /**
     * 导出excel表格
     * @param array $header 设置表头数据
     * @param array $data 生成的表格数据
     * @param bool $type 文件类型,true为Xlsx,false为Xls,默认为true
     * @param string $fileName 文件名,默认为数据
     */
    protected function export($header = [], $data = [], $type = true, $fileName = "数据")
    {
        // 实例化类
        $preadsheet = new Spreadsheet();
        // 创建sheet
        $sheet = $preadsheet->getActiveSheet();
        // 生成表头字母
        $letter = [];
        $n = 0;
        for ($i = 'A'; $i <= 'Z'; $i++) {
            if ($n<count($header)){
                $letter[] = $i;
            }else{
                break;
            }
            $n++;
        }
        // 循环设置表头数据
        foreach ($header as $k => $v) {
            // 解决长数字自动转科学计数法
            if(is_numeric($v) && strlen($v) > 11){
                $sheet->setCellValueExplicit($letter[$k].'1',$v,'s');
            }

            $sheet->setCellValue($letter[$k].'1', $v);
        }
        // 生成数据
        $sheet->fromArray($data, null, "A2");
        // 样式设置
        $sheet->getDefaultColumnDimension()->setWidth(12);
        // 设置下载与后缀
        if ($type) {
            header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            $type = "Xlsx";
            $suffix = "xlsx";
        } else {
            header("Content-Type:application/vnd.ms-excel");
            $type = "Xls";
            $suffix = "xls";
        }
        // 激活浏览器窗口
        header("Content-Disposition:attachment;filename=$fileName.$suffix");
        //缓存控制
        header("Cache-Control:max-age=0");
        // 调用方法执行下载
        $writer = IOFactory::createWriter($preadsheet, $type);
        // 数据流
        $writer->save("php://output");
    }
}

调用

$excel = new Excel();

// 导出
$header = ['姓名','性别'];
$data = [['小王','男'],['小李','男']];
$excel->export($header,$data);

// 导入
$data = $excel->importExcel('/storage/picture/20221222/77d80064c35db092c8124a13a7f6fcd5.xlsx');
if(is_array($data)){
    print_r($data);
}else{
    echo $data;
}

]]>
0 https://www.zzwws.cn/archives/6389/#comments https://www.zzwws.cn/feed/
HTML中的字符实体 https://www.zzwws.cn/archives/6387/ https://www.zzwws.cn/archives/6387/ Tue, 03 Jan 2023 10:22:00 +0800 悠悠楠杉 提示:需要把\去掉!

字符说明字符实体名实体编号
"双引号\&quot;\&#34;
'撇号\&apos;(IE不支持)\&#39;
<小于号\&lt;\&#60;
>大于号\&gt;\&#62;
&和号\&amp;\&#38;
©版权(copyright)\&copy;\&#169;
®注册商标\&reg;\&#174;
商标\&trade;\&#8482;
×乘号\&times;\&#215;
÷除号\&divide;\&#247;
£镑(pound)\&pound;\&#163;
¥元(yen)\&yen;\&#165;
竖条 \&#124;
§小节\&sect;\&#167;
Empty space不间断空格\&nbsp;\&#160;
欧元(euro)\&euro;\&#8364;
中文全角空格\&amp;\&#12288;
·间隔符\&middot;\&#183;
«左双尖括号\&laquo;\&#171;
»右双尖括号\&raquo;\&#187;
°\&deg;\&#176;
千分比\&permil;\&#8240;
]]>
0 https://www.zzwws.cn/archives/6387/#comments https://www.zzwws.cn/feed/
MySQL 小数类型 https://www.zzwws.cn/archives/6386/ https://www.zzwws.cn/archives/6386/ Wed, 28 Dec 2022 15:53:00 +0800 悠悠楠杉 定点数decimal
能够保证数据精确的小数(小数部分可能不精确,超出长度会四舍五入),整数部分一定精确
decimal(M, D), M表示总长度,最大值不能超过65,D代表小数部分长度,最长不能超过30

浮点型
又称为精度类型,是一种可能丢失精度的数据类型,数据可能不那么准确

float 单精度类型
4字节存储,7位精度,表示数据范围比整数大得多
float 表示不指定小数位的浮点数
float(M, D)表示一共存储M个有效数字,其中小数部分占D位

double 双精度类型
8个字节存储,表示范围更大,精度有15位左右
double 表示不指定小数位的浮点数
double(M, D)表示一共存储M个有效数字,其中小数部分占D位

如何选择
当需要存储的小数对精度要求不高时,可以选择FLOAT单精度浮点型,可以节省内存空间,提高计算速度。
当需要进行高速数学计算、科学计算、卫星定位计算等对精度要求较高时,可以选择DOUBLE双精度浮点型。
当需要进行精确计算,如工资结算、转账打款等财务类型的数据,可以选择DECIMAL定点型。

]]>
0 https://www.zzwws.cn/archives/6386/#comments https://www.zzwws.cn/feed/
ThinkPHP6使用DOMDocument报错 https://www.zzwws.cn/archives/6385/ https://www.zzwws.cn/archives/6385/ Fri, 23 Dec 2022 16:51:27 +0800 悠悠楠杉 每一个载入浏览器都会生成一个 Document 对象。

Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。Document 对象是 Window 对象的一部分。

我们项目中需要使用第三方支付,第三方支付文件使用了DOMDocument,如果直接使用DOMDocument的话会报错

解决方法
只需要在DOMDocument加上一个反斜杠就可以了

$dom = new \DOMDocument();
$dom->loadXML($data);
]]>
0 https://www.zzwws.cn/archives/6385/#comments https://www.zzwws.cn/feed/
ThinkPHP6使用阿里云短信服务 https://www.zzwws.cn/archives/6384/ https://www.zzwws.cn/archives/6384/ Fri, 16 Dec 2022 15:49:00 +0800 悠悠楠杉 使用composer安装sdk

composer require alibabacloud/sdk

新建一个控制器文件或者放到共用文件

<?php
namespace app\api\controller;

use app\BaseController;
use AlibabaCloud\Client\AlibabaCloud;
class Sms extends BaseController
{
    public function index()
    {
        $phone = input('phone');
        if(!$phone){
            echo '请传入手机号';
        }else if(!$this->validatePhone($phone)){
            echo '手机号格式错误';
        }else{
            $res = $this->sendCode($phone);
            if($res === true){
                echo '发送验证码成功';
            }else{
                // echo $res;
                echo '发送验证码失败';
            }
        }
    }

    /**
     * 发送短信验证码
     */
    protected function sendCode($phone)
    {
        return $this->sendSms('AccessKeyId','Secret',['phone' => '手机号','sign' => '至尊网络','code' => 'SMS_...','param' => json_encode(['code' => mt_rand(10000,99999)])]);
    }
  
    /**
     * 阿里云短信服务
     * @param $AccessKeyId
     * @param $Secret
     * @param $params
     * @return bool
     * @throws ClientException
     */
    protected function sendSms($AccessKeyId, $Secret, $params){
        if (empty($params['phone'])) {
            return false;
        }
        // 创建客户端
        AlibabaCloud::accessKeyClient($AccessKeyId, $Secret)
            ->regionId('cn-hangzhou')
            ->asDefaultClient();
        try {
            $query = [
                'RigionId'     => 'cn_hangzhou',
                'PhoneNumbers' => $params['phone'],// 输入的手机号
                'SignName'     => $params['sign'],// 签名信息
                'TemplateCode' => $params['code']// 短信模板id  
            ];
            if(!empty($param['param'])){
                $query['TemplateParam'] = $params['param'];// 可选,模板变量值,json格式
            }
            $result = AlibabaCloud::rpc()
                ->product('Dysmsapi')
                ->version('2017-05-25')
                ->action('SendSms')
                ->host('dysmsapi.aliyuncs.com')
                ->options([
                    // 这里的参数可以在openAPI Explorer里面查看
                    'query' => $query
                ])
                ->request();
            $arr = $result->toArray();
            // print_r($arr);
            if($arr['Code'] == 'OK'){
                return true;
            }else{
                return $arr['Message'];
            }  
        } catch (ClientException $e) {
            return $e->getErrorMessage();
        } catch (ServerException $e) {
            return $e->getErrorMessage();
        }
    } 
    
    /**
     * 校验手机号码
     * @param $phone
     * @return bool
     */
    protected function validatePhone($phone){
        if(!preg_match("/^(?:(?:\+|00)86)?1[3-9]\d{9}$/", $phone)){
            return false;
        }
        return true;
    }
}  

短信验证码防刷机制
1、时间限制:60秒后才能再次发送
2、手机号限制:同一个手机号,24小时之内不能够超过5条
3、短信验证码限制:30分钟之内发送同一个验证码
4、前后端校验:提交Token参数校验
5、唯一性限制:微信产品,限制同一个微信ID用户的请求数量
6、产品流程限制:分步骤进行
7、图形验证码限制:图形验证通过后再请求接口图形验证码前后台交互流程比较简单
8、IP及Cookie限制:限制相同的IP/Cookie信息最大数量
9、短信预警机制,做好出问题之后的防护

]]>
0 https://www.zzwws.cn/archives/6384/#comments https://www.zzwws.cn/feed/
Fiddler中文版抓包工具 https://www.zzwws.cn/archives/6383/ https://www.zzwws.cn/archives/6383/ Thu, 08 Dec 2022 10:16:00 +0800 悠悠楠杉

抓包工具有很多种,如Wireshark、Fiddler、Charlse、Tcpdump、浏览器工具(F12)等,但在软件测试工作中抓包对象一般是HTTP协议的接口,所以最多的是浏览器工具、Fiddler/Charlse。

Fiddler特点简单归纳如下
Fiddler能抓取客户端和服务器之间的HTTP/HTTPS请求,可以对接口请求设置断点,甚至修改输入输出数据
Fiddler只能抓取HTTP/HTTPS协议
Fiddler除能对PC端浏览器抓包外,还支持对移动端进行抓包

查看数据

允许远程计算机连接

允许捕获HTTPS连接

APP/手机浏览器抓包

1、设置手机网络代理

注意:手机必须与电脑连接的是同一个网络,即连同一个WIFI或手机直接连电脑的热点,再对这个网络进行代理设置,否则无法抓取数据。

2、手机安装证书
在手机上选择任意浏览器,输入第二步中的设置的代理地址,host为即Fiddler安装电脑的IPv4地址,端口号即为默认的8888,然后下载证书安装

会话窗口图标说明

最后重启一下Fiddler就可以了

下载地址:https://zhizun.lanzouy.com/iV7Sw0i4pd4f

]]>
0 https://www.zzwws.cn/archives/6383/#comments https://www.zzwws.cn/feed/
VSCode实用插件 https://www.zzwws.cn/archives/6370/ https://www.zzwws.cn/archives/6370/ Sat, 19 Nov 2022 14:10:00 +0800 悠悠楠杉 一、必备插件(web前端/PHP)

Chinese(中文)

HTML Snippets(代码提示)

HTML CSS Support(智能提示CSS类名以及id)

Auto Close Tag(自动闭合标签)

Auto Rename Tag(自动重命名 HTML 标签的开始和结束标签)

CSS Peek(选择某个 class 或者 id 名称按住Ctrl键+鼠标左键可以直接定位到该名称的CSS的位置)

Markmap(思维导图神器,.md文档编辑窗口的右上角就会多一个预览的图标Open as markmap,当然也可手动打开命令面板,输入Open as markmap)

css-auto-prefix(自动添加 CSS 私有前缀)

JavaScript (ES6) code snippets(智能提示与快速输入)

jQuery Code Snippets(jQuery代码智能提示)

px to rem & rpx & vw (cssrem)(px转换成rem,Font Size:填写设计稿的宽度/10)
需要在head引用lib-flexible:https://zhizun.lanzouy.com/iq8cDzuud2f

<script>
    if(window.screen.width >= 850){// 设置最大的字体大小,PC端显示,放到head
        document.getElementsByTagName('html')[0].style.fontSize = '85px';
    }
</script>

PHP Intelephense(PHP代码提示工具)

open in browser(快速打开html文件到浏览器预览)

Prettier - Code formatter(文件格式化,可配置自动格式化)

Vetur(官方钦定Vue插件)

Vue Language Features(默认的vue文件在vs code里全部是一样的文字,且不能点击。该插件让vue文件的内容有了颜色区分,同时支持点击相对路径文件的跳转)

二、效率神器

Bracket Pair Colorizer(括号做颜色区分)

Browser Preview(VSCode里面打开浏览器)

REST Client(接口调试)

Partial Diff(文件比较)

Npm Intellisense(自动完成导入语句中的npm模块)

Path Intellisense(快速引入文件)

Color Highlight(设置 CSS 颜色的样式)

Project Dashboard(项目仪表板插件)

CodeSnap(代码截图插件)

Path Autocomplete(路径自动完成)

IntelliCode(提供智能的代码建议,默认支持 Python、TypeScript/JavaScript、React 和 Java)

ES7 React/Redux/GraphQL/React-Native snippets(语法智能提示,React 开发者必备)

Live SASS Compiler(可以将 SASS 或 SCSS 文件实时编译或转译为 CSS 文件)

Remote-SSH(SSH 服务器的远程机器作为开发环境)

Debugger for chrome(微软开发的插件,调试 JS 代码,可以设置断点、逐步执行代码、调试动态添加的脚本等)

Live Server(实时加载功能的小型服务器)

Minify(压缩html、css、js文件,安装后按F1再输入Minify)

Regex Previewer(实时预览正则表达式的效果)

HTML Boilerplate(一键生成 HTML 模板)

wakatime(编程时间及行为跟踪统计)

any-rule(常用正则大全)

Image preview(预览图片)

Tabnine(多语言的插件,自动完成代码的输入)

Settings Sync(配置同步到云端,登录账号也会同步扩展)

Codelf(提供很多建议的命名,选中文本再右键点击Codelf)

Highlight Matching Tag(突出显示匹配的开始和/或结束标签)

Turbo Console Log(快速添加 console.log 信息,js debug 必备,ctrl + alt + l 选中变量之后,使用这个快捷键生成 console.log,alt + shift + c 注释所有 console.log,alt + shift + u 启用所有 console.log,alt + shift + d 删除所有 console.log)

Sort lines(对当前文本排序)

Data Preview(预览数据文件)

三、Git集成

GitHub Pull requests( 查看和管理GitHub拉取请求和问题)

Git Graph(Git 图形化显示和操作)

GitLens(快速查看更改行或代码块的对象)

GitHistory(可查看和搜索git日志以及图形和详细信息)

四、美化

GitHub Theme(黑白两款皮肤)

vscode-icons(漂亮的目录树图标主题)

Better Align(代码优雅排版)

Better Comments(丰富注释颜色)

vscode-json(处理 JSON 文件)

Prettier(格式化插件支持React)

Material Theme(集成了多种主题皮肤)

Material Icon Theme(扁平化的主题图标库)

Beautify(右键鼠标一键格式化)

五、代码规范

change-case(变量命名规范)

JavaScript Booster(代码改进)

ESlint(严谨的规范书写)

TSLint(书写规范)

Code Spell Checker(拼写检查程序)

koroFileHeader(生成文件头部注释和函数注释)

Error Lens(代码检查(错误、警告、语法问题)进行突出显示)

EditorConfig for VS Code(代码风格统一)

六、装X神器

Markdown All in One(书写Markdown)

vscode-drawio(画流程图)

Polacode-2020(转化成一张逼格满满的图片)

Live Share(与他人实时进行协作式编辑和调试)

Markdown Preview Enhanced(在 VSCode 里编写 Markdown,支持预览)

]]>
0 https://www.zzwws.cn/archives/6370/#comments https://www.zzwws.cn/feed/
ThinkPHP6使用扩展类库 https://www.zzwws.cn/archives/6369/ https://www.zzwws.cn/archives/6369/ Wed, 16 Nov 2022 10:06:45 +0800 悠悠楠杉 在使用thinkphp6时,经常要引用第三方类库,比如upload.php类,在框架根目录下的 extend 目录称为 扩展类库目录,用于存放一些自定义的类,只要符合自动加载的规范(命名空间、类名、文件名),就可以拿来直接使用。

1. extend 目录的直接子内容
假设在 extend 目录下创建一个 Upload.php 文件,如果是 extend 目录的直接子内容则不需要添加命名空间

<?php

class Upload
{
    
}

此时可以在控制器中直接使用 \Upload 类,特别注意命名空间

2. 带层级的类
假设在 extend/file 目录下创建一个 Upload.php 文件,此时需要添加命名空间

<?php

namespace file;

class Upload
{
    
}

此时可以在控制器中直接使用 \file\Upload 类

// 测试
dump(new \Upload());
dump(new \file\Upload());
]]>
0 https://www.zzwws.cn/archives/6369/#comments https://www.zzwws.cn/feed/