diff --git a/snowy-admin-web/src/api/biz/bizGroupApi.js b/snowy-admin-web/src/api/biz/bizGroupApi.js
new file mode 100644
index 00000000..bd2b5c57
--- /dev/null
+++ b/snowy-admin-web/src/api/biz/bizGroupApi.js
@@ -0,0 +1,44 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/biz/group/` + url, ...arg)
+
+/**
+ * 用户组Api接口管理器
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+export default {
+ // 获取用户组分页
+ bizGroupPage(data) {
+ return request('page', data, 'get')
+ },
+ // 提交用户组表单 edit为true时为编辑,默认为新增
+ bizGroupSubmitForm(data, edit = false) {
+ return request(edit ? 'edit' : 'add', data)
+ },
+ // 删除用户组
+ bizGroupDelete(data) {
+ return request('delete', data)
+ },
+ // 获取用户组详情
+ bizGroupDetail(data) {
+ return request('detail', data, 'get')
+ },
+ // 获取用户组下的用户
+ bizGroupOwnUser(data) {
+ return request('ownUser', data, 'get')
+ },
+ // 获取机构树
+ bizGroupOrgTreeSelector(data) {
+ return request('orgTreeSelector', data, 'get')
+ },
+ // 获取用户选择器
+ bizGroupUserSelector(data) {
+ return request('userSelector', data, 'get')
+ },
+ // 给用户组授权用户
+ bizGroupGrantUser(data) {
+ return request('grantUser', data)
+ }
+}
diff --git a/snowy-admin-web/src/api/sys/groupApi.js b/snowy-admin-web/src/api/sys/groupApi.js
new file mode 100644
index 00000000..6959bdb3
--- /dev/null
+++ b/snowy-admin-web/src/api/sys/groupApi.js
@@ -0,0 +1,44 @@
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/sys/group/` + url, ...arg)
+
+/**
+ * 用户组Api接口管理器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+export default {
+ // 获取用户组分页
+ sysGroupPage(data) {
+ return request('page', data, 'get')
+ },
+ // 提交用户组表单 edit为true时为编辑,默认为新增
+ sysGroupSubmitForm(data, edit = false) {
+ return request(edit ? 'edit' : 'add', data)
+ },
+ // 删除用户组
+ sysGroupDelete(data) {
+ return request('delete', data)
+ },
+ // 获取用户组详情
+ sysGroupDetail(data) {
+ return request('detail', data, 'get')
+ },
+ // 获取用户组下的用户
+ sysGroupOwnUser(data) {
+ return request('ownUser', data, 'get')
+ },
+ // 获取机构树
+ sysGroupOrgTreeSelector(data) {
+ return request('orgTreeSelector', data, 'get')
+ },
+ // 获取用户选择器
+ sysGroupUserSelector(data) {
+ return request('userSelector', data, 'get')
+ },
+ // 给用户组授权用户
+ sysGroupGrantUser(data) {
+ return request('grantUser', data)
+ }
+}
diff --git a/snowy-admin-web/src/views/biz/group/form.vue b/snowy-admin-web/src/views/biz/group/form.vue
new file mode 100644
index 00000000..1be0f789
--- /dev/null
+++ b/snowy-admin-web/src/views/biz/group/form.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关闭
+ 保存
+
+
+
+
+
diff --git a/snowy-admin-web/src/views/biz/group/index.vue b/snowy-admin-web/src/views/biz/group/index.vue
new file mode 100644
index 00000000..d0c7f56a
--- /dev/null
+++ b/snowy-admin-web/src/views/biz/group/index.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+ 编辑
+
+ 授权用户
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/snowy-admin-web/src/views/sys/group/form.vue b/snowy-admin-web/src/views/sys/group/form.vue
new file mode 100644
index 00000000..7d8f165a
--- /dev/null
+++ b/snowy-admin-web/src/views/sys/group/form.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关闭
+ 保存
+
+
+
+
+
diff --git a/snowy-admin-web/src/views/sys/group/index.vue b/snowy-admin-web/src/views/sys/group/index.vue
new file mode 100644
index 00000000..60927f6c
--- /dev/null
+++ b/snowy-admin-web/src/views/sys/group/index.vue
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+ 编辑
+
+ 授权用户
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysGroupApi.java b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysGroupApi.java
new file mode 100644
index 00000000..ddeabce0
--- /dev/null
+++ b/snowy-plugin-api/snowy-plugin-sys-api/src/main/java/vip/xiaonuo/sys/api/SysGroupApi.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.api;
+
+import java.util.List;
+
+/**
+ * 用户Api
+ *
+ * @author xuyuxiang
+ * @date 2022/6/6 11:33
+ **/
+public interface SysGroupApi {
+
+
+ /**
+ * 获取用户组拥有人员
+ *
+ * @author xuyuxiang
+ * @date 2022/5/13 21:00
+ */
+ List ownUser(String userId);
+
+ /**
+ * 给用户组授权用户
+ *
+ * @author xuyuxiang
+ * @date 2022/8/1 18:28
+ */
+ void grantUser(String userId, List roleIdList);
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/controller/BizGroupController.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/controller/BizGroupController.java
new file mode 100644
index 00000000..7ec8b1dd
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/controller/BizGroupController.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.lang.tree.Tree;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.biz.modular.group.param.*;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.biz.modular.group.entity.BizGroup;
+import vip.xiaonuo.biz.modular.group.service.BizGroupService;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 用户组控制器
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+@Tag(name = "用户组控制器")
+@RestController
+@Validated
+public class BizGroupController {
+
+ @Resource
+ private BizGroupService bizGroupService;
+
+ /**
+ * 获取用户组分页
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ @Operation(summary = "获取用户组分页")
+ @SaCheckPermission("/biz/group/page")
+ @GetMapping("/biz/group/page")
+ public CommonResult> page(BizGroupPageParam bizGroupPageParam) {
+ return CommonResult.data(bizGroupService.page(bizGroupPageParam));
+ }
+
+ /**
+ * 添加用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ @Operation(summary = "添加用户组")
+ @CommonLog("添加用户组")
+ @SaCheckPermission("/biz/group/add")
+ @PostMapping("/biz/group/add")
+ public CommonResult add(@RequestBody @Valid BizGroupAddParam bizGroupAddParam) {
+ bizGroupService.add(bizGroupAddParam);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 编辑用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ @Operation(summary = "编辑用户组")
+ @CommonLog("编辑用户组")
+ @SaCheckPermission("/biz/group/edit")
+ @PostMapping("/biz/group/edit")
+ public CommonResult edit(@RequestBody @Valid BizGroupEditParam bizGroupEditParam) {
+ bizGroupService.edit(bizGroupEditParam);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 删除用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ @Operation(summary = "删除用户组")
+ @CommonLog("删除用户组")
+ @SaCheckPermission("/biz/group/delete")
+ @PostMapping("/biz/group/delete")
+ public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+ List bizGroupIdParamList) {
+ bizGroupService.delete(bizGroupIdParamList);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 获取用户组详情
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ @Operation(summary = "获取用户组详情")
+ @SaCheckPermission("/biz/group/detail")
+ @GetMapping("/biz/group/detail")
+ public CommonResult detail(@Valid BizGroupIdParam bizGroupIdParam) {
+ return CommonResult.data(bizGroupService.detail(bizGroupIdParam));
+ }
+
+ /**
+ * 获取用户组下的用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取用户组下的用户")
+ @SaCheckPermission("/biz/group/ownUser")
+ @GetMapping("/biz/group/ownUser")
+ public CommonResult> ownUser(@Valid BizGroupIdParam bizGroupIdParam) {
+ return CommonResult.data(bizGroupService.ownUser(bizGroupIdParam));
+ }
+
+ /**
+ * 获取组织树选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取组织树选择器")
+ @SaCheckPermission("/biz/group/orgTreeSelector")
+ @GetMapping("/biz/group/orgTreeSelector")
+ public CommonResult>> orgTreeSelector() {
+ return CommonResult.data(bizGroupService.orgTreeSelector());
+ }
+
+ /**
+ * 获取用户选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取用户选择器")
+ @SaCheckPermission("/biz/group/userSelector")
+ @GetMapping("/biz/group/userSelector")
+ public CommonResult> userSelector(BizGroupSelectorUserParam bizGroupSelectorUserParam) {
+ return CommonResult.data(bizGroupService.userSelector(bizGroupSelectorUserParam));
+ }
+
+ /**
+ * 给用户组授权用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "给用户组授权用户")
+ @CommonLog("给用户组授权用户")
+ @SaCheckPermission("/biz/group/grantUser")
+ @PostMapping("/biz/group/grantUser")
+ public CommonResult grantUser(@RequestBody @Valid BizGroupGrantUserParam bizGroupGrantUserParam) {
+ bizGroupService.grantUser(bizGroupGrantUserParam);
+ return CommonResult.ok();
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/entity/BizGroup.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/entity/BizGroup.java
new file mode 100644
index 00000000..6870cdae
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/entity/BizGroup.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+/**
+ * 用户组实体
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+@Getter
+@Setter
+@TableName("SYS_GROUP")
+public class BizGroup extends CommonEntity {
+
+ /** 主键 */
+ @TableId
+ @Schema(description = "主键")
+ private String id;
+
+ /** 名称 */
+ @Schema(description = "名称")
+ private String name;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+ /** 排序码 */
+ @Schema(description = "排序码")
+ private Integer sortCode;
+
+ /** 扩展信息 */
+ @Schema(description = "扩展信息")
+ private String extJson;
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/enums/BizGroupEnum.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/enums/BizGroupEnum.java
new file mode 100644
index 00000000..c3ad49fe
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/enums/BizGroupEnum.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.enums;
+
+import lombok.Getter;
+
+/**
+ * 用户组枚举
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+@Getter
+public enum BizGroupEnum {
+
+ /** 测试 */
+ TEST("TEST");
+
+ private final String value;
+
+ BizGroupEnum(String value) {
+ this.value = value;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/mapper/BizGroupMapper.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/mapper/BizGroupMapper.java
new file mode 100644
index 00000000..88ad10dd
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/mapper/BizGroupMapper.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.biz.modular.group.entity.BizGroup;
+
+/**
+ * 用户组Mapper接口
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+public interface BizGroupMapper extends BaseMapper {
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/mapper/mapping/BizGroupMapper.xml b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/mapper/mapping/BizGroupMapper.xml
new file mode 100644
index 00000000..34b35a0a
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/mapper/mapping/BizGroupMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupAddParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupAddParam.java
new file mode 100644
index 00000000..48093c10
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupAddParam.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * 用户组添加参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+@Getter
+@Setter
+public class BizGroupAddParam {
+
+ /** 名称 */
+ @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "name不能为空")
+ private String name;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+ /** 排序码 */
+ @Schema(description = "排序码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "sortCode不能为空")
+ private Integer sortCode;
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupEditParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupEditParam.java
new file mode 100644
index 00000000..9b14c16b
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupEditParam.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * 用户组编辑参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+@Getter
+@Setter
+public class BizGroupEditParam {
+
+ /** 主键 */
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "id不能为空")
+ private String id;
+
+ /** 名称 */
+ @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "name不能为空")
+ private String name;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+ /** 排序码 */
+ @Schema(description = "排序码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "sortCode不能为空")
+ private Integer sortCode;
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupGrantUserParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupGrantUserParam.java
new file mode 100644
index 00000000..e023f89c
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupGrantUserParam.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 用户组授权用户参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class BizGroupGrantUserParam {
+
+ /** 用户组id */
+ @Schema(description = "用户组id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "id不能为空")
+ private String id;
+
+ /** 授权用户信息 */
+ @Schema(description = "授权用户信息", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "grantInfoList不能为空")
+ private List grantInfoList;
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupIdParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupIdParam.java
new file mode 100644
index 00000000..7df88659
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupIdParam.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 用户组Id参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+@Getter
+@Setter
+public class BizGroupIdParam {
+
+ /** 主键 */
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "id不能为空")
+ private String id;
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupPageParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupPageParam.java
new file mode 100644
index 00000000..3ae858c1
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupPageParam.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 用户组查询参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+@Getter
+@Setter
+public class BizGroupPageParam {
+
+ /** 当前页 */
+ @Schema(description = "当前页码")
+ private Integer current;
+
+ /** 每页条数 */
+ @Schema(description = "每页条数")
+ private Integer size;
+
+ /** 排序字段 */
+ @Schema(description = "排序字段,字段驼峰名称,如:userName")
+ private String sortField;
+
+ /** 排序方式 */
+ @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+ private String sortOrder;
+
+ /** 关键词 */
+ @Schema(description = "关键词")
+ private String searchKey;
+
+ /** 名称 */
+ @Schema(description = "名称")
+ private String name;
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupSelectorUserParam.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupSelectorUserParam.java
new file mode 100644
index 00000000..3715100a
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/param/BizGroupSelectorUserParam.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 用户选择器参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class BizGroupSelectorUserParam {
+
+ /** 当前页 */
+ @Schema(description = "当前页码")
+ private Integer current;
+
+ /** 每页条数 */
+ @Schema(description = "每页条数")
+ private Integer size;
+
+ /** 组织id */
+ @Schema(description = "组织id")
+ private String orgId;
+
+ /** 姓名关键词 */
+ @Schema(description = "姓名关键词")
+ private String searchKey;
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/service/BizGroupService.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/service/BizGroupService.java
new file mode 100644
index 00000000..ce6fcc81
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/service/BizGroupService.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.biz.modular.group.entity.BizGroup;
+import vip.xiaonuo.biz.modular.group.param.*;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
+
+import java.util.List;
+
+/**
+ * 用户组Service接口
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+public interface BizGroupService extends IService {
+
+ /**
+ * 获取用户组分页
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ Page page(BizGroupPageParam bizGroupPageParam);
+
+ /**
+ * 添加用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ void add(BizGroupAddParam bizGroupAddParam);
+
+ /**
+ * 编辑用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ void edit(BizGroupEditParam bizGroupEditParam);
+
+ /**
+ * 删除用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ void delete(List bizGroupIdParamList);
+
+ /**
+ * 获取用户组详情
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ */
+ BizGroup detail(BizGroupIdParam bizGroupIdParam);
+
+ /**
+ * 获取用户组详情
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+ BizGroup queryEntity(String id);
+
+ /**
+ * 获取用户组下的用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ List ownUser(BizGroupIdParam sysGroupIdParam);
+
+ /**
+ * 获取机构树选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ List> orgTreeSelector();
+
+ /**
+ * 获取用户选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ Page userSelector(BizGroupSelectorUserParam bizGroupSelectorUserParam);
+
+ /**
+ * 给用户组授权用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ void grantUser(BizGroupGrantUserParam bizGroupGrantUserParam);
+}
diff --git a/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/service/impl/BizGroupServiceImpl.java b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/service/impl/BizGroupServiceImpl.java
new file mode 100644
index 00000000..a178abe8
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/group/service/impl/BizGroupServiceImpl.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.group.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNode;
+import cn.hutool.core.lang.tree.TreeUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.biz.modular.group.param.*;
+import vip.xiaonuo.biz.modular.org.entity.BizOrg;
+import vip.xiaonuo.biz.modular.org.service.BizOrgService;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
+import vip.xiaonuo.biz.modular.user.service.BizUserService;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.biz.modular.group.entity.BizGroup;
+import vip.xiaonuo.biz.modular.group.mapper.BizGroupMapper;
+import vip.xiaonuo.biz.modular.group.service.BizGroupService;
+import vip.xiaonuo.sys.api.SysGroupApi;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 用户组Service接口实现类
+ *
+ * @author yubaoshan
+ * @date 2024/12/24 03:33
+ **/
+@Service
+public class BizGroupServiceImpl extends ServiceImpl implements BizGroupService {
+
+ @Resource
+ private SysGroupApi sysGroupApi;
+
+ @Resource
+ private BizUserService bizUserService;
+
+ @Resource
+ private BizOrgService bizOrgService;
+
+ @Override
+ public Page page(BizGroupPageParam bizGroupPageParam) {
+ QueryWrapper queryWrapper = new QueryWrapper().checkSqlInjection();
+ if(ObjectUtil.isNotEmpty(bizGroupPageParam.getName())) {
+ queryWrapper.lambda().like(BizGroup::getName, bizGroupPageParam.getName());
+ }
+ if(ObjectUtil.isAllNotEmpty(bizGroupPageParam.getSortField(), bizGroupPageParam.getSortOrder())) {
+ CommonSortOrderEnum.validate(bizGroupPageParam.getSortOrder());
+ queryWrapper.orderBy(true, bizGroupPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+ StrUtil.toUnderlineCase(bizGroupPageParam.getSortField()));
+ } else {
+ queryWrapper.lambda().orderByAsc(BizGroup::getSortCode);
+ }
+ return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void add(BizGroupAddParam bizGroupAddParam) {
+ BizGroup bizGroup = BeanUtil.toBean(bizGroupAddParam, BizGroup.class);
+ this.save(bizGroup);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void edit(BizGroupEditParam bizGroupEditParam) {
+ BizGroup bizGroup = this.queryEntity(bizGroupEditParam.getId());
+ BeanUtil.copyProperties(bizGroupEditParam, bizGroup);
+ this.updateById(bizGroup);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void delete(List bizGroupIdParamList) {
+ // 执行删除
+ this.removeByIds(CollStreamUtil.toList(bizGroupIdParamList, BizGroupIdParam::getId));
+ }
+
+ @Override
+ public BizGroup detail(BizGroupIdParam bizGroupIdParam) {
+ return this.queryEntity(bizGroupIdParam.getId());
+ }
+
+ @Override
+ public BizGroup queryEntity(String id) {
+ BizGroup bizGroup = this.getById(id);
+ if(ObjectUtil.isEmpty(bizGroup)) {
+ throw new CommonException("用户组不存在,id值为:{}", id);
+ }
+ return bizGroup;
+ }
+
+ @Override
+ public List ownUser(BizGroupIdParam sysGroupIdParam) {
+ return sysGroupApi.ownUser(sysGroupIdParam.getId());
+ }
+
+ @Override
+ public List> orgTreeSelector() {
+ // 获取所有机构
+ List allOrgList = bizOrgService.list();
+ // 定义机构集合
+ Set bizOrgSet = CollectionUtil.newHashSet();
+ // 校验数据范围
+ List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
+ if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+ loginUserDataScope.forEach(orgId -> bizOrgSet.addAll(bizOrgService.getParentListById(allOrgList, orgId, true)));
+ } else {
+ return CollectionUtil.newArrayList();
+ }
+ List> treeNodeList = bizOrgSet.stream().map(bizOrg ->
+ new TreeNode<>(bizOrg.getId(), bizOrg.getParentId(),
+ bizOrg.getName(), bizOrg.getSortCode()).setExtra(JSONUtil.parseObj(bizOrg)))
+ .collect(Collectors.toList());
+ return TreeUtil.build(treeNodeList, "0");
+ }
+
+ @Override
+ public Page userSelector(BizGroupSelectorUserParam bizGroupSelectorUserParam) {
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ // 校验数据范围
+ List loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
+ if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
+ lambdaQueryWrapper.in(BizUser::getOrgId, loginUserDataScope);
+ } else {
+ return new Page<>();
+ }
+ // 只查询部分字段
+ lambdaQueryWrapper.select(BizUser::getId, BizUser::getAvatar, BizUser::getOrgId, BizUser::getPositionId, BizUser::getAccount,
+ BizUser::getName, BizUser::getSortCode, BizUser::getGender, BizUser::getEntryDate);
+ if (ObjectUtil.isNotEmpty(bizGroupSelectorUserParam.getOrgId())) {
+ // 如果机构id不为空,则查询该机构及其子机构下的所有人
+ List childOrgIdList = CollStreamUtil.toList(bizOrgService.getChildListById(bizOrgService
+ .getAllOrgList(), bizGroupSelectorUserParam.getOrgId(), true), BizOrg::getId);
+ if (ObjectUtil.isNotEmpty(childOrgIdList)) {
+ lambdaQueryWrapper.in(BizUser::getOrgId, childOrgIdList);
+ } else {
+ return new Page<>();
+ }
+ }
+ if(ObjectUtil.isNotEmpty(bizGroupSelectorUserParam.getSearchKey())) {
+ lambdaQueryWrapper.like(BizUser::getName, bizGroupSelectorUserParam.getSearchKey());
+ }
+ lambdaQueryWrapper.orderByAsc(BizUser::getSortCode);
+ return bizUserService.page(CommonPageRequest.defaultPage(), lambdaQueryWrapper);
+ }
+
+ @Override
+ public void grantUser(BizGroupGrantUserParam bizGroupGrantUserParam) {
+ sysGroupApi.grantUser(bizGroupGrantUserParam.getId(), bizGroupGrantUserParam.getGrantInfoList());
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/controller/SysGroupController.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/controller/SysGroupController.java
new file mode 100644
index 00000000..ab1411e6
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/controller/SysGroupController.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.controller;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.sys.modular.group.entity.SysGroup;
+import vip.xiaonuo.sys.modular.group.param.*;
+import vip.xiaonuo.sys.modular.group.service.SysGroupService;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import vip.xiaonuo.sys.modular.user.entity.SysUser;
+
+import java.util.List;
+
+/**
+ * 用户组控制器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+@Tag(name = "用户组控制器")
+@RestController
+@Validated
+public class SysGroupController {
+
+ @Resource
+ private SysGroupService sysGroupService;
+
+ /**
+ * 获取用户组分页
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取用户组分页")
+ @GetMapping("/sys/group/page")
+ public CommonResult> page(SysGroupPageParam sysGroupPageParam) {
+ return CommonResult.data(sysGroupService.page(sysGroupPageParam));
+ }
+
+ /**
+ * 添加用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "添加用户组")
+ @CommonLog("添加用户组")
+ @PostMapping("/sys/group/add")
+ public CommonResult add(@RequestBody @Valid SysGroupAddParam sysGroupAddParam) {
+ sysGroupService.add(sysGroupAddParam);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 编辑用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "编辑用户组")
+ @CommonLog("编辑用户组")
+ @PostMapping("/sys/group/edit")
+ public CommonResult edit(@RequestBody @Valid SysGroupEditParam sysGroupEditParam) {
+ sysGroupService.edit(sysGroupEditParam);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 删除用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "删除用户组")
+ @CommonLog("删除用户组")
+ @PostMapping("/sys/group/delete")
+ public CommonResult delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+ List sysGroupIdParamList) {
+ sysGroupService.delete(sysGroupIdParamList);
+ return CommonResult.ok();
+ }
+
+ /**
+ * 获取用户组详情
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取用户组详情")
+ @GetMapping("/sys/group/detail")
+ public CommonResult detail(@Valid SysGroupIdParam sysGroupIdParam) {
+ return CommonResult.data(sysGroupService.detail(sysGroupIdParam));
+ }
+
+ /**
+ * 获取用户组下的用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取用户组下的用户")
+ @GetMapping("/sys/group/ownUser")
+ public CommonResult> ownUser(@Valid SysGroupIdParam sysGroupIdParam) {
+ return CommonResult.data(sysGroupService.ownUser(sysGroupIdParam));
+ }
+
+ /**
+ * 获取组织树选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取组织树选择器")
+ @GetMapping("/sys/group/orgTreeSelector")
+ public CommonResult>> orgTreeSelector() {
+ return CommonResult.data(sysGroupService.orgTreeSelector());
+ }
+
+ /**
+ * 获取用户选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "获取用户选择器")
+ @GetMapping("/sys/group/userSelector")
+ public CommonResult> userSelector(SysGroupSelectorUserParam sysGroupSelectorUserParam) {
+ return CommonResult.data(sysGroupService.userSelector(sysGroupSelectorUserParam));
+ }
+
+ /**
+ * 给用户组授权用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ @Operation(summary = "给用户组授权用户")
+ @CommonLog("给用户组授权用户")
+ @PostMapping("/sys/group/grantUser")
+ public CommonResult grantUser(@RequestBody @Valid SysGroupGrantUserParam sysGroupGrantUserParam) {
+ sysGroupService.grantUser(sysGroupGrantUserParam);
+ return CommonResult.ok();
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/entity/SysGroup.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/entity/SysGroup.java
new file mode 100644
index 00000000..60bd0a90
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/entity/SysGroup.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+
+/**
+ * 用户组实体
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+@TableName("SYS_GROUP")
+public class SysGroup extends CommonEntity {
+
+ /** 主键 */
+ @TableId
+ @Schema(description = "主键")
+ private String id;
+
+ /** 名称 */
+ @Schema(description = "名称")
+ private String name;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+ /** 排序码 */
+ @Schema(description = "排序码")
+ private Integer sortCode;
+
+ /** 扩展信息 */
+ @Schema(description = "扩展信息")
+ private String extJson;
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/enums/SysGroupEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/enums/SysGroupEnum.java
new file mode 100644
index 00000000..37cbaab8
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/enums/SysGroupEnum.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.enums;
+
+import lombok.Getter;
+
+/**
+ * 用户组枚举
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+public enum SysGroupEnum {
+
+ /** 测试 */
+ TEST("TEST");
+
+ private final String value;
+
+ SysGroupEnum(String value) {
+ this.value = value;
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/mapper/SysGroupMapper.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/mapper/SysGroupMapper.java
new file mode 100644
index 00000000..6454f138
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/mapper/SysGroupMapper.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.sys.modular.group.entity.SysGroup;
+
+/**
+ * 用户组Mapper接口
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+public interface SysGroupMapper extends BaseMapper {
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/mapper/mapping/SysGroupMapper.xml b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/mapper/mapping/SysGroupMapper.xml
new file mode 100644
index 00000000..4534cb42
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/mapper/mapping/SysGroupMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupAddParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupAddParam.java
new file mode 100644
index 00000000..354a8ab9
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupAddParam.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * 用户组添加参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class SysGroupAddParam {
+
+ /** 名称 */
+ @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "name不能为空")
+ private String name;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+ /** 排序码 */
+ @Schema(description = "排序码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "sortCode不能为空")
+ private Integer sortCode;
+
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupEditParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupEditParam.java
new file mode 100644
index 00000000..efdc7bdd
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupEditParam.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * 用户组编辑参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class SysGroupEditParam {
+
+ /** 主键 */
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "id不能为空")
+ private String id;
+
+ /** 名称 */
+ @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "name不能为空")
+ private String name;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remark;
+
+ /** 排序码 */
+ @Schema(description = "排序码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "sortCode不能为空")
+ private Integer sortCode;
+
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupGrantUserParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupGrantUserParam.java
new file mode 100644
index 00000000..4088b995
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupGrantUserParam.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 用户组授权用户参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class SysGroupGrantUserParam {
+
+ /** 用户组id */
+ @Schema(description = "用户组id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "id不能为空")
+ private String id;
+
+ /** 授权用户信息 */
+ @Schema(description = "授权用户信息", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "grantInfoList不能为空")
+ private List grantInfoList;
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupIdParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupIdParam.java
new file mode 100644
index 00000000..1ffbcc69
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupIdParam.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import jakarta.validation.constraints.NotBlank;
+
+/**
+ * 用户组Id参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class SysGroupIdParam {
+
+ /** 主键 */
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "id不能为空")
+ private String id;
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupPageParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupPageParam.java
new file mode 100644
index 00000000..3653d12b
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupPageParam.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 用户组查询参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class SysGroupPageParam {
+
+ /** 当前页 */
+ @Schema(description = "当前页码")
+ private Integer current;
+
+ /** 每页条数 */
+ @Schema(description = "每页条数")
+ private Integer size;
+
+ /** 排序字段 */
+ @Schema(description = "排序字段,字段驼峰名称,如:userName")
+ private String sortField;
+
+ /** 排序方式 */
+ @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+ private String sortOrder;
+
+ /** 关键词 */
+ @Schema(description = "关键词")
+ private String searchKey;
+
+ /** 名称 */
+ @Schema(description = "名称")
+ private String name;
+
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupSelectorUserParam.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupSelectorUserParam.java
new file mode 100644
index 00000000..72fb4722
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/param/SysGroupSelectorUserParam.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 用户选择器参数
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Getter
+@Setter
+public class SysGroupSelectorUserParam {
+
+ /** 当前页 */
+ @Schema(description = "当前页码")
+ private Integer current;
+
+ /** 每页条数 */
+ @Schema(description = "每页条数")
+ private Integer size;
+
+ /** 组织id */
+ @Schema(description = "组织id")
+ private String orgId;
+
+ /** 姓名关键词 */
+ @Schema(description = "姓名关键词")
+ private String searchKey;
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/provider/SysGroupApiProvider.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/provider/SysGroupApiProvider.java
new file mode 100644
index 00000000..00188fe7
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/provider/SysGroupApiProvider.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.provider;
+
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.sys.api.SysGroupApi;
+import vip.xiaonuo.sys.modular.group.param.SysGroupGrantUserParam;
+import vip.xiaonuo.sys.modular.group.param.SysGroupIdParam;
+import vip.xiaonuo.sys.modular.group.service.SysGroupService;
+import java.util.List;
+
+/**
+ * 用户组API接口提供者
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Service
+public class SysGroupApiProvider implements SysGroupApi {
+
+ @Resource
+ private SysGroupService sysGroupService;
+
+ @Override
+ public List ownUser(String groupId) {
+ SysGroupIdParam sysGroupIdParam = new SysGroupIdParam();
+ sysGroupIdParam.setId(groupId);
+ return sysGroupService.ownUser(sysGroupIdParam);
+ }
+
+ @Override
+ public void grantUser(String groupId, List userIdList) {
+ SysGroupGrantUserParam sysGroupGrantUserParam = new SysGroupGrantUserParam();
+ sysGroupGrantUserParam.setId(groupId);
+ sysGroupGrantUserParam.setGrantInfoList(userIdList);
+ sysGroupService.grantUser(sysGroupGrantUserParam);
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/service/SysGroupService.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/service/SysGroupService.java
new file mode 100644
index 00000000..dddb583b
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/service/SysGroupService.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.sys.modular.group.entity.SysGroup;
+import vip.xiaonuo.sys.modular.group.param.*;
+import vip.xiaonuo.sys.modular.user.entity.SysUser;
+
+import java.util.List;
+
+/**
+ * 用户组Service接口
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+public interface SysGroupService extends IService {
+
+ /**
+ * 获取用户组分页
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ Page page(SysGroupPageParam sysGroupPageParam);
+
+ /**
+ * 添加用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ void add(SysGroupAddParam sysGroupAddParam);
+
+ /**
+ * 编辑用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ void edit(SysGroupEditParam sysGroupEditParam);
+
+ /**
+ * 删除用户组
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ void delete(List sysGroupIdParamList);
+
+ /**
+ * 获取用户组详情
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ SysGroup detail(SysGroupIdParam sysGroupIdParam);
+
+ /**
+ * 获取用户组详情
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+ SysGroup queryEntity(String id);
+
+ /**
+ * 获取用户组下的用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ List ownUser(SysGroupIdParam sysGroupIdParam);
+
+ /**
+ * 获取组织树选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ List> orgTreeSelector();
+
+ /**
+ * 获取用户选择器
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ Page userSelector(SysGroupSelectorUserParam sysGroupSelectorUserParam);
+
+ /**
+ * 给用户组授权用户
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ */
+ void grantUser(SysGroupGrantUserParam sysGroupGrantUserParam);
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/service/impl/SysGroupServiceImpl.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/service/impl/SysGroupServiceImpl.java
new file mode 100644
index 00000000..d1c27fdf
--- /dev/null
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/group/service/impl/SysGroupServiceImpl.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.sys.modular.group.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNode;
+import cn.hutool.core.lang.tree.TreeUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.sys.modular.group.entity.SysGroup;
+import vip.xiaonuo.sys.modular.group.mapper.SysGroupMapper;
+import vip.xiaonuo.sys.modular.group.param.*;
+import vip.xiaonuo.sys.modular.group.service.SysGroupService;
+import vip.xiaonuo.sys.modular.org.entity.SysOrg;
+import vip.xiaonuo.sys.modular.org.service.SysOrgService;
+import vip.xiaonuo.sys.modular.relation.entity.SysRelation;
+import vip.xiaonuo.sys.modular.relation.enums.SysRelationCategoryEnum;
+import vip.xiaonuo.sys.modular.relation.service.SysRelationService;
+import vip.xiaonuo.sys.modular.user.entity.SysUser;
+import vip.xiaonuo.sys.modular.user.service.SysUserService;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户组Service接口实现类
+ *
+ * @author yubaoshan
+ * @date 2024/12/21 01:25
+ **/
+@Service
+public class SysGroupServiceImpl extends ServiceImpl implements SysGroupService {
+
+ @Resource
+ private SysRelationService sysRelationService;
+
+ @Resource
+ private SysUserService sysUserService;
+
+ @Resource
+ private SysOrgService sysOrgService;
+
+ @Override
+ public Page page(SysGroupPageParam sysGroupPageParam) {
+ QueryWrapper queryWrapper = new QueryWrapper().checkSqlInjection();
+ if(ObjectUtil.isNotEmpty(sysGroupPageParam.getName())) {
+ queryWrapper.lambda().like(SysGroup::getName, sysGroupPageParam.getName());
+ }
+ if(ObjectUtil.isAllNotEmpty(sysGroupPageParam.getSortField(), sysGroupPageParam.getSortOrder())) {
+ CommonSortOrderEnum.validate(sysGroupPageParam.getSortOrder());
+ queryWrapper.orderBy(true, sysGroupPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+ StrUtil.toUnderlineCase(sysGroupPageParam.getSortField()));
+ } else {
+ queryWrapper.lambda().orderByAsc(SysGroup::getSortCode);
+ }
+ return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void add(SysGroupAddParam sysGroupAddParam) {
+ SysGroup sysGroup = BeanUtil.toBean(sysGroupAddParam, SysGroup.class);
+ this.save(sysGroup);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void edit(SysGroupEditParam sysGroupEditParam) {
+ SysGroup sysGroup = this.queryEntity(sysGroupEditParam.getId());
+ BeanUtil.copyProperties(sysGroupEditParam, sysGroup);
+ this.updateById(sysGroup);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void delete(List sysGroupIdParamList) {
+ // 执行删除
+ this.removeByIds(CollStreamUtil.toList(sysGroupIdParamList, SysGroupIdParam::getId));
+ }
+
+ @Override
+ public SysGroup detail(SysGroupIdParam sysGroupIdParam) {
+ return this.queryEntity(sysGroupIdParam.getId());
+ }
+
+ @Override
+ public SysGroup queryEntity(String id) {
+ SysGroup sysGroup = this.getById(id);
+ if(ObjectUtil.isEmpty(sysGroup)) {
+ throw new CommonException("用户组不存在,id值为:{}", id);
+ }
+ return sysGroup;
+ }
+
+ @Override
+ public List ownUser(SysGroupIdParam sysGroupIdParam) {
+ return sysRelationService.getRelationObjectIdListByTargetIdAndCategory(sysGroupIdParam.getId(),
+ SysRelationCategoryEnum.SYS_USER_HAS_GROUP.getValue());
+ }
+
+ @Override
+ public List> orgTreeSelector() {
+ List sysOrgList = sysOrgService.getAllOrgList();
+ List> treeNodeList = sysOrgList.stream().map(sysOrg ->
+ new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), sysOrg.getName(), sysOrg.getSortCode()))
+ .collect(Collectors.toList());
+ return TreeUtil.build(treeNodeList, "0");
+ }
+
+ @Override
+ public Page userSelector(SysGroupSelectorUserParam sysGroupSelectorUserParam) {
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ // 只查询部分字段
+ lambdaQueryWrapper.select(SysUser::getId, SysUser::getAvatar, SysUser::getOrgId, SysUser::getPositionId, SysUser::getAccount,
+ SysUser::getName, SysUser::getSortCode, SysUser::getGender, SysUser::getEntryDate);
+ // 如果查询条件为空,则直接查询
+ if(ObjectUtil.isAllEmpty(sysGroupSelectorUserParam.getOrgId(), sysGroupSelectorUserParam.getSearchKey())) {
+ return sysUserService.getAllUserSelectorList();
+ } else {
+ if (ObjectUtil.isNotEmpty(sysGroupSelectorUserParam.getOrgId())) {
+ // 如果组织id不为空,则查询该组织及其子极其子下的所有人
+ List childOrgIdList = CollStreamUtil.toList(sysOrgService.getChildListById(sysOrgService
+ .getAllOrgList(), sysGroupSelectorUserParam.getOrgId(), true), SysOrg::getId);
+ if (ObjectUtil.isNotEmpty(childOrgIdList)) {
+ lambdaQueryWrapper.in(SysUser::getOrgId, childOrgIdList);
+ } else {
+ return new Page<>();
+ }
+ }
+ if (ObjectUtil.isNotEmpty(sysGroupSelectorUserParam.getSearchKey())) {
+ lambdaQueryWrapper.like(SysUser::getName, sysGroupSelectorUserParam.getSearchKey());
+ }
+ lambdaQueryWrapper.orderByAsc(SysUser::getSortCode);
+ return sysUserService.page(CommonPageRequest.defaultPage(), lambdaQueryWrapper);
+ }
+ }
+
+ @Override
+ public void grantUser(SysGroupGrantUserParam sysGroupGrantUserParam) {
+ String id = sysGroupGrantUserParam.getId();
+ List grantInfoList = sysGroupGrantUserParam.getGrantInfoList();
+ sysRelationService.remove(new LambdaQueryWrapper().eq(SysRelation::getTargetId, id)
+ .eq(SysRelation::getCategory, SysRelationCategoryEnum.SYS_USER_HAS_GROUP.getValue()));
+ sysRelationService.saveBatch(grantInfoList.stream().map(userId -> {
+ SysRelation sysRelation = new SysRelation();
+ sysRelation.setObjectId(userId);
+ sysRelation.setTargetId(id);
+ sysRelation.setCategory(SysRelationCategoryEnum.SYS_USER_HAS_GROUP.getValue());
+ return sysRelation;
+ }).collect(Collectors.toList()));
+ }
+}
diff --git a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/enums/SysRelationCategoryEnum.java b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/enums/SysRelationCategoryEnum.java
index 98a58cb8..cbb4ac33 100644
--- a/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/enums/SysRelationCategoryEnum.java
+++ b/snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/relation/enums/SysRelationCategoryEnum.java
@@ -45,7 +45,10 @@ public enum SysRelationCategoryEnum {
SYS_ROLE_HAS_MOBILE_MENU("SYS_ROLE_HAS_MOBILE_MENU"),
/** 角色拥有权限 */
- SYS_ROLE_HAS_PERMISSION("SYS_ROLE_HAS_PERMISSION");
+ SYS_ROLE_HAS_PERMISSION("SYS_ROLE_HAS_PERMISSION"),
+
+ /** 用户拥有用户组 */
+ SYS_USER_HAS_GROUP("SYS_USER_HAS_GROUP");
private final String value;
diff --git a/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java b/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java
index 9cad2b3d..e7622be3 100644
--- a/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java
+++ b/snowy-web-app/src/main/java/vip/xiaonuo/core/config/GlobalConfigure.java
@@ -157,6 +157,7 @@ public class GlobalConfigure implements WebMvcConfigurer {
"/auth/third/page",
"/client/user/**",
"/sys/org/**",
+ "/sys/group/**",
"/sys/position/**",
"/sys/button/**",
"/sys/menu/**",
diff --git a/snowy-web-app/src/main/resources/_sql/snowy_mysql.sql b/snowy-web-app/src/main/resources/_sql/snowy_mysql.sql
index 6624555e..9e5fa12a 100644
--- a/snowy-web-app/src/main/resources/_sql/snowy_mysql.sql
+++ b/snowy-web-app/src/main/resources/_sql/snowy_mysql.sql
@@ -662,6 +662,28 @@ INSERT INTO `MOBILE_RESOURCE` VALUES ('1623696236267024386', '162338076520231321
INSERT INTO `MOBILE_RESOURCE` VALUES ('1623696292042878977', '1623380765202313218', '编辑人员', 'mobileBizUserEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `MOBILE_RESOURCE` VALUES ('1623696346547859458', '1623380765202313218', '删除人员', 'mobileBizUserDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+-- ----------------------------
+-- Table structure for SYS_GROUP
+-- ----------------------------
+DROP TABLE IF EXISTS `SYS_GROUP`;
+CREATE TABLE `SYS_GROUP` (
+ `ID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',
+ `NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
+ `REMARK` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+ `SORT_CODE` int(11) NULL DEFAULT NULL COMMENT '排序码',
+ `EXT_JSON` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '扩展信息',
+ `DELETE_FLAG` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '删除标志',
+ `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+ `CREATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建用户',
+ `UPDATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+ `UPDATE_USER` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`ID`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户组' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of SYS_GROUP
+-- ----------------------------
+
-- ----------------------------
-- Table structure for SYS_ORG
-- ----------------------------
@@ -889,6 +911,9 @@ INSERT INTO `SYS_RELATION` VALUES ('1813960110876631049', '1570687866138206208',
INSERT INTO `SYS_RELATION` VALUES ('1813960110876631050', '1570687866138206208', '/biz/notice/page', 'SYS_ROLE_HAS_PERMISSION', '{\"apiUrl\":\"/biz/notice/page\",\"scopeCategory\":\"SCOPE_ALL\",\"scopeDefineOrgIdList\":[]}');
INSERT INTO `SYS_RELATION` VALUES ('1813959903803842580', '1570687866138206208', '1813959658013433858', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1813959658013433858\",\"buttonInfo\":[]}');
+INSERT INTO `SYS_RELATION` VALUES ('1871280434097565701', '1570687866138206208', '1870158678418993154', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1870158678418993154\",\"buttonInfo\":[\"1870158678481907713\",\"1870158678481907714\",\"1870158678481907715\",\"1870158678481907716\"]}');
+INSERT INTO `SYS_RELATION` VALUES ('1871280434097565751', '1570687866138206208', '1871278073018986498', 'SYS_ROLE_HAS_RESOURCE', '{\"menuId\":\"1871278073018986498\",\"buttonInfo\":[\"1871278073086095361\",\"1871278073086095362\",\"1871278073086095363\",\"1871278073086095364\",\"1871280381043814402\"]}');
+
-- ----------------------------
-- Table structure for SYS_RESOURCE
-- ----------------------------
@@ -1009,6 +1034,14 @@ INSERT INTO `SYS_RESOURCE` VALUES ('1811290937503387650', '1811290937444667393',
INSERT INTO `SYS_RESOURCE` VALUES ('1811328402989662210', '1811290937444667393', '更新状态', NULL, 'bizNoticerUpdateStatus', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
INSERT INTO `SYS_RESOURCE` VALUES ('1811330359695400961', '1811290937444667393', '通知公告详情', NULL, 'bizNoticeDetail', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+INSERT INTO `SYS_RESOURCE` VALUES ('1870158678418993154', '1548901111999770726', '用户组管理', 'groupIndex', 'd4KUq2ZnK7', 'MENU', '1548901111999770525', 'MENU', '/sys/group', 'sys/group/index', 'team-outlined', NULL, 'TRUE', 99, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+INSERT INTO `SYS_RESOURCE` VALUES ('1871278073018986498', '1548901111999773977', '用户组', 'bizGroupIndex', 'HQVofyRf7Z', 'MENU', '1548901111999773976', 'MENU', '/biz/group', 'biz/group/index', 'team-outlined', NULL, 'TRUE', 55, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095361', '1871278073018986498', '新增用户组', NULL, 'bizGroupAdd', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095362', '1871278073018986498', '编辑用户组', NULL, 'bizGroupEdit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095363', '1871278073018986498', '删除用户组', NULL, 'bizGroupDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+INSERT INTO `SYS_RESOURCE` VALUES ('1871278073086095364', '1871278073018986498', '批量删除', NULL, 'bizGroupBatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+INSERT INTO `SYS_RESOURCE` VALUES ('1871280381043814402', '1871278073018986498', '授权用户', NULL, 'bizGroupGrantUser', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 5, NULL, 'NOT_DELETE', NULL, NULL, NULL, NULL);
+
-- ----------------------------
-- Table structure for SYS_ROLE
-- ----------------------------