Система управления фоновыми разрешениями SpringBoot (3) — модуль разрешений

Spring Boot
Система управления фоновыми разрешениями SpringBoot (3) — модуль разрешений

Создание фоновой структуры разрешений SpringBoot (1) - создание фоновой структуры
Система управления фоновыми полномочиями SpringBoot (2) — интерфейсная инженерная конструкция
Система управления фоновыми разрешениями SpringBoot (3) — модуль разрешений
Система управления фоновыми правами SpringBoot (4) — развертывание

权限模块主要包括用户管理、部门管理、角色管理、菜单管理模块。以下主要从数据库表创建、页面、
接口主要实现点的讲述。

Дизайн базы данных

схема базы данных

Описание таблицы базы данных

  • Таблица пользователей: в основном записывает информацию о пользователе, учетную запись, пароль и т. д.
  • Таблица отдела: в основном записывает информацию, связанную с отделом.
  • Таблица ролей: в основном записывает информацию о взаимоотношениях ролей.
  • Лист меню: в основном запись информации, связанной с меню
  • Таблица отношений ролей пользователей: пользователи и роли находятся в отношениях «многие ко многим».
  • Таблица отношений между ролями и отделами: отделы и роли находятся в отношениях «многие ко многим»
  • Таблица взаимосвязей меню ролей: меню и роль являются отношениями "многие ко многим"

будь осторожен

  • И таблица отделов, и таблица меню являются древовидными структурами, при инициализации проекта в этих двух таблицах инициализируется корневой узел, что удобно для последующего запроса древовидной структуры (так я решил, и это тоже можно решается другими методами), например:

    insert into  sys_dept(dept_id,name) values(-1,'一级部门');
    insert into  sys_menu(menu_id,name) values(-1,'一级菜单');
    
  • В связанной таблице существует ассоциация внешнего ключа, поэтому ее можно автоматически обновлять при изменении или удалении основной таблицы позже.

Управление пользователями

титульная страница

  • страница со списком

  • добавить страницу

  • отредактируйте страницу

  • Путь к внешнему коду

    ─views
        ├─sys
        │  ├─dept
        │  ├─dict
        │  ├─job
        │  ├─menu
        │  ├─role
        │  ├─task
        │  ├─test
        │  └─user
        
    

дизайн интерфейса

  • Запрос списка: адрес доступа к внутреннему интерфейсу/sysuser/list
  • Новые пользователи:/sysuser/adduser
  • Изменить пользователя:/sysuser/edit
  • удалить пользователей:/sysuser/delete

будь осторожен

  • Метод доступа к интерфейсу: использование внешнего интерфейса доступаaxiosметод, используемый во внутреннем контроллере@RequestBodyОбъект тега получает данные

    @RequestMapping(value = "adduser", method = RequestMethod.POST)
    public void addUser(@RequestBody SysUser sysUser, HttpServletRequest request, HttpServletResponse response){...}
    
  • Управление разрешениями: добавить в интерфейс@RequiresPermissionsАннотация, интерфейс могут использовать только люди с указанными разрешениями.В модифицированной системе права пользователей настраиваются в таблице данных.Код аннотации разрешения выглядит следующим образом:

    @RequiresPermissions("userInfo:view")//拥有userInfo:view权限才能查询
    @RequestMapping(value = "list", method = RequestMethod.POST)
    @ResponseBody
    public JSONObject findList(@RequestBody SysUser sysUser, HttpServletRequest request, HttpServletResponse response) {
        List list = sysUserService.findList(sysUser);
        JSONObject obj = new JSONObject();
        obj.put("data", list);
        obj.put("code", 20000);
        obj.put("message", "success");
        return obj;
    }
    

управление ролями

титульная страница

  • список

  • новый

  • редактировать

дизайн интерфейса

  • Список ролей:/sysrole/list

  • Новые роли:/sysrole/add

  • Редактор персонажей:/sysrole/edit

  • Запросы отдела:/sysdept/getTree

  • Запрос меню:/sysmenu/getTree

будь осторожен

  • Авторизация меню: опция проверки авторизации меню по умолчанию на странице редактирования обрабатывается во внешнем JS в соответствии с данными, запрошенными из бэкэнда.Код выглядит следующим образом:

    getMenuTreeCheckedKeys: function(arr, node) {
        var that = this
        if (node.children.length === 0) {
            arr.push(node.menuId)
            return node.menuId
        }
        for (var index in node.children) {
        	that.getMenuTreeCheckedKeys(arr, node.children[index])
        }
        arr.push(node.menuId)
    }
    
  • Авторизация данных: обрабатывается во внешнем JS, код такой:

    getDeptTreeCheckedKeys: function(arr, node) {
        var that = this
        if (node.children.length === 0) {
        	arr.push(node.deptId)
        	return node.deptId
        }
        for (var index in node.children) {
        	that.getDeptTreeCheckedKeys(arr, node.children[index])
        }
        arr.push(node.deptId)
    }
    

Управление отделом

титульная страница

  • список

  • новый

  • редактировать

дизайн интерфейса

  • Список отделов:/sysdept/getTree
  • Департамент добавил:/sysdept/add
  • Редактор отдела:/sysdept/edit
  • Удаление отдела:/sysdept/delete

будь осторожен

  • Список отделов: поскольку список представляет собой древовидную структуру, передайте корневой узел дерева при запросе.deptId, внешний запрос выглядит следующим образом:

    getTree({ deptId: '-1' }).then(response => {
    	that.depts = response.data.children
    })
    

    Внутренний код:

    @RequestMapping("getTree")
    @ResponseBody
    public JSONObject getTree(@RequestBody SysDept sysDept, HttpServletRequest request, HttpServletResponse response) {
        JSONObject jsonObject = new JSONObject();
        SysDept tree = new SysDept();
        tree = sysDeptService.getMenuTree(sysDept.getDeptId());
        jsonObject.put("code", 20000);
        jsonObject.put("data", tree);
        return jsonObject;
    }
    
  • Удаление отдела: поскольку данные отдела находятся в древовидной структуре, если у удаленного узла есть дочерние узлы, он не будет удален, и будет отображаться подсказка.Основной код выглядит следующим образом:

    @RequestMapping(value = "delete", method = RequestMethod.POST)
    public void delete(@RequestBody SysDept sysDeptParam, HttpServletRequest request, 	HttpServletResponse response) {
        int flag = 0;
        JSONObject jsonObject = new JSONObject();
        BigInteger deptId = sysDeptParam.getDeptId();
        SysDept tree = new SysDept();
        tree = sysDeptService.getMenuTree(deptId);
        if (tree.getChildren().size() == 0) {
            SysDept sysDept = new SysDept();
            sysDept.setDeptId(deptId);
            sysDept.setDelFlag(-1);
            flag = sysDeptService.delete(sysDept);
            if (flag > 0) {
                jsonObject.put("status", 200);
            } else {
                jsonObject.put("status", 500);
            }
        } else {
            jsonObject.put("status", 201);
        }
        jsonObject.put("code", 20000);
        try {
            response.getWriter().print(jsonObject.toJSONString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

управление меню

титульная страница

  • Список:

  • новый

  • редактировать

дизайн интерфейса

  • Список запросов:/sysmenu/getTree
  • Новое в меню:/sysmenu/add
  • Редактирование меню:/sysmenu/edit
  • Удаление меню:/sysmenu/delete

будь осторожен

  • Новое меню: можно добавить в соответствии с типом, каталогом, меню, кнопкой
    • Оглавление: отображает первый уровень панели оглавления в левой части страницы.
    • Меню: меню, содержащиеся в каталоге слева.
    • Кнопка: кнопка, отображаемая на странице (эта функция еще не реализована)
  • Авторизация меню: при добавлении меню или изменении меню обязательно обратите внимание菜单路由и授权标识, и может быть настроен с несколькими, посередине на английском языке;интервал.
    • Маршрут меню: это маршрут, по которому внешний интерфейс щелкает в браузере меню, чтобы перейти к нему.
    • Идентификатор авторизации: даshiroИдентификатор проверки должен быть аннотирован методом контроллера.@RequiresPermissionsпоследовательный

заполнить яму

  • Как MyBatis получает самоувеличивающееся значение поля вставленной записи

    добавить в метод вставкиuseGeneratedKeysиkeyPropertyАтрибуты,useGeneratedKeysЕсли установлено значение true, это означает, что если вставленная таблица использует автоматически увеличивающийся столбец в качестве первичного ключа, JDBC разрешено поддерживать автоматически сгенерированный первичный ключ, и автоматически сгенерированный первичный ключ может быть возвращен.

    <insert id="insert" useGeneratedKeys="true" keyProperty="userId" parameterType="com.site.mountain.entity.SysUser">
            INSERT INTO sys_user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userId!=null">`user_id`,</if>
            <if test="username!=null">`username`,</if>
            <if test="password!=null">`password`,</if>
            <if test="email!=null">`email`,</if>
            <if test="mobile!=null">`mobile`,</if>
            <if test="status!=null">`status`,</if>
            <if test="deptId!=null">`dept_id`,</if>
            <if test="createTime!=null">`create_time`,</if>
    
        </trim>
        VALUES
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userId!=null">#{userId},</if>
            <if test="username!=null">#{username},</if>
            <if test="password!=null">#{password},</if>
            <if test="email!=null">#{email},</if>
            <if test="mobile!=null">#{mobile},</if>
            <if test="status!=null">#{status},</if>
            <if test="deptId!=null">#{deptId},</if>
            <if test="createTime!=null">#{createTime},</if>
    
        </trim>
    </insert>
    
  • Каскадное удаление MySQL на основе внешнего ключа: механизм хранения таблиц должен использовать механизм InnoDB.

  • Проблема сбоя транзакции: когда Springboot и shiro framework интегрированы, shiro загружается первым.В настоящее время экземпляр sysUserService не создан, что приводит к сбою транзакции, которая загружается в sysUserService@Lazy, основной код выглядит следующим образом:

    public class MyShiroRealm extends AuthorizingRealm {
        @Autowired
        @Lazy
        private SysUserService sysUserService;
        
        ......
    }
    

разное

В этом проекте я сначала разработал взаимосвязь между таблицами базы данных, а затем использовал написанные гаджеты для преобразования таблиц базы данных в коды JavaBean, xml и mapper.Пожалуйста, смотрите мои гаджеты."генератор кода mybatis, реализованный golang"

Создать гаджетссылка для скачивания

продолжение следует...

  • Интегрировать Swagger2
  • Интегрированный кварцевый каркас
  • Интегрировать докер