123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- <?php
- /**
- * Niushop商城系统 - 团队十年电商经验汇集巨献!
- * =========================================================
- * Copy right 2019-2029 山西牛酷信息科技有限公司, 保留所有权利。
- * ----------------------------------------------
- * 官方网址: https://www.niushop.com.cn
- * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
- * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
- * =========================================================
- */
- namespace app\model\system;
- use Symfony\Component\VarDumper\Cloner\DumperInterface;
- use think\facade\Cache;
- use think\facade\Db;
- use app\model\BaseModel;
- /**
- * 插件表
- */
- class Addon extends BaseModel
- {
-
- /**
- * 获取单条插件信息
- * @param array $condition
- * @param string $field
- */
- public function getAddonInfo($condition, $field = "*")
- {
- $data = json_encode([ $condition, $field ]);
- $cache = Cache::get("addon_getAddonInfo_" . $data);
- if (!empty($cache)) {
- return $this->success($cache);
- }
- $addon_info = model('addon')->getInfo($condition, $field);
- Cache::tag("addon")->set("addon_getAddonInfo_" . $data, $addon_info);
- return $this->success($addon_info);
- }
-
-
- /**
- * 获取插件列表
- *
- * @param array $condition
- * @param string $field
- * @param string $order
- * @param string $limit
- */
- public function getAddonList($condition = [], $field = '*', $order = '', $limit = null)
- {
- $data = json_encode([ $condition, $field, $order, $limit ]);
- $cache = Cache::get("addon_getAddonList_" . $data);
- if (!empty($cache)) {
- return $this->success($cache);
- }
- $addon_list = model('addon')->getList($condition, $field, $order, '', '', '', $limit);
- Cache::tag("addon")->set("addon_getAddonList_" . $data, $addon_list);
- return $this->success($addon_list);
- }
-
- /**
- * 获取插件分页列表
- *
- * @param array $condition
- * @param number $page
- * @param string $page_size
- * @param string $order
- * @param string $field
- * @return multitype:string mixed
- */
- public function getAddonPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
- {
- $data = json_encode([ $condition, $page, $page_size, $order, $field ]);
- $cache = Cache::get("addon_getAddonPageList_" . $data);
- if (!empty($cache)) {
- return $this->success($cache);
- }
- $list = model('addon')->pageList($condition, $field, $order, $page, $page_size);
- Cache::tag("addon")->set("addon_getAddonPageList_" . $data, $list);
- return $this->success($list);
- }
-
- /**
- * 获取未安装的插件列表
- */
- public function getUninstallAddonList()
- {
-
- $dirs = array_map('basename', glob('addon/*', GLOB_ONLYDIR));
- $addon_names = model('addon')->getColumn([], 'name');
- $addons = [];
- foreach ($dirs as $key => $value) {
- if (!in_array($value, $addon_names)) {
- $info_name = 'addon/' . $value . '/config/info.php';
- if (file_exists($info_name)) {
- $info = include_once $info_name;
- $info['icon'] = 'addon/' . $value . '/icon.png';
- $addons[] = $info;
- }
-
- }
- }
- return $this->success($addons);
- }
-
- /*******************************************************************插件安装方法开始****************************************************/
- /**
- * 插件安装
- *
- * @param string $addon_name
- */
- public function install($addon_name)
- {
-
- Db::startTrans();
- try {
- // 插件预安装
-
- $res2 = $this->preInstall($addon_name);
- if ($res2['code'] != 0) {
- Db::rollback();
- return $res2;
- }
-
- // 安装菜单
- $res3 = $this->installMenu($addon_name);
-
- if ($res3['code'] != 0) {
- Db::rollback();
- return $res3;
- }
-
- // 安装自定义模板
- $res4 = $this->refreshDiyView($addon_name);
- if ($res4['code'] != 0) {
- Db::rollback();
- return $res4;
- }
- // 添加插件入表
- $addons_model = model('addon');
- $addon_info = require 'addon/' . $addon_name . '/config/info.php';
- $addon_info['create_time'] = time();
- $addon_info['icon'] = 'addon/' . $addon_name . '/icon.png';
-
- $data = $addons_model->add($addon_info);
-
- if (!$data) {
- Db::rollback();
- return $this->error($data, 'ADDON_ADD_FAIL');
- }
- // 清理缓存
- Cache::clear();
-
- Db::commit();
- return $this->success();
- } catch (\Exception $e) {
- // 清理缓存
- Cache::clear();
- Db::rollback();
- return $this->error('', $e->getMessage());
- }
- }
-
- /**
- * 插件预安装
- */
- private function preInstall($addon_name)
- {
- $class_name = "addon\\" . $addon_name . "\\event\\Install";
- $install = new $class_name;
- $res = $install->handle($addon_name);
- if ($res['code'] != 0) {
- return $res;
- }
- return $this->success();
- }
-
- /**
- * 安装插件菜单
- */
- private function installMenu($addon)
- {
- $menu = new Menu();
- $menu->refreshMenu('admin', $addon);
- $menu->refreshMenu('shop', $addon);
- return $this->success();
- }
-
-
- /**
- * 刷新插件自定义页面配置
- * @param string $addon
- */
- public function refreshDiyView($addon)
- {
- if (empty($addon)) {
- $diy_view_file = 'config/diy_view.php';
- model('diy_view_temp')->delete([ [ 'addon_name', '=', '' ] ]);
- model('link')->delete([ [ 'addon_name', '=', '' ] ]);
- model('diy_view_util')->delete([ [ 'addon_name', '=', '' ] ]);
- } else {
- $diy_view_file = 'addon/' . $addon . '/config/diy_view.php';
- model('diy_view_temp')->delete([ [ 'addon_name', '=', $addon ] ]);
- model('link')->delete([ [ 'addon_name', '=', $addon ] ]);
- model('diy_view_util')->delete([ [ 'addon_name', '=', $addon ] ]);
- }
- if (! file_exists($diy_view_file)) {
- return $this->success();
- }
- $diy_view = require $diy_view_file;
- // 自定义模板
- if (isset($diy_view['template'])) {
- $diy_view_addons_data = [];
- foreach ($diy_view['template'] as $k => $v) {
- $addons_item = [
- 'addon_name' => isset($addon) ? $addon : '',
- 'name' => $v['name'],
- 'title' => $v['title'],
- 'value' => $v['value'],
- 'type' => $v['type'],
- 'icon' => $v['icon'],
- 'create_time' => time()
- ];
- $diy_view_addons_data[] = $addons_item;
- }
- if ($diy_view_addons_data) {
- model('diy_view_temp')->addList($diy_view_addons_data);
- }
- }
- // 自定义链接
- if (isset($diy_view['link'])) {
- $diy_view_link_data = [];
- foreach ($diy_view['link'] as $k => $v) {
- $link_item = [
- 'addon_name' => isset($addon) ? $addon : '',
- 'name' => $v['name'],
- 'title' => $v['title'],
- 'wap_url' => isset($v['wap_url']) ? $v['wap_url'] : '',
- 'web_url' => isset($v['web_url']) ? $v['web_url'] : '',
- 'icon' => isset($v['icon']) ? $v['icon'] : '',
- 'support_diy_view' => isset($v['support_diy_view']) ? $v['support_diy_view'] : '',
- ];
- $diy_view_link_data[] = $link_item;
- }
- if ($diy_view_link_data) {
- model('link')->addList($diy_view_link_data);
- }
- }
- // 自定义模板组件
- if (isset($diy_view['util'])) {
- $diy_view_util_data = [];
- foreach ($diy_view['util'] as $k => $v) {
- $util_item = [
- 'name' => $v['name'],
- 'title' => $v['title'],
- 'type' => $v['type'],
- 'controller' => $v['controller'],
- 'value' => $v['value'],
- 'sort' => $v['sort'],
- 'support_diy_view' => $v['support_diy_view'],
- 'addon_name' => $addon,
- 'max_count' => $v['max_count']
- ];
- $diy_view_util_data[] = $util_item;
- }
- if ($diy_view_util_data) {
- model('diy_view_util')->addList($diy_view_util_data);
- }
- }
- return $this->success();
-
- }
-
- /**************************************************************插件安装结束*********************************************************/
-
- /**************************************************************插件卸载开始*********************************************************/
- public function uninstall($addon_name)
- {
- Db::startTrans();
- try {
- // 插件预卸载
- $res1 = $this->preUninstall($addon_name);
- if ($res1['code'] != 0) {
- Db::rollback();
- return $res1;
- }
- // 卸载菜单
- $res2 = $this->uninstallMenu($addon_name);
- if ($res2['code'] != 0) {
- Db::rollback();
- return $res2;
- }
- $res3 = $this->uninstallDiyView($addon_name);
- if ($res3['code'] != 0) {
- Db::rollback();
- return $res3;
- }
- $delete_res = model('addon')->delete([
- [ 'name', '=', $addon_name ]
- ]);
- if ($delete_res === false) {
- Db::rollback();
- return $this->error();
- }
- //清理缓存
- Cache::clear();
- Db::commit();
- return $this->success();
- } catch (\Exception $e) {
- //清理缓存
- Cache::clear();
- Db::rollback();
- return $this->error('', $e->getMessage());
- }
- }
-
- /**
- * 插件预卸载
- */
- private function preUninstall($addon_name)
- {
- $class_name = "addon\\" . $addon_name . "\\event\\UnInstall";
- $install = new $class_name;
- $res = $install->handle($addon_name);
- return $res;
- }
-
- /**
- * 卸载插件菜单
- */
- private function uninstallMenu($addon_name)
- {
- $res = model('menu')->delete([
- [ 'addon', '=', $addon_name ]
- ]);
- return $this->success($res);
- }
-
- /**
- * 卸载自定义模板
- *
- * @param string $addon_name
- * @return multitype:string mixed
- */
- private function uninstallDiyView($addon_name)
- {
- model('diy_view_temp')->delete([ [ 'addon_name', '=', $addon_name ] ]);
- model('link')->delete([ [ 'addon_name', '=', $addon_name ] ]);
- model('diy_view_util')->delete([ [ 'addon_name', '=', $addon_name ] ]);
- return $this->success();
- }
-
- /***************************************************************插件卸载结束********************************************************/
- /************************************************************* 安装全部插件 start *************************************************************/
- /**
- * 安装全部插件
- */
- public function installAllAddon(){
- $addon_list_result = $this->getUninstallAddonList();
- $addon_list = $addon_list_result["data"];
- foreach($addon_list as $k => $v){
- $item_result = $this->install($v["name"]);
- if($item_result["code"] < 0)
- return $item_result;
- }
- return $this->success();
- }
- /************************************************************* 安装全部插件 end *************************************************************/
- }
|