Roles.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <?php
  2. namespace app\admin\controller;
  3. use think\facade\Session;
  4. use app\admin\model\Role;
  5. use app\admin\model\Admin;
  6. use app\admin\controller\Base;
  7. use think\Request;
  8. use think\Db;
  9. class Roles extends Base
  10. {
  11. //角色权限列表渲染输出
  12. public function roleList()
  13. {
  14. $rolepid = $this->foreachroleid(Session::get('Adminuser.roles'));
  15. if($rolepid){
  16. $role = Db::name('role')->where('id','in',$rolepid.','.Session::get('Adminuser.roles'))->order('pid','asc')->paginate(25)->each(function($item, $key){
  17. $adminname = Db::name('admin')->where('roles',$item['id'])->field('name')->select()->toArray();
  18. $item['username'] = $adminname;
  19. $status = ['0'=>'已停用','1'=>'已启用'];
  20. $item['status'] = $status[$item['status']];
  21. if($item['id'] == Session::get('Adminuser.roles') || $item['pid'] == 0){
  22. $item['center'] = 0;
  23. }else{
  24. $item['center'] = 1;
  25. }
  26. return $item;
  27. });
  28. }else{
  29. $role = Db::name('role')->where('id',Session::get('Adminuser.roles'))->order('pid','asc')->paginate(25)->each(function($item, $key){
  30. $adminname = Db::name('admin')->where('roles',$item['id'])->field('name')->select()->toArray();
  31. $item['username'] = $adminname;
  32. $status = ['0'=>'已停用','1'=>'已启用'];
  33. $item['status'] = $status[$item['status']];
  34. if($item['id'] == Session::get('Adminuser.roles') || $item['pid'] == 0){
  35. $item['center'] = 0;
  36. }else{
  37. $item['center'] = 1;
  38. }
  39. return $item;
  40. });
  41. }
  42. return view('list',['roles'=>$role]);
  43. }
  44. public function foreachroleid($roleid)
  45. {
  46. $roleids = "";
  47. if(!empty($roleid) || is_numeric($roleid)){
  48. $rolepid = Db::name('role')->where('pid',$roleid)->field('id')->select();
  49. if(!$rolepid->isEmpty()){
  50. foreach($rolepid as $r){
  51. $roleids .= $r['id'] . ',';
  52. $roleids .= $this->foreachroleid($r['id']).',';
  53. }
  54. }
  55. }
  56. if(!empty($roleids)){
  57. return trim($roleids,',');
  58. }else{
  59. return false;
  60. }
  61. }
  62. //请求数据源 添加/编辑在使用
  63. public function getData(Request $request)
  64. {
  65. if(request()->isAjax()){
  66. //查询一级ID
  67. $one = Db::name('rule')->field(['id','pid','title'])->select()->toArray();
  68. $info = alldigui($one,0,0);
  69. return json($info);
  70. }
  71. }
  72. //角色添加
  73. public function add(Request $request)
  74. {
  75. //判断是否为ajax请求
  76. if(request()->isAjax()){
  77. $sorts = Role::all();
  78. $sort = 1;
  79. //自动排序
  80. foreach($sorts as $key=>$val){
  81. if(!empty($val['orders'])){
  82. $sort = $val["orders"]+1;
  83. }
  84. }
  85. //接收提交过来的信息
  86. $data = $request->param();
  87. $info['name'] = $data['name'];
  88. $info['info'] = $data ['info'];
  89. if(isset($data['select']) && is_numeric($data['select'])){
  90. $info['pid'] = $data['select'];
  91. unset($data['select']);
  92. }
  93. //删除数组中指定元素
  94. unset($data['name']);
  95. unset($data['info']);
  96. if(isset($data['jurisdiction'])){
  97. if($data['jurisdiction'] == '/-all-/'){
  98. $info['jurisdiction'] = $data['jurisdiction'];
  99. }else{
  100. $info['jurisdiction'] = '/-all-/';
  101. }
  102. unset($data['jurisdiction']);
  103. }else{
  104. if(!empty($data)){
  105. foreach($data as $k=>$r){
  106. if(!is_numeric($r)){
  107. unset($data[$k]);
  108. }
  109. }
  110. //将键转换为数字键
  111. $array = array_values($data);
  112. //数组转字符串
  113. $info['jurisdiction'] = implode(',',$array);
  114. }else{
  115. $info['jurisdiction'] = NULL;
  116. }
  117. }
  118. //创建时间
  119. $info['create_time'] = time();
  120. //修改时间
  121. $info['update_time'] = time();
  122. //排序
  123. $info['orders'] = $sort;
  124. //判断角色名是否为空
  125. if(empty($info['name'])){
  126. $this -> error("角色名不能为空!");
  127. return false;
  128. }else{
  129. //判断角色名是否存在
  130. if(Role::get(['name'=>$info['name']])){
  131. $this -> error("角色名已存在!");
  132. return false;
  133. }else{
  134. $res = Role::insert($info);
  135. //提示信息
  136. if($res){
  137. $this -> logs("管理员:".Session::get('Adminuser.name')."添加角色 [ID: ".$info['name'].'] 成功!');
  138. $this -> success("添加成功!",'Roles/rolelist');
  139. }else{
  140. $this -> logs("管理员:".Session::get('Adminuser.name')."添加角色 [ID: ".$info['name'].'] 失败!');
  141. $this -> error("添加失败!");
  142. }
  143. }
  144. }
  145. }
  146. $roleid = "";
  147. $allrolesid = Db::name('rule')->field('id,level')->select();
  148. foreach($allrolesid as $key=>$val){
  149. if($val['level'] != 2){
  150. unset($allrolesid[$key]);
  151. }else{
  152. $roleid .= $val['id'] . ',';
  153. }
  154. }
  155. if(!empty($roleid)){
  156. $roleid = substr($roleid,0,-1);
  157. }
  158. $roles = Db::name('role')->field('id,name,pid')->select()->toArray();
  159. foreach($roles as $ke=>$v){
  160. $roles[$ke]['id'] = $v['id'];
  161. $roles[$ke]['value'] = $v['id'];
  162. if($v['pid'] == 0 || $v['id'] == 1){
  163. $roles[$ke]['selected'] = true;
  164. }
  165. }
  166. $roles = alldigui($roles,0,0);
  167. return view('add',['roleid'=>$roleid,'rolepids'=>json_encode($roles,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)]);
  168. }
  169. //角色管理列表编辑
  170. public function edit(Request $request)
  171. {
  172. //判断是否为ajax请求
  173. if(request()->isAjax()){
  174. //接收提交过来的信息
  175. $data = $request->param();
  176. //获取对应ID的角色信息
  177. $roles = Role::get($data['id']);
  178. $info['name'] = $data['name'];
  179. $info['info'] = $data['info'];
  180. $info['id'] = $data['id'];
  181. if(isset($data['select']) && is_numeric($data['select'])){
  182. if($data['select'] != $roles['pid']){
  183. $info['pid'] = $data['select'];
  184. unset($data['select']);
  185. }
  186. }
  187. //删除数组中指定元素
  188. unset($data['name']);
  189. unset($data['info']);
  190. unset($data['id']);
  191. if(isset($data['jurisdiction'])){
  192. if($data['jurisdiction'] == '/-all-/'){
  193. $info['jurisdiction'] = $data['jurisdiction'];
  194. }else{
  195. $info['jurisdiction'] = '/-all-/';
  196. }
  197. unset($data['jurisdiction']);
  198. }else{
  199. if(!empty($data)){
  200. foreach($data as $k=>$r){
  201. if(!is_numeric($r)){
  202. unset($data[$k]);
  203. }
  204. }
  205. //将键转换为数字键
  206. $array = array_values($data);
  207. //数组转字符串
  208. $info['jurisdiction'] = implode(',',$array);
  209. }else{
  210. $info['jurisdiction'] = NULL;
  211. }
  212. }
  213. //修改时间
  214. $info['update_time'] = time();
  215. //提示信息
  216. if(empty($info['name'])){
  217. $this -> error("角色名不能为空!");
  218. return false;
  219. }else{
  220. //判断角色名是否存在
  221. if(Role::get(['name'=>$info['name']] && $info['name'] != $roles['name'])){
  222. $this -> error("角色名已存在!");
  223. return false;
  224. }else{
  225. $res = Role::update($info);
  226. //提示信息
  227. if($res){
  228. $this -> logs("管理员:".Session::get('Adminuser.name')."修改角色 [ID: ".$info['id'].'] 成功!');
  229. $this -> success("修改成功!",'Roles/rolelist');
  230. }else{
  231. $this -> logs("管理员:".Session::get('Adminuser.name')."修改角色 [ID: ".$info['id'].'] 失败!');
  232. $this -> error("修改失败!");
  233. }
  234. }
  235. }
  236. }
  237. $id = $request->param('id');
  238. //获取对应ID的角色信息
  239. $roles = Db::name('role')->find($id);
  240. if($roles['jurisdiction'] != '/-all-/'){
  241. $roles['jurcheck'] = '0';
  242. //字符串转数组
  243. $array = explode(',',$roles['jurisdiction']);
  244. //删除0级1级的url,以防模板渲染错误
  245. foreach ($array as $key => $val){
  246. $info = Db::name('rule')->where('id',$val)->field('level')->find();
  247. if($info['level'] != 2){
  248. unset($array[$key]);
  249. }
  250. }
  251. //转为字符串
  252. $roles['jurisdiction'] = implode(',',$array);
  253. $roleid = $roles['jurisdiction'];
  254. }else{
  255. $roles['jurisdiction'] = "";
  256. $roles['jurcheck'] = '1';
  257. $allrolesid = Db::name('rule')->field('id,level')->select();
  258. foreach($allrolesid as $key=>$val){
  259. if($val['level'] != 2){
  260. unset($allrolesid[$key]);
  261. }else{
  262. $roles['jurisdiction'] .= $val['id'] . ',';
  263. }
  264. }
  265. $roleid = substr($roles['jurisdiction'],0,-1);
  266. if(!empty($roleid)){
  267. $roles['jurisdiction'] = $roleid;
  268. }
  269. }
  270. $rolespid = Db::name('role')->field('id,name,pid')->select()->toArray();
  271. foreach($rolespid as $ke=>$v){
  272. $rolespid[$ke]['id'] = $v['id'];
  273. $rolespid[$ke]['value'] = $v['id'];
  274. if($roles['pid'] == 0){
  275. $rolespid[$ke]['disabled'] = true;
  276. }else if($roles['pid'] == $v['id']){
  277. $rolespid[$ke]['selected'] = true;
  278. }else if($roles['id'] == $v['id']){
  279. $rolespid[$ke]['disabled'] = true;
  280. }
  281. }
  282. $rolespid = alldigui($rolespid,0,0);
  283. return view('edit',['roles'=>$roles,'roleid'=>$roleid,'rolepids'=>json_encode($rolespid,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)]);
  284. }
  285. //角色管理列表删除/批量删除
  286. public function deletes(Request $request)
  287. {
  288. //判断是否为ajax请求
  289. if(request()->isAjax()){
  290. //接收提交过来的信息
  291. $id = $request->param('id');
  292. //转为数组
  293. $array = explode(',',$id);
  294. foreach(array_unique(array_filter($array)) as $ke=>$vs){
  295. $p = Db::name('role')->find($vs);
  296. if($p['pid'] == 0){
  297. unset($array[$ke]);
  298. }else{
  299. $pid = $this->foreachroleid($vs);
  300. if(!empty($pid)){
  301. $parray = explode(',',$pid);
  302. $array = array_merge($array,$parray);
  303. }
  304. }
  305. }
  306. $array = array_unique(array_filter($array));
  307. if(!empty($array)){
  308. $admin = Db::name('admin')->where('id',Session::get('Adminuser.id'))->field('roles')->find();
  309. foreach($array as $key=>$val){
  310. if($val == $admin['roles']){
  311. unset($array[$key]);
  312. }
  313. $checkadmin = Db::name('admin')->where('roles',$val)->find();
  314. if(!empty($checkadmin)){
  315. unset($array[$key]);
  316. }
  317. }
  318. if(!empty($array)){
  319. //删除操作
  320. $res =Role::destroy($array);
  321. if($res){
  322. $this -> logs("管理员:".Session::get('Adminuser.name')."删除角色:".implode(",",$array));
  323. $this -> success("删除成功!",'Roles/rolelist');
  324. }else{
  325. $this -> logs("管理员:".Session::get('Adminuser.name')."删除角色:".implode(",",$array)."失败");
  326. $this -> error("删除失败!");
  327. }
  328. }else{
  329. $this->error("正在使用的角色不可删除!");
  330. }
  331. }else{
  332. $this->error("当前无可操作数据!");
  333. }
  334. }
  335. }
  336. //状态变更
  337. public function setStatus(Request $request)
  338. {
  339. if(request()->isAjax()){
  340. //接收ID
  341. $id = $request->param('id');
  342. $roles = Db::name('role')->find($id);
  343. if($roles['pid'] != 0 || $id != Session::get('Adminuser.roles')){
  344. $status = ['status'=>1];
  345. if($roles['status'] == 1){
  346. $status = ['status'=>0];
  347. }
  348. //执行更新
  349. $res = Db::name('role')->where('id',$id)->update($status);
  350. if($res){
  351. $this -> logs("管理员:".Session::get('Adminuser.name')."变更角色[".$roles['name']."]状态成功!");
  352. $this->success("状态已变更!",'Roles/rolelist');
  353. }else{
  354. $this -> logs("管理员:".Session::get('Adminuser.name')."变更角色[".$roles['name']."]状态失败!");
  355. $this->error("状态变更失败!");
  356. }
  357. }else{
  358. $this->error("当前无可操作数据!");
  359. }
  360. }
  361. }
  362. //角色搜索
  363. public function search(Request $request)
  364. {
  365. $rolesid = Session::get('Adminuser.roles');
  366. $keywords = $request->param('keywords');
  367. $roleid = $this->foreachroleid(Session::get('Adminuser.roles'));
  368. if($roleid){
  369. $rolesid .= ','.$roleid;
  370. }
  371. //进行模糊查询
  372. $role = Role::where('name|info','like','%'.$keywords.'%')->where('id','in',$rolesid)->order('pid','asc')->paginate(25,false,['query'=>request()->param()])->each(function($item, $key){
  373. $username = Admin::where('roles',$item['id'])->field('name')->select()->toArray();
  374. $item['username'] = $username;
  375. if($item['id'] == Session::get('Adminuser.roles') || $item['pid'] == 0){
  376. $item['center'] = 0;
  377. }else{
  378. $item['center'] = 1;
  379. }
  380. return $item;
  381. });
  382. return view('list',['roles'=>$role]);
  383. }
  384. }