You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
374 lines
17 KiB
374 lines
17 KiB
<?php
|
|
/**
|
|
* +----------------------------------------------------------------------
|
|
* | 插件管理控制器
|
|
* +----------------------------------------------------------------------
|
|
* .::::.
|
|
* .::::::::. | AUTHOR: siyu
|
|
* ::::::::::: | EMAIL: 407593529@qq.com
|
|
* ..:::::::::::' | QQ: 407593529
|
|
* '::::::::::::' | DATETIME: 2020/03/11
|
|
* .::::::::::
|
|
* '::::::::::::::..
|
|
* ..::::::::::::.
|
|
* ``::::::::::::::::
|
|
* ::::``:::::::::' .:::.
|
|
* ::::' ':::::' .::::::::.
|
|
* .::::' :::: .:::::::'::::.
|
|
* .:::' ::::: .:::::::::' ':::::.
|
|
* .::' :::::.:::::::::' ':::::.
|
|
* .::' ::::::::::::::' ``::::.
|
|
* ...::: ::::::::::::' ``::.
|
|
* ```` ':. ':::::::::' ::::..
|
|
* '.:::::' ':'````..
|
|
* +----------------------------------------------------------------------
|
|
*/
|
|
namespace app\admin\controller;
|
|
|
|
use think\facade\Request;
|
|
use think\facade\View;
|
|
|
|
// 表单和表格构建器
|
|
use app\common\builder\FormBuilder;
|
|
use app\common\builder\TableBuilder;
|
|
// 插件服务
|
|
use app\admin\facade\ThinkAddons;
|
|
|
|
class Plugin extends Base
|
|
{
|
|
// 列表
|
|
public function index()
|
|
{
|
|
// 搜索
|
|
if (Request::param('getList') == 1) {
|
|
// 获取插件列表
|
|
$list = ThinkAddons::localAddons();
|
|
// 渲染输出
|
|
$result = [
|
|
'total' => count($list),
|
|
'per_page' => 1000,
|
|
'current_page' => 1,
|
|
'last_page' => 1,
|
|
'data' => $list,
|
|
];
|
|
return $result;
|
|
}
|
|
|
|
return TableBuilder::getInstance()
|
|
->addColumns([ // 批量添加列
|
|
['name', '编号'],
|
|
['title', '插件名称'],
|
|
['description', '插件介绍'],
|
|
['status', '状态(启用/禁用)', 'status', '0',[
|
|
['0' => '禁用'],
|
|
['1' => '启用']
|
|
]],
|
|
['author', '作者'],
|
|
['version', '版本'],
|
|
['button', '操作', 'text']
|
|
])
|
|
->setUniqueId('name')
|
|
//->addRightButton('edit', ['title' => '配置'])
|
|
->setEditUrl(url('config', ['name' => '__id__']))
|
|
->setExtraJs($this->makeExtraJs())
|
|
->fetch();
|
|
}
|
|
|
|
// 插件配置信息预览
|
|
public function config(string $name)
|
|
{
|
|
$config = ThinkAddons::config($name);
|
|
// 如果插件自带配置模版的话加载插件自带的,否则调用表单构建器
|
|
$file = app()->getRootPath() . 'addons' . DIRECTORY_SEPARATOR . $name . DIRECTORY_SEPARATOR . 'config.html';
|
|
if (file_exists($file)) {
|
|
View::assign([
|
|
'config' => $config
|
|
]);
|
|
return View::fetch($file);
|
|
} else {
|
|
// 获取字段数据
|
|
$columns = $this->makeAddColumns($config);
|
|
// 判断是否分组
|
|
$group = ThinkAddons::checkConfigGroup($config);
|
|
// 构建页面
|
|
$builder = FormBuilder::getInstance();
|
|
$builder->setFormUrl(url('configSave'))
|
|
->addHidden('id', $name);
|
|
$group ? $builder->addGroup($columns) : $builder->addFormItems($columns);
|
|
return $builder->fetch();
|
|
}
|
|
}
|
|
|
|
// 插件配置信息保存
|
|
public function configSave()
|
|
{
|
|
if (Request::isPost()) {
|
|
$result = ThinkAddons::configPost(Request::except(['file'], 'post'));
|
|
if ($result['code'] == 1) {
|
|
$this->success($result['msg'], 'index');
|
|
} else {
|
|
$this->error($result['msg']);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 更改插件状态 [启用/禁用]
|
|
public function state(string $id)
|
|
{
|
|
return ThinkAddons::state($id);
|
|
}
|
|
|
|
// 安装插件
|
|
public function install(string $id)
|
|
{
|
|
return ThinkAddons::install($id);
|
|
}
|
|
|
|
// 卸载插件
|
|
public function uninstall(string $id)
|
|
{
|
|
return ThinkAddons::uninstall($id);
|
|
}
|
|
|
|
// =========================================
|
|
|
|
// 生成表单信息
|
|
private function makeAddColumns(array $config)
|
|
{
|
|
// 判断是否开启了分组
|
|
if (ThinkAddons::checkConfigGroup($config) === false) {
|
|
// 未开启分组
|
|
return $this->makeAddColumnsArr($config);
|
|
} else {
|
|
$columns = [];
|
|
// 开启分组
|
|
foreach ($config as $k => $v) {
|
|
$columns[$k] = $this->makeAddColumnsArr($v);
|
|
}
|
|
return $columns;
|
|
}
|
|
}
|
|
|
|
// 生成表单返回数组
|
|
private function makeAddColumnsArr(array $config)
|
|
{
|
|
$columns = [];
|
|
foreach ($config as $k => $field) {
|
|
// 初始化
|
|
$field['name'] = $field['name'] ?? $field['title'];
|
|
$field['field'] = $k;
|
|
$field['tips'] = $field['tips'] ?? '';
|
|
$field['required'] = $field['required'] ?? 0;
|
|
$field['group'] = $field['group'] ?? '';
|
|
if (!isset($field['setup'])) {
|
|
$field['setup'] = [
|
|
'default' => $field['value'] ?? '',
|
|
'extra_attr' => $field['extra_attr'] ?? '',
|
|
'extra_attr' => $field['extra_attr'] ?? '',
|
|
'extra_class' => $field['extra_class'] ?? '',
|
|
'placeholder' => $field['placeholder'] ?? '',
|
|
];
|
|
}
|
|
|
|
if ($field['type'] == 'text') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['group'], // 标签组,可以在文本框前后添加按钮或者文字
|
|
$field['setup']['extra_attr'], // 额外属性
|
|
$field['setup']['extra_class'],// 额外CSS
|
|
$field['setup']['placeholder'],// 占位符
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'textarea' || $field['type'] == 'password') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['extra_attr'], // 额外属性
|
|
$field['setup']['extra_class'] ?? '', // 额外CSS
|
|
$field['setup']['placeholder'] ?? '', // 占位符
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'radio' || $field['type'] == 'checkbox') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['options'], // 选项(数组)
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['extra_attr'], // 额外属性 extra_attr
|
|
'', // 额外CSS extra_class
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'select' || $field['type'] == 'select2' ) {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['options'], // 选项(数组)
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['extra_attr'], // 额外属性
|
|
$field['setup']['extra_class'] ?? '', // 额外CSS
|
|
$field['setup']['placeholder'] ?? '', // 占位符
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'number') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
'', // 最小值
|
|
'', // 最大值
|
|
$field['setup']['step'], // 步进值
|
|
$field['setup']['extra_attr'], // 额外属性
|
|
$field['setup']['extra_class'], // 额外CSS
|
|
$field['setup']['placeholder'] ?? '', // 占位符
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'hidden') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['setup']['default'] ?? '', // 默认值
|
|
$field['setup']['extra_attr'] ?? '', // 额外属性 extra_attr
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'date' || $field['type'] == 'time' || $field['type'] == 'datetime') {
|
|
// 使用每个字段设定的格式
|
|
if ($field['type'] == 'time') {
|
|
$field['setup']['format'] = str_replace("HH", "h", $field['setup']['format']);
|
|
$field['setup']['format'] = str_replace("mm", "i", $field['setup']['format']);
|
|
$field['setup']['format'] = str_replace("ss", "s", $field['setup']['format']);
|
|
$format = $field['setup']['format'] ?? 'H:i:s';
|
|
} else {
|
|
$field['setup']['format'] = str_replace("yyyy", "Y", $field['setup']['format']);
|
|
$field['setup']['format'] = str_replace("mm", "m", $field['setup']['format']);
|
|
$field['setup']['format'] = str_replace("dd", "d", $field['setup']['format']);
|
|
$field['setup']['format'] = str_replace("hh", "h", $field['setup']['format']);
|
|
$field['setup']['format'] = str_replace("ii", "i", $field['setup']['format']);
|
|
$field['setup']['format'] = str_replace("ss", "s", $field['setup']['format']);
|
|
$format = $field['setup']['format'] ?? 'Y-m-d H:i:s';
|
|
}
|
|
$field['setup']['default'] = $field['setup']['default'] > 0 ? date($format, $field['setup']['default']) : '';
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['format'], // 日期格式
|
|
$field['setup']['extra_attr'], // 额外属性 extra_attr
|
|
'', // 额外CSS extra_class
|
|
$field['setup']['placeholder'],// 占位符
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'daterange') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['format'], // 日期格式
|
|
$field['setup']['extra_attr'] ?? '', // 额外属性
|
|
$field['setup']['extra_class'] ?? '', // 额外CSS
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'tag') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['extra_attr'] ?? '', // 额外属性
|
|
$field['setup']['extra_class'] ?? '', // 额外CSS
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'image' || $field['type'] == 'images' || $field['type'] == 'file' || $field['type'] == 'files') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['size'], // 限制大小(单位kb)
|
|
$field['setup']['ext'], // 文件后缀
|
|
$field['setup']['extra_attr'] ?? '', // 额外属性
|
|
$field['setup']['extra_class'] ?? '', // 额外CSS
|
|
$field['setup']['placeholder'] ?? '', // 占位符
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'editor') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['heidht'] ?? 0, // 高度
|
|
$field['setup']['extra_attr'] ?? '', // 额外属性
|
|
$field['setup']['extra_class'] ?? '', // 额外CSS
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
elseif ($field['type'] == 'color') {
|
|
$columns[] = [
|
|
$field['type'], // 类型
|
|
$field['field'], // 字段名称
|
|
$field['name'], // 字段别名
|
|
$field['tips'], // 提示信息
|
|
$field['setup']['default'], // 默认值
|
|
$field['setup']['extra_attr'] ?? '', // 额外属性
|
|
$field['setup']['extra_class'] ?? '', // 额外CSS
|
|
$field['setup']['placeholder'] ?? '', // 占位符
|
|
$field['required'], // 是否必填
|
|
];
|
|
}
|
|
}
|
|
return $columns;
|
|
}
|
|
|
|
// 生成列表页额外JS
|
|
private function makeExtraJs()
|
|
{
|
|
$js = '<script type="text/javascript">
|
|
// 安装
|
|
$.operate.pluginInstall = function(id) {
|
|
var url = \''.url('install').'\';
|
|
$.modal.confirm("确认要安装?", function () {
|
|
var data = {"id": id};
|
|
$.operate.submit(url, "post", "json", data);
|
|
});
|
|
}
|
|
// 卸载
|
|
$.operate.pluginUninstall = function(id) {
|
|
var url = \''.url('uninstall').'\';
|
|
$.modal.confirm("确认要卸载?", function () {
|
|
var data = {"id": id};
|
|
$.operate.submit(url, "post", "json", data);
|
|
});
|
|
}
|
|
</script>';
|
|
return $js;
|
|
}
|
|
}
|
|
|