ModuleModel.class.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <?php
  2. namespace Admin\Model;
  3. use Common\Model\ModelModel;
  4. use Think\Storage;
  5. use Util\Tree;
  6. /**
  7. * 功能模块模型
  8. *
  9. */
  10. class ModuleModel extends ModelModel
  11. {
  12. /**
  13. * 数据库表名
  14. *
  15. */
  16. protected $tableName = 'admin_module';
  17. /**
  18. * 自动验证规则
  19. *
  20. */
  21. protected $_validate = array(
  22. array('name', 'require', '模块名称不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  23. array('name', '', '该模块已存在', self::MUST_VALIDATE, 'unique', self::MODEL_BOTH),
  24. array('title', 'require', '模块标题不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  25. array('description', 'require', '模块描述不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  26. array('developer', 'require', '模块开发者不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  27. array('version', 'require', '模块版本不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  28. array('admin_menu', 'require', '模块菜单节点不能为空', self::MUST_VALIDATE, 'regex', self::MODEL_BOTH),
  29. );
  30. /**
  31. * 自动完成规则
  32. *
  33. */
  34. protected $_auto = array(
  35. array('create_time', 'time', self::MODEL_INSERT, 'function'),
  36. array('update_time', 'time', self::MODEL_BOTH, 'function'),
  37. array('sort', '0', self::MODEL_INSERT),
  38. array('status', '1', self::MODEL_INSERT),
  39. );
  40. /**
  41. * 安装描述文件名
  42. *
  43. */
  44. public function install_file()
  45. {
  46. return 'opencmf.php';
  47. }
  48. /**
  49. * 获取模块菜单
  50. *
  51. */
  52. public function getAdminMenu($module_name = MODULE_NAME)
  53. {
  54. // 获取模块左侧导航
  55. $where['name'] = $module_name;
  56. $module_info = $this->where($where)->find();
  57. $_side_menu_list = json_decode($module_info['admin_menu'], true);
  58. // 转换成树结构
  59. $tree = new tree();
  60. return $tree->list2tree($_side_menu_list);
  61. }
  62. /**
  63. * 获取模块当前菜单
  64. *
  65. */
  66. public function getCurrentMenu($module_name = MODULE_NAME)
  67. {
  68. $admin_menu = $this->getFieldByName($module_name, 'admin_menu');
  69. $admin_menu = json_decode($admin_menu, true);
  70. foreach ($admin_menu as $key => $val) {
  71. if (isset($val['url'])) {
  72. $config_url =$val['url'];
  73. $current_url = MODULE_NAME . '/' . CONTROLLER_NAME . '/' . ACTION_NAME;
  74. if ($config_url === $current_url) {
  75. $result = $val;
  76. }
  77. }
  78. }
  79. return $result;
  80. }
  81. /**
  82. * 获取所有模块菜单
  83. * @param string $addon_dir
  84. *
  85. */
  86. public function getAllMenu()
  87. {
  88. $uid = is_login();
  89. $user_group = D('Admin/Access')->getFieldByUid($uid, 'group'); // 获得当前登录用户信息
  90. $group_info = D('Admin/Group')->find($user_group);
  91. $group_auth = json_decode($group_info['menu_auth'], true); // 获得当前登录用户所属部门的权限列表
  92. // 获取所有菜单
  93. $menu_list = S('MENU_LIST_' . $uid);
  94. if (!$menu_list || APP_DEBUG === true) {
  95. $con['status'] = 1;
  96. $system_module_list = $this->where($con)->order('sort asc, id asc')->select();
  97. $tree = new tree();
  98. $menu_list = array();
  99. foreach ($system_module_list as $key => &$module) {
  100. $menu = json_decode($module['admin_menu'], true);
  101. if(!empty($group_auth['Admin'])) {//为空表示是管理员
  102. foreach ($menu as $k => $v) {
  103. if ($v['id'] == 1) continue;
  104. if (!in_array($v['id'], $group_auth['Admin'])) unset($menu[$k]);
  105. }
  106. }
  107. $temp = $tree->list2tree($menu);
  108. $menu_list[$module['name']] = $temp[0];
  109. $menu_list[$module['name']]['id'] = $module['id'];
  110. $menu_list[$module['name']]['name'] = $module['name'];
  111. }
  112. S('MENU_LIST_' . $uid, $menu_list, 3600); // 缓存配置
  113. }
  114. return $menu_list;
  115. }
  116. /**
  117. * 根据菜单ID的获取其所有父级菜单
  118. * @param array $current_menu 当前菜单信息
  119. * @return array 父级菜单集合
  120. *
  121. */
  122. public function getParentMenu($current_menu = '', $module_name = MODULE_NAME)
  123. {
  124. if (!$current_menu) {
  125. $current_menu = $this->getCurrentMenu();
  126. }
  127. if (!$current_menu) {
  128. return false;
  129. }
  130. $admin_menu = $this->getFieldByName($module_name, 'admin_menu');
  131. $admin_menu = json_decode($admin_menu, true);
  132. $pid = $current_menu['pid'];
  133. $temp = array();
  134. $result[] = $current_menu;
  135. while (true) {
  136. foreach ($admin_menu as $key => $val) {
  137. if ($val['id'] == $pid) {
  138. $pid = $val['pid'];
  139. array_unshift($result, $val); // 将父菜单插入到第一个元素前
  140. }
  141. }
  142. if ($pid == '0') {
  143. break;
  144. }
  145. }
  146. return $result;
  147. }
  148. /**
  149. * 获取模块列表
  150. * @param string $addon_dir
  151. *
  152. */
  153. public function getAll()
  154. {
  155. // 获取除了Common等系统模块外的用户模块
  156. // 文件夹下必须有$install_file定义的安装描述文件
  157. $dirs = array_map('basename', glob(APP_PATH . '*', GLOB_ONLYDIR));
  158. foreach ($dirs as $dir) {
  159. $config_file = realpath(APP_PATH . $dir) . '/' . $this->install_file();
  160. if (Storage::has($config_file)) {
  161. $module_dir_list[] = $dir;
  162. $temp_arr = include $config_file;
  163. $temp_arr['info']['status'] = -1; //未安装
  164. $module_list[$temp_arr['info']['name']] = $temp_arr['info'];
  165. }
  166. }
  167. // 获取系统已经安装的模块信息
  168. $installed_module_list = $this->field(true)
  169. ->order('sort asc,id asc')
  170. ->select();
  171. if ($installed_module_list) {
  172. foreach ($installed_module_list as &$module) {
  173. $new_module_list[$module['name']] = $module;
  174. $new_module_list[$module['name']]['admin_menu'] = json_decode($module['admin_menu'], true);
  175. }
  176. // 系统已经安装的模块信息与文件夹下模块信息合并
  177. $module_list = array_merge($module_list, $new_module_list);
  178. }
  179. foreach ($module_list as &$val) {
  180. switch ($val['status']) {
  181. case '-2': // 损坏
  182. $val['status_icon'] = '<span class="text-danger">删除记录</span>';
  183. $val['right_button']['damaged']['title'] = '删除记录';
  184. $val['right_button']['damaged']['attribute'] = 'class="label label-danger ajax-get" href="' . U('setStatus', array('status' => 'delete', 'ids' => $val['id'])) . '"';
  185. break;
  186. case '-1': // 未安装
  187. $val['status_icon'] = '<i class="fa fa-download text-success"></i>';
  188. $val['right_button']['install_before']['title'] = '安装';
  189. $val['right_button']['install_before']['attribute'] = 'class="label label-success" href="' . U('install_before', array('name' => $val['name'])) . '"';
  190. break;
  191. case '0': // 禁用
  192. $val['status_icon'] = '<i class="fa fa-ban text-danger"></i>';
  193. $val['right_button']['update_info']['title'] = '更新菜单';
  194. $val['right_button']['update_info']['attribute'] = 'class="label label-info ajax-get no-refresh" href="' . U('updateInfo', array('id' => $val['id'])) . '"';
  195. $val['right_button']['forbid']['title'] = '启用';
  196. $val['right_button']['forbid']['attribute'] = 'class="label label-success ajax-get" href="' . U('setStatus', array('status' => 'resume', 'ids' => $val['id'])) . '"';
  197. $val['right_button']['uninstall_before']['title'] = '卸载';
  198. $val['right_button']['uninstall_before']['attribute'] = 'class="label label-danger " href="' . U('uninstall_before', array('id' => $val['id'])) . '"';
  199. break;
  200. case '1': // 正常
  201. $val['status_icon'] = '<i class="fa fa-check text-success"></i>';
  202. $val['right_button']['update_info']['title'] = '更新菜单';
  203. $val['right_button']['update_info']['attribute'] = 'class="label label-info ajax-get no-refresh" href="' . U('updateInfo', array('id' => $val['id'])) . '"';
  204. if (!$val['is_system']) {
  205. $val['right_button']['forbid']['title'] = '禁用';
  206. $val['right_button']['forbid']['attribute'] = 'class="label label-warning ajax-get" href="' . U('setStatus', array('status' => 'forbid', 'ids' => $val['id'])) . '"';
  207. $val['right_button']['uninstall_before']['title'] = '卸载';
  208. $val['right_button']['uninstall_before']['attribute'] = 'class="label label-danger " href="' . U('uninstall_before', array('id' => $val['id'])) . '"';
  209. }
  210. break;
  211. }
  212. }
  213. return $module_list;
  214. }
  215. /**
  216. * 获取模块名称列表
  217. * @param string $addon_dir
  218. *
  219. */
  220. public function getNameList()
  221. {
  222. $list = $this->getField('name', true);
  223. foreach ($list as $val) {
  224. $return[$val] = $val;
  225. }
  226. return $return;
  227. }
  228. }