Создание фоновой структуры разрешений 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
- Интегрированный кварцевый каркас
- Интегрировать докер