Laravel 权限导出

1. Admin目录下写了接口,需要操作如下:
1.1 本地执行php artisan permission:record 命令;(在database下生成permission.log文件)
1.2 将生成的 permission 文件上传到开发,开发环境执行php artisan permission:migrate

 php artisan config:clear

./app/Console/Commands/ExportPermission.php

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ExportPermission extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'export:permission {param}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '导出 permission 日志 和 TXT';

    /**
     * Create a new command instance.
     *
     * @return void
     */


    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $param = $this->argument('param');  // "staff"
        $fullRouteUri = app()->routes->getRoutes();
        $routes = self::getRouteUriContent($fullRouteUri, $param);
        self::diffPermissionJsContent($routes,$param);
        $this->info('日志:database/permission/permission.log  SQL:database/permission/permission.sql');
    }

    /**
     * FunctionName:getRouteUriContent
     * Description:001 获取路由里的数据
     * Author:lwl
     * @param $routes
     * @param string $param
     * @return array
     */
    protected static function getRouteUriContent($routes, string $param)
    {
        $appName = config('app.name');
        $data = array();
        foreach ($routes as $key => $value) {
            /** @var $value \Illuminate\Routing\Route */
            $uri = $value->uri;
            $method = $value->methods[0];
            if (strpos($uri, $appName . "/{$param}") !== false) {
                $namePrefix = $value->action['name_prefix'];
                $diffNamePrefix = explode('@', $namePrefix);
                $route = end($diffNamePrefix) . '/' . $diffNamePrefix[0] . '/' . $value->action['as'];
                $data[$key] = '/' . str_replace("/$param", '', $route) . '@@' . $method;
            }
        }

        return array_values($data);
    }

    /**
     * FunctionName:diffPermissionJsContent
     * Description:002 对比 Permission.js 内容 然后写入
     * Author:lwl
     * @param array $routeUri
     * @param string $param
     */
    protected static function diffPermissionJsContent(array $routeUri,string $param)
    {
        $path = database_path('permission/permission.js');
        if (!is_file($path)) {
            fopen($path, "w");
        }
        $hasContent = file_get_contents($path);
        //是否执行过 命令 是
        if (!empty($hasContent)) {
            $oldRouteUri = explode(PHP_EOL, $hasContent);
            $newRouteUri = array_diff($routeUri, $oldRouteUri);
            $content = empty($newRouteUri) ? [] : $newRouteUri;
        } else { //否
            $content = $routeUri;
        }
        if (!empty($content)) {
            self::putPermissionLog($content,$param);
            self::putPermissionJsContent($content);
            self::putPermissionTxtContent($param,$content);
        }
    }

    /**
     * FunctionName:putPermissionLog
     * Description:003 写入log
     * Author:lwl
     * @param array $content
     * @param string $param
     */
    protected static function putPermissionLog(array $content,string $param)
    {
        $dataTime = date('Y-m-d H:i:s');
        $permissionLogContent = '';
        $appName = config('app.name');
        foreach ($content as  $value){
            $value =  trim($value,'/');
            $valueArray = explode('@@', $value);
            $method = end($valueArray);
            $minValue  = str_replace($appName.'/',$appName.'.',$value);
            $routePrefix = str_replace($appName.'/','',$valueArray[0]);
            $routePrefixArray = str_replace('.','\/',$routePrefix);
            $routeJson = "{'url':'\/$appName\/$param\/$routePrefixArray','method':$method}}";
            $permissionLogContent .= '[' . $dataTime . '] CREATE: ' . $minValue . ' > {"name":"' . $minValue . '","type":"api","scopes":["__' . $appName . '","' . $param . '"],"content":' . $routeJson . '}' . PHP_EOL;
        }
        $permissionLogHandle = fopen(database_path('permission/permission.log'), 'a');
        fputs($permissionLogHandle, $permissionLogContent);
        fclose($permissionLogHandle);
    }

    /**
     * FunctionName:putPermissionJsContent
     * Description:004 写入permission.js
     * Author:lwl
     * @param array $permissionJsContents
     */
    protected static function putPermissionJsContent(array $permissionJsContents)
    {
        $permissionJsHandle = fopen(database_path('permission/permission.js'), 'a');
        $permissionJsContent = '';
        foreach ($permissionJsContents as $value) {
            $permissionJsContent .= $value . PHP_EOL;
        }
        fputs($permissionJsHandle, $permissionJsContent);
        fclose($permissionJsHandle);
    }

    /**
     * FunctionName:putPermissionTxtContent
     * Description:005 写入 permission.txt
     * Author:lwl
     * @param string $param
     * @param array $content
     */
    protected static function putPermissionTxtContent(string $param,array $content)
    {

        $appName = config('app.name');
        $nowDate = date('Y-m-d H:i:s');
        $outPath = database_path('permission/permission.sql');
        /** @var $out resource */
        $out = fopen($outPath, 'a');
        foreach (array_values($content) as $item) {
            if (empty($item)) {
                continue;
            }
            $routeNameArray = explode('@@', $item);
            $name = $routeNameArray[0];
            $newName = str_replace( '/', '.', trim($name,'/'));
            $routePrefix = str_replace($appName . '.', '', $newName);
            $method = end($routeNameArray);
            $url = "\\\/{$appName}\\\/$param\\\/" . str_replace('.', '\\\/', $routePrefix);
            $s = <<<EOF
INSERT INTO `staff`.`permissions`(`name`, `type`, `scopes`, `content`, `translations`, `created_at`, `updated_at`) VALUES ('{$newName}', 'api', '[\"__{$appName}\",\"staff\"]', '{\"url\":"{$url}",\"method\":\"{$method}\"}', NULL, '{$nowDate}', '{$nowDate}');\n
EOF;

            fwrite($out, $s);
        }
        fclose($out);
    }
}

php artisan permission:migrate  

php artisan export:permission staff


日志:database/permission/permission.log  SQL:database/permission/permission.sql

Route::namespace('CarSource')->prefix('car-source')->group(function () {
     // ...
     Route::post('secondhand/edit', 'SecondHandCarController@edit')->name('car-source-secondhand.edit');
});
INSERT INTO `staff`.`permissions`(`name`, `type`, `scopes`, `content`, `translations`, `created_at`, `updated_at`) 
VALUES ('carV2.car-source-secondhand.edit', 'api', '[\"__car-v2\",\"staff\"]', '{\"url\":"\\/car-v2\\/staff\\/carV2\\/car-source-secondhand\\/edit",\"method\":\"POST\"}', NULL, '2022-06-09 13:11:24', '2022-06-09 13:11:24');

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fareast_mzh

打赏个金币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值