You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

859 lines
73 KiB

4 weeks ago
��diff --git a/CONTEXT-MAP.md b/CONTEXT-MAP.md
index f8253ec..71c6541 100644
--- a/CONTEXT-MAP.md
+++ b/CONTEXT-MAP.md
@@ -9,12 +9,12 @@ This is a multi-module Maven monorepo. Each `crm-{i�3q` module is a bounded cont
| `crm-auth` | �t�0 v�m�^���m Y�g'����} | [`crm-auth/CONTEXT.md`](./crm-auth/CONTEXT.md) |
| `crm-dict` | ��HrA]p@iT(���Qt_�~GmeJ�Nq�tO�? | [`crm-dict/CONTEXT.md`](./crm-dict/CONTEXT.md) |
| `crm-file` | “�V"kp:jMP(�mAZ6}/�h�RM�) | [`crm-file/CONTEXT.md`](./crm-file/CONTEXT.md) |
-| `crm-base` | i�y��V�?��1ldes�Ʌ�Y,ȕ�p{T�3 Yq) | _(Ɠ�P�h���s�h�UYq�ta��%)_ |
+| `crm-base` | i�y��V�?��1ldes�Ʌ�Y,ȕ�p{T�3 Yq) | [`crm-base/CONTEXT.md`](./crm-base/CONTEXT.md) |
| `crm-app` | ^���zZ���YO��0[_ | _(Ɠ�P�h���s�h�UYq�ta��%)_ |
## System-wide decisions
-ADR )����} `docs/adr/`(�~d��|�~C�U�~?���OREADME.md` 0��d�X�[�fde\m?ADR-0003 / 0004 / 0006,cm�U�g`m���vȓG��`f�sb� �e� �eqe `/domain-modeling` f�%1�U�~+han�YH�f�YtE��UÓ�`��i)a� ?+ADR )����} `docs/adr/`(�~d��|�~C�U�~?���OREADME.md` 0��d�X�[�fde\m?ADR-0003 / 0004 / 0006,cm�U�g`m���vȓG��`f�sb� �e� �eqe `/domain-modeling` f�%1�U�~+han�YH�f�YtE��UÓ�`��i)a� �ODR-0016 �tg�}\m?PermissionSeeder seam P�]�t(Z%X�j�t&1g�AiHoĕ.aR�p,a�[(��RVYp,a�ucm?��?
## Adding a new context
diff --git a/crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java b/crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java
index 5411a9e..aa18e1b 100644
--- a/crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java
+++ b/crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java
@@ -1,33 +1,33 @@
package com.crm.auth.config;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.crm.auth.domain.entity.SysMenu;
import com.crm.auth.domain.entity.SysRole;
-import com.crm.auth.domain.entity.SysRoleMenu;
import com.crm.auth.domain.enums.DataScopeEnum;
-import com.crm.auth.mapper.SysMenuMapper;
import com.crm.auth.mapper.SysRoleMapper;
-import com.crm.auth.mapper.SysRoleMenuMapper;
+import com.crm.base.domain.dto.ButtonSeed;
+import com.crm.base.domain.dto.PermissionModuleDescriptor;
+import com.crm.base.service.PermissionSeeder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* �~d��|��HrA]R��oP�V�5h}���P�t�Y0}�Y�_��Z���Y��0a 0�Y� ̓�0}Y�G��y��k��?- * <p>R��mP�oT�u�~��`[�?jW�y�B\� zO���qx���UM_W��f� }OW�y�,�x��?button ɓ�Q�j�xv}
- * �����vO�)14Q�t�R.|R��U�Skx���U�aYt�c�X�WDR-0012�Y� ?/p>
+ * <p>R��mP�oT�u�~��`[�?jW�y���}����`��3lC~ {@link PermissionSeeder} seam �~�]�tV�+h���qx���UM_W��f� ?+ * Yt�c�X�~��`/��n]�~��`/��)1�h�~��`(�?button ɓ�Q�j�xv}�����vO�)14Q�t�R.|R��U�Skx���U�aYt�c�X�WDR-0012��NDR-0016�Y� ?/p>
*/
@Slf4j
@Component
+@Order(1)
@RequiredArgsConstructor
public class DataInitializer implements CommandLineRunner {
private final SysRoleMapper sysRoleMapper;
- private final SysMenuMapper sysMenuMapper;
- private final SysRoleMenuMapper sysRoleMenuMapper;
+ private final PermissionSeeder permissionSeeder;
@Override
public void run(String... args) {
@@ -51,115 +51,45 @@ public class DataInitializer implements CommandLineRunner {
log.info("t�0��P�oT�uYt�c�X͓�V���k}", adminRole.getRoleCode());
}
- // ---- �m� �~E0m0��f0}�~d��|�~��` ----
- SysMenu sysManage = findMenu("�~d��|�~��`", 0L);
- if (sysManage == null) {
- sysManage = insertMenu(new MenuSeed("�~d��|�~��`", 0L, 1, null, null, 0));
- }
-
- // ---- \m�\����n] ----
- SysMenu roleManage = findMenu("Yt�c�X�~��`", sysManage.getId());
- if (roleManage == null) {
- roleManage = insertMenu(new MenuSeed("Yt�c�X�~��`", sysManage.getId(), 2,
- "/system/role", "system/role/index", 1));
- }
- SysMenu menuManage = findMenu("��n]�~��`", sysManage.getId());
- if (menuManage == null) {
- menuManage = insertMenu(new MenuSeed("��n]�~��`", sysManage.getId(), 2,
- "/system/menu", "system/menu/index", 2));
- }
- SysMenu deptManage = findMenu("��)1�h�~��`", sysManage.getId());
- if (deptManage == null) {
- deptManage = insertMenu(new MenuSeed("��)1�h�~��`", sysManage.getId(), 2,
- "/system/dept", "system/dept/index", 3));
- }
-
- // ---- Yt�c�X�~��` button ɓ�Q�j�xv}ADR-0012�?----
- insertButtonIfAbsent("Yt�c�XR�Di0", roleManage.getId(), "crm:role:list", "/api/roles/page", 1);
- insertButtonIfAbsent("Yt�c�X�t=�Q", roleManage.getId(), "crm:role:detail", "/api/roles/detail", 2);
- insertButtonIfAbsent("Yt�c�X�m�o�t", roleManage.getId(), "crm:role:save", "/api/roles/saveOrUpdate", 3);
- insertButtonIfAbsent("Yt�c�XR��r�j", roleManage.getId(), "crm:role:delete", "/api/roles/delete", 4);
- insertButtonIfAbsent("ɓ�Q�jR��U�S", roleManage.getId(), "crm:role:assign", "/api/roles/assign-resources", 5);
-
- // ---- Yt�c�X-��n]b~u�"Xx���U�a���0An��� ȓYM_W��f�bɓ�Q�j�xv} ----
- bindIfAbsent(adminRole.getId(), sysManage.getId());
- bindIfAbsent(adminRole.getId(), roleManage.getId());
- bindIfAbsent(adminRole.getId(), menuManage.getId());
- bindIfAbsent(adminRole.getId(), deptManage.getId());
- // b~uYt�c�X�~��`�m,[�kO�)14Q button ɓ�Q�j�?- List<SysMenu> roleButtons = sysMenuMapper.selectList(
- new LambdaQueryWrapper<SysMenu>()
- .eq(SysMenu::getParentId, roleManage.getId())
- .eq(SysMenu::getMenuType, 3));
- for (SysMenu btn : roleButtons) {
- bindIfAbsent(adminRole.getId(), btn.getId());
- }
+ // ---- Yt�c�X�~��`��n] + 5 �m?button ɓ�Q�j�xv}ADR-0012�?----
+ permissionSeeder.seedModule(new PermissionModuleDescriptor(
+ "�~d��|�~��`",
+ "Yt�c�X�~��`",
+ "/system/role",
+ "system/role/index",
+ 1,
+ List.of(
+ new ButtonSeed("Yt�c�XR�Di0", "crm:role:list", "/api/roles/page", 1),
+ new ButtonSeed("Yt�c�X�t=�Q", "crm:role:detail", "/api/roles/detail", 2),
+ new ButtonSeed("Yt�c�X�m�o�t", "crm:role:save", "/api/roles/saveOrUpdate", 3),
+ new ButtonSeed("Yt�c�XR��r�j", "crm:role:delete", "/api/roles/delete", 4),
+ new ButtonSeed("ɓ�Q�jR��U�S", "crm:role:assign", "/api/roles/assign-resources", 5)
+ ),
+ List.of("ROLE_ADMIN")
+ ));
+
+ // ---- ��n]�~��`��n]�X�h button�?----
+ permissionSeeder.seedModule(new PermissionModuleDescriptor(
+ "�~d��|�~��`",
+ "��n]�~��`",
+ "/system/menu",
+ "system/menu/index",
+ 2,
+ List.of(),
+ List.of("ROLE_ADMIN")
+ ));
+
+ // ---- ��)1�h�~��`��n]�X�h button�?----
+ permissionSeeder.seedModule(new PermissionModuleDescriptor(
+ "�~d��|�~��`",
+ "��)1�h�~��`",
+ "/system/dept",
+ "system/dept/index",
+ 3,
+ List.of(),
+ List.of("ROLE_ADMIN")
+ ));
log.info("ɓ�Q�j��HrA]R��oP�V�(h��̓�0lu��?);
}
-
- // ==================== ���P�tHgmT�Y“ĉvx ====================
-
- private SysMenu findMenu(String name, Long parentId) {
- return sysMenuMapper.selectOne(
- new LambdaQueryWrapper<SysMenu>()
- .eq(SysMenu::getMenuName, name)
- .eq(SysMenu::getParentId, parentId));
- }
-
- private SysMenu insertMenu(MenuSeed seed) {
- SysMenu m = new SysMenu();
- m.setParentId(seed.parentId());
- m.setMenuName(seed.name());
- m.setMenuType(seed.type());
- m.setPath(seed.path());
- m.setComponent(seed.component());
- m.setSort(seed.sort());
- m.setVisible(true);
- sysMenuMapper.insert(m);
- log.info("R��m��n]z��PcP�k} (type={})", seed.name(), seed.type());
- return m;
- }
-
- /**
- * ��n]�~�]�t�-l�yĕ?insertMenu (��R�}��,_��Hr ��mY� ?- */
- private record MenuSeed(String name, Long parentId, int type,
- String path, String component, int sort) {
- }
-
- private void insertButtonIfAbsent(String name, Long parentId,
- String perms, String apiUrl, int sort) {
- Long count = sysMenuMapper.selectCount(
- new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getPerms, perms));
- if (count > 0) {
- return;
- }
- SysMenu btn = new SysMenu();
- btn.setParentId(parentId);
- btn.setMenuName(name);
- btn.setMenuType(3);
- btn.setSort(sort);
- btn.setVisible(true);
- btn.setPerms(perms);
- btn.setDenyBehavior("hide");
- btn.setApiUrl(apiUrl);
- btn.setStatus("enabled");
- sysMenuMapper.insert(btn);
- log.info("R��mɓ�Q�j�xv0}{} -> {}", name, perms);
- }
-
- private void bindIfAbsent(Long roleId, Long menuId) {
- Long count = sysRoleMenuMapper.selectCount(
- new LambdaQueryWrapper<SysRoleMenu>()
- .eq(SysRoleMenu::getRoleId, roleId)
- .eq(SysRoleMenu::getMenuId, menuId));
- if (count > 0) {
- return;
- }
- SysRoleMenu rm = new SysRoleMenu();
- rm.setRoleId(roleId);
- rm.setMenuId(menuId);
- sysRoleMenuMapper.insert(rm);
- }
}
diff --git a/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class b/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class
index b6709a2..ff64c05 100644
Binary files a/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class and b/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class differ
diff --git a/crm-dict/src/main/java/com/crm/dict/config/DictPermissionInitializer.java b/crm-dict/src/main/java/com/crm/dict/config/DictPermissionInitializer.java
index b3cc8fe..20a5df5 100644
--- a/crm-dict/src/main/java/com/crm/dict/config/DictPermissionInitializer.java
+++ b/crm-dict/src/main/java/com/crm/dict/config/DictPermissionInitializer.java
@@ -1,25 +1,22 @@
package com.crm.dict.config;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.crm.base.domain.dto.ButtonSeed;
+import com.crm.base.domain.dto.PermissionModuleDescriptor;
+import com.crm.base.service.PermissionSeeder;
import com.crm.dict.constant.DictConstants;
-import com.crm.dict.domain.entity.SysMenuSeed;
-import com.crm.dict.domain.entity.SysRoleMenuSeed;
-import com.crm.dict.domain.entity.SysRoleSeed;
-import com.crm.dict.mapper.SysMenuSeedMapper;
-import com.crm.dict.mapper.SysRoleMenuSeedMapper;
-import com.crm.dict.mapper.SysRoleSeedMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
-import java.util.ArrayList;
import java.util.List;
/**
- * ��HrA]p@iTɓ�Q�j�~�]�tV�5h}���P�t�t[07�?- * <p>Op?10 �m?{@code dict:...} ɓ�Q�j.�zOR�p,a�[R�HrHoĕ/akygZ-a2r�pWys_menu �C%�`t��}��AR�|9p,l4U��x���U�aYt�c�X��?- * �m?crm-auth DataInitializer Ó�r� @��`�1l���qx���U0m0��f�]�o^S�Ww�D��{lOLE_ADMIN �TQ0R�k�pig�V�|9p,l߂ warn
+ * ��HrA]p@iTɓ�Q�j�~�]�tV�5h}���P�t�t[07�I[DR-0016�?+ * <p>��3lC~ {@link PermissionSeeder} seam Op?10 �m?{@code dict:...} ɓ�Q�j.�zOR�p,a�[R�HrHoĕ/akygZ-a2r
+ * �pWys_menu �C%�`t��}��AR�|9p,l4U��x���U�aYt�c�X���P { crm-auth DataInitializer �r� @��`�?+ * �~d��|�~��`)����}�TQ0R�?seam w�D��{lOLE_ADMIN �TQ0R�?seam warn �t�[C~b~u
* �HWrm-auth �h(h��Z���YR��mZ��^}p@iTɓ�Q�jf�$1{Z3 �`T�(1�/b}��?/p>
* <p>ɓ�Q�j�ptSUO��0!| api_url�]krm-auth (�?ApiPermissionInterceptor ��?api_url ���c�Y^gPI�R�k}
* �~�]�tV�'hlu��,a�`�md�l��xv}page/saveOrUpdate/delete/status/set-default �~Y}ȓE��]ɓ�Q��•��F]t���Z��N�1}
@@ -27,15 +24,11 @@ import java.util.List;
*/
@Slf4j
@Component
+@Order(10)
@RequiredArgsConstructor
public class DictPermissionInitializer implements CommandLineRunner {
- private final SysMenuSeedMapper sysMenuMapper;
- private final SysRoleSeedMapper sysRoleMapper;
- private final SysRoleMenuSeedMapper sysRoleMenuMapper;
-
- /** ��Y3c�~��7p�X { crm-auth ��n]�~��7p˓+l�Y�m� w���} */
- private static final int MENU_TYPE_BUTTON = 3;
+ private final PermissionSeeder permissionSeeder;
/** 10 �mE�Hoĕ.acP�~�]�t�?Z��], ɓ�Q�j.�? apiUrl, ���c-|)���PHoĕ.ar�m�^�X�~��g�Y?d8 �m� w�?*/
private static final List<ButtonSeed> BUTTON_SEEDS = List.of(
@@ -54,104 +47,16 @@ public class DictPermissionInitializer implements CommandLineRunner {
public void run(String... args) {
log.info("��F���HrA]p@iTɓ�Q�j�~�]�tV�(h��̓?..");
- // ---- �m� �~E0m0��f0}�~d��|�~��`�"X�]�o���V�[4s}�m?crm-auth DataInitializer $i�T-|�r�S�?----
- SysMenuSeed sysManage = findMenuByName("�~d��|�~��`", 0L);
- if (sysManage == null) {
- sysManage = insertMenu("�~d��|�~��`", 0L, 1, null, null, 0);
- }
-
- // ---- \m�\����n]�-l�f�����tO�i�}���Pjn�~d��|�~��`�m6[} ----
- SysMenuSeed dictMenu = findMenuByName("��HrA]p@iT", sysManage.getId());
- if (dictMenu == null) {
- dictMenu = insertMenu("��HrA]p@iT", sysManage.getId(), 2,
- "/system/dict", "system/dict/index", 4);
- }
-
- // ---- 10 �mE��[����Hoĕ.acP�X�[ perms ���P�t̓�0xV�}\�tf�%1F]�t�[C~�?----
- List<Long> buttonIds = new ArrayList<>(BUTTON_SEEDS.size());
- for (ButtonSeed seed : BUTTON_SEEDS) {
- buttonIds.add(insertButtonIfAbsent(seed.name(), dictMenu.getId(),
- seed.perms(), seed.apiUrl(), seed.sort()));
- }
-
- // ---- b~uP�oT�u�~��`[�?jW�y���}�TQ0�t�[C~ + warn�?----
- SysRoleSeed admin = sysRoleMapper.selectOne(
- new LambdaQueryWrapper<SysRoleSeed>().eq(SysRoleSeed::getRoleCode, "ROLE_ADMIN"));
- if (admin == null) {
- log.warn("P�oT�uYt�c�X ROLE_ADMIN �m�]�tf���}�t�[C~��HrA]p@iTɓ�Q�jb~u�HWrm-auth R��m�t�0W�y��c�`�m+[��Z���Yt�0�|�?);
- return;
- }
- bindIfAbsent(admin.getId(), sysManage.getId());
- bindIfAbsent(admin.getId(), dictMenu.getId());
- for (Long buttonId : buttonIds) {
- bindIfAbsent(admin.getId(), buttonId);
- }
+ permissionSeeder.seedModule(new PermissionModuleDescriptor(
+ "�~d��|�~��`",
+ "��HrA]p@iT",
+ "/system/dict",
+ "system/dict/index",
+ 4,
+ BUTTON_SEEDS,
+ List.of("ROLE_ADMIN")
+ ));
log.info("��HrA]p@iTɓ�Q�j�~�]�tV�(h��̓�0lu��6a0}{} �mE�Hoĕ.acP", BUTTON_SEEDS.size());
}
-
- // ==================== ���P�tHgmT�Y“ĉvx ====================
-
- private SysMenuSeed findMenuByName(String name, Long parentId) {
- return sysMenuMapper.selectOne(new LambdaQueryWrapper<SysMenuSeed>()
- .eq(SysMenuSeed::getMenuName, name)
- .eq(SysMenuSeed::getParentId, parentId));
- }
-
- private SysMenuSeed insertMenu(String name, Long parentId, int type,
- String path, String component, int sort) {
- SysMenuSeed m = new SysMenuSeed();
- m.setParentId(parentId);
- m.setMenuName(name);
- m.setMenuType(type);
- m.setPath(path);
- m.setComponent(component);
- m.setSort(sort);
- m.setVisible(true);
- sysMenuMapper.insert(m);
- log.info("R��m��n]z��PcP�k} (type={})", name, type);
- return m;
- }
-
- /**
- * �� YHoĕ.ar̓�0xV���c�S��Y3cɓ�Q�j�xv}ig�emO�?id�X�Qp:jjnR�kQ~e��pG^ȓ?id�Y� ?- */
- private Long insertButtonIfAbsent(String name, Long parentId, String perms,
- String apiUrl, int sort) {
- SysMenuSeed exist = sysMenuMapper.selectOne(
- new LambdaQueryWrapper<SysMenuSeed>().eq(SysMenuSeed::getPerms, perms));
- if (exist != null) {
- return exist.getId();
- }
- SysMenuSeed btn = new SysMenuSeed();
- btn.setParentId(parentId);
- btn.setMenuName(name);
- btn.setMenuType(MENU_TYPE_BUTTON);
- btn.setSort(sort);
- btn.setVisible(true);
- btn.setPerms(perms);
- btn.setDenyBehavior("hide");
- btn.setApiUrl(apiUrl);
- btn.setStatus("enabled");
- sysMenuMapper.insert(btn);
- log.info("R��mɓ�Q�j�xv0}{} -> {}", name, perms);
- return btn.getId();
- }
-
- private void bindIfAbsent(Long roleId, Long menuId) {
- Long count = sysRoleMenuMapper.selectCount(new LambdaQueryWrapper<SysRoleMenuSeed>()
- .eq(SysRoleMenuSeed::getRoleId, roleId)
- .eq(SysRoleMenuSeed::getMenuId, menuId));
- if (count > 0) {
- return;
- }
- SysRoleMenuSeed rm = new SysRoleMenuSeed();
- rm.setRoleId(roleId);
- rm.setMenuId(menuId);
- sysRoleMenuMapper.insert(rm);
- }
-
- /** ��Y3c�~�]�t�-l�yĕ?insertButtonIfAbsent (��R�}��,_��Hr ��m?*/
- private record ButtonSeed(String name, String perms, String apiUrl, int sort) {
- }
}
diff --git a/crm-dict/src/main/java/com/crm/dict/domain/entity/SysMenuSeed.java b/crm-dict/src/main/java/com/crm/dict/domain/entity/SysMenuSeed.java
deleted file mode 100644
index 9982ea6..0000000
--- a/crm-dict/src/main/java/com/crm/dict/domain/entity/SysMenuSeed.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.crm.dict.domain.entity;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.crm.base.domain.entity.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * ɓ�Q�j�t�R.|͓b6nOp�_�[ē�r�v�pWys_menu �C%�`t��}T07�?- * <p>`moTde\m?crm-dict ���P�t�~�]�tV�(hHoĕ.acP�}\�W���_ {͓?@Entity�,lt%1�} crm-auth (�?SysMenu�?- * ȓ᫈Y�D��N MyBatis-Plus �t��SU��\)OO��] { crm-auth Y�}\�ucm�d�iOp�R�`�m� �[�r0�WDR-0015 ƕ5g�}�t+h�[ɓ�q}��?/p>
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("sys_menu")
-public class SysMenuSeed extends BaseEntity {
-
- /** �mDZ����n]ID�~\trz��PcP�m?0 */
- private Long parentId;
-
- /** ��n]Z��] */
- private String menuName;
-
- /** �~��7p�?=)����} 2=��n] 3=��Y3c */
- private Integer menuType;
-
- /** S��]l��t�qe�t��}�"X0m0�?��n]"���} */
- private String path;
-
- /** S��]l��R"k�t��}�#XM_W��fde�?*/
- private String component;
-
- /** ���c-| */
- private Integer sort;
-
- /** �`Y��F� */
- private Boolean visible;
-
- /** ɓ�Q�j.��O}��Y3c�~DHoĕ-a#r�t�U}�o?dict:item:list�?*/
- private String perms;
-
- /** Ó�rHoĕ-ai(��R�X�~���m4s0}hide ŕ/a�h��[isable �~zOde */
- private String denyBehavior;
-
- /** ɓ�Q�j�-W�Y���O0}enabled Z��de��[isabled K��nde�X�S^p� “a��w�?*/
- private String status;
-
- /** ���0[_ URL�X�[������4d�e�kZ��^l� API �t��}�I[piPermissionInterceptor �� Y�V�R_�SYt�R�W�?*/
- private String apiUrl;
-}
diff --git a/crm-dict/src/main/java/com/crm/dict/domain/entity/SysRoleMenuSeed.java b/crm-dict/src/main/java/com/crm/dict/domain/entity/SysRoleMenuSeed.java
deleted file mode 100644
index dc1d863..0000000
--- a/crm-dict/src/main/java/com/crm/dict/domain/entity/SysRoleMenuSeed.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.crm.dict.domain.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-/**
- * Yt�c�X-�t�R.|b~uȓ� Op�_�[ē�r�v�pWys_role_menu �C%�`t��}T07�?- * <p>`moTde\m?crm-dict ���P�t�~�]�tV�(hiOp�UHoĕ.acPb~uR�g4U��x���U�aYt�c�X�?- * R��~pR�m�]#r @Entity�}\t%1�} crm-auth (�?SysRoleMenu�WDR-0015 ƕ5g�}�t+h�[ɓ�q}��?/p>
- */
-@Data
-@TableName("sys_role_menu")
-public class SysRoleMenuSeed {
-
- @TableId(type = IdType.ASSIGN_ID)
- private Long id;
-
- /** Yt�c�XID */
- private Long roleId;
-
- /** ��n]/ɓ�Q�j�={D */
- private Long menuId;
-}
diff --git a/crm-dict/src/main/java/com/crm/dict/domain/entity/SysRoleSeed.java b/crm-dict/src/main/java/com/crm/dict/domain/entity/SysRoleSeed.java
deleted file mode 100644
index 1a25d56..0000000
--- a/crm-dict/src/main/java/com/crm/dict/domain/entity/SysRoleSeed.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.crm.dict.domain.entity;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.crm.base.domain.entity.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * �~d��|Yt�c�Xȓ� Op�_�[ē�r�v�pWys_role �C%�`t��}T07�?- * <p>`moTde\m?crm-dict ���P�t�~�]�tV�(hi9p+l�}P�oT�u�~��`[�?jW�y�?ROLE_ADMIN�}\�W���_ {͓?@Entity�?- * �[?�00�?crm-auth (�?SysRole�WDR-0015 ƕ5g�}�t+h�[ɓ�q}��?/p>
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("sys_role")
-public class SysRoleSeed extends BaseEntity {
-
- /** Yt�c�XZ��] */
- private String roleName;
-
- /** Yt�c�X+hr�X�� ROLE_ADMIN�?*/
- private String roleCode;
-
- /** ��HrA]|��Q?m�?=ȓ��Il 2=ȓ�4Q•?3=ȓ�4Q•%17_p0a4Q•?4=O�)14Q */
- private Integer dataScope;
-
- /** ���c-| */
- private Integer sort;
-
- /** P�oT�uYt�c�X͓�V���ukrue=�~d��|P�oT�u�m�]r_R��r�j�m�]r_��-W*}.�?*/
- private Boolean builtin;
-}
diff --git a/crm-dict/src/main/java/com/crm/dict/mapper/SysMenuSeedMapper.java b/crm-dict/src/main/java/com/crm/dict/mapper/SysMenuSeedMapper.java
deleted file mode 100644
index 2251978..0000000
--- a/crm-dict/src/main/java/com/crm/dict/mapper/SysMenuSeedMapper.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.crm.dict.mapper;
-
-import com.crm.base.mapper.CrmBaseMapper;
-import com.crm.dict.domain.entity.SysMenuSeed;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * sys_menu ȓ� Op�_�[ē�r�v Mapper�1W07 ɓ�Q�j�~�]�tV�&h{"���}
- */
-@Mapper
-public interface SysMenuSeedMapper extends CrmBaseMapper<SysMenuSeed> {
-}
diff --git a/crm-dict/src/main/java/com/crm/dict/mapper/SysRoleMenuSeedMapper.java b/crm-dict/src/main/java/com/crm/dict/mapper/SysRoleMenuSeedMapper.java
deleted file mode 100644
index c7c98d5..0000000
--- a/crm-dict/src/main/java/com/crm/dict/mapper/SysRoleMenuSeedMapper.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.crm.dict.mapper;
-
-import com.crm.base.mapper.CrmBaseMapper;
-import com.crm.dict.domain.entity.SysRoleMenuSeed;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * sys_role_menu ȓ� Op�_�[ē�r�v Mapper�1W07 ɓ�Q�j�~�]�tV�&h{"���}
- */
-@Mapper
-public interface SysRoleMenuSeedMapper extends CrmBaseMapper<SysRoleMenuSeed> {
-}
diff --git a/crm-dict/src/main/java/com/crm/dict/mapper/SysRoleSeedMapper.java b/crm-dict/src/main/java/com/crm/dict/mapper/SysRoleSeedMapper.java
deleted file mode 100644
index 985c73c..0000000
--- a/crm-dict/src/main/java/com/crm/dict/mapper/SysRoleSeedMapper.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.crm.dict.mapper;
-
-import com.crm.base.mapper.CrmBaseMapper;
-import com.crm.dict.domain.entity.SysRoleSeed;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * sys_role ȓ� Op�_�[ē�r�v Mapper�1W07 ɓ�Q�j�~�]�tV�&h{"���}
- */
-@Mapper
-public interface SysRoleSeedMapper extends CrmBaseMapper<SysRoleSeed> {
-}
diff --git a/crm-dict/src/test/java/com/crm/dict/config/DictPermissionInitializerTest.java b/crm-dict/src/test/java/com/crm/dict/config/DictPermissionInitializerTest.java
index 2c7b490..40d52d9 100644
--- a/crm-dict/src/test/java/com/crm/dict/config/DictPermissionInitializerTest.java
+++ b/crm-dict/src/test/java/com/crm/dict/config/DictPermissionInitializerTest.java
@@ -1,63 +1,34 @@
package com.crm.dict.config;
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.core.MybatisConfiguration;
-import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
-import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
-import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
-import com.crm.base.config.MetaObjectFillHandler;
+import com.crm.base.domain.dto.ButtonSeed;
+import com.crm.base.domain.dto.PermissionModuleDescriptor;
+import com.crm.base.service.PermissionSeeder;
import com.crm.dict.constant.DictConstants;
import com.crm.dict.controller.DictGroupController;
import com.crm.dict.controller.DictItemController;
-import com.crm.dict.domain.entity.SysMenuSeed;
-import com.crm.dict.domain.entity.SysRoleMenuSeed;
-import com.crm.dict.domain.entity.SysRoleSeed;
-import com.crm.dict.mapper.SysMenuSeedMapper;
-import com.crm.dict.mapper.SysRoleMenuSeedMapper;
-import com.crm.dict.mapper.SysRoleSeedMapper;
-import org.apache.ibatis.mapping.Environment;
-import org.apache.ibatis.session.LocalCacheScope;
-import org.apache.ibatis.session.SqlSession;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.session.SqlSessionFactoryBuilder;
-import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
-import org.h2.jdbcx.JdbcDataSource;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
import org.springframework.security.access.prepost.PreAuthorize;
import java.lang.reflect.Method;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Arrays;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.*;
/**
- * T07 ɓ�Q�j�~�]�tV�-h�l��-aty�t�f0}�~�]�tV�'h�` 10 �mE�Hoĕ.acP���P2r��AR�|9p1lx���U�a / ���P�t / ROLE_ADMIN �TQ0�t�[C~ / Controller Z(1�o b�[
- * <p>H2 ��*[OAttT�S�Xb� AbstractDictH2Test�Y1}"Ó�rHoĕ/a��•��f緓?(��R�Y��}O��my�qe crm-auth
- * ApiPermissionInterceptor�X�[ api_url ���c�Y^gPI�R�k}�m?Spring Security �m�o v�?- * ȓ�ty�t�fYs�tzOR�p,a�[\mC�VJZ��Q�t�0�Z��D��j�o b�[�EWpi_url + status=enabled + perms�Y� ?/p>
+ * T07 ɓ�Q�j�~�]�tV�(hty�t�f}ADR-0016�Y0}`i�\ v DictPermissionInitializer ��3lC~ PermissionSeeder seam
+ * �oHr�i�YG� (��RHoĕ-a?_ignb���|\{ Controller �~�cP/u?@PreAuthorize Z(1��?+ * <p>�m�]@Ucm��de H2 �[?sys_menu/sys_role/sys_role_menu t"1� �e� eeam 9p�pG^f�?crm-auth (�?+ * PermissionSeederImplTest �mb��l��-aty�t�f� ?/p>
*/
@DisplayName("T07 ɓ�Q�j�~�]�tV�?)
class DictPermissionInitializerTest {
- private static final AtomicBoolean BOOTSTRAPPED = new AtomicBoolean(false);
-
- private static SqlSessionFactory sqlSessionFactory;
-
- private SqlSession session;
- private SysMenuSeedMapper sysMenuMapper;
- private SysRoleSeedMapper sysRoleMapper;
- private SysRoleMenuSeedMapper sysRoleMenuMapper;
+ private PermissionSeeder permissionSeeder;
private DictPermissionInitializer initializer;
/** 10 �mE�Hoĕ.ar�X { DictConstants + S��]l�“�V0 d8 �m� w���} */
@@ -68,160 +39,39 @@ class DictPermissionInitializerTest {
DictConstants.PERM_ITEM_DELETE, DictConstants.PERM_ITEM_FORCE_DELETE,
DictConstants.PERM_ITEM_STATUS, DictConstants.PERM_ITEM_DEFAULT);
- @BeforeAll
- static void bootstrap() throws Exception {
- if (!BOOTSTRAPPED.compareAndSet(false, true)) {
- return;
- }
- JdbcDataSource ds = new JdbcDataSource();
- ds.setURL("jdbc:h2:mem:dict-perm;MODE=MySQL;DATABASE_TO_LOWER=TRUE;" +
- "CASE_INSENSITIVE_IDENTIFIERS=TRUE;DB_CLOSE_DELAY=-1;NON_KEYWORDS=VALUE");
-
- MybatisConfiguration configuration = new MybatisConfiguration();
- configuration.setEnvironment(new Environment("dict-perm-test", new JdbcTransactionFactory(), ds));
- configuration.setMapUnderscoreToCamelCase(true);
- configuration.setLocalCacheScope(LocalCacheScope.STATEMENT);
-
- MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
- mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
- configuration.addInterceptor(mpInterceptor);
-
- GlobalConfigUtils.getGlobalConfig(configuration).setMetaObjectHandler(new MetaObjectFillHandler());
- GlobalConfigUtils.getGlobalConfig(configuration).setIdentifierGenerator(DefaultIdentifierGenerator.getInstance());
-
- configuration.addMapper(SysMenuSeedMapper.class);
- configuration.addMapper(SysRoleSeedMapper.class);
- configuration.addMapper(SysRoleMenuSeedMapper.class);
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
-
- try (SqlSession s = sqlSessionFactory.openSession(true);
- Statement st = s.getConnection().createStatement()) {
- for (String sql : SCHEMA) {
- st.execute(sql);
- }
- }
- }
-
@BeforeEach
- void setUp() throws SQLException {
- session = sqlSessionFactory.openSession(true);
- try (Statement st = session.getConnection().createStatement()) {
- st.execute("TRUNCATE TABLE sys_role_menu");
- st.execute("TRUNCATE TABLE sys_menu");
- st.execute("TRUNCATE TABLE sys_role");
- }
- sysMenuMapper = session.getMapper(SysMenuSeedMapper.class);
- sysRoleMapper = session.getMapper(SysRoleSeedMapper.class);
- sysRoleMenuMapper = session.getMapper(SysRoleMenuSeedMapper.class);
- initializer = new DictPermissionInitializer(sysMenuMapper, sysRoleMapper, sysRoleMenuMapper);
- }
-
- @AfterEach
- void tearDown() {
- if (session != null) {
- session.close();
- }
+ void setUp() {
+ permissionSeeder = mock(PermissionSeeder.class);
+ initializer = new DictPermissionInitializer(permissionSeeder);
}
@Test
- @DisplayName("�~�]�tV�5h0}�~d��|�~��`/��HrA]p@iT���P2r�?0 �mE�Hoĕ.acP/u?api_url �m�e�|9p1lx���U�a")
- void seedAll_createsTreeAndBindsAdmin() {
- SysRoleSeed admin = insertAdminRole();
-
+ @DisplayName("seedModule �oHr�i�YG� (��R0m0��f� }OM_W��f� ?0 �mE��[����Hoĕ.acP\��\W�y�,��|9p?)
+ void seedModule_declaresCorrectDescriptor() {
initializer.run();
- // )����}�m�^M_W�?- SysMenuSeed sysManage = findMenu("�~d��|�~��`", 0L);
- assertThat(sysManage).isNotNull();
- SysMenuSeed dictMenu = findMenu("��HrA]p@iT", sysManage.getId());
- assertThat(dictMenu).isNotNull();
- assertThat(dictMenu.getMenuType()).isEqualTo(2);
- assertThat(dictMenu.getPath()).isEqualTo("/system/dict");
+ ArgumentCaptor<PermissionModuleDescriptor> captor = ArgumentCaptor.forClass(PermissionModuleDescriptor.class);
+ verify(permissionSeeder, times(1)).seedModule(captor.capture());
+
+ PermissionModuleDescriptor descriptor = captor.getValue();
+ assertThat(descriptor.catalogName()).isEqualTo("�~d��|�~��`");
+ assertThat(descriptor.menuName()).isEqualTo("��HrA]p@iT");
+ assertThat(descriptor.menuPath()).isEqualTo("/system/dict");
+ assertThat(descriptor.menuComponent()).isEqualTo("system/dict/index");
+ assertThat(descriptor.menuSort()).isEqualTo(4);
+ assertThat(descriptor.bindToRoleCodes()).containsExactly("ROLE_ADMIN");
- // 10 �mE�Hoĕ.acP�qkerms �i,a�S��yO�[���᫈h�([� jNnabled��dNpi_url ȕ�p%�WpiPermissionInterceptor T��rGm�o b�[�?- List<SysMenuSeed> buttons = sysMenuMapper.selectList(null).stream()
- .filter(m -> m.getMenuType() == 3)
- .toList();
+ // 10 �mE��[����Hoĕ.acP
+ List<ButtonSeed> buttons = descriptor.buttons();
assertThat(buttons).hasSize(10);
- assertThat(buttons).extracting(SysMenuSeed::getPerms).containsExactlyInAnyOrderElementsOf(PERM_CODES);
+ assertThat(buttons).extracting(ButtonSeed::perms).containsExactlyInAnyOrderElementsOf(PERM_CODES);
+
+ // �Y�_ܑ��Y3c����An apiUrl \�?sort
assertThat(buttons).allSatisfy(b -> {
- assertThat(b.getStatus()).isEqualTo("enabled");
- assertThat(b.getApiUrl()).isNotBlank();
- assertThat(b.getParentId()).isEqualTo(dictMenu.getId());
+ assertThat(b.apiUrl()).isNotBlank();
+ assertThat(b.sort()).isGreaterThanOrEqualTo(1);
+ assertThat(b.name()).isNotBlank();
});
-
- // b~u�~��`[�Hj0})����} + ��n] + 10 ��Y3c
- List<SysRoleMenuSeed> binds = sysRoleMenuMapper.selectList(null);
- assertThat(binds).hasSize(12);
- assertThat(binds).allMatch(b -> b.getRoleId().equals(admin.getId()));
- }
-
- @Test
- @DisplayName("���P�t�6lxV�o�]�Xt|\ {\mESe���]2���n]/ɓ�Q�j�?b~u")
- void seedAll_idempotent() {
- insertAdminRole();
-
- initializer.run();
- initializer.run();
-
- assertThat(sysMenuMapper.selectCount(null)).isEqualTo(12);
- assertThat(sysRoleMenuMapper.selectCount(null)).isEqualTo(12);
- }
-
- @Test
- @DisplayName("ROLE_ADMIN �TQ0�-lHoĕ.acP�C6r�~�]�tV�5h}�t�[C~b~u�m�e {���m}/u?)
- void seedAll_skipsBindingWhenAdminMissing() {
- initializer.run();
-
- assertThat(sysMenuMapper.selectCount(null)).isEqualTo(12);
- assertThat(sysRoleMenuMapper.selectCount(null)).isZero();
- }
-
- @Test
- @DisplayName("�o�]deÓ!2An͓/b0}�~d��|�~��`/��HrA]p@iT�[�c�tf�&1i�m�]�V�[4s}ɓ�Q�j�ĉ�[ perms t�0�}�m�]xV�o?)
- void seedAll_reusesExistingMenuTree() {
- insertAdminRole();
- // �Y!�Z crm-auth DataInitializer �[�c�W�[y�0m0��f}�m�e4QR��UHoĕ.acP�[�c�tf���}/u?apiUrl�?- SysMenuSeed sysManage = new SysMenuSeed();
- sysManage.setParentId(0L);
- sysManage.setMenuName("�~d��|�~��`");
- sysManage.setMenuType(1);
- sysManage.setSort(0);
- sysManage.setVisible(true);
- sysMenuMapper.insert(sysManage);
-
- SysMenuSeed dictMenu = new SysMenuSeed();
- dictMenu.setParentId(sysManage.getId());
- dictMenu.setMenuName("��HrA]p@iT");
- dictMenu.setMenuType(2);
- dictMenu.setPath("/system/dict");
- dictMenu.setSort(4);
- dictMenu.setVisible(true);
- sysMenuMapper.insert(dictMenu);
-
- SysMenuSeed existingButton = new SysMenuSeed();
- existingButton.setParentId(dictMenu.getId());
- existingButton.setMenuName("R��U�|̓�0��");
- existingButton.setMenuType(3);
- existingButton.setPerms(DictConstants.PERM_GROUP_LIST);
- existingButton.setApiUrl("/api/dict/group/page");
- existingButton.setStatus("enabled");
- existingButton.setVisible(true);
- sysMenuMapper.insert(existingButton);
-
- initializer.run();
-
- // ͓b {���]2��6ljo��Y3cz��PcP`m?2 �mN�}��Y3c��g�0 10 �m?- assertThat(sysMenuMapper.selectCount(null)).isEqualTo(12);
- List<SysMenuSeed> buttons = sysMenuMapper.selectList(null).stream()
- .filter(m -> m.getMenuType() == 3)
- .toList();
- assertThat(buttons).extracting(SysMenuSeed::getPerms).containsExactlyInAnyOrderElementsOf(PERM_CODES);
- // �[�c�tf�&1�[����Z~��xO+^ id �m�]xV�[?- assertThat(buttons.stream().filter(b -> b.getPerms().equals(DictConstants.PERM_GROUP_LIST))
- .map(SysMenuSeed::getId)).containsExactly(existingButton.getId());
- // b~ut�0�}
- assertThat(sysRoleMenuMapper.selectCount(null)).isEqualTo(12);
}
@Test
@@ -242,49 +92,10 @@ class DictPermissionInitializerTest {
}
}
- /*-------- HgmT�Y --------*/
-
- private SysRoleSeed insertAdminRole() {
- SysRoleSeed admin = new SysRoleSeed();
- admin.setRoleName("�~��`[�?);
- admin.setRoleCode("ROLE_ADMIN");
- admin.setDataScope(4);
- admin.setSort(0);
- admin.setBuiltin(true);
- sysRoleMapper.insert(admin);
- return admin;
- }
-
- private SysMenuSeed findMenu(String name, Long parentId) {
- return sysMenuMapper.selectList(null).stream()
- .filter(m -> name.equals(m.getMenuName()) && parentId.equals(m.getParentId()))
- .findFirst().orElse(null);
- }
-
/** `m?hasAuthority('xxx') t(1�c�[�_Q���,aG_ɓ�Q�j.�?*/
private static String extractPerm(String expression) {
int start = expression.indexOf('\'');
int end = expression.lastIndexOf('\'');
return expression.substring(start + 1, end);
}
-
- /*-------- �[?�0 DDL�X { crm-auth 9p�p�}�d/p5pR_�}�tkys_menu Z�?perms/api_url �~ Y�X^p�f�W�?-------*/
-
- private static final String[] SCHEMA = {
- "CREATE TABLE IF NOT EXISTS sys_menu (" +
- "id BIGINT NOT NULL PRIMARY KEY, creator_id VARCHAR(50), create_time DATETIME, " +
- "updater_id VARCHAR(50), update_time DATETIME, deleted TINYINT NOT NULL DEFAULT 0, " +
- "parent_id BIGINT NOT NULL DEFAULT 0, menu_name VARCHAR(50) NOT NULL, " +
- "menu_type TINYINT NOT NULL, path VARCHAR(200), component VARCHAR(200), icon VARCHAR(50), " +
- "sort INT DEFAULT 0, visible TINYINT DEFAULT 1, description VARCHAR(100), " +
- "perms VARCHAR(100), deny_behavior VARCHAR(16), status VARCHAR(16) DEFAULT 'enabled', " +
- "api_url VARCHAR(200))",
- "CREATE TABLE IF NOT EXISTS sys_role (" +
- "id BIGINT NOT NULL PRIMARY KEY, creator_id VARCHAR(50), create_time DATETIME, " +
- "updater_id VARCHAR(50), update_time DATETIME, deleted TINYINT NOT NULL DEFAULT 0, " +
- "role_name VARCHAR(50), role_code VARCHAR(50), data_scope TINYINT, sort INT, " +
- "remark VARCHAR(200), builtin BOOLEAN DEFAULT FALSE)",
- "CREATE TABLE IF NOT EXISTS sys_role_menu (" +
- "id BIGINT NOT NULL PRIMARY KEY, role_id BIGINT NOT NULL, menu_id BIGINT NOT NULL)",
- };
}