Addon.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\model\system;
  11. use app\model\BaseModel;
  12. use app\model\diy\Template;
  13. use app\model\diy\Theme;
  14. use app\model\system\Config as ConfigModel;
  15. use app\model\web\DiyView as DiyViewModel;
  16. use app\model\web\DiyViewLink;
  17. use think\facade\Cache;
  18. use think\facade\Db;
  19. /**
  20. * 插件表
  21. */
  22. class Addon extends BaseModel
  23. {
  24. /**
  25. * 获取单条插件信息
  26. * @param array $condition
  27. * @param string $field
  28. */
  29. public function getAddonInfo($condition, $field = "*")
  30. {
  31. $data = json_encode([ $condition, $field ]);
  32. $cache = Cache::get("addon_getAddonInfo_" . $data);
  33. if (!empty($cache)) {
  34. return $this->success($cache);
  35. }
  36. $addon_info = model('addon')->getInfo($condition, $field);
  37. Cache::tag("addon")->set("addon_getAddonInfo_" . $data, $addon_info);
  38. return $this->success($addon_info);
  39. }
  40. /**
  41. * 获取插件列表
  42. *
  43. * @param array $condition
  44. * @param string $field
  45. * @param string $order
  46. * @param string $limit
  47. */
  48. public function getAddonList($condition = [], $field = '*', $order = '', $limit = null)
  49. {
  50. $data = json_encode([ $condition, $field, $order, $limit ]);
  51. $cache = Cache::get("addon_getAddonList_" . $data);
  52. if (!empty($cache)) {
  53. return $this->success($cache);
  54. }
  55. $addon_list = model('addon')->getList($condition, $field, $order, '', '', '', $limit);
  56. Cache::tag("addon")->set("addon_getAddonList_" . $data, $addon_list);
  57. return $this->success($addon_list);
  58. }
  59. /**
  60. * 获取插件分页列表
  61. * @param array $condition
  62. * @param int $page
  63. * @param int $page_size
  64. * @param string $order
  65. * @param string $field
  66. * @return array
  67. */
  68. public function getAddonPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
  69. {
  70. $data = json_encode([ $condition, $page, $page_size, $order, $field ]);
  71. $cache = Cache::get("addon_getAddonPageList_" . $data);
  72. if (!empty($cache)) {
  73. return $this->success($cache);
  74. }
  75. $list = model('addon')->pageList($condition, $field, $order, $page, $page_size);
  76. Cache::tag("addon")->set("addon_getAddonPageList_" . $data, $list);
  77. return $this->success($list);
  78. }
  79. /**
  80. * 获取所有插件
  81. * @return array
  82. */
  83. public function getAddonAllList()
  84. {
  85. //获取官网记录的所有数据
  86. $upgrade_service = new Upgrade();
  87. $data = $upgrade_service->getAuthPlugin();
  88. if (isset($data[ 'code' ]) && $data[ 'code' ] >= 0) {
  89. $temp_auth_addon_list = $data[ 'data' ];
  90. } else {
  91. $temp_auth_addon_list = [];
  92. }
  93. //以code为key组装正式数据
  94. $auth_addon_list = [];
  95. foreach ($temp_auth_addon_list as $key => $val) {
  96. $auth_addon_list[ $val[ 'code' ] ] = $val;
  97. }
  98. //存在的插件
  99. $existed_addons = array_map('basename', glob('addon/*', GLOB_ONLYDIR));
  100. //已安装的插件
  101. $installed_addon_array = model('addon')->getColumn([], 'name');
  102. //初始化数据
  103. $undownload_addons = [];
  104. $uninstall_addons = [];
  105. $install_addons = [];
  106. //获取未下载插件
  107. foreach ($auth_addon_list as $key => $val) {
  108. $index = array_search($val[ 'code' ], $existed_addons);
  109. if ($index === false) {
  110. $undownload_addons[] = [
  111. 'name' => $val[ 'code' ],
  112. 'title' => $val[ 'goods_name' ],
  113. 'icon' => $val[ 'logo' ],
  114. 'description' => $val[ 'introduction' ],
  115. 'version' => $val[ 'last_online_version_name' ],
  116. 'download' => 1,
  117. 'auth' => true,
  118. 'update' => false
  119. ];
  120. }
  121. }
  122. //获取已下载插件 区分已安装和为安装 是否需要升级 是否已授权
  123. foreach ($existed_addons as $key => $val) {
  124. $info_file_path = 'addon/' . $val . '/config/info.php';
  125. if (file_exists($info_file_path)) {
  126. $info = include_once $info_file_path;
  127. $info[ 'icon' ] = 'addon/' . $val . '/icon.png';
  128. $info[ 'download' ] = 0;
  129. $info[ 'auth' ] = isset($auth_addon_list[ $val ]) ? true : false;
  130. $info[ 'update' ] = ( isset($auth_addon_list[ $val ]) && $auth_addon_list[ $val ][ 'last_online_version_no' ] > $info[ 'version_no' ] ) ? true : false;
  131. $info[ 'last_online_version_no' ] = isset($auth_addon_list[ $val ]) ? $auth_addon_list[ $val ][ 'last_online_version_no' ] : '';
  132. if (!in_array($val, $installed_addon_array)) {
  133. $uninstall_addons[] = $info;
  134. } else {
  135. $install_addons[] = $info;
  136. }
  137. }
  138. }
  139. return $this->success([
  140. 'uninstall' => array_merge($undownload_addons, $uninstall_addons),
  141. 'install' => $install_addons,
  142. ]);
  143. }
  144. /**
  145. * 获取未安装的插件列表
  146. */
  147. public function getUninstallAddonList()
  148. {
  149. $dirs = array_map('basename', glob('addon/*', GLOB_ONLYDIR));
  150. $addon_names = model('addon')->getColumn([], 'name');
  151. $addons = [];
  152. foreach ($dirs as $key => $value) {
  153. if (!in_array($value, $addon_names)) {
  154. $info_name = 'addon/' . $value . '/config/info.php';
  155. if (file_exists($info_name)) {
  156. $info = include_once $info_name;
  157. $info[ 'icon' ] = 'addon/' . $value . '/icon.png';
  158. $addons[] = $info;
  159. }
  160. }
  161. }
  162. return $this->success($addons);
  163. }
  164. /*******************************************************************插件安装方法开始****************************************************/
  165. /**
  166. * 插件安装
  167. *
  168. * @param string $addon_name
  169. */
  170. public function install($addon_name)
  171. {
  172. Db::startTrans();
  173. try {
  174. // 插件预安装
  175. $res2 = $this->preInstall($addon_name);
  176. if ($res2[ 'code' ] != 0) {
  177. Db::rollback();
  178. return $res2;
  179. }
  180. // 安装菜单
  181. $res3 = $this->installMenu($addon_name);
  182. if ($res3[ 'code' ] != 0) {
  183. Db::rollback();
  184. return $res3;
  185. }
  186. // 安装自定义模板
  187. $res4 = $this->refreshDiyView($addon_name);
  188. if ($res4[ 'code' ] != 0) {
  189. Db::rollback();
  190. return $res4;
  191. }
  192. // 添加插件入表
  193. $addons_model = model('addon');
  194. $addon_info = require 'addon/' . $addon_name . '/config/info.php';
  195. $addon_info[ 'create_time' ] = time();
  196. $addon_info[ 'icon' ] = 'addon/' . $addon_name . '/icon.png';
  197. $data = $addons_model->add($addon_info);
  198. if (!$data) {
  199. Db::rollback();
  200. return $this->error($data, 'ADDON_ADD_FAIL');
  201. }
  202. // 清理缓存
  203. Cache::clear();
  204. Db::commit();
  205. return $this->success();
  206. } catch (\Exception $e) {
  207. // 清理缓存
  208. Cache::clear();
  209. Db::rollback();
  210. return $this->error('', $e->getMessage());
  211. }
  212. }
  213. /**
  214. * 插件预安装
  215. */
  216. private function preInstall($addon_name)
  217. {
  218. $class_name = "addon\\" . $addon_name . "\\event\\Install";
  219. $install = new $class_name;
  220. $res = $install->handle($addon_name);
  221. if ($res[ 'code' ] != 0) {
  222. return $res;
  223. }
  224. return $this->success();
  225. }
  226. /**
  227. * 安装插件菜单
  228. */
  229. private function installMenu($addon)
  230. {
  231. $menu = new Menu();
  232. $menu->refreshMenu('shop', $addon);
  233. return $this->success();
  234. }
  235. /**
  236. * 刷新插件自定义页面配置
  237. * @param $addon
  238. * @param $site_id
  239. * @return array
  240. */
  241. public function refreshDiyView($addon)
  242. {
  243. try {
  244. if (empty($addon)) {
  245. $diy_view_file = 'config/diy_view.php';
  246. } else {
  247. $diy_view_file = 'addon/' . $addon . '/config/diy_view.php';
  248. }
  249. if (!file_exists($diy_view_file)) {
  250. return $this->success();
  251. }
  252. $link_model = new DiyViewLink();
  253. $diy_view_model = new DiyViewModel();
  254. $diy_template_model = new Template();
  255. $diy_theme_model = new Theme();
  256. // 查询原模板组列表,用于更新自定义页面的所属模板id
  257. $diy_template_goods_list_old = $diy_template_model->getTemplateGoodsList([ [ 'addon_name', '=', $addon ] ], 'goods_id,name')[ 'data' ];
  258. // 清空数据
  259. $link_model->deleteLink([ [ 'addon_name', '=', $addon ] ]); // 链接
  260. $diy_view_model->deleteUtil([ [ 'addon_name', '=', $addon ] ]); // 组件
  261. $diy_template_model->deleteTemplate([ [ 'addon_name', '=', $addon ] ]); // 页面类型
  262. $diy_theme_model->deleteTheme([ [ 'addon_name', '=', $addon ] ]); // 主题风格
  263. $diy_template_model->deleteTemplateGoods([ [ 'addon_name', '=', $addon ] ]); // 模板组
  264. $diy_template_model->deleteTemplateGoodsItem([ [ 'addon_name', '=', $addon ] ]); // 模板页面
  265. $diy_view = require $diy_view_file;
  266. // 自定义链接
  267. if (isset($diy_view[ 'link' ])) {
  268. $diy_view_link_data = $link_model->getViewLinkList($diy_view[ 'link' ], $addon);
  269. if ($diy_view_link_data) {
  270. model('link')->addList($diy_view_link_data);
  271. }
  272. }
  273. // 自定义模板组件
  274. if (isset($diy_view[ 'util' ])) {
  275. $diy_view_util_data = [];
  276. foreach ($diy_view[ 'util' ] as $k => $v) {
  277. $util_item = [
  278. 'name' => $v[ 'name' ], // 组件标识
  279. 'title' => $v[ 'title' ], // 组件名称
  280. 'type' => $v[ 'type' ], // 组件类型,SYSTEM:基础组件,PROMOTION:营销组件,EXTEND:扩展组件
  281. 'value' => $v[ 'value' ], // 组件数据结构json格式
  282. 'sort' => $v[ 'sort' ],
  283. 'support_diy_view' => $v[ 'support_diy_view' ] ?? '', // 支持的自定义页面(为空表示公共组件都支持)
  284. 'addon_name' => $addon,
  285. 'max_count' => $v[ 'max_count' ] ?? 0, // 限制添加次数,0表示可以无限添加该组件
  286. 'is_delete' => $v[ 'is_delete' ] ?? 0, // 组件是否可以删除,0 允许,1 禁用
  287. 'icon' => $v[ 'icon' ] ?? '' // 组件字体图标
  288. ];
  289. $diy_view_util_data[] = $util_item;
  290. }
  291. if ($diy_view_util_data) {
  292. $diy_view_model->addUtilList($diy_view_util_data);
  293. }
  294. }
  295. // 自定义模板页面类型
  296. if (isset($diy_view[ 'template' ]) && !empty($diy_view[ 'template' ])) {
  297. $template_data = [];
  298. foreach ($diy_view[ 'template' ] as $k => $v) {
  299. // 检测防重复
  300. $count = $diy_template_model->getTemplateCount([ [ 'name', '=', $v[ 'name' ] ] ])[ 'data' ];
  301. if ($count == 0) {
  302. $template_data[] = [
  303. 'title' => $v[ 'title' ], // 模板名称
  304. 'name' => $v[ 'name' ], // 模板标识
  305. 'page' => $v[ 'path' ], // 页面路径
  306. 'addon_name' => $addon,
  307. 'value' => $v[ 'value' ] ?? '',
  308. 'rule' => isset($v[ 'rule' ]) ? json_encode($v[ 'rule' ]) : '',
  309. 'sort' => $v[ 'sort' ] ?? 0
  310. ];
  311. }
  312. }
  313. if (!empty($template_data)) {
  314. $diy_template_model->addTemplateList($template_data);
  315. }
  316. }
  317. // 主题风格配色
  318. if (isset($diy_view[ 'theme' ]) && !empty($diy_view[ 'theme' ])) {
  319. $theme_data = [];
  320. foreach ($diy_view[ 'theme' ] as $k => $v) {
  321. // 检测防重复
  322. $count = $diy_theme_model->getThemeCount([ [ 'name', '=', $v[ 'name' ] ] ])[ 'data' ];
  323. if ($count == 0) {
  324. $theme_value = $v;
  325. unset($theme_value[ 'title' ], $theme_value[ 'name' ], $theme_value[ 'main_color' ], $theme_value[ 'aux_color' ], $theme_value[ 'preview' ]);
  326. $theme_data[] = [
  327. 'title' => $v[ 'title' ],
  328. 'name' => $v[ 'name' ],
  329. 'addon_name' => $addon,
  330. 'main_color' => $v[ 'main_color' ],
  331. 'aux_color' => $v[ 'aux_color' ],
  332. 'preview' => implode(',', $v[ 'preview' ]),
  333. 'color_img' => $v[ 'color_img' ],
  334. 'value' => json_encode($theme_value),
  335. ];
  336. }
  337. }
  338. if (!empty($theme_data)) {
  339. $diy_theme_model->addThemeList($theme_data);
  340. }
  341. }
  342. // 模板信息
  343. $diy_goods_id = 0;
  344. if (isset($diy_view[ 'info' ]) && !empty($diy_view[ 'info' ])) {
  345. $template_goods_data = [
  346. 'title' => $diy_view[ 'info' ][ 'title' ], // 模板名称
  347. 'name' => $diy_view[ 'info' ][ 'name' ], // 模板标识
  348. 'addon_name' => $addon,
  349. 'cover' => $diy_view[ 'info' ][ 'cover' ], // 模板封面图
  350. 'preview' => $diy_view[ 'info' ][ 'preview' ], // 模板预览图
  351. 'desc' => $diy_view[ 'info' ][ 'desc' ], // 模板描述
  352. ];
  353. // 检测防重复
  354. $count = $diy_template_model->getTemplateGoodsCount([ [ 'name', '=', $template_goods_data[ 'name' ] ] ])[ 'data' ];
  355. if ($count == 0) {
  356. $diy_goods_id = $diy_template_model->addTemplateGoods($template_goods_data)[ 'data' ];
  357. }
  358. if (!empty($diy_template_goods_list_old)) {
  359. foreach ($diy_template_goods_list_old as $k => $v) {
  360. // 更新自定义页面的所属模板id
  361. // $diy_view_model->editSiteDiyView([
  362. // 'template_id' => $diy_goods_id,
  363. // ], [
  364. // [ 'name', 'like', '%DIY_VIEW_RANDOM_%' ],
  365. // [ 'template_id', '=', $v[ 'goods_id' ] ]
  366. // ]);
  367. // 更新店铺关联模板关系id
  368. $diy_template_model->editSiteDiyTemplate([
  369. 'template_goods_id' => $diy_goods_id,
  370. ], [
  371. [ 'addon_name', '=', $addon ],
  372. [ 'name', '=', $v[ 'name' ] ],
  373. [ 'template_goods_id', '=', $v[ 'goods_id' ] ]
  374. ]);
  375. }
  376. }
  377. } else {
  378. // 模板不存在,则清除店铺与模板之间的关系
  379. $diy_template_model->deleteSiteDiyTemplate([ [ 'addon_name', '=', $addon ] ]); // 模板页面关联关系
  380. }
  381. // 自定义页面数据
  382. if (isset($diy_view[ 'data' ]) && !empty($diy_view[ 'data' ])) {
  383. $goods_item_id = 0;
  384. foreach ($diy_view[ 'data' ] as $k => $v) {
  385. $goods_item_data = [
  386. 'goods_id' => $diy_goods_id, // 模板组id
  387. 'title' => $v[ 'title' ], // 名称
  388. 'addon_name' => $addon,
  389. 'name' => $v[ 'name' ], // 所属页面(首页、分类,空为微页面)
  390. 'value' => json_encode($v[ 'value' ]), // 模板数据
  391. 'create_time' => time()
  392. ];
  393. $item_id = $diy_template_model->addTemplateGoodsItem($goods_item_data)[ 'data' ];
  394. // 默认装修第一个页面
  395. if ($k == 0) {
  396. $goods_item_id = $item_id;
  397. }
  398. }
  399. $diy_template_model->editTemplateGoods([ 'goods_item_id' => $goods_item_id ], [ [ 'goods_id', '=', $diy_goods_id ] ]);
  400. // 更新页面的所属模板id
  401. $diy_template_goods_item_list = $diy_template_model->getTemplateGoodsItemList([ [ 'addon_name', '=', $addon ] ], 'goods_id,goods_item_id,name')[ 'data' ];
  402. if (!empty($diy_template_goods_item_list)) {
  403. foreach ($diy_template_goods_item_list as $k => $v) {
  404. $diy_view_model->editSiteDiyView([
  405. 'template_id' => $v[ 'goods_id' ],
  406. 'template_item_id' => $v[ 'goods_item_id' ]
  407. ], [
  408. [ 'name', '=', $v[ 'name' ] ],
  409. [ 'addon_name', '=', $addon ]
  410. ]);
  411. }
  412. }
  413. }
  414. return $this->success();
  415. } catch (\Exception $e) {
  416. return $this->error('', $e->getMessage() . '-' . $e->getFile() . '-' . $e->getLine());
  417. }
  418. }
  419. /**************************************************************插件安装结束*********************************************************/
  420. /**************************************************************插件卸载开始*********************************************************/
  421. public function uninstall($addon_name)
  422. {
  423. Db::startTrans();
  424. try {
  425. $addon_info = model("addon")->getInfo([ [ 'name', '=', $addon_name ] ], '*');
  426. // 插件预卸载
  427. $res1 = $this->preUninstall($addon_name);
  428. if ($res1[ 'code' ] != 0) {
  429. Db::rollback();
  430. return $res1;
  431. }
  432. // 卸载菜单
  433. $res2 = $this->uninstallMenu($addon_name);
  434. if ($res2[ 'code' ] != 0) {
  435. Db::rollback();
  436. return $res2;
  437. }
  438. $res3 = $this->uninstallDiyView($addon_name);
  439. if ($res3[ 'code' ] != 0) {
  440. Db::rollback();
  441. return $res3;
  442. }
  443. $delete_res = model('addon')->delete([
  444. [ 'name', '=', $addon_name ]
  445. ]);
  446. if ($delete_res === false) {
  447. Db::rollback();
  448. return $this->error();
  449. }
  450. //清理缓存
  451. Cache::clear();
  452. Db::commit();
  453. return $this->success();
  454. } catch (\Exception $e) {
  455. //清理缓存
  456. Cache::clear();
  457. Db::rollback();
  458. return $this->error('', $e->getMessage());
  459. }
  460. }
  461. /**
  462. * 插件预卸载
  463. */
  464. private function preUninstall($addon_name)
  465. {
  466. $class_name = "addon\\" . $addon_name . "\\event\\UnInstall";
  467. $install = new $class_name;
  468. $res = $install->handle($addon_name);
  469. return $res;
  470. }
  471. /**
  472. * 卸载插件菜单
  473. */
  474. private function uninstallMenu($addon_name)
  475. {
  476. $res = model('menu')->delete([
  477. [ 'addon', '=', $addon_name ]
  478. ]);
  479. return $this->success($res);
  480. }
  481. /**
  482. * 卸载自定义数据(清除:自定义链接、组件、主题风格、模板页面类型、模板组、模板组页面、店铺拥有的模板组、店铺自定义模板)
  483. * @param $addon_name
  484. * @return array
  485. */
  486. private function uninstallDiyView($addon_name)
  487. {
  488. model('link')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 自定义链接
  489. model('diy_view_util')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 自定义组件
  490. model('diy_theme')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 主题风格
  491. model('diy_template')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 模板页面类型
  492. model('diy_template_goods')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 模板组
  493. model('diy_template_goods_item')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 模板组页面
  494. model('site_diy_template')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 店铺拥有的模板组
  495. // model('site_diy_view')->delete([ [ 'addon_name', '=', $addon_name ] ]); // 店铺自定义模板
  496. return $this->success();
  497. }
  498. /***************************************************************插件卸载结束********************************************************/
  499. /************************************************************* 安装全部插件 start *************************************************************/
  500. /**
  501. * 安装全部插件
  502. */
  503. public function installAllAddon()
  504. {
  505. $addon_list_result = $this->getUninstallAddonList();
  506. $addon_list = $addon_list_result[ "data" ];
  507. foreach ($addon_list as $k => $v) {
  508. $item_result = $this->install($v[ "name" ]);
  509. if ($item_result[ "code" ] < 0)
  510. return $item_result;
  511. }
  512. return $this->success();
  513. }
  514. /************************************************************* 安装全部插件 end *************************************************************/
  515. /**
  516. * 刷新应用插件
  517. * @return array
  518. */
  519. public function cacheAddon()
  520. {
  521. //刷新插件信息
  522. $addon_list = model('addon')->getList();
  523. try {
  524. foreach ($addon_list as $k => $v) {
  525. $data = require 'addon/' . $v[ 'name' ] . '/config/info.php';
  526. if (empty($data)) {
  527. $data = [];
  528. }
  529. $data[ 'create_time' ] = time();
  530. $data[ 'icon' ] = 'addon/' . $v[ 'name' ] . '/icon.png';
  531. model('addon')->update($data, [ 'name' => $v[ 'name' ] ]);
  532. }
  533. return $this->success();
  534. } catch (\Exception $e) {
  535. return $this->error('', $e->getMessage() . '-' . $e->getFile() . '-' . $e->getLine());
  536. }
  537. }
  538. /**
  539. * 刷新所有插件菜单
  540. * @return array
  541. */
  542. public function cacheAddonMenu()
  543. {
  544. $addon_list = model('addon')->getList([], 'name');
  545. $menu_model = new Menu();
  546. foreach ($addon_list as $k => $v) {
  547. $addon_menu_res = $menu_model->refreshMenu('shop', $v[ 'name' ]);
  548. // 刷新收银端权限
  549. $menu_model->refreshCashierAuth($v[ 'name' ]);
  550. }
  551. return $this->success($addon_menu_res);
  552. }
  553. /**
  554. * 刷新插件收银台权限
  555. * @return array
  556. */
  557. public function refreshAddonCashierAuth()
  558. {
  559. $addon_list = model('addon')->getList([], 'name');
  560. $menu_model = new Menu();
  561. foreach ($addon_list as $k => $v) {
  562. $addon_menu_res = $menu_model->refreshCashierAuth($v[ 'name' ]);
  563. }
  564. return $this->success();
  565. }
  566. /**
  567. * 获取插件快捷菜单配置
  568. * @param $site_id
  569. * @param string $app_module
  570. * @return array
  571. */
  572. public function getAddonQuickMenuConfig($site_id, $app_module = 'shop')
  573. {
  574. $config = new ConfigModel();
  575. $res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', $app_module ], [ 'config_key', '=', 'COMMON_ADDON' ] ]);
  576. if (!empty($res[ 'data' ][ 'value' ])) {
  577. if (!empty($res[ 'data' ][ 'value' ][ 'promotion' ])) {
  578. $res[ 'data' ][ 'value' ][ 'promotion' ] = explode(',', $res[ 'data' ][ 'value' ][ 'promotion' ]);
  579. foreach ($res[ 'data' ][ 'value' ][ 'promotion' ] as $k => $v) {
  580. if (empty($v)) {
  581. unset($res[ 'data' ][ 'value' ][ 'promotion' ][ $k ]);
  582. } elseif (!empty($v) && addon_is_exit($v) == 0) {
  583. unset($res[ 'data' ][ 'value' ][ 'promotion' ][ $k ]);
  584. }
  585. }
  586. $res[ 'data' ][ 'value' ][ 'promotion' ] = array_values($res[ 'data' ][ 'value' ][ 'promotion' ]);
  587. } else {
  588. $res[ 'data' ][ 'value' ][ 'promotion' ] = [];
  589. }
  590. if (!empty($res[ 'data' ][ 'value' ][ 'tool' ])) {
  591. $res[ 'data' ][ 'value' ][ 'tool' ] = explode(',', $res[ 'data' ][ 'value' ][ 'tool' ]);
  592. foreach ($res[ 'data' ][ 'value' ][ 'tool' ] as $k => $v) {
  593. if (empty($v)) {
  594. unset($res[ 'data' ][ 'value' ][ 'tool' ][ $k ]);
  595. } elseif (!empty($v) && addon_is_exit($v) == 0) {
  596. unset($res[ 'data' ][ 'value' ][ 'tool' ][ $k ]);
  597. }
  598. }
  599. $res[ 'data' ][ 'value' ][ 'tool' ] = array_values($res[ 'data' ][ 'value' ][ 'tool' ]);
  600. } else {
  601. $res[ 'data' ][ 'value' ][ 'tool' ] = [];
  602. }
  603. } else {
  604. $res[ 'data' ][ 'value' ] = [
  605. 'promotion' => [],
  606. 'tool' => []
  607. ];
  608. }
  609. return $res;
  610. }
  611. /**
  612. * 设置插件快捷菜单配置
  613. * @param $data
  614. * @return array
  615. */
  616. public function setAddonQuickMenuConfig($data)
  617. {
  618. $condition = [
  619. [ 'site_id', '=', $data[ 'site_id' ] ],
  620. [ 'app_module', '=', $data[ 'app_module' ] ],
  621. [ 'config_key', '=', 'COMMON_ADDON' ]
  622. ];
  623. $config = new ConfigModel();
  624. $value = $config->getConfig($condition)[ 'data' ][ 'value' ];
  625. $addon_array = empty($value) ? [] : explode(',', $value[ $data[ 'type' ] ] ?? '');
  626. if (in_array($data[ 'addon' ], $addon_array)) {
  627. $addon_array = array_diff($addon_array, [ $data[ 'addon' ] ]);
  628. } else {
  629. array_push($addon_array, $data[ 'addon' ]);
  630. }
  631. $value[ $data[ 'type' ] ] = implode(',', $addon_array);
  632. return $config->setConfig($value, '常用功能设置', 1, $condition);
  633. }
  634. }