MenuService.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace services\common;
  3. use Yii;
  4. use yii\helpers\Json;
  5. use yii\db\ActiveQuery;
  6. use common\enums\StatusEnum;
  7. use common\enums\AddonTypeEnum;
  8. use common\enums\WhetherEnum;
  9. use common\models\common\Menu;
  10. use common\models\common\MenuCate;
  11. use common\components\Service;
  12. use common\helpers\Auth;
  13. use common\helpers\ArrayHelper;
  14. use common\helpers\StringHelper;
  15. /**
  16. * Class MenuService
  17. * @package services\common
  18. * @author jianyan74 <751393839@qq.com>
  19. */
  20. class MenuService extends Service
  21. {
  22. /**
  23. * @param string $addon_name 插件名称
  24. */
  25. public function delByAddonName($addon_name)
  26. {
  27. Menu::deleteAll(['addon_name' => $addon_name]);
  28. }
  29. /**
  30. * @param MenuCate $cate
  31. */
  32. public function delByCate(MenuCate $cate)
  33. {
  34. Menu::deleteAll(['app_id' => $cate->app_id, 'addon_name' => $cate->addon_name]);
  35. }
  36. /**
  37. * 更新状态
  38. *
  39. * @param $addon_name
  40. * @return void
  41. */
  42. public function updateStatusByAddonName($addon_name, $status)
  43. {
  44. Menu::updateAll(['status' => $status], ['addon_name' => $addon_name, 'is_addon' => StatusEnum::ENABLED]);
  45. }
  46. /**
  47. * @param array $menus
  48. * @param MenuCate $cate
  49. * @param int $pid
  50. * @param int $level
  51. * @param Menu $parent
  52. */
  53. public function createByAddon(array $menus, MenuCate $cate, $pid = 0, $level = 1, $parent = '')
  54. {
  55. // 重组数组
  56. $menus = ArrayHelper::regroupMapToArr($menus);
  57. foreach ($menus as $menu) {
  58. $model = new Menu();
  59. $model->attributes = $menu;
  60. // 增加父级
  61. !empty($parent) && $model->setParent($parent);
  62. if ($model->params) {
  63. $params = [];
  64. foreach ($model->params as $key => $value) {
  65. $params[] = [
  66. 'key' => $key,
  67. 'value' => $value,
  68. ];
  69. }
  70. $model->params = $params;
  71. }
  72. $model->name = '';
  73. $model->url = '/' . StringHelper::toUnderScore($cate->addon_name) . '/'. $menu['name'];
  74. $model->pid = $pid;
  75. $model->level = $level;
  76. $model->cate_id = $cate->id;
  77. $model->app_id = $cate->app_id;
  78. $model->addon_name = $cate->addon_name;
  79. $model->addon_location = $cate->addon_location;
  80. $model->is_addon = $cate->is_addon;
  81. if (!$model->save()) {
  82. $this->error($model);
  83. }
  84. if (isset($menu['child']) && !empty($menu['child'])) {
  85. $this->createByAddon($menu['child'], $cate, $model->id, $model->level + 1, $model);
  86. }
  87. }
  88. }
  89. /**
  90. * @param $app_id
  91. * @return array|\yii\db\ActiveRecord[]
  92. */
  93. public function findAllByAuth($app_id)
  94. {
  95. $models = $this->findAll($app_id);
  96. $addons = Yii::$app->services->addons->findBrief();
  97. $addonCateId = Yii::$app->services->menuCate->findAddon($app_id);
  98. $addonMenus = [];
  99. $addons = ArrayHelper::arrayKey($addons, 'name');
  100. $addonGroup = Yii::$app->params['addonsGroup'];
  101. foreach ($models as $key => &$model) {
  102. // 验证开发模式
  103. if (isset($model['pattern'])) {
  104. !is_array($model['pattern']) && $model['pattern'] = Json::decode($model['pattern']);
  105. if (!empty($model['pattern']) && !in_array(Yii::$app->params['devPattern'], $model['pattern'])) {
  106. unset($models[$key]);
  107. continue;
  108. }
  109. }
  110. if (Auth::verify($model['url']) === false) {
  111. unset($models[$key]);
  112. continue;
  113. }
  114. if (!empty($model['url'])) {
  115. $params = Json::decode($model['params']);
  116. (empty($params) || !is_array($params)) && $params = [];
  117. $model['fullUrl'][] = $model['url'];
  118. foreach ($params as $param) {
  119. if (!empty($param['key'])) {
  120. $model['fullUrl'][$param['key']] = $param['value'];
  121. }
  122. }
  123. } else {
  124. $model['fullUrl'] = '#';
  125. }
  126. // 如果是插件且位置在应用中心
  127. if (
  128. $model['is_addon'] == WhetherEnum::ENABLED &&
  129. $model['addon_location'] == AddonTypeEnum::ADDONS &&
  130. !isset($addonMenus[$model['addon_name']])
  131. ) {
  132. $model['pid'] = $addons[$model['addon_name']]['group'];
  133. $model['title'] = $addons[$model['addon_name']]['title'];;
  134. $model['cate_id'] = $addonCateId;
  135. $addonMenus[$model['addon_name']] = $model;
  136. unset($models[$key]);
  137. }
  138. }
  139. ////////////////////////////// 插件组别 ////////////////////////////////////
  140. // 重组类型
  141. $addonGroupKey = array_column($addonMenus, 'pid');
  142. foreach ($addonGroup as $key => &$item) {
  143. $item['id'] = $key;
  144. $item['pid'] = 0;
  145. $item['cate_id'] = $addonCateId;
  146. $item['fullUrl'] = '#';
  147. if (!in_array($key, $addonGroupKey)) {
  148. unset($addonGroup[$key]);
  149. }
  150. }
  151. $models = ArrayHelper::merge($models, $addonMenus);
  152. return ArrayHelper::merge($models, $addonGroup);
  153. }
  154. /**
  155. * 获取下拉
  156. *
  157. * @param MenuCate $menuCate
  158. * @param string $id
  159. * @return array
  160. */
  161. public function getDropDown($menuCate, $app_id, $id = '')
  162. {
  163. $list = Menu::find()
  164. ->where(['>=', 'status', StatusEnum::DISABLED])
  165. ->andWhere(['app_id' => $app_id])
  166. ->andWhere(['is_addon' => $menuCate->is_addon])
  167. ->andFilterWhere(['addon_name' => $menuCate->addon_name])
  168. ->andFilterWhere(['<>', 'id', $id])
  169. ->select(['id', 'title', 'pid', 'level'])
  170. ->orderBy('cate_id asc, sort asc')
  171. ->asArray()
  172. ->all();
  173. $models = ArrayHelper::itemsMerge($list);
  174. $data = ArrayHelper::map(ArrayHelper::itemsMergeDropDown($models), 'id', 'title');
  175. return ArrayHelper::merge([0 => '顶级菜单'], $data);
  176. }
  177. /**
  178. * @param $app_id
  179. * @param string $addon_name
  180. * @return array|\yii\db\ActiveRecord[]
  181. */
  182. public function findAll($app_id, $addon_name = '')
  183. {
  184. $data = Menu::find()->where(['status' => StatusEnum::ENABLED]);
  185. // 关闭开发模式
  186. if (empty(Yii::$app->services->config->backendConfig('sys_dev'))) {
  187. $data = $data->andWhere(['dev' => StatusEnum::DISABLED]);
  188. }
  189. $models = $data
  190. ->andWhere(['app_id' => $app_id])
  191. ->andFilterWhere(['addon_name' => $addon_name])
  192. ->with(['cate' => function (ActiveQuery $query) use ($app_id) {
  193. return $query->andWhere(['app_id' => $app_id]);
  194. }])
  195. ->orderBy('sort asc, id asc')
  196. ->asArray()
  197. ->all();
  198. return $models;
  199. }
  200. }
粤ICP备19079148号