AdminController.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. /**
  3. * @copyright (C)2016-2099 Hnaoyun Inc.
  4. * @author XingMeng
  5. * @email hnxsh@foxmail.com
  6. * @date 2016年12月25日
  7. * 应用公共控制类
  8. */
  9. namespace app\common;
  10. use core\basic\Controller;
  11. class AdminController extends Controller
  12. {
  13. public function __construct()
  14. {
  15. // 自动缓存基础信息
  16. cache_config();
  17. // 从配置文件读取cmsname参数来设置系统名称
  18. define("CMSNAME", $this->config("cmsname") ?: 'PbootCMS');
  19. // 检测登录,未登录跳转登录页面,已登录执行数据处理
  20. if ($this->checkLogin()) {
  21. // 权限检测
  22. $this->checkLevel();
  23. $this->getSecondMenu(); // 获取同级菜单
  24. $this->assign('menu_tree', session('menu_tree')); // 注入菜单树
  25. if (session('area_tree')) {
  26. $area_html = make_area_Select(session('area_tree'), session('acode'));
  27. $this->assign('area_html', $area_html);
  28. if (count(session('area_tree')) == 1) {
  29. $this->assign('one_area', true);
  30. }
  31. } else {
  32. session_unset();
  33. error('您账号的区域权限设置有误,无法正常登录!', url('/admin/Index/index'), 10);
  34. }
  35. // 内容模型菜单注入
  36. $models = model('admin.content.Model');
  37. $this->assign('menu_models', $models->getModelMenu());
  38. // 注入编码后的回跳地址
  39. $this->assign('btnqs', get_btn_qs());
  40. $this->assign('backurl', get_backurl());
  41. // 兼容模式form使用get搜索时注入pathinfo隐藏域
  42. if ($_GET['p'] && $this->config('app_url_type') == 3) {
  43. $this->assign('pathinfo', '<input name="p" type="hidden" value="' . get('p') . '">');
  44. }
  45. }
  46. // 不进行表单检验的控制器
  47. $nocheck = array(
  48. 'Upgrade'
  49. );
  50. // POST表单提交校验
  51. if ($_POST && ! in_array(C, $nocheck) && session('formcheck') != post('formcheck')) {
  52. // 检查会话目录权限问题
  53. if (session_save_path()) {
  54. preg_match('/^((\s+)?([0-9]+)(\s+)?;)?(.*)/', session_save_path(), $matches);
  55. // 自动创建会话主目录
  56. if (! check_dir($matches[5], true)) {
  57. error('会话目录创建失败!' . $matches[5]);
  58. }
  59. // 检查会话目录写入权限
  60. if (! is_writable($matches[5])) {
  61. error('会话目录权限不足!' . $matches[5]);
  62. }
  63. // 自动创建层级会话目录
  64. if ($matches[3]) {
  65. create_session_dir($matches[5], $matches[3]);
  66. }
  67. } elseif (isset($_SERVER['TMP']) && ! file_exists($_SERVER['TMP'] . '/sess_' . session_id())) {
  68. error(' 操作系统缓存目录写入权限不足!' . $_SERVER['TMP']);
  69. }
  70. alert_back('表单提交校验失败,请刷新后重试!');
  71. }
  72. // 首次加载时,生成页面验证码
  73. if (! issetSession('formcheck')) {
  74. session('formcheck', get_uniqid());
  75. }
  76. $this->assign('formcheck', session('formcheck')); // 注入formcheck模板变量
  77. }
  78. // 后台用户登录状态检查
  79. private function checkLogin()
  80. {
  81. // 免登录可访问页面
  82. $public_path = array(
  83. '/admin/Index/index', // 登录页面
  84. '/admin/Index/login' // 执行登录
  85. );
  86. if (session('sid') && $this->checkSid()) { // 如果已经登录直接true
  87. return true;
  88. } elseif (in_array('/' . M . '/' . C . '/' . F, $public_path)) { // 免登录可访问页面
  89. return false;
  90. } else { // 未登录跳转到登录页面
  91. location(url('/admin/Index/index'));
  92. }
  93. }
  94. // 检查会话id
  95. private function checkSid()
  96. {
  97. $sid = encrypt_string(session_id() . session('id'));
  98. if ($sid != session('sid') || session('M') != M) {
  99. session_destroy();
  100. return false;
  101. } else {
  102. return true;
  103. }
  104. }
  105. // 访问权限检查
  106. private function checkLevel()
  107. {
  108. // 免权限等级认证页面,即所有登录用户都可以访问
  109. $public_path = array(
  110. '/admin/Index/index', // 登录页
  111. '/admin/Index/home', // 主页
  112. '/admin/Index/loginOut', // 退出登录
  113. '/admin/Index/ucenter', // 用户中心
  114. '/admin/Index/area', // 区域选择
  115. '/admin/Index/clearCache', // 清理缓存
  116. '/admin/Index/upload' // 上传文件
  117. );
  118. $levals = session('levels');
  119. $path1 = '/' . M . '/' . C;
  120. $path2 = '/' . M . '/' . C . '/' . F;
  121. if (session('id') == 1 || in_array(URL, $levals) || in_array($path2, $levals) || in_array($path1, $public_path) || in_array($path2, $public_path)) {
  122. return true;
  123. } else {
  124. error('您的账号权限不足,您无法执行该操作!');
  125. }
  126. }
  127. // 当前菜单的父类的子菜单,即同级菜单二级菜单
  128. private function getSecondMenu()
  129. {
  130. $menu_tree = session('menu_tree');
  131. $url = '/' . M . '/' . C . '/' . F;
  132. $len = 0;
  133. $primary_menu_url = '';
  134. $second_menu = array();
  135. // 直接比对找出最长匹配URL
  136. foreach ($menu_tree as $key => $value) {
  137. if (is_array($value->son)) {
  138. foreach ($value->son as $key2 => $value2) {
  139. if (! $value2->url) // 如果为空,则跳过
  140. continue;
  141. $pos = strpos($url, $value2->url);
  142. if ($pos !== false) {
  143. $templen = strlen($value2->url);
  144. if ($templen > $len) {
  145. $len = $templen;
  146. $primary_menu_url = $value->url;
  147. $second_menu = $value->son;
  148. }
  149. break; // 如果匹配到已经找到父类,则结束
  150. }
  151. }
  152. }
  153. }
  154. // 前面第一种无法匹配,则选择子菜单匹配,只需控制器通过即可,如翻页、增、改、删操作
  155. if (! $second_menu) {
  156. foreach ($menu_tree as $key => $value) {
  157. if (is_array($value->son)) {
  158. foreach ($value->son as $key2 => $value2) {
  159. if (strpos($value2->url, '/' . M . '/' . C . '/') === 0) {
  160. $primary_menu_url = $value->url;
  161. $second_menu = $value->son;
  162. break;
  163. }
  164. }
  165. }
  166. if ($second_menu) { // 已经获取二级菜单到后退出
  167. break;
  168. }
  169. }
  170. }
  171. $this->assign('primary_menu_url', $primary_menu_url);
  172. $this->assign('second_menu', $second_menu);
  173. }
  174. }