123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- <?php
- namespace app\common\library;
- use app\admin\model\MenuRule;
- use app\admin\model\UserRule;
- use think\db\exception\DbException;
- use think\db\exception\DataNotFoundException;
- use think\db\exception\ModelNotFoundException;
- /**
- * 后台菜单类
- */
- class Menu
- {
- /**
- * @param array $menu
- * @param int|string $parent 父级规则name或id
- * @param string $mode 添加模式(规则重复时):cover=覆盖旧菜单,rename=重命名新菜单,ignore=忽略
- * @param string $position 位置:backend=后台,frontend=前台
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- */
- public static function create(array $menu, $parent = 0, string $mode = 'cover', string $position = 'backend')
- {
- $pid = 0;
- $model = $position == 'backend' ? new MenuRule() : new UserRule();
- $parentRule = $model->where((is_numeric($parent) ? 'id' : 'name'), $parent)->find();
- if ($parentRule) {
- $pid = $parentRule['id'];
- }
- foreach ($menu as $item) {
- if (!self::requiredAttrCheck($item)) {
- continue;
- }
- // 属性
- $item['status'] = '1';
- if (!isset($item['pid']) && $pid) {
- $item['pid'] = $pid;
- }
- $oldMenu = $model->where('name', $item['name'])->find();
- if ($oldMenu) {
- // 存在相关名称的菜单规则
- if ($mode == 'cover') {
- $oldMenu->save($item);
- } elseif ($mode == 'rename') {
- $count = $model->where('name', $item['name'])->count();
- $item['name'] = $item['name'] . '-conflicting-' . $count;
- $item['title'] = $item['title'] . '-conflicting-' . $count;
- $oldMenu = $model->create($item);
- } elseif ($mode == 'ignore') {
- $oldMenu = $menu;
- }
- } else {
- $oldMenu = $model->create($item);
- }
- if (isset($item['children']) && $item['children']) {
- self::create($item['children'], $oldMenu['name'], $mode, $position);
- }
- }
- }
- /**
- * 删菜单
- * @param string|int $id 规则name或id
- * @param bool $recursion 是否递归删除子级菜单、是否删除自身,是否删除上级空菜单
- * @param string $position 位置:backend=后台,frontend=前台
- * @return bool
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- */
- public static function delete($id, bool $recursion = false, string $position = 'backend'): bool
- {
- if (!$id) {
- return true;
- }
- $model = $position == 'backend' ? new MenuRule() : new UserRule();
- $menuRule = $model->where((is_numeric($id) ? 'id' : 'name'), $id)->find();
- if (!$menuRule) {
- return true;
- }
- $children = $model->where('pid', $menuRule['id'])->select()->toArray();
- if ($recursion && $children) {
- foreach ($children as $child) {
- self::delete($child['id'], true, $position);
- }
- }
- if (!$children || $recursion) {
- $menuRule->delete();
- self::delete($menuRule->pid, false, $position);
- }
- return true;
- }
- /**
- * 启用菜单
- * @param string|int $id 规则name或id
- * @param string $position 位置:backend=后台,frontend=前台
- * @return bool
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- */
- public static function enable($id, string $position = 'backend'): bool
- {
- $model = $position == 'backend' ? new MenuRule() : new UserRule();
- $menuRule = $model->where((is_numeric($id) ? 'id' : 'name'), $id)->find();
- if (!$menuRule) {
- return false;
- }
- $menuRule->status = '1';
- $menuRule->save();
- return true;
- }
- /**
- * 禁用菜单
- * @param string|int $id 规则name或id
- * @param string $position 位置:backend=后台,frontend=前台
- * @return bool
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- */
- public static function disable($id, string $position = 'backend'): bool
- {
- $model = $position == 'backend' ? new MenuRule() : new UserRule();
- $menuRule = $model->where((is_numeric($id) ? 'id' : 'name'), $id)->find();
- if (!$menuRule) {
- return false;
- }
- $menuRule->status = '0';
- $menuRule->save();
- return true;
- }
- public static function requiredAttrCheck($menu): bool
- {
- $attrs = ['type', 'title', 'name'];
- foreach ($attrs as $attr) {
- if (!array_key_exists($attr, $menu)) {
- return false;
- }
- if (!$menu[$attr]) {
- return false;
- }
- }
- return true;
- }
- }
|