AddonsController.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. <?php
  2. namespace backend\modules\admin\controllers;
  3. use backend\controllers\AdminController;
  4. use common\enums\StatusEnum;
  5. use common\models\addons\AddonsCombo;
  6. use common\models\common\Addons;
  7. use Yii;
  8. use yii\helpers\Json;
  9. /**
  10. *
  11. * 插件管理
  12. * @Author bing
  13. * @DateTime 2021-08-11 17:22:39
  14. * @copyright: Copyright (c) 2020 广东七件事集团
  15. */
  16. class AddonsController extends AdminController
  17. {
  18. /**
  19. * 应用列表
  20. * @Author bing
  21. * @DateTime 2021-08-16 13:21:03
  22. * @copyright: Copyright (c) 2020 广东七件事集团
  23. * @return void
  24. */
  25. public function actionIndex()
  26. {
  27. $request = Yii::$app->request;
  28. if($request->isAjax){
  29. if($request->isGet){
  30. // 查询参数
  31. $title = $request->get('title','');
  32. $name = $request->get('name','');
  33. $where[] = ['status'=>[0,1]];
  34. (!empty(trim($title))) && $where[] = ['LIKE', 'title', $title];
  35. (!empty(trim($title))) && $where[] = ['LIKE', 'name', $title];
  36. $keyword = $request->get('keyword','');
  37. $addons_group_name = $request->get('addons_group_name','');
  38. (!empty(trim($keyword))) && $where[] = ['or',['LIKE', 'title', $keyword],['LIKE', 'name', $keyword]];
  39. (!empty($addons_group_name)) && $where[] = ['group'=>trim($addons_group_name)];
  40. $limit = $request->get('limit')??$this->pageSize;
  41. $select = 'title,name,author,cover,group,status,is_online,version,brief_introduction';
  42. $params = array('select' => $select,'where' => $where, 'order'=>'id desc','limit' => $limit);
  43. $page_data = Addons::listPage($params,false);
  44. if($page_data === false) return $this->error(Addons::getStaticError());
  45. // 检查插件是否有需要额外设置
  46. foreach ($page_data['list'] as &$item) {
  47. $item['is_extra_setting'] = (file_exists(Yii::getAlias('@addons')."/{$item['name']}/backend/views/extra-setting/index.php")) ? 1 : 0;
  48. }
  49. $page_data['addons_group'] = Yii::$app->params['addonsGroup'];
  50. $addons_group_arr = Yii::$app->params['addonsGroup'];
  51. sort($addons_group_arr);
  52. $page_data['addons_group_arr'] =$addons_group_arr;
  53. return $this->success('ok',$page_data);
  54. }else{
  55. // 操作插件
  56. $post = $request->post();
  57. $res = self::checkRequireParam($post, ['name', 'type']);
  58. if ($res === false) return $this->error(self::getStaticError());
  59. switch($post['type']){
  60. case 'uninstall':
  61. $res = Addons::uninstall($post['name']);
  62. break;
  63. case 'disable':
  64. $res = Addons::disable($post['name']);
  65. break;
  66. case 'reload':
  67. $res = Addons::install($post['name']);
  68. break;
  69. case 'upgrade':
  70. $res = Addons::upgrade($post['name']);
  71. break;
  72. case 'online':
  73. case 'offline':
  74. $res = Addons::online($post['name']);
  75. break;
  76. default :
  77. return $this->error('不支持的操作类型');
  78. }
  79. if($res === false) return $this->error(Addons::getStaticError());
  80. return $this->success('操作成功');
  81. }
  82. }else{
  83. return $this->render($this->action->id);
  84. }
  85. }
  86. /**
  87. * 应用设计
  88. * @Author bing
  89. * @DateTime 2021-08-16 13:21:03
  90. * @copyright: Copyright (c) 2020 广东七件事集团
  91. * @return void
  92. */
  93. public function actionCreate()
  94. {
  95. $request = Yii::$app->request;
  96. if (\Yii::$app->request->isAjax) {
  97. if ($request->isPost) {
  98. $post = $request->post();
  99. $res = self::checkRequireParam($post, ['title', 'name', 'group', 'author', 'version', 'install', 'uninstall', 'upgrade']);
  100. if ($res === false) return $this->error(self::getStaticError());
  101. $res = Addons::createAddons($post);
  102. if ($res === false) return $this->error(Addons::getStaticError());
  103. return $this->success();
  104. } else {
  105. $data['addons_group'] = Yii::$app->params['addonsGroup'];
  106. return $this->success('ok',$data);
  107. }
  108. }
  109. return $this->render($this->action->id);
  110. }
  111. public function actionEdit()
  112. {
  113. if (\Yii::$app->request->isAjax) {
  114. if (\Yii::$app->request->isGet) {
  115. $get = \Yii::$app->request->get();
  116. $res = Yii::$app->services->validate->validate($get, [[['name'], 'string']]);
  117. if ($res === false) {
  118. return $this->error(self::getStaticError());
  119. }
  120. $addons_info = Addons::findOne(['name' => $get['name']])->toArray();
  121. $addons_info['addons_group'] = Yii::$app->params['addonsGroup'];
  122. return $this->success('操作成功', $addons_info);
  123. } elseif (\Yii::$app->request->isPost) {
  124. $post = \Yii::$app->request->post();
  125. // dd($post);
  126. $rules = [
  127. [['name', 'title', 'cover', 'group', 'brief_introduction','course_url', 'description'], 'string'],
  128. [['cover'], 'url']
  129. ];
  130. $res = Yii::$app->services->validate->validate($post, $rules);
  131. if ($res === false) {
  132. return $this->error(self::getStaticError());
  133. }
  134. $model = Addons::findOne(['name' => $post['name']]);
  135. $model->title = $post['title'];
  136. $model->cover = $post['cover'];
  137. $model->group = $post['group'];
  138. $model->course_url = $post['course_url'];
  139. $model->brief_introduction = $post['brief_introduction'];
  140. $model->description = $post['description'];
  141. if ($model->save()) {
  142. return $this->success('修改成功');
  143. } else {
  144. return $this->error('修改失败');
  145. }
  146. } else {
  147. return $this->error('请求方式错误');
  148. }
  149. } else {
  150. return $this->render($this->action->id);
  151. }
  152. }
  153. /**
  154. * 本地插件
  155. * @Author bing
  156. * @DateTime 2021-08-17 11:18:04
  157. * @copyright: Copyright (c) 2020 广东七件事集团
  158. * @return void
  159. */
  160. public function actionLocal()
  161. {
  162. $request = Yii::$app->request;
  163. if($request->isAjax){
  164. if($request->isGet){
  165. // 未安装插件列表
  166. $addons_group = Yii::$app->params['addonsGroup'];
  167. $list = Yii::$app->services->addons->getLocalList();
  168. $list = array_values($list);
  169. $this->success('ok',compact('list','addons_group'));
  170. }else{
  171. // 安装插件
  172. $post = $request->post();
  173. $res = self::checkRequireParam($post, ['name']);
  174. if ($res === false) return $this->error(self::getStaticError());
  175. $res = Addons::install($post['name'],true);
  176. if ($res === false) return $this->error(Addons::getStaticError());
  177. $this->success('安装成功');
  178. }
  179. }else{
  180. return $this->render($this->action->id);
  181. }
  182. }
  183. /**
  184. * @Author: ltm 应用付费列表
  185. * @DateTime: 2022/2/26 0026 11:02
  186. * @Copyright: copyright (c) 2021 广东七件事集团
  187. * @param $data
  188. * @return string
  189. */
  190. public function actionPaySetting()
  191. {
  192. $request = Yii::$app->request;
  193. if($request->isAjax){
  194. if($request->isGet){
  195. // 查询参数
  196. $where[] = ['status'=>[0,1]];
  197. $limit = $request->get('limit')??$this->pageSize;
  198. $select = 'title,name,author,cover,group,status,is_online,version,brief_introduction,id,price_setting';
  199. $keyword = $request->get('keyword','');
  200. (!empty(trim($keyword))) && $where[] = ['or',['LIKE', 'title', $keyword],['LIKE', 'name', $keyword]];
  201. $params = array('select' => $select,'where' => $where, 'order'=>'id desc','limit' => $limit);
  202. $page_data = Addons::listPage($params,false);
  203. if($page_data['list']){
  204. foreach ($page_data['list'] as $k => $v){
  205. $page_data['list'][$k]['setting'] = !empty($v['price_setting']) ? json_decode($v['price_setting']) : '';
  206. }
  207. }
  208. if($page_data === false) return $this->error(Addons::getStaticError());
  209. return $this->success('ok',$page_data);
  210. }
  211. }else{
  212. return $this->render($this->action->id);
  213. }
  214. }
  215. /**
  216. * @Author: ltm 应用付费
  217. * @DateTime: 2022/2/26 0026 10:58
  218. * @Copyright: copyright (c) 2021 广东七件事集团
  219. * @param $data
  220. * @return string
  221. */
  222. public function actionPaySettingEdit()
  223. {
  224. if (\Yii::$app->request->isAjax) {
  225. if (\Yii::$app->request->isGet) {
  226. $get = \Yii::$app->request->get();
  227. $addons_info = Addons::findOne(['name' => $get['name']])->toArray();
  228. $addons_info['setting'] = !empty($addons_info['price_setting']) ? json_encode($addons_info['price_setting']) : '';
  229. $addons_info['payment_type'] = json_decode($addons_info['payment_type']);
  230. return $this->success('操作成功', $addons_info);
  231. } elseif (\Yii::$app->request->isPost) {
  232. $post = \Yii::$app->request->post();
  233. $rules = [
  234. [['price_setting', 'name', 'payment_type'], 'safe'],
  235. ];
  236. $res = Yii::$app->services->validate->validate($post, $rules);
  237. if ($res === false) {
  238. return $this->error(self::getStaticError());
  239. }
  240. $model = Addons::findOne(['name' => $post['name']]);
  241. $model->price_setting = $post['price_setting'];
  242. $model->payment_type = json_encode($post['payment_type'],true);
  243. if ($model->save()) {
  244. return $this->success('修改成功');
  245. } else {
  246. return $this->error('修改失败');
  247. }
  248. } else {
  249. return $this->error('请求方式错误');
  250. }
  251. } else {
  252. return $this->render($this->action->id);
  253. }
  254. }
  255. /**
  256. * 应用付费套餐
  257. * @Author: lun
  258. * @DateTime: 2022/3/29 0029 10:34
  259. * @Copyright: copyright (c) 2021 广东七件事集团
  260. * @return mixed|string|void
  261. */
  262. public function actionCombo()
  263. {
  264. $request = Yii::$app->request;
  265. if($request->isAjax){
  266. if($request->isPost){
  267. $params = Yii::$app->request->post();
  268. // 检查提交的参数
  269. $res = Yii::$app->services->validate->validate($params,[
  270. [['page', 'limit'], 'safe'],
  271. [['title'], 'string'],
  272. [['datetime'], 'safe'],
  273. ]);
  274. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  275. $params = AddonsCombo::exceptNullVal($params);
  276. $where = [];
  277. isset($params['title']) && $where[] = ['like', 'title', $params['title']];
  278. if (isset($params['datetime'])) {
  279. $start_time = strtotime($params['datetime'][0]);
  280. $end_time = strtotime($params['datetime'][1]);
  281. $where[] = ['between','created_at',$start_time,$end_time];
  282. }
  283. $where[] = ['=', 'status', StatusEnum::ENABLED];
  284. $order = 'id desc,created_at desc';
  285. $params = array('where' => $where, 'order'=>$order, 'limit' => $params['limit']);
  286. $list = AddonsCombo::listPage($params, false, true);
  287. $this->success('获取成功', $list);
  288. }
  289. }else{
  290. return $this->render($this->action->id);
  291. }
  292. }
  293. /**
  294. * 付费套餐编辑
  295. * @Author: lun
  296. * @DateTime: 2022/3/29 0029 14:40
  297. * @Copyright: copyright (c) 2021 广东七件事集团
  298. * @return mixed|string|void
  299. */
  300. public function actionComboEdit()
  301. {
  302. $request = Yii::$app->request;
  303. if($request->isAjax){
  304. if($request->isPost){
  305. $params = Yii::$app->request->post('detail');
  306. // 检查提交的参数
  307. $res = Yii::$app->services->validate->validate($params,[
  308. [['id'], 'integer'],
  309. [['title','description','addons','expire'], 'string'],
  310. ]);
  311. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  312. $params = AddonsCombo::exceptNullVal($params);
  313. $res = AddonsCombo::setData($params);
  314. if ($res == false) return $this->error("保存失败:" . AddonsCombo::getStaticError());
  315. $this->success('保存成功');
  316. } else {
  317. $params = Yii::$app->request->get();
  318. // 检查提交的参数
  319. $res = Yii::$app->services->validate->validate($params,[
  320. [['id'], 'integer'],
  321. ]);
  322. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  323. $params = AddonsCombo::exceptNullVal($params);
  324. $data = [];
  325. if (!empty($params['id'])) {
  326. $detail = AddonsCombo::find()->where(['id' => $params['id'], 'status' => StatusEnum::ENABLED])->asArray()->one();
  327. if (empty($detail)) return $this->error("获取失败:" . AddonsCombo::getStaticError());
  328. $data['detail'] = $detail;
  329. }
  330. $cate = Yii::$app->params['addonsGroup'];// 获取应用分类
  331. $field = 'title,name,group';
  332. $list = Addons::getAddons([['is_online' => 1]], [], true, $field);// 获取已上架的应用列表
  333. $addons_list = [];
  334. foreach ($list as $value) {
  335. $k = $value['group'];
  336. $addons_list[$k]['title'] = $cate[$k]['title'];
  337. $addons_list[$k]['list'][] = [
  338. 'title' => $value['title'],
  339. 'name' => $value['name'],
  340. ];
  341. }
  342. $data['addons_list'] = $addons_list;
  343. $this->success('获取成功', $data);
  344. }
  345. }else{
  346. return $this->render($this->action->id);
  347. }
  348. }
  349. /**
  350. * 套餐操作
  351. * @Author: lun
  352. * @DateTime: 2022/3/29 0029 14:28
  353. * @Copyright: copyright (c) 2021 广东七件事集团
  354. * @return mixed|void
  355. */
  356. public function actionHandleCombo()
  357. {
  358. $request = Yii::$app->request;
  359. if($request->isAjax && $request->isPost){
  360. $params = Yii::$app->request->post();
  361. // 检查提交的参数
  362. $res = Yii::$app->services->validate->validate($params,[
  363. [['id','status'], 'integer'],
  364. ]);
  365. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  366. $params = AddonsCombo::exceptNullVal($params);
  367. $res = AddonsCombo::setData($params);
  368. if ($res == false) return $this->error("操作失败:" . AddonsCombo::getStaticError());
  369. $this->success('操作成功');
  370. }
  371. }
  372. /**
  373. * 本地应用批量安装
  374. * @Author: lun
  375. * @DateTime: 2023/1/10 0010 14:30
  376. * @Copyright: copyright (c) 2021 广东七件事集团
  377. * @return mixed|void
  378. */
  379. public function actionBatchLocalInstall()
  380. {
  381. $request = Yii::$app->request;
  382. if($request->isAjax && $request->isPost){
  383. $params = Yii::$app->request->post();
  384. // 检查提交的参数
  385. $res = Yii::$app->services->validate->validate($params,[
  386. [['addons_names'], 'required'],
  387. [['is_online', 'is_set_price'], 'integer'],
  388. [['addons_names', 'payment_type', 'price_setting'], 'safe'],
  389. ]);
  390. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  391. if (empty($params['addons_names'])) return $this->error('安装的应用不能为空');
  392. // 批量安装
  393. foreach ($params['addons_names'] as $addons_name) {
  394. $res = Addons::install($addons_name,true);
  395. if ($res === false) return $this->error($addons_name.'安装失败:'.Addons::getStaticError());
  396. $res = Addons::install($addons_name);
  397. if ($res === false) return $this->error($addons_name.'配置更新失败:'.Addons::getStaticError());
  398. }
  399. // 更改上架状态、价格设置
  400. Addons::installAfterUpdate($params);
  401. $this->success('操作成功');
  402. }
  403. }
  404. /**
  405. * 获取应用
  406. * @Author: lun
  407. * @DateTime: 2023/2/1 0001 11:53
  408. * @Copyright: copyright (c) 2021 广东七件事集团
  409. * @return mixed|void
  410. */
  411. public function actionGetMallAddons()
  412. {
  413. $request = Yii::$app->request;
  414. if($request->isAjax && $request->isGet){
  415. $params = Yii::$app->request->get();
  416. // 检查提交的参数
  417. $res = Yii::$app->services->validate->validate($params,[
  418. [['mall_id'], 'required'],
  419. [['mall_id'], 'integer'],
  420. ]);
  421. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  422. $data = AddonsCombo::getNoInstallAddons($params['mall_id'], Yii::$app->params['addonsGroup']);
  423. $this->success('获取成功', $data);
  424. }
  425. }
  426. /**
  427. * 插件额外设置
  428. * @Author: lun
  429. * @DateTime: 2023/3/23 0023 11:19
  430. * @Copyright: copyright (c) 2021 广东七件事集团
  431. * @return mixed|string|void
  432. */
  433. public function actionExtraSetting()
  434. {
  435. $retuest = Yii::$app->request;
  436. $get = Yii::$app->request->get();
  437. if ($retuest->isAjax) {
  438. if (empty($get['addons'])) return $this->error('请求地址请带上应用标识');
  439. $group = 'addonsSetting' . $get['addons'];// 命名格式:addonsSetting . 插件标识
  440. if ($retuest->isPost) {
  441. $params = Yii::$app->request->post();
  442. if (isset($params['_csrf'])) unset($params['_csrf']);
  443. // 保存配置
  444. $config = Yii::$app->services->setting->platform->set([$group => $params]);
  445. $this->success('保存成功', $config);
  446. } else {
  447. // 获取配置
  448. $config = Yii::$app->services->setting->platform->get($group);
  449. $this->success('获取成功', $config);
  450. }
  451. }
  452. return $this->render("@addons/{$get['addons']}/backend/views/extra-setting/index.php");
  453. }
  454. }