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} + + + + + + + {/foreach} + +
模块名称模块描述当前版本
{$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} +
+ + {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