Menu.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  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 think\facade\Cache;
  12. use app\model\BaseModel;
  13. /**
  14. * 菜单表
  15. * @author Administrator
  16. *
  17. */
  18. class Menu extends BaseModel
  19. {
  20. public $list = [];
  21. /***************************************** 系统菜单开始*****************************************************************************/
  22. /**
  23. * 获取菜单列表
  24. * @param array $condition
  25. * @param string $field
  26. * @param string $order
  27. * @param string $limit
  28. */
  29. public function getMenuList($condition = [], $field = 'id, app_module, title, name, parent, level, url, is_show, sort, is_icon, picture, picture_select, is_control', $order = '', $limit = null)
  30. {
  31. $data = json_encode([ $condition, $field, $order, $limit ]);
  32. $cache = Cache::get("getMenuList_" . $data);
  33. if (!empty($cache)) {
  34. return $this->success($cache);
  35. }
  36. $list = model('menu')->getList($condition, $field, $order, '', '', '', $limit);
  37. Cache::tag("menu")->set("getMenuList_" . $data, $list);
  38. return $this->success($list);
  39. }
  40. /**
  41. * 获取菜单数量
  42. * @param $condition
  43. * @return array
  44. */
  45. public function getMenuCount($condition)
  46. {
  47. $count = model('menu')->getCount($condition);
  48. return $this->success($count);
  49. }
  50. /**
  51. * 获取菜单树
  52. * @param number $level 层级 0不限层级
  53. */
  54. public function menuTree($level = 0, $menu_type = 1)
  55. {
  56. $condition = [];
  57. if ($level > 0) {
  58. $condition = [
  59. [ 'level', 'elt', $level ]
  60. ];
  61. }
  62. $list = $this->getMenuList($condition, 'id, app_module, title, name, parent, level, url, is_show, sort, is_icon, picture, picture_select, is_control', 'sort asc');
  63. $tree = list_to_tree($list[ 'data' ], 'menu_id', 'parent', 'child_list');
  64. return $this->success($tree);
  65. }
  66. /**
  67. * 通过主键获取菜单信息
  68. * @param unknown $menu_id
  69. * @return multitype:string mixed
  70. */
  71. public function getMenuInfo($condition, $field = 'id, app_module, name, title, parent, level, url, is_show, sort, `desc`, picture, is_icon, picture_select, is_control, addon')
  72. {
  73. $data = json_encode([ $condition, $field ]);
  74. $cache = Cache::get("getMenuInfo_" . $data);
  75. if (!empty($cache)) {
  76. return $this->success($cache);
  77. }
  78. $menu_info = model('menu')->getInfo($condition, $field);
  79. Cache::tag("menu")->set("getMenuInfo_" . $data, $menu_info);
  80. return $this->success($menu_info);
  81. }
  82. /**
  83. * 通过url和端口查询对应菜单信息
  84. * @param unknown $url
  85. * @param unknown $app_module
  86. * @param $addon 插件名称
  87. */
  88. public function getMenuInfoByUrl($url, $app_module, $addon = '')
  89. {
  90. $cache = Cache::get("getMenuInfoByUrl_" . $url . "_" . $app_module . '_' . $addon);
  91. if (!empty($cache)) {
  92. return $this->success($cache);
  93. }
  94. $info = model('menu')->getFirstData([ [ 'url', "=", $url ], [ 'app_module', "=", $app_module ] ], 'id, app_module, name, title, parent, level, url, is_show, sort, `desc`, picture, is_icon, picture_select, is_control, addon', 'level desc');
  95. if (empty($info)) {
  96. return $this->error();
  97. }
  98. Cache::tag("menu")->set("getMenuInfoByUrl_" . $url . "_" . $app_module . '_' . $addon, $info);
  99. return $this->success($info);
  100. }
  101. /**
  102. * 刷新菜单
  103. * @param $app_module
  104. * @param $addon
  105. * @return array
  106. */
  107. public function refreshMenu($app_module, $addon)
  108. {
  109. try {
  110. if (empty($addon)) {
  111. $tree_name = 'config/menu_' . $app_module . '.php';
  112. } else {
  113. $tree_name = 'addon/' . $addon . '/config/menu_' . $app_module . '.php';
  114. }
  115. model('menu')->delete([ [ 'app_module', "=", $app_module ], [ 'addon', "=", $addon ] ]);
  116. $tree = require $tree_name;
  117. $list = $this->getAddonMenuList($tree, $app_module, $addon);
  118. if (!empty($list)) {
  119. $res = model('menu')->addList($list);
  120. return $this->success($res);
  121. } else {
  122. return $this->success();
  123. }
  124. } catch (\Exception $e) {
  125. return $this->error('', $e->getMessage() . '-' . $e->getFile() . '-' . $e->getLine());
  126. // halt($list);
  127. }
  128. }
  129. /**
  130. * 刷新收银端权限
  131. * @param $addon
  132. * @return array
  133. */
  134. public function refreshCashierAuth($addon)
  135. {
  136. $tree_name = 'addon/' . $addon . '/config/cashier_auth.php';
  137. if (!file_exists($tree_name)) return $this->error();
  138. $tree = require $tree_name;
  139. if (!$tree) return $this->error();
  140. model('cashier_auth')->delete([ [ 'addon', '=', $addon ] ]);
  141. $list = [];
  142. $this->getCashierAuthList($tree, $addon, '', $list);
  143. $res = model('cashier_auth')->addList($list);
  144. // 清除缓存
  145. Cache::clear('cashier_menu');
  146. return $this->success();
  147. }
  148. /**
  149. * 获取收银端权限集
  150. * @param $addon
  151. * @param array $list
  152. */
  153. private function getCashierAuthList($tree, $addon, $parent = '', &$list = [])
  154. {
  155. foreach ($tree as $item) {
  156. $children = $item[ 'children' ] ?? [];
  157. if (isset($item[ 'children' ])) unset($item[ 'children' ]);
  158. $item = array_merge($item, [ 'addon' => $addon, 'parent' => $item[ 'parent' ] ?? $parent ]);
  159. ksort($item);
  160. array_push($list, $item);
  161. if (!empty($children)) $this->getCashierAuthList($children, $addon, $item[ 'name' ], $list);
  162. }
  163. }
  164. /**
  165. * 刷新全部菜单
  166. */
  167. public function refreshAllMenu()
  168. {
  169. $shop_menu_res = $this->refreshMenu("shop", '');
  170. $addon_model = new Addon();
  171. $addon_list = $addon_model->getAddonList([], 'name');
  172. $addon_list = $addon_list[ 'data' ];
  173. foreach ($addon_list as $k_addon => $v_addon) {
  174. $addon_menu_res = $this->refreshMenu('shop', $v_addon[ 'name' ]);
  175. }
  176. }
  177. /**
  178. * 刷新店铺端菜单
  179. * @param $addon
  180. * @param string $app_module
  181. * @return array|int
  182. */
  183. public function cacheMenu($addon, $app_module = 'shop')
  184. {
  185. if (!empty($addon)) {
  186. $tree_name = 'addon/' . $addon . '/config/menu_' . $app_module . '.php';
  187. } else {
  188. $tree_name = $addon . '/config/menu_' . $app_module . '.php';
  189. }
  190. if (file_exists($tree_name)) {
  191. model('menu')->delete([ [ 'app_module', "=", $app_module ], [ 'addon', "=", $addon ] ]);
  192. $tree = require $tree_name;
  193. $list = $this->getAddonMenuList($tree, $app_module, $addon);
  194. if (!empty($list)) {
  195. $res = model('menu')->addList($list);
  196. return $res;
  197. } else {
  198. return $this->success();
  199. }
  200. } else {
  201. return $this->success();
  202. }
  203. }
  204. /**
  205. * 获取菜单
  206. * @param unknown $tree
  207. * @param unknown $port
  208. */
  209. public function getAddonMenuList($tree, $app_module, $addon)
  210. {
  211. try {
  212. $list = [];
  213. if (!$tree) {
  214. return [];
  215. }
  216. foreach ($tree as $k => $v) {
  217. $parent = '';
  218. if (isset($v[ 'parent' ])) {
  219. if ($v[ 'parent' ] == '') {
  220. $parent = '';
  221. $level = 1;
  222. } else {
  223. $parent_menu_info = model('menu')->getInfo([
  224. [ 'name', "=", $v[ 'parent' ] ]
  225. ]);
  226. if ($parent_menu_info) {
  227. $parent = $parent_menu_info[ 'name' ];
  228. $level = $parent_menu_info[ 'level' ] + 1;
  229. } else {
  230. $level = 1;
  231. }
  232. }
  233. } else {
  234. $parent = '';
  235. $level = 1;
  236. }
  237. $item = [
  238. 'app_module' => $app_module,
  239. 'addon' => $addon,
  240. 'title' => $v[ 'title' ],
  241. 'name' => $v[ 'name' ],
  242. 'parent' => $parent,
  243. 'level' => $level,
  244. 'url' => $v[ 'url' ],
  245. 'is_show' => isset($v[ 'is_show' ]) ? $v[ 'is_show' ] : 1,
  246. 'sort' => isset($v[ 'sort' ]) ? $v[ 'sort' ] : 100,
  247. 'is_icon' => isset($v[ 'is_icon' ]) ? $v[ 'is_icon' ] : 0,
  248. 'picture' => isset($v[ 'picture' ]) ? $v[ 'picture' ] : '',
  249. 'picture_select' => isset($v[ 'picture_selected' ]) ? $v[ 'picture_selected' ] : '',
  250. 'is_control' => isset($v[ 'is_control' ]) ? $v[ 'is_control' ] : 1,
  251. 'desc' => isset($v[ 'desc' ]) ? $v[ 'desc' ] : '',
  252. ];
  253. array_push($list, $item);
  254. if (isset($v[ 'child_list' ])) {
  255. $this->list = [];
  256. $this->menuTreeToList($v[ 'child_list' ], $app_module, $addon, $v[ 'name' ], $level + 1);
  257. $list = array_merge($list, $this->list);
  258. }
  259. }
  260. return $list;
  261. } catch (\Exception $e) {
  262. return json(error(-1, $e->getMessage() . ",File:" . $e->getFile() . ",line:" . $e->getLine()));
  263. }
  264. }
  265. /**
  266. * 菜单树转化为列表
  267. * @param unknown $tree
  268. * @param unknown $module
  269. * @param unknown $port
  270. * @param string $pid
  271. * @param number $level
  272. */
  273. private function menuTreeToList($tree, $app_module, $addon = '', $parent = '', $level = 1)
  274. {
  275. if (is_array($tree)) {
  276. foreach ($tree as $key => $value) {
  277. $item = [
  278. 'app_module' => $app_module,
  279. 'addon' => $addon,
  280. 'title' => $value[ 'title' ],
  281. 'name' => $value[ 'name' ],
  282. 'parent' => $parent,
  283. 'level' => $level,
  284. 'url' => $value[ 'url' ],
  285. 'is_show' => isset($value[ 'is_show' ]) ? $value[ 'is_show' ] : 1,
  286. 'sort' => isset($value[ 'sort' ]) ? $value[ 'sort' ] : 100,
  287. 'is_icon' => isset($value[ 'is_icon' ]) ? $value[ 'is_icon' ] : 0,
  288. 'picture' => isset($value[ 'picture' ]) ? $value[ 'picture' ] : '',
  289. 'picture_select' => isset($value[ 'picture_selected' ]) ? $value[ 'picture_selected' ] : '',
  290. 'is_control' => isset($value[ 'is_control' ]) ? $value[ 'is_control' ] : 1,
  291. 'desc' => isset($value[ 'desc' ]) ? $value[ 'desc' ] : '',
  292. ];
  293. $refer = $value;
  294. if (isset($refer[ 'child_list' ])) {
  295. unset($refer[ 'child_list' ]);
  296. array_push($this->list, $item);
  297. $p_name = $refer[ 'name' ];
  298. $this->menuTreeToList($value[ 'child_list' ], $app_module, $addon, $p_name, $level + 1);
  299. } else {
  300. array_push($this->list, $item);
  301. }
  302. }
  303. }
  304. }
  305. /**
  306. * 清空菜单表,防止自增ID越来越大
  307. */
  308. public function truncateMenu()
  309. {
  310. $prefix = config("database")[ "connections" ][ "mysql" ][ "prefix" ];
  311. model('menu')->execute("TRUNCATE TABLE {$prefix}menu");
  312. }
  313. /**
  314. * 清空收银台菜单表,防止自增ID越来越大
  315. */
  316. public function truncateCashierAuth()
  317. {
  318. $prefix = config("database")[ "connections" ][ "mysql" ][ "prefix" ];
  319. model('menu')->execute("TRUNCATE TABLE {$prefix}cashier_auth");
  320. }
  321. /**
  322. * 清空组件、链接表,防止自增ID越来越大
  323. */
  324. public function truncateDiyView()
  325. {
  326. $prefix = config("database")[ "connections" ][ "mysql" ][ "prefix" ];
  327. model('menu')->execute("TRUNCATE TABLE {$prefix}diy_view_util");
  328. model('menu')->execute("TRUNCATE TABLE {$prefix}link");
  329. }
  330. }