200 lines
5.6 KiB
PHP
200 lines
5.6 KiB
PHP
<?php
|
||
/**
|
||
* 创建一个新的应用插件
|
||
* @author dogstar 20200311
|
||
*/
|
||
|
||
require_once dirname(__FILE__) . '/../public/init.php';
|
||
|
||
if ($argc < 2) {
|
||
echo "Usage: {$argv[0]} <plugin_key>\n";
|
||
echo "请输入你的插件编号,字母数字和下划线组合。\n";
|
||
echo "例如:{$argv[0]} plugin_demo\n";
|
||
echo "\n";
|
||
exit;
|
||
}
|
||
|
||
$pluginKey = trim($argv[1]);
|
||
if (!preg_match('/^[0-9A-Za-z_]{1,}$/', $pluginKey)) {
|
||
echo "插件编号格式不对,应该使用字母数字和下划线组合。\n";
|
||
echo "\n";
|
||
exit;
|
||
}
|
||
|
||
$pluginKeyClass = ucfirst(str_replace('_', '', $pluginKey));
|
||
|
||
// 生成插件json配置文件
|
||
echo "开始生成插件json配置文件……\n";
|
||
$jsonFile = dirname(__FILE__) . '/../plugins/' . $pluginKey . '.json';
|
||
$jsonConfig = array(
|
||
'plugin_key' => $pluginKey,
|
||
'plugin_name' => $pluginKey . '插件',
|
||
'plugin_author' => '作者名称',
|
||
'plugin_desc' => '插件描述',
|
||
'plugin_version' => '1.0',
|
||
'plugin_encrypt' => 0, // 加密模式,0无加密,1有加密,2半加密
|
||
'plugin_depends' => array(
|
||
'PHP' => '5.6',
|
||
'MySQL' => '5.3',
|
||
'PhalApi' => PHALAPI_VERSION,
|
||
// composer 依赖的包,无则不写
|
||
'composer' => array(
|
||
// 参考示例,格式是包名 => 版本号
|
||
'phalapi/kernal' => '>=2.12.2',
|
||
),
|
||
'extension' => array(
|
||
// PHP扩展名
|
||
// 'pdo_mysql',
|
||
),
|
||
),
|
||
// 插件的文件
|
||
'plugin_files' => array(
|
||
// 配置文件
|
||
'config' => 'config/' . $pluginKey . '.php',
|
||
// 插件启动文件
|
||
'plugins' => 'plugins/' . $pluginKey . '.php',
|
||
// 数据库变更文件
|
||
'data' => 'data/' . $pluginKey . '.sql',
|
||
// portal后台及对外访问的文件
|
||
'public' => array(
|
||
'public/portal/page/' . $pluginKey,
|
||
'public/portal/page/' . $pluginKey,
|
||
),
|
||
// PHP源代码
|
||
'src' => array(
|
||
'src/app/Api/' . $pluginKeyClass,
|
||
'src/app/Domain/' . $pluginKeyClass,
|
||
'src/app/Model/' . $pluginKeyClass,
|
||
'src/app/Common/' . $pluginKeyClass,
|
||
'src/portal/Api/' . $pluginKeyClass,
|
||
),
|
||
),
|
||
);
|
||
|
||
if (file_exists($jsonFile)) {
|
||
echo "插件已存在!" . $jsonFile . "\n";
|
||
echo "\n";
|
||
exit;
|
||
}
|
||
file_put_contents($jsonFile, json_encode($jsonConfig, version_compare(PHP_VERSION, '5.4.0', '>=') ? JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT : JSON_PRETTY_PRINT));
|
||
|
||
echo realpath($jsonFile), " json配置文件生成 ok \n\n";
|
||
|
||
// 开始创建插件文件和目录
|
||
echo "开始创建插件文件和目录……\n";
|
||
|
||
// config配置
|
||
$file = API_ROOT . '/' . $jsonConfig['plugin_files']['config'];
|
||
echo $file, "... \n";
|
||
file_put_contents($file, "<?php
|
||
// $pluginKey 插件配置
|
||
return array(
|
||
);
|
||
");
|
||
|
||
// json配置
|
||
$file = API_ROOT . '/' . $jsonConfig['plugin_files']['plugins'];
|
||
echo $file, "... \n";
|
||
file_put_contents($file, "<?php
|
||
// $pluginKey 插件初始化
|
||
|
||
");
|
||
|
||
// 添加菜单
|
||
$menuId = rand(100001, 999999999);
|
||
$menuSql = array();
|
||
$menuSql[] = "delete from `phalapi_portal_menu` where id = {$menuId};";
|
||
$menuSql[] = "insert into `phalapi_portal_menu` ( `target`, `id`, `title`, `href`, `sort_num`, `parent_id`, `icon`) values ( '_self', '{$menuId}', '{$pluginKey}插件', 'page/{$pluginKey}/index.html', '9999', '1', 'fa fa-list-alt');";
|
||
|
||
$file = API_ROOT . '/' . $jsonConfig['plugin_files']['data'];
|
||
echo $file, "... \n";
|
||
file_put_contents($file, implode("\n", $menuSql) . "\n");
|
||
|
||
// 运营平台
|
||
$file = API_ROOT . '/public/portal/' . $pluginKey;
|
||
echo $file, "... \n";
|
||
mkdir(API_ROOT . '/public/portal/page/' . $pluginKey, 0755, TRUE);
|
||
$file = API_ROOT . '/public/portal/page/' . $pluginKey . '/index.html';
|
||
echo $file, "... \n";
|
||
file_put_contents($file, file_get_contents(API_ROOT . '/public/portal/page/phalapi-plugins/_index_tpl.html'));
|
||
|
||
// src源代码
|
||
mkdir(API_ROOT . '/src/app/Api/' . $pluginKeyClass, 0755, TRUE);
|
||
$file = API_ROOT . '/src/app/Api/' . $pluginKeyClass . '/Main.php';
|
||
echo $file, "... \n";
|
||
file_put_contents($file, "<?php
|
||
namespace App\\Api\\{$pluginKeyClass};
|
||
use PhalApi\\Api;
|
||
|
||
/**
|
||
* {$pluginKey} 插件
|
||
*/
|
||
class Main extends Api {
|
||
|
||
/**
|
||
* 插件接口
|
||
* @desc 待开发的插件新接口
|
||
*/
|
||
public function todo() {
|
||
}
|
||
}
|
||
|
||
");
|
||
|
||
mkdir(API_ROOT . '/src/app/Domain/' . $pluginKeyClass, 0755, TRUE);
|
||
$file = API_ROOT . '/src/app/Domain/' . $pluginKeyClass . '/Main.php';
|
||
echo $file, "... \n";
|
||
file_put_contents($file, "<?php
|
||
namespace App\\Domain\\{$pluginKeyClass};
|
||
|
||
class Main {
|
||
}
|
||
");
|
||
|
||
mkdir(API_ROOT . '/src/app/Model/' . $pluginKeyClass, 0755, TRUE);
|
||
$file = API_ROOT . '/src/app/Model/' . $pluginKeyClass . '/Main.php';
|
||
echo $file, "... \n";
|
||
file_put_contents($file, "<?php
|
||
namespace App\\Model\\{$pluginKeyClass};
|
||
use PhalApi\\Model\\DataModel;
|
||
|
||
class Main extends DataModel {
|
||
}
|
||
");
|
||
|
||
mkdir(API_ROOT . '/src/app/Common/' . $pluginKeyClass, 0755, TRUE);
|
||
|
||
// portal
|
||
mkdir(API_ROOT . '/src/portal/Api/' . $pluginKeyClass, 0755, TRUE);
|
||
|
||
$file = API_ROOT . '/src/portal/Api/' . $pluginKeyClass . '/Main.php';
|
||
echo $file, "... \n";
|
||
file_put_contents($file, "<?php
|
||
namespace Portal\\Api\\{$pluginKeyClass};
|
||
use Portal\\Common\\DataApi as Api;
|
||
|
||
/**
|
||
* {$pluginKey} 插件
|
||
*/
|
||
class Main extends Api {
|
||
|
||
protected function getDataModel() {
|
||
return new \\App\\Model\\{$pluginKeyClass}\\Main();
|
||
}
|
||
}
|
||
");
|
||
|
||
echo "插件文件和目录生成 ok \n\n";
|
||
|
||
echo "开始添加运营平台菜单……\n";
|
||
|
||
foreach ($menuSql as $sql) {
|
||
\PhalApi\DI()->notorm->demo->executeSql($sql);
|
||
}
|
||
|
||
echo "{$pluginKey}插件菜单添加 ok \n\n";
|
||
|
||
echo "恭喜,插件创建成功,可以开始开发啦!\n";
|
||
|
||
|