作者: Mr.Li

  • 如何安装 Composer

    如何安装 Composer

    下载 Composer

    安装前请务必确保已经正确安装了 PHP。打开命令行窗口并执行 php -v 查看是否正确输出版本号。

    打开命令行并依次执行下列命令安装最新版本的 Composer:

    复制
    php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
    
    复制
    php composer-setup.php
    
    复制
    php -r "unlink('composer-setup.php');"
    

    执行第一条命令下载下来的 composer-setup.php 脚本将简单地检测 php.ini 中的参数设置,如果某些参数未正确设置则会给出警告;然后下载最新版本的 composer.phar 文件到当前目录。

    上述 3 条命令的作用依次是:

    1. 下载安装脚本 - composer-setup.php - 到当前目录。
    2. 执行安装过程。
    3. 删除安装脚本。

    局部安装

    上述下载 Composer 的过程正确执行完毕后,可以将 composer.phar 文件复制到任意目录(比如项目根目录下),然后通过 php composer.phar 指令即可使用 Composer 了!

    全局安装

    全局安装是将 Composer 安装到系统环境变量 PATH 所包含的路径下面,然后就能够在命令行窗口中直接执行 composer 命令了。

    Mac 或 Linux 系统:

    打开命令行窗口并执行如下命令将前面下载的 composer.phar 文件移动到 /usr/local/bin/ 目录下面:

    复制
    sudo mv composer.phar /usr/local/bin/composer
    

    Windows 系统:

    1. 找到并进入 PHP 的安装目录(和你在命令行中执行的 php 指令应该是同一套 PHP)。
    2. composer.phar 复制到 PHP 的安装目录下面,也就是和 php.exe 在同一级目录。
    3. 在 PHP 安装目录下新建一个 composer.bat 文件,并将下列代码保存到此文件中。
    复制
    @php "%~dp0composer.phar" %*
    

    最后重新打开一个命令行窗口试一试执行 composer --version 看看是否正确输出版本号。

    最后

    提示:不要忘了经常执行 composer selfupdate 以保持 Composer 一直是最新版本哦!

    关于升级 Composer

    Composer 升级时是无法利用我们的镜像加速下载的,而必须连接到 Composer 国外官网的服务器上下载升级文件,某些时候就会导致升级的速度非常慢甚至失败。

    这里提供一个简单的办法:

    如果你的系统中已经有可以正常使用的 Composer 了,说明系统环境是符合要求的,那么只需要下载新的 Composer 文件并覆盖原来的文件即可。

    首先你要确定现有的 Composer 的安装目录,然后通过下面的链接下载 composer.phar 文件(复制以下地址到浏览器地址栏可直接下载),

    复制
    https://install.phpcomposer.com/composer.phar
    

    将前面下载的 composer.phar 文件覆盖系统中已经安装的 composer.phar 文件即可。注意,有可能在安装时将 composer.phar 改名为 composer 了,注意用同样的名字覆盖即可。

  • 常见问题之Golang——cgo: C compiler “gcc” not found: exec: “gcc”: executable file not found in %PATH%错误

    常见问题之Golang——cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%错误

    背景

    本系列文章均为学习过程中记录的笔记,欢迎和我一起来学习Go语言。

    全文使用环境如下:

    • 操作系统:windows10
    • 使用工具:Goland开发工具
    • golang版本:1.17

    简介

    本文主要是对我日常在使用golang时遇到的一些问题与解决方式进行的汇总,在此提供给大家便于排查一些遇到的问题,其中有更好的解决方案可在评论区留言。

    正文

    错误

    cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%
    
    Compilation finished with exit code 2

    造成原因分析:

    缺少gcc编译器,需要进行安装

    解决方案:

    下载x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z

    1、进行下载基础程序并进行安装

    这里我们直接使用在线安装即可,通常你能打开这个下载页,基本上在线安装也没有啥问题,怕出问题你就打开访问国外网站就行。

    注意:这里需要根据系统是64还是32位进行选择,一般我们的系统都是64位的,改为x86_64即可。

    选择好一个要安装的位置,就等着它装完吧

    2、安装完成后,将该程序的命令程序可以在cmd中调用起来

    打开系统环境变量,在系统path变量上面追加一下刚才安装的bin文件夹,如下图所示:

    3、打开cmd,进行输入gcc -v 查看是否能有效加载起来刚才配置
    C:\Users\cnhuashao>gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=D:/Program\ Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
    Target: x86_64-w64-mingw32
    Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_64-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '
    Thread model: posix
    gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

    4、重启一下之前报错的程序或Goland,再次进行启动程序尝试,恢复正常。

    本文声明:

    知识共享许可协议

    本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

  • composer插件之—-Box\Spout\Reader导出

    composer require box/spout //下载的插件
    

    最近测试了这个插件,发现最新的插件不支持这样写了。
    好多方法都废弃了,下面的这些适合用2.7.3的版本,下面还有3.1的用法。

    //2的版本废弃的是注释的。 这个是导出的。
    use Box\Spout\Writer\Common\Creator\WriterEntityFactory; // namespace is no longer "Box\Spout\Writer"
    ...
    $writer = WriterEntityFactory::createXLSXWriter(); // replaces WriterFactory::create(Type::XLSX)
    $writer = WriterEntityFactory::createCSVWriter();  // replaces WriterFactory::create(Type::CSV)
    $writer = WriterEntityFactory::createODSWriter();  // replaces WriterFactory::create(Type::ODS)
    

    Box\Spout\Reader:可以处理大的表格数据。
    首先我们在学一下:使用box插件来进行导出。
    下面我们写一个HTML的点击按钮。

    <a href="{:url('orderlogdoexcel',input())}" class="piliang-btn-style">批量导出</a>
    

    接下来我们开始写PHP的代码。
    我们新建一个index的控制器(我是在YII2框架里面写的demo)大家可以根据自己的框架进行编写。

    public function orderlogdoexcel()
    {
        $fileName = 'orderlog.xlsx';//导出文件名
        
        $param = input();
        header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
        header("Content-Disposition: attachment; filename=\"{$filename}\"");
        
    
        // TODO 
        // 这里写一些业务逻辑
        //你的查询数据,例如:
        //$data = Data::find()->where(['status'=>1])->asArray()->all();
        //不用进行处理。
        //
         //addRow 是一维数组 插入一条
        //addRows 才是二位数组
    
        WriterFactory::create(Type::XLSX)//这块根据大家的需求进行修改,。可以看底部代码。
            ->openToBrowser($fileName)
            ->addRow([
                'order_no'   => '订单编号',
                'username'   => '会员编号',
                'number'     => '数量',
                'w_time'     => '创建时间',
            ])
            ->addRows($data)
            ->close();
    }
    

    这个是box/spout 3.1的用法,,查看源代码进行写的一个方法。大家可以试试。

    use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
    use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
    use Box\Spout\Common\Entity\Style\Color;
    
    public function  Excel(){
      $fileName = 'biaoge.xlsx';//导出文件名
            $data = UserCode::find()->select('id,code')->where(['status'=>1])->limit(100)->asArray()->all();//这个是你需要导出的数据
        //这个是最新的用法,我指定的excel。如果你不想这样用可以调用这个方法:createWriter('')  参数:
        //const CSV = 'csv';
        //const XLSX = 'xlsx';
        //const ODS = 'ods';
    
            $writer = WriterEntityFactory :: createXLSXWriter ();
            //这行代码就是表格的样式,字体大小,颜色,背景颜色,自己看看想要什么颜色,自己追源代码。
            $style = ( new StyleBuilder ())->setFontBold()->setFontSize( 12 )->setFontColor( Color :: BLUE )->setShouldWrapText()->setBackgroundColor( Color :: YELLOW )->build (); 
    //下面这行代码是打开文件的流,坑的地方就是这里,我调用的是下面的方法,是直接下载的,还有有个方法是:openToFile() 这个是直接下载到根目录了,建议不用。
    
            $writer->openToBrowser($fileName);
            //表格的头部信息
            $row1 = WriterEntityFactory :: createRowFromArray ([ '订单编号' , '会员编号'], $style );
            //写入头部信息。
            $writer->addRow($row1);
          //下面这个是我循环了处理了写入数据,因为addRows 这个目前我没找到怎么用,一直报错。所以暂时这样处理了。如果大家有找到用法,可以评论。
            foreach ($data as $row) {
                $writer->addRow(WriterEntityFactory::createRowFromArray($row));
            }
          //这里是释放了,最后必须加上:del;要不程序会给你写带表格乱码。导致打不开。
            $writer->close();die;
    }

  • PHP 提取富文本字符串中的文本内容

    处理思路:
    1. 首先通过php的htmlspecialchars_decode()函数把预定义的 HTML 实体 "&lt;"(小于)和 "&gt;"(大于)转换为字符;
    2. 其次通过str_replace() 将HTML中的空格换成空;
    3. 最后再通过strip_tags()函数剥去字符串中的 HTML、XML 以及 PHP 的标签,即可得到想要的txt纯文本内容。
    ————————————————
    /**
     * 在富文本html中截取指定字数
     * @param $string
     * @param $num
     * @return false|string
     */
    function subHtmlChars($string,$num = 50){
        if($string){
            // 把一些预定义的 HTML 实体转换为字符
            // 预定义字符是指:<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用
            $html_string = htmlspecialchars_decode($string);
            // 将空格去除
            $content = str_replace(" ", "", $html_string);
            $content = str_replace("\n", "", $content);
            // 去除字符串中的 HTML 标签
            $contents = strip_tags($content);
            // 设置截取的字数
            // 利用三元运算判断文字是否超出设置的字数进行截取
            return mb_strlen($contents,'utf-8') > $num ? mb_substr($contents, 0, $num, "utf-8").'...' : mb_substr($contents, 0, $num, "utf-8");
        }else{
            return false;
        }
    }
  • Laravel 在 with 查询中只查询个别字段

    Laravel 在 with 查询中只查询个别字段

    在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的。

    这时候我们可以使用下面的技巧在使用 with 时只查询目标关联的部分字段:

    $topics = Topic::limit(2)->with(['user'=>function($query){
       $query->select('id','username');
    }])->get();

    但是每次查询都写得这么繁琐真的好么?不如利用 Laravel 的范围查询将其封装起来:

    在 Model 基类中定义一个范围查询(或者使用 Trait)

    class BaseModel extends \Eloquent{
        public function scopeWithOnly($query, $relation, Array $columns)
        {
            return $query->with([$relation => function ($query) use ($columns){
                $query->select(array_merge(['id'], $columns));
            }]);
        }
    }

    在我们普通的 Model 类都继承基类:

    class Topic extends BaseModel{
        public function user()
        {
            return $this->belongsTo('User');
        }
    }

    然后使用就很方便了:

    $topics = Topic::limit(2)->withOnly('user', ['username'])->get();
  • php格式化数字为’w’,php格式化金额函数

    程序代码如下:
    /**
    * 格式化金额
    * @param int $money
    * @param int $len
    * @param string $sign
    * @return string
    */
    
    function formatMoney($money, $len=2, $sign='¥'){
        $negative = $money > 0 ? '' : '-';
        $int_money = intval(abs($money));
        $len = intval(abs($len));
        $decimal = '';//小数
        if ($len > 0) {
            $decimal = '.'.substr(sprintf('%01.'.$len.'f', $money),-$len);
        }
        $tmp_money = strrev($int_money);
        $strlen = strlen($tmp_money);
        for ($i = 3; $i < $strlen; $i += 3) {
            $format_money .= substr($tmp_money,0,3).',';
            $tmp_money = substr($tmp_money,3);
        }
        $format_money .= $tmp_money;
        $format_money = strrev($format_money);
        return $sign.$negative.$format_money.$decimal;
    }
    
    /**
    * 格式化数字 为 'w'
    * @param $number
    * @return string
    */
    
    function formatNumber($number)
    {
        if (empty($number) || !is_numeric($number)) 
            return $number;
        $unit = "";
        if ($number > 10000) {
            $leftNumber = floor($number / 10000);
            $rightNumber = round(($number % 10000) / 10000, 2);
            // $rightNumber = bcmul(($number % 10000) / 10000, '1', 2);
            $number = floatval($leftNumber + $rightNumber);
            $unit = "W";
        } else {
            $decimals = $number > 1 ? 2 : 6;
            $number = (float)number_format($number, $decimals, '.', '');
        }
        return (string)$number . $unit;
    }
    

     

    调用示例:

    $formatNumber['a'] = formatNumber(123456789);
    $formatNumber['b'] = formatNumber(123);
    $formatNumber['c'] = formatNumber(1234);
    $formatNumber['d'] = formatNumber(12345);
    $formatMoney['a1'] = formatMoney(123456789,1,'$');
    $formatMoney['a'] = formatMoney(123456789);
    $formatMoney['b1'] = formatMoney(-1235,1,'$');
    $formatMoney['b'] = formatMoney(-1235);
    $formatMoney['c'] = formatMoney(123456.789);
    $formatMoney['d'] = formatMoney(-123456.789);

    结果:

    {
        "status": "success",
        "code": 200,
        "message": "成功",
        "data": {
            "formatNumber": {
                "a": "12345.68W",
                "b": "123",
                "c": "1234",
                "d": "1.23W"
            },
            "formatMoney": {
                "a1": "$123,456,789.0",
                "a": "¥123,456,789.00",
                "b1": "$-1,235.0",
                "b": "¥-1,235.00",
                "c": "¥123,456.79",
                "d": "¥-123,456.79"
            }
        },
        "error": {}
    }

  • Laravel数据删除以及软删除的操作方法

     

    所谓软删除就是逻辑删除,当然还有物理删除,逻辑删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被删除了。

    Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。

    1、删除模型

    //1、第一种方法
    Post::find(5)->delete();
    //2、第二种方法
    Post::destroy(5)
    //3、第三种方法
    Post::where('views', 0)->delete();
     

    2、软删除

    数据库中添加deleted_at字段

    Model中使用SoftDeletes,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes

    use Illuminate\Database\Eloquent\SoftDeletes;
    class Post extends Model
    {
        use SoftDeletes;
     

    按照1中常规的方法删除即可就被软删除了,find,get,all都将无法查找这些些被软删除后的数据

    3、软删除查询

    需要在普通的查询前调用withTrashed

    Post::withTrashed()->find('1');
    
    Post::withTrashed()->where('id','>',1)->get();
    
    Post::withTrashed()->all();
     

    4、软删除恢复

    //恢复单个
    Post::withTrashed()->find(1)->restore();
    //恢复多个模型
    Post::withTrashed()->where('id','>',1)->restore();
    //恢复所有模型
    Post::withTrashed()->restore();
     

    5、强制删除

    //删除单个
    Post::withTrashed()->find(1)->forceDelete();
    //删除多个模型
    Post::withTrashed()->where('id','>',1)->forceDelete();
    //删除所有模型
    Post::withTrashed()->forceDelete();
     

    6、关联模型

    数据被软删除后关联的数据还想关联到该数据,需要在belongsTo后面加withTrashed

    public function user()
    {
        return $this->belongsTo('App\User')->withTrashed();
    }
     
  • laravel 数据的自增和自减

     

    laravel 数据的自增和自减

    最近遇到一个坑,那就是laravel相加或相减,如果此数据没有的时候就会报错,思前想后找了很多,总算是找到了自增和自减的方法了

    increment自增

    increment自增方法有两个参数:

    1.第一个为必填,代表要对数据表的哪个字段进行自增操作

    2.第二个参数为可选,如果为空则表示每次增加1,如果填写了5,则表示每次在原有的基础上增加5。

    DB方法

    # 自增1的方法
    DB::table('order')->where('num', $num)->increment('total');
    # 自定义每次自增数额(5)的方法
    DB::table('order')->where('num', $num)->increment('total',5);
    
     

    模型方法

    # 自增1的方法
    Order::where('num', $num)->increment('total');
    # 自定义每次自增数额(5)的方法
    Order::where('num', $num)->increment('total',5);
    
    decrement自减

    decrement自减方法有两个参数:

    1.第一个为必填,代表要对数据表的哪个字段进行自减操作

    2.第二个参数为可选,如果为空则表示每次减少1,如果填写了5,则表示每次在原有的基础上减少5。

    DB方法

    # 自减1的方法
    DB::table('order')->where('num', $num)->decrement('total');
    # 自定义每次自减数额(5)的方法
    DB::table('order')->where('num', $num)->decrement('total',5);
    
     

    模型方法

    # 自减1的方法
    Order::where('num', $num)->decrement('total');
    # 自定义每次自减数额(5)的方法
    Order::where('num', $num)->decrement('total',5);
    
     

    总结

    每次想写一个功能前最好搜索一下新的资料,闭门造车只能陷入死循环,这样写对于文章阅读的自增,订单金额的自增都有莫大的帮助,感谢你的阅读,愿我们的技术越来越好!

     
  • Go设置国内源

     

    Go设置国内源


    如果你需要Beego这个框架,正常来说你需要安装Git之后go get不会报错。但由于网络问题,go get会非常慢,以至于没法使用。
    这个时候我们需要需要国内源来进行加速

    首先需要我们开启GoMODULL支持

    SETX GO111MODULE on

    然后我们需要进行更改GoGOPROXY

    go env -w GOPROXY=https://goproxy.cn,direct

    SETX来设置一下Windows环境变量

    SETX GOPROXY=https://goproxy.cn,direct

    接下来就可以正常使用了

    go get -v github.com/astaxie/beego
     
  • Linux环境下配置Go开发环境

     

    1、下载go的开发包

    下载地址(国内):

    Downloads – The Go Programming Language

    我选择的是:

    go1.17.5.linux-amd64.tar.gz

    2、在Linux主机中解压

    tar -zxvf go1.17.5.linux-amd64.tar.gz

    当前目录下解压生成名为go的文件夹

    复制:

    cp -r go /usr/local

    3、编辑profile文件

    进入/etc下

    vim profile

    在末尾添加以下内容:

    export GOROOT=/usr/local/go

    export GOPATH=/home/w1/Go

    export GOBIN=$GOPATH/bin

    export PATH=$PATH:$GOROOT/bin

    export PATH=$PATH:$GOPATH/bin

    保存退出vim

    令修改生效

    source profile

     

    GOROOT:golang的安装目录

    GOPATH:工作目录

    GOBIN:执行go install,程序可执行文件的安装目录

     

    4、查看开发环境

    go version

    看到go的版本号

    go env

    看到go的各个配置参数