caipan_shop_admin/app/controller/manager/Role.php

270 lines
7.4 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\controller\manager;
use app\model\Log;
use app\model\Menu;
use app\model\Menu as MenuModel;
use app\model\Role as RoleModel;
use app\model\Rules;
use app\repository\CmsRepository;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\exception\ValidateException;
use think\facade\Db;
use think\response\Json;
use think\response\View;
/**
* 角色管理
*
* Class Role
* @package app\controller\manager
*/
class Role extends Base
{
/**
* 删除
*
* @return Json
*/
public function del(): Json
{
if ($this->request->isPost()) {
$ids = input('post.ids/a', []);
if (empty($ids)) {
$ids[] = input('post.id/d');
}
RoleModel::deleteByIds($ids);
Log::write(get_class().'Del', 'del', '涉及到的ID为'.implode(',', $ids));
return $this->json();
}
return $this->json(4001, '非法请求!');
}
/**
* 编辑
*
* @return Json|View
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws Exception
*/
public function edit()
{
$id = input('id/d', 0);
if (!$info = RoleModel::findById($id)) {
return $this->json(4001, '记录不存在');
}
if ($this->request->isPost()) {
$item = input('post.');
$validate = $this->validateByApi($item, [
'title' => 'require',
]);
if ($validate !== true) {
return $validate;
}
try {
$info->save($item);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
}
}
$this->data['item'] = $info;
return $this->view();
}
/**
* 单个字段编辑
*
* @return Json
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws Exception
*/
public function modify(): Json
{
if ($this->request->isPost()) {
$item = input('post.');
$validate = $this->validateByApi($item, [
'field' => 'require',
'value' => 'require',
]);
if ($validate !== true) {
return $validate;
}
if (!$info = RoleModel::findById($item['id'])) {
return $this->json(4001, '记录不存在');
}
$update = [$item['field'] => $item['value']];
try {
$info->save($update);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
}
}
return $this->json(4000, '非法请求');
}
/**
* 添加
*
* @return Json|View
* @throws Exception
*/
public function add()
{
if ($this->request->isPost()) {
$item = input('post.');
$validate = $this->validateByApi($item, [
'title' => 'require',
]);
if ($validate !== true) {
return $validate;
}
try {
RoleModel::create($item);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
}
}
return $this->view();
}
/**
* 角色权限
*
* @return Json|View
* @throws Exception
*/
public function rule()
{
$id = input('id/d', 0);
if (!$item = RoleModel::findById($id)) {
return $this->json(4001, '记录不存在');
}
if ($this->request->isPost()) {
$ids = input('post.ids');
$roleUpdate = $ids;//角色更新数据
$ids = explode(',', $ids);
Db::startTrans();
try {
//查询角色已有权限
$hasRules = Rules::where('ptype', 'p')->where('v0', $id)->select()->toArray();
//角色最新权限列表
$currentRules = MenuModel::where('id', 'in', $ids)->field('name')->select()->toArray();
foreach ($currentRules as &$rule) {
$route = explode(':', $rule['name']);
$v1 = $route[0];
$v2 = $route[1] ?? 'index';
$rule['ptype'] = 'p';
$rule['v0'] = $id;
$rule['v1'] = $v1;
$rule['v2'] = $v2;
}
foreach ($hasRules as $k => $has) {
foreach ($currentRules as $m => $current) {
if ($has['ptype'] == $current['ptype'] && $has['v0'] == $current['v0'] && $has['v1'] == $current['v1'] && $has['v2'] == $current['v2']) {
unset($currentRules[$m]);//删除当前权限列表已存在的 currentRules剩下的就是需要添加的记录
unset($hasRules[$k]);//删除已有权限中存在的 hasRules剩下的就是需要删除的记录
}
}
}
$insert = $currentRules;//需要添加的数据
$delete = $hasRules;//需要删除的数据
$deleteIds = array_column($delete, 'id');//需要删除的ID
(new Rules())->saveAll($insert);
(new Rules())->where('id', 'in', $deleteIds)->delete();
cache('tauthz', null);//权限缓存清空
$item->save(['rules' => $roleUpdate]);
Db::commit();
return $this->json();
} catch (ValidateException $e) {
Db::rollback();
return $this->json(4001, $e->getError());
}
}
$selected = explode(',', $item['rules']);
$this->data['authJson'] = $this->authJson($selected);
$this->data['item'] = $item;
return $this->view();
}
/**
* 构造json数据
*
* @param array $selected
* @return false|string
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
private function authJson(array $selected = [])
{
$menus = Menu::field("id,pid,title,sort")
->where('status', Menu::STATUS_NORMAL)
->order('sort', 'desc')
->order('id', 'asc')
->select()->toArray();
foreach ($menus as $k => $m) {
$menus[$k]['checked'] = in_array($m['id'], $selected);
$menus[$k]['open'] = true;
}
$menus = CmsRepository::getInstance()->buildMenuChild(0, $menus);
return json_encode($menus, JSON_UNESCAPED_UNICODE);
}
/**
* 列表
*
* @return View|Json
* @throws Exception
*/
public function index()
{
if ($this->request->isPost()) {
$page = input('page/d', 1);
$limit = input('size/d', 20);
$items = RoleModel::findList([], [], $page, $limit, function ($q) {
return $q->order('sort', 'desc')->order('id', 'asc');
});
return $this->json(0, '操作成功', $items);
}
return $this->view();
}
}