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');