diff --git a/app/admin/controller/Module.php b/app/admin/controller/Module.php
new file mode 100644
index 000000000..9fc2ef6b2
--- /dev/null
+++ b/app/admin/controller/Module.php
@@ -0,0 +1,50 @@
+title = '系统模块管理';
+ $this->modules = ModuleService::instance()->change();
+ $this->fetch();
+ }
+
+ /**
+ * 安装模块代码
+ * @auth true
+ */
+ public function install()
+ {
+ $data = $this->_vali(['name.require' => '模块名称不能为空!']);
+ [$state, $message] = ModuleService::instance()->install($data['name']);
+ $state ? $this->success($message) : $this->error($message);
+ }
+}
\ No newline at end of file
diff --git a/app/admin/controller/api/Update.php b/app/admin/controller/api/Update.php
index d5f536009..aae87a427 100644
--- a/app/admin/controller/api/Update.php
+++ b/app/admin/controller/api/Update.php
@@ -17,7 +17,7 @@ namespace app\admin\controller\api;
use think\admin\Controller;
use think\admin\service\InstallService;
-use think\admin\service\NodeService;
+use think\admin\service\ModuleService;
/**
* 安装服务端支持
@@ -32,38 +32,12 @@ class Update extends Controller
*/
public function version()
{
- $input = $this->_vali(['name.default' => '_all']);
- if ($input['name'] === '_all') {
- $data = [];
- foreach (NodeService::instance()->getModules() as $module) {
- if (is_array($ver = $this->__getModuleVersion($module))) $data[] = $ver;
- }
- $this->success('获取所有模块版本成功!', $data);
- } else {
- $ver = $this->__getModuleVersion($input['name']);
- if ($ver === null) $this->error('获取模块信息失败!');
- if ($ver === false) $this->error('获取模块信息无效!');
- if (is_array($ver)) $this->success('获取模块信息成功!', [$ver]);
- }
+ $modules = ModuleService::instance()->getModules();
+ $this->success('获取模块信息成功!', $modules);
}
/**
- * 获取模块版本信息
- * @param string $name
- * @return bool|array|null
- */
- private function __getModuleVersion($name)
- {
- $file = $this->app->getBasePath() . $name . DIRECTORY_SEPARATOR . 'ver.php';
- if (file_exists($file) && is_file($file) && is_array($vars = @include $file)) {
- return isset($vars['name']) && isset($vars['version']) ? $vars : null;
- } else {
- return false;
- }
- }
-
- /**
- * 读取文件内容(旧版本)
+ * 读取文件内容
*/
public function get()
{
@@ -75,7 +49,7 @@ class Update extends Controller
}
/**
- * 读取文件列表(旧版本)
+ * 读取文件列表
*/
public function node()
{
diff --git a/app/admin/ver.php b/app/admin/ver.php
index e309c9aa3..962b7b90d 100644
--- a/app/admin/ver.php
+++ b/app/admin/ver.php
@@ -17,10 +17,11 @@
return [
'name' => 'admin',
'author' => 'Anyon',
- 'version' => '2020.08.03.01',
+ 'version' => '2020.08.03.00',
'content' => 'ThinkAdmin 系统基础模块',
'changes' => [
'2020.08.03.00' => [
+ 'content' => '模块初始化提交',
'database' => [
'select version()',
],
diff --git a/app/admin/view/module/index.html b/app/admin/view/module/index.html
new file mode 100644
index 000000000..0130cd84f
--- /dev/null
+++ b/app/admin/view/module/index.html
@@ -0,0 +1,43 @@
+{extend name='main'}
+
+{block name="content"}
+
+
+
+ {notempty name='modules'}
+
+
+ 模块名称 |
+ 模块描述 |
+ 当前版本 |
+ |
+
+
+ {/notempty}
+
+ {foreach $modules as $key=>$vo}
+
+ {$vo.name} |
+ {$vo.content} |
+
+ {if isset($vo.local)} {$vo.local.version}
+ {if $vo.version > $vo.local.version}
+ {$vo.local.version}
+ {else}
+ {$vo.type_desc}
+ {/if}
+ {else}{$vo.type_desc}{/if}
+ |
+
+ {if $vo.type_code eq 1} 安 装{/if}
+ {if $vo.type_code eq 2} 更 新{/if}
+ |
+
+ {/foreach}
+
+
+
+ {empty name='modules'}
没有记录哦{else}{$pagehtml|raw|default=''}{/empty}
+
+
+{/block}
\ No newline at end of file
diff --git a/app/admin/view/module/index_search.html b/app/admin/view/module/index_search.html
new file mode 100644
index 000000000..e636357cb
--- /dev/null
+++ b/app/admin/view/module/index_search.html
@@ -0,0 +1,61 @@
+
+
+
+
diff --git a/app/wechat/ver.php b/app/wechat/ver.php
index ec44be7a6..19cd4861f 100644
--- a/app/wechat/ver.php
+++ b/app/wechat/ver.php
@@ -21,6 +21,7 @@ return [
'content' => 'ThinkAdmin 微信基础模块',
'changes' => [
'2020.08.03.00' => [
+ 'content' => '模块初始化提交',
'database' => [
'select version()',
],
diff --git a/composer.lock b/composer.lock
index 16a0023a4..4715f7ce6 100644
--- a/composer.lock
+++ b/composer.lock
@@ -879,12 +879,12 @@
"source": {
"type": "git",
"url": "https://github.com/zoujingli/ThinkLibrary.git",
- "reference": "2ce8935d423feccfd59bba2963e9127f3fca8c90"
+ "reference": "3241ffefd6697d1bedcc9721e3275a24055bb77b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zoujingli/ThinkLibrary/zipball/2ce8935d423feccfd59bba2963e9127f3fca8c90",
- "reference": "2ce8935d423feccfd59bba2963e9127f3fca8c90",
+ "url": "https://api.github.com/repos/zoujingli/ThinkLibrary/zipball/3241ffefd6697d1bedcc9721e3275a24055bb77b",
+ "reference": "3241ffefd6697d1bedcc9721e3275a24055bb77b",
"shasum": "",
"mirrors": [
{
@@ -928,7 +928,7 @@
],
"description": "ThinkPHP v6.0 Development Library",
"homepage": "http://thinkadmin.top",
- "time": "2020-07-31T10:16:54+00:00"
+ "time": "2020-08-03T09:00:42+00:00"
},
{
"name": "zoujingli/wechat-developer",
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 91a290b7e..b9a9301ef 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -194,6 +194,7 @@ return array(
'app\\admin\\controller\\Index' => $baseDir . '/app/admin/controller/Index.php',
'app\\admin\\controller\\Login' => $baseDir . '/app/admin/controller/Login.php',
'app\\admin\\controller\\Menu' => $baseDir . '/app/admin/controller/Menu.php',
+ 'app\\admin\\controller\\Module' => $baseDir . '/app/admin/controller/Module.php',
'app\\admin\\controller\\Oplog' => $baseDir . '/app/admin/controller/Oplog.php',
'app\\admin\\controller\\Queue' => $baseDir . '/app/admin/controller/Queue.php',
'app\\admin\\controller\\User' => $baseDir . '/app/admin/controller/User.php',
@@ -293,6 +294,7 @@ return array(
'think\\admin\\service\\InstallService' => $vendorDir . '/zoujingli/think-library/src/service/InstallService.php',
'think\\admin\\service\\MenuService' => $vendorDir . '/zoujingli/think-library/src/service/MenuService.php',
'think\\admin\\service\\MessageService' => $vendorDir . '/zoujingli/think-library/src/service/MessageService.php',
+ 'think\\admin\\service\\ModuleService' => $vendorDir . '/zoujingli/think-library/src/service/ModuleService.php',
'think\\admin\\service\\NodeService' => $vendorDir . '/zoujingli/think-library/src/service/NodeService.php',
'think\\admin\\service\\OpenService' => $vendorDir . '/zoujingli/think-library/src/service/OpenService.php',
'think\\admin\\service\\ProcessService' => $vendorDir . '/zoujingli/think-library/src/service/ProcessService.php',
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index b47744618..eb7870169 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -322,6 +322,7 @@ class ComposerStaticInitb911c14a0826c73d9f097343fd33a252
'app\\admin\\controller\\Index' => __DIR__ . '/../..' . '/app/admin/controller/Index.php',
'app\\admin\\controller\\Login' => __DIR__ . '/../..' . '/app/admin/controller/Login.php',
'app\\admin\\controller\\Menu' => __DIR__ . '/../..' . '/app/admin/controller/Menu.php',
+ 'app\\admin\\controller\\Module' => __DIR__ . '/../..' . '/app/admin/controller/Module.php',
'app\\admin\\controller\\Oplog' => __DIR__ . '/../..' . '/app/admin/controller/Oplog.php',
'app\\admin\\controller\\Queue' => __DIR__ . '/../..' . '/app/admin/controller/Queue.php',
'app\\admin\\controller\\User' => __DIR__ . '/../..' . '/app/admin/controller/User.php',
@@ -421,6 +422,7 @@ class ComposerStaticInitb911c14a0826c73d9f097343fd33a252
'think\\admin\\service\\InstallService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/InstallService.php',
'think\\admin\\service\\MenuService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/MenuService.php',
'think\\admin\\service\\MessageService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/MessageService.php',
+ 'think\\admin\\service\\ModuleService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/ModuleService.php',
'think\\admin\\service\\NodeService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/NodeService.php',
'think\\admin\\service\\OpenService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/OpenService.php',
'think\\admin\\service\\ProcessService' => __DIR__ . '/..' . '/zoujingli/think-library/src/service/ProcessService.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 68f637094..4d43bbd3a 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -903,12 +903,12 @@
"source": {
"type": "git",
"url": "https://github.com/zoujingli/ThinkLibrary.git",
- "reference": "2ce8935d423feccfd59bba2963e9127f3fca8c90"
+ "reference": "3241ffefd6697d1bedcc9721e3275a24055bb77b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zoujingli/ThinkLibrary/zipball/2ce8935d423feccfd59bba2963e9127f3fca8c90",
- "reference": "2ce8935d423feccfd59bba2963e9127f3fca8c90",
+ "url": "https://api.github.com/repos/zoujingli/ThinkLibrary/zipball/3241ffefd6697d1bedcc9721e3275a24055bb77b",
+ "reference": "3241ffefd6697d1bedcc9721e3275a24055bb77b",
"shasum": "",
"mirrors": [
{
@@ -924,7 +924,7 @@
"ext-json": "*",
"topthink/framework": "^6.0"
},
- "time": "2020-07-31T10:16:54+00:00",
+ "time": "2020-08-03T09:00:42+00:00",
"type": "library",
"extra": {
"think": {
diff --git a/vendor/services.php b/vendor/services.php
index 2ed688973..9b4e9ffc4 100644
--- a/vendor/services.php
+++ b/vendor/services.php
@@ -1,5 +1,5 @@
'think\\admin\\Library',
diff --git a/vendor/zoujingli/think-library/src/Library.php b/vendor/zoujingli/think-library/src/Library.php
index e16df2464..2e7a5c8e2 100644
--- a/vendor/zoujingli/think-library/src/Library.php
+++ b/vendor/zoujingli/think-library/src/Library.php
@@ -73,11 +73,11 @@ class Library extends Service
$this->app->request->setPathinfo($_SERVER['argv'][1]);
}
} else {
- // 注册语言包处理中间键
- $this->app->middleware->add(LoadLangPack::class);
- // 注册会话初始化中间键
if ($this->app->request->request('not_init_session', 0) == 0) {
+ // 注册会话初始化中间键
$this->app->middleware->add(SessionInit::class);
+ // 注册语言包处理中间键
+ $this->app->middleware->add(LoadLangPack::class);
}
// 注册访问处理中间键
$this->app->middleware->add(function (Request $request, \Closure $next) {
diff --git a/vendor/zoujingli/think-library/src/service/ModuleService.php b/vendor/zoujingli/think-library/src/service/ModuleService.php
new file mode 100644
index 000000000..98aebaf2b
--- /dev/null
+++ b/vendor/zoujingli/think-library/src/service/ModuleService.php
@@ -0,0 +1,122 @@
+online(), $this->getModules()];
+ foreach ($online as &$item) if (isset($locals[$item['name']])) {
+ $item['local'] = $locals[$item['name']];
+ if ($item['local']['version'] < $item['version']) {
+ $item['type_code'] = 2;
+ $item['type_desc'] = '需要更新';
+ } else {
+ $item['type_code'] = 3;
+ $item['type_desc'] = '无需更新';
+ }
+ } else {
+ $item['type_code'] = 1;
+ $item['type_desc'] = '未安装';
+ }
+ return $online;
+ }
+
+ /**
+ * 安装或更新模块
+ * @param string $name
+ * @return array
+ */
+ public function install($name): array
+ {
+ $install = InstallService::instance();
+ $data = $install->grenerateDifference(["app/{$name}"]);
+ if (empty($data)) return [0, '没有需要安装的文件', []];
+ $lines = [];
+ foreach ($data as $file) {
+ [$state, $mode, $name] = $install->fileSynchronization($file);
+ if ($state) {
+ if ($mode === 'add') $lines[] = "add {$name} successed";
+ if ($mode === 'mod') $lines[] = "modify {$name} successed";
+ if ($mode === 'del') $lines[] = "delete {$name} successed";
+ } else {
+ if ($mode === 'add') $lines[] = "add {$name} failed";
+ if ($mode === 'mod') $lines[] = "modify {$name} failed";
+ if ($mode === 'del') $lines[] = "delete {$name} failed";
+ }
+ }
+ return [1, '模块安装成功', $lines];
+ }
+
+ /**
+ * 获取线上模块数据
+ * @return array
+ */
+ public function online(): array
+ {
+ $data = $this->app->cache->get('module-online-data', []);
+ if (!empty($data)) return $data;
+ $result = json_decode(HttpExtend::get('https://v6.thinkadmin.top/admin/api.update/version'), true);
+ if (isset($result['code']) && $result['code'] > 0 && isset($result['data']) && is_array($result['data'])) {
+ foreach ($result['data'] as $item) $data[$item['name']] = $item;
+ $this->app->cache->set('module-online-data', $data, 1800);
+ return $data;
+ } else {
+ return [];
+ }
+ }
+
+ /**
+ * 获取系统模块信息
+ * @return array
+ */
+ public function getModules(): array
+ {
+ $data = [];
+ foreach (NodeService::instance()->getModules() as $name) {
+ if (is_array($ver = $this->__getVersion($name))) $data[$name] = $ver;
+ }
+ return $data;
+ }
+
+ /**
+ * 获取模块版本信息
+ * @param string $name 模块名称
+ * @return bool|array|null
+ */
+ private function __getVersion($name)
+ {
+ $file = $this->app->getBasePath() . $name . DIRECTORY_SEPARATOR . 'ver.php';
+ if (file_exists($file) && is_file($file) && is_array($vars = @include $file)) {
+ return isset($vars['name']) && isset($vars['version']) ? $vars : null;
+ } else {
+ return false;
+ }
+ }
+}
\ No newline at end of file