From 143f8bbf29faf08402b1fe7d34dd0262c194edf0 Mon Sep 17 00:00:00 2001 From: Devil Date: Thu, 18 Feb 2021 21:59:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=96=B0=E5=A2=9E=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/service/PluginsAdminService.php | 70 +++++++++++++-------- application/service/PluginsService.php | 44 ++++++++++++- changelog.txt | 4 +- 3 files changed, 91 insertions(+), 27 deletions(-) diff --git a/application/service/PluginsAdminService.php b/application/service/PluginsAdminService.php index fb99328d8..cd8653139 100755 --- a/application/service/PluginsAdminService.php +++ b/application/service/PluginsAdminService.php @@ -133,13 +133,14 @@ class PluginsAdminService } // 数据处理 - $config = self::GetPluginsConfig($params['id']);; + $plugins = $params['id']; + $config = self::GetPluginsConfig($plugins); if($config !== false && !empty($config['base']) && !empty($config['base']['name'])) { - $cache = PluginsService::PluginsCacheData($params['id']); + $cache = PluginsService::PluginsCacheData($plugins); $data = [ 'name' => $config['base']['name'], - 'plugins' => $params['id'], + 'plugins' => $plugins, 'data' => empty($cache) ? '' : json_encode($cache), 'is_enable' => 0, 'add_time' => time(), @@ -148,6 +149,9 @@ class PluginsAdminService // 添加数据 if(Db::name('Plugins')->insertGetId($data) > 0) { + // 插件事件回调 + PluginsService::PluginsEventCall($plugins, 'Install', $params); + return DataReturn('安装成功'); } else { return DataReturn('安装失败', -100); @@ -178,7 +182,8 @@ class PluginsAdminService Db::startTrans(); // 开始卸载 - if(DB::name('Plugins')->where(['plugins'=>$params['id']])->delete()) + $plugins = $params['id']; + if(DB::name('Plugins')->where(['plugins'=>$plugins])->delete()) { // 钩子部署 $ret = self::PluginsHookDeployment(); @@ -186,6 +191,10 @@ class PluginsAdminService { // 提交事务 Db::commit(); + + // 插件事件回调 + PluginsService::PluginsEventCall($plugins, 'Uninstall', $params); + return DataReturn('卸载成功'); } } else { @@ -391,13 +400,14 @@ class PluginsAdminService } // 应用是否存在 - if(!file_exists(APP_PATH.'plugins'.DS.$params['id'])) + $plugins = $params['id']; + if(!file_exists(APP_PATH.'plugins'.DS.$plugins)) { return DataReturn('应用不存在', -10); } // 获取应用标记 - $data = Db::name('Plugins')->where(['plugins'=>$params['id']])->find(); + $data = Db::name('Plugins')->where(['plugins'=>$plugins])->find(); if(!empty($data['is_enable'])) { return DataReturn('请先卸载应用', -10); @@ -408,16 +418,16 @@ class PluginsAdminService if($ret['code'] == 0) { // 是否需要删除应用数据,sql运行 - $is_delete_static = (isset($params['value']) && $params['value'] == 1); + $is_delete_data = (isset($params['value']) && $params['value'] == 1); // 删除数据 - if($is_delete_static === true) + if($is_delete_data === true) { // 删除缓存 - PluginsService::PluginsCacheDelete($params['id']); + PluginsService::PluginsCacheDelete($plugins); // 执行卸载sql - $uninstall_sql = APP_PATH.'plugins'.DS.$params['id'].DS.'uninstall.sql'; + $uninstall_sql = APP_PATH.'plugins'.DS.$plugins.DS.'uninstall.sql'; if(file_exists($uninstall_sql)) { SqlconsoleService::Implement(['sql'=>file_get_contents($uninstall_sql)]); @@ -425,10 +435,13 @@ class PluginsAdminService } // 删除数据库附件 - ResourcesService::AttachmentPathTypeDelete('plugins_'.$params['id']); + ResourcesService::AttachmentPathTypeDelete('plugins_'.$plugins); // 删除应用文件 - self::PluginsResourcesDelete($params['id'], $is_delete_static); + self::PluginsResourcesDelete($plugins, $is_delete_data); + + // 插件事件回调 + PluginsService::PluginsEventCall($plugins, 'Delete', $params); return DataReturn('删除成功'); } @@ -443,9 +456,9 @@ class PluginsAdminService * @date 2019-02-13 * @desc description * @param [string] $plugins [唯一标记] - * @param [boolean] $is_delete_static [是否删除应用数据] + * @param [boolean] $is_delete_data [是否删除应用数据] */ - private static function PluginsResourcesDelete($plugins, $is_delete_static = false) + private static function PluginsResourcesDelete($plugins, $is_delete_data = false) { \base\FileUtil::UnlinkDir(APP_PATH.'plugins'.DS.$plugins); \base\FileUtil::UnlinkDir(APP_PATH.'plugins'.DS.'view'.DS.$plugins); @@ -454,7 +467,7 @@ class PluginsAdminService \base\FileUtil::UnlinkDir(ROOT.'public'.DS.'static'.DS.'plugins'.DS.'images'.DS.$plugins); // 是否需要删除应用数据 - if($is_delete_static === true) + if($is_delete_data === true) { \base\FileUtil::UnlinkDir(ROOT.'public'.DS.'static'.DS.'upload'.DS.'images'.DS.'plugins_'.$plugins); \base\FileUtil::UnlinkDir(ROOT.'public'.DS.'static'.DS.'upload'.DS.'video'.DS.'plugins_'.$plugins); @@ -1039,7 +1052,7 @@ php; ]; // 包名 - $plugins_name = ''; + $plugins = ''; // 开始解压文件 $resource = zip_open($_FILES['file']['tmp_name']); @@ -1056,11 +1069,11 @@ php; $file = zip_entry_name($temp_resource); // 获取包名 - if(empty($plugins_name)) + if(empty($plugins)) { // 应用名称 - $plugins_name = substr($file, 0, strpos($file, '/')); - if(empty($plugins_name)) + $plugins = substr($file, 0, strpos($file, '/')); + if(empty($plugins)) { // 应用名称为空、则校验是否为支付插件 $file_size = zip_entry_filesize($temp_resource); @@ -1075,7 +1088,7 @@ php; } // 应用不存在则添加 - $ret = self::PluginsVerification($plugins_name); + $ret = self::PluginsVerification($plugins); if($ret['code'] != 0) { zip_entry_close($temp_resource); @@ -1083,7 +1096,7 @@ php; } // 应用是否存在 - $ret = self::PluginsExist($plugins_name); + $ret = self::PluginsExist($plugins); if($ret['code'] != 0) { zip_entry_close($temp_resource); @@ -1116,7 +1129,7 @@ php; } // 匹配成功文件路径处理、跳出循环 - $file = str_replace($plugins_name.'/'.$dir_key.'/', '', $dir_value.$file); + $file = str_replace($plugins.'/'.$dir_key.'/', '', $dir_value.$file); $is_has_find = true; break; } @@ -1150,15 +1163,18 @@ php; } // 附件同步到数据库 - ResourcesService::AttachmentDiskFilesToDb('plugins_'.$plugins_name); + ResourcesService::AttachmentDiskFilesToDb('plugins_'.$plugins); // sql运行 - $install_sql = APP_PATH.'plugins'.DS.$plugins_name.DS.'install.sql'; - if(!empty($plugins_name) && file_exists($install_sql)) + $install_sql = APP_PATH.'plugins'.DS.$plugins.DS.'install.sql'; + if(!empty($plugins) && file_exists($install_sql)) { SqlconsoleService::Implement(['sql'=>file_get_contents($install_sql)]); } + // 插件事件回调 + PluginsService::PluginsEventCall($plugins, 'Upload', $params); + return DataReturn('安装成功'); } @@ -1326,7 +1342,11 @@ php; // 开始下载 if(\base\FileUtil::DownloadFile($new_dir.'.zip', $config['base']['name'].'.zip')) { + // 删除文件 @unlink($new_dir.'.zip'); + + // 插件事件回调 + PluginsService::PluginsEventCall($plugins, 'Download', $params); } else { return DataReturn('下载失败', -100); } diff --git a/application/service/PluginsService.php b/application/service/PluginsService.php index 00129da6d..bcf2e6d3f 100755 --- a/application/service/PluginsService.php +++ b/application/service/PluginsService.php @@ -310,7 +310,49 @@ class PluginsService } // 调用方法仅传递请求参数 - if(isset($params['data_request'])) + if(!empty($params) && isset($params['data_request'])) + { + $params = $params['data_request']; + } + return DataReturn('调用成功', 0, $obj->$action($params)); + } + + /** + * 应用控制器调用 + * @author Devil + * @blog http://gong.gg/ + * @version 1.0.0 + * @date 2020-01-02 + * @param [string] $plugins [应用标记] + * @param [string] $action [事件方法(Upload 上传, Install 安装, Uninstall 卸载, Download 下载, Delete 删除)] + * @param [array] $params [输入参数] + */ + public static function PluginsEventCall($plugins, $action, $params = []) + { + // 应用校验 + $ret = self::PluginsCheck($plugins); + if($ret['code'] != 0) + { + return $ret; + } + + // 应用事件 + $plugins = '\app\plugins\\'.$plugins.'\\Event'; + if(!class_exists($plugins)) + { + return DataReturn('应用事件未定义['.$plugins.']', -1); + } + + // 调用方法 + $action = ucfirst($action); + $obj = new $plugins($params); + if(!method_exists($obj, $action)) + { + return DataReturn('应用事件方法未定义['.$action.']', -1); + } + + // 调用方法仅传递请求参数 + if(!empty($params) && isset($params['data_request'])) { $params = $params['data_request']; } diff --git a/changelog.txt b/changelog.txt index cee1591b3..c550c5f92 100755 --- a/changelog.txt +++ b/changelog.txt @@ -11,12 +11,14 @@ web端 1. 编辑器图片、附件、视频多选支持按照顺序选择插入编辑器 + 2. 插件、主题下载新增历史信息记录 + 3. 插件(上传、安装、卸载、删除)新增回调事件 小程序 1. 插件 - 1. + 1. 应用商店 +=========================================================+