111
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

189 righe
6.9 KiB

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