From 9c81d055889b78e57e1b0e4797f9615ac45f9913 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Thu, 21 Aug 2025 19:28:04 +0800
Subject: [PATCH] 1

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java         |   86 +++++++
 ruoyi-admin/src/main/java/com/ruoyi/im/config/AddTeamMembersRequest.java                    |   62 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/GroupWelcomeConfigVo.java             |   15 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GroupWelcomeConfigServiceImpl.java |   19 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/IpBlacklistServiceImpl.java        |   19 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/IpBlacklistService.java                 |    8 
 ruoyi-admin/src/main/java/com/ruoyi/im/config/AssignmentRequest.java                        |   21 +
 ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java                  |   66 ++++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/GroupWelcomeConfigMapper.java            |   15 +
 ruoyi-admin/src/main/java/com/ruoyi/im/service/NeteaseTeamService.java                      |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/IpBlacklist.java                         |   34 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/group/ImGroupController.java             |   40 +++
 ruoyi-admin/src/main/java/com/ruoyi/im/config/CreateTeamRequest.java                        |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/GroupWelcomeConfigService.java          |    8 
 ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/NeteaseTeamServiceImpl.java             |  226 ++++++++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/IpBlacklistMapper.java                   |   15 +
 16 files changed, 637 insertions(+), 20 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/config/AddTeamMembersRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/im/config/AddTeamMembersRequest.java
new file mode 100644
index 0000000..abae4c2
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/config/AddTeamMembersRequest.java
@@ -0,0 +1,62 @@
+package com.ruoyi.im.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sun.istack.internal.NotNull;
+import lombok.Builder;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+@Data
+@Builder
+public class AddTeamMembersRequest {
+
+        private String groupId;//群id
+
+        /**
+         * 邀请入群的成员账号ID列表,必填
+         */
+        @Size(min = 1, max = 200, message = "邀请账号数量必须在1-200之间")
+        @JsonProperty("invite_account_ids")
+        private List<@NotBlank(message = "账号ID不能为空") String> inviteAccountIds;
+
+        /**
+         * 操作者(邀请人)账号 ID,必填
+         */
+        @Size(min = 1, max = 32, message = "操作者账号长度必须在1-32之间")
+        @JsonProperty("operator_id")
+        private String operatorId;
+
+        /**
+         * 邀请入群的附言,长度上限150位字符,选填
+         */
+        @Size(max = 150, message = "附言长度不能超过150字符")
+        private String msg;
+
+        /**
+         * 群组ID,创建群组成功时自动生成,必填
+         */
+        @Min(value = 1, message = "群组ID必须大于0")
+        @JsonProperty("team_id")
+        private Long teamId;
+
+        /**
+         * 自定义扩展字段,JSON格式,长度上限512位字符,选填
+         */
+        @Size(max = 512, message = "扩展字段长度不能超过512字符")
+        private String extension;
+
+        /**
+         * 群组类型,必填
+         * 1:高级群,2:超大群
+         */
+        @Min(value = 1, message = "群组类型必须为1或2")
+        @Max(value = 2, message = "群组类型必须为1或2")
+        @JsonProperty("team_type")
+        private Integer teamType;
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/config/AssignmentRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/im/config/AssignmentRequest.java
new file mode 100644
index 0000000..b48e001
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/config/AssignmentRequest.java
@@ -0,0 +1,21 @@
+package com.ruoyi.im.config;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 18:30
+ **/
+@Data
+@Builder
+public class AssignmentRequest {
+
+    private String groupId;//群id
+    private Long teamId;//群组ID,创建群组成功时自动生成,必填
+    private Integer team_type;//需要转让的群组类型。1:高级群。2:超大群。
+    private String new_owner_account_id;//新群主的 IM 账号 ID。
+    private Integer leave = 2;//转让群主后,原群主是否退出该群组。1:退出。2:不退出,成为普通成员。
+
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/config/CreateTeamRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/im/config/CreateTeamRequest.java
index 154dc5f..77fe78f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/config/CreateTeamRequest.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/config/CreateTeamRequest.java
@@ -9,23 +9,25 @@
 
 @Data
 public class CreateTeamRequest {
+
+    @NotBlank(message = "群主id为空")
+    private String groupId;
+
+
     /**
      * 群主(创建者)的 IM 账号 ID
      */
-    @NotBlank(message = "群主账号不能为空")
     @Size(max = 32, message = "群主账号长度不能超过32个字符")
     private String owner_account_id;
 
     /**
      * 群组类型:1:高级群。2:超大群。
      */
-    @NotNull(message = "群组类型不能为空")
     private Integer team_type;
 
     /**
      * 群组名称,长度上限 64 位字符
      */
-    @NotBlank(message = "群组名称不能为空")
     @Size(max = 64, message = "群组名称长度不能超过64个字符")
     private String name;
 
@@ -67,13 +69,11 @@
     /**
      * 创建群组时邀请入群的成员列表
      */
-    @NotNull(message = "邀请成员列表不能为空")
     private List<String> invite_account_ids;
 
     /**
      * 邀请入群的附言,长度上限 150 位字符
      */
-    @NotBlank(message = "邀请消息不能为空")
     @Size(max = 150, message = "邀请消息长度不能超过150个字符")
     private String invite_msg;
 
@@ -91,7 +91,6 @@
      * 1:需要群主或管理员验证通过才能入群
      * 2:不允许任何人申请入群
      */
-    @NotNull(message = "入群验证方式不能为空")
     private Integer join_mode = 0;
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/NeteaseTeamService.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/NeteaseTeamService.java
index a486540..4a677e6 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/service/NeteaseTeamService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/NeteaseTeamService.java
@@ -2,15 +2,21 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.im.comm.Result;
+import com.ruoyi.im.config.AddTeamMembersRequest;
 import com.ruoyi.im.config.CreateTeamRequest;
-import com.ruoyi.im.dto.CreateGroupDto;
+import com.ruoyi.im.config.AssignmentRequest;
 import com.ruoyi.system.domain.NeteaseTeam;
-import org.springframework.transaction.annotation.Transactional;
 
 public interface NeteaseTeamService extends IService<NeteaseTeam> {
 
 
     AjaxResult createGroup(CreateTeamRequest request);
 
+    AjaxResult updateCreate(CreateTeamRequest request);
+
+    AjaxResult inviteTeamMembers(AddTeamMembersRequest request);
+
+    AjaxResult assignment(AssignmentRequest request);
+
+    AjaxResult dismiss(Long id);
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/NeteaseTeamServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/NeteaseTeamServiceImpl.java
index 454be10..020d0df 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/NeteaseTeamServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/im/service/impl/NeteaseTeamServiceImpl.java
@@ -1,30 +1,29 @@
 package com.ruoyi.im.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.druid.support.json.JSONUtils;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.netease.nim.server.sdk.core.BizName;
 import com.netease.nim.server.sdk.core.YunxinApiHttpClient;
 import com.netease.nim.server.sdk.core.YunxinApiResponse;
 import com.netease.nim.server.sdk.core.exception.YunxinSdkException;
 import com.netease.nim.server.sdk.core.http.HttpMethod;
 import com.netease.nim.server.sdk.im.v2.team.TeamV2UrlContext;
+import com.netease.nim.server.sdk.im.v2.team_member.TeamMemberV2UrlContext;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.bean.BeanUtils;
-import com.ruoyi.im.comm.Result;
-import com.ruoyi.im.config.AppAuthConfig;
+import com.ruoyi.im.config.AddTeamMembersRequest;
 import com.ruoyi.im.config.CreateTeamRequest;
-import com.ruoyi.im.dto.CreateGroupDto;
+import com.ruoyi.im.config.AssignmentRequest;
 import com.ruoyi.im.service.NeteaseTeamService;
 import com.ruoyi.system.domain.NeteaseTeam;
 import com.ruoyi.system.mapper.NeteaseTeamMapper;
-import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.util.*;
 
@@ -103,6 +102,80 @@
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult updateCreate(CreateTeamRequest request) {
+        try {
+            // 1. 构建请求参数Map
+            Map<String, Object> paramMap = buildCreateTeamParams(request);
+
+            // 2. 将Map转换为JSON字符串
+            String jsonBody = JSON.toJSONString(paramMap);
+
+            NeteaseTeam neteaseTeam = neteaseTeamMapper.selectById(request.getGroupId());
+            if(ObjectUtil.isNotEmpty(neteaseTeam)){
+                return AjaxResult.error("群不存在!");
+            }
+
+            String path = TeamV2UrlContext.UPDATE_TEAM.replace("{team_id}", String.valueOf(neteaseTeam.getTid()));
+            YunxinApiResponse response = yunxinClient.executeV2Api(
+                    HttpMethod.PATCH,
+                    path,
+                    path,
+                    null,
+                    jsonBody
+            );
+
+            // 4. 处理响应
+            String data = response.getData();
+            JSONObject json = JSONObject.parseObject(data);
+            int code = json.getIntValue("code");
+
+            if (code != 200) {
+                log.error("网易云信修改群组失败,响应:");
+                return AjaxResult.error("修改群组失败");
+            }
+
+            // 5. 解析响应获取群组ID
+            JSONObject resultData = json.getJSONObject("data");
+            JSONObject teamInfo = resultData.getJSONObject("team_info");
+            String tid = teamInfo.getString("team_id");
+            String ownerAccountId = teamInfo.getString("owner_account_id");
+
+            // 6. 跟新群组信息到本地数据库
+            int count = updateNeteaseTeam(request,neteaseTeam);
+            if(count > 0){
+                return AjaxResult.success("修改群组成功");
+            }
+            return AjaxResult.error("修改群组失败");
+        } catch (YunxinSdkException e) {
+            // 云信调用异常时回滚事务
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            e.printStackTrace();
+            log.error("网易云信服务调用异常 traceId:");
+            return AjaxResult.error("修改群组失败,云信服务异常");
+        } catch (Exception e) {
+            // 其他异常同样回滚
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            e.printStackTrace();
+            log.error("修改群组过程发生未知异常", e);
+            return AjaxResult.error("修改群组失败,系统异常");
+        }
+    }
+
+
+    private int updateNeteaseTeam(CreateTeamRequest request, NeteaseTeam neteaseTeam) {
+        neteaseTeam.setName(request.getName());
+        neteaseTeam.setMemberCount(request.getMembers_limit());
+        neteaseTeam.setAnnouncement(request.getAnnouncement());
+        neteaseTeam.setIntro(request.getIntro());
+        neteaseTeam.setJoinMode(request.getJoin_mode());
+        neteaseTeam.setAgreeMode(request.getAgree_mode());
+        neteaseTeam.setInviteMode(request.getInvite_mode());
+        neteaseTeam.setUpdateTeamInfoMode(request.getUpdate_team_info_mode());
+        return neteaseTeamMapper.updateById(neteaseTeam);
+    }
+
     /**
      * 构建创建群组的参数Map
      */
@@ -178,4 +251,145 @@
 
         return insert;
     }
+
+    @Override
+    public AjaxResult inviteTeamMembers(AddTeamMembersRequest request) {
+        try {
+
+            NeteaseTeam neteaseTeam = neteaseTeamMapper.selectById(request.getGroupId());
+            if(ObjectUtil.isNotEmpty(neteaseTeam)){
+                return AjaxResult.error("群不存在!");
+            }
+
+            AddTeamMembersRequest build = AddTeamMembersRequest.builder()
+                    .inviteAccountIds(request.getInviteAccountIds())
+                    .operatorId(request.getOperatorId())
+                    .msg(request.getMsg())
+                    .teamId(Long.getLong(neteaseTeam.getTid()))
+                    .teamType(request.getTeamType())
+                    .build();
+            String jsonBody = JSONUtils.toJSONString(build);
+
+            YunxinApiResponse response = yunxinClient.executeV2Api(
+                    HttpMethod.POST,
+                    TeamMemberV2UrlContext.INVITE_TEAM_MEMBERS,
+                    TeamMemberV2UrlContext.INVITE_TEAM_MEMBERS,
+                    null,
+                    jsonBody
+            );
+
+            // 4. 处理响应
+            String data = response.getData();
+            JSONObject json = JSONObject.parseObject(data);
+            int code = json.getIntValue("code");
+
+            if (code != 200) {
+                log.error("网易云信拉人入群失败,响应:");
+                return AjaxResult.error("拉人入群失败");
+            }
+            return AjaxResult.success();
+        } catch (YunxinSdkException e) {
+            // 云信调用异常时回滚事务
+            e.printStackTrace();
+            log.error("网易云信服务调用异常 traceId:");
+            return AjaxResult.error("拉人入群失败,云信服务异常");
+        } catch (Exception e) {
+            // 其他异常同样回滚
+            e.printStackTrace();
+            log.error("拉人入群过程发生未知异常", e);
+            return AjaxResult.error("拉人入群失败,系统异常");
+        }
+    }
+
+    @Override
+    public AjaxResult assignment(AssignmentRequest request) {
+        try {
+
+            NeteaseTeam neteaseTeam = neteaseTeamMapper.selectById(request.getGroupId());
+            if(ObjectUtil.isNotEmpty(neteaseTeam)){
+                return AjaxResult.error("群不存在!");
+            }
+
+            AssignmentRequest build = AssignmentRequest.builder()
+                    .teamId(Long.getLong(neteaseTeam.getTid()))
+                    .team_type(neteaseTeam.getTeamType())
+                    .leave(2)
+                    .build();
+            String requestBody = JSONUtils.toJSONString(build);
+
+            String path = TeamV2UrlContext.TRANSFER_OWNER.replace("{team_id}",neteaseTeam.getTid().toString());
+
+            YunxinApiResponse response = yunxinClient.executeV2Api(
+                    HttpMethod.PATCH,
+                    TeamV2UrlContext.TRANSFER_OWNER,
+                    path,
+                    null,
+                    requestBody
+            );
+
+            // 4. 处理响应
+            String data = response.getData();
+            JSONObject json = JSONObject.parseObject(data);
+            int code = json.getIntValue("code");
+
+            if (code != 200) {
+                log.error("网易云信转让群主失败,响应:");
+                return AjaxResult.error("转让群主失败");
+            }
+            return AjaxResult.success();
+        } catch (YunxinSdkException e) {
+            // 云信调用异常时回滚事务
+            e.printStackTrace();
+            log.error("网易云信转让群主服务调用异常 traceId:");
+            return AjaxResult.error("转让群主失败,云信服务异常");
+        } catch (Exception e) {
+            // 其他异常同样回滚
+            e.printStackTrace();
+            log.error("转让群主过程发生未知异常", e);
+            return AjaxResult.error("转让群主失败,系统异常");
+        }
+    }
+
+    @Override
+    public AjaxResult dismiss(Long id) {
+        try {
+            NeteaseTeam neteaseTeam = neteaseTeamMapper.selectById(id);
+            if(ObjectUtil.isNotEmpty(neteaseTeam)){
+                return AjaxResult.error("群不存在!");
+            }
+            Map<String, String> queryParams = new HashMap<>();
+            queryParams.put("team_type", String.valueOf(neteaseTeam.getTeamType()));
+
+            String path = TeamV2UrlContext.DISBAND_TEAM.replace("{team_id}", neteaseTeam.getTid());
+
+            YunxinApiResponse response = yunxinClient.executeV2Api(
+                    HttpMethod.DELETE,
+                    path,
+                    path,
+                    queryParams,
+                    null
+            );
+
+            // 4. 处理响应
+            String data = response.getData();
+            JSONObject json = JSONObject.parseObject(data);
+            int code = json.getIntValue("code");
+
+            if (code != 200) {
+                log.error("网易云信解散群失败,响应:");
+                return AjaxResult.error("解散群失败");
+            }
+            return AjaxResult.success();
+        } catch (YunxinSdkException e) {
+            // 云信调用异常时回滚事务
+            e.printStackTrace();
+            log.error("网易云信解散群服务调用异常 traceId:");
+            return AjaxResult.error("解散群失败,云信服务异常");
+        } catch (Exception e) {
+            // 其他异常同样回滚
+            e.printStackTrace();
+            log.error("解散群过程发生未知异常", e);
+            return AjaxResult.error("解散群失败,系统异常");
+        }
+    }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/group/ImGroupController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/group/ImGroupController.java
index 972d236..b1b596d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/group/ImGroupController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/group/ImGroupController.java
@@ -2,16 +2,14 @@
 
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.im.config.AddTeamMembersRequest;
 import com.ruoyi.im.config.CreateTeamRequest;
-import com.ruoyi.im.dto.CreateGroupDto;
+import com.ruoyi.im.config.AssignmentRequest;
 import com.ruoyi.im.service.NeteaseTeamService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 @RestController
 @RequestMapping("/im/group")
@@ -30,4 +28,36 @@
         return neteaseGroupService.createGroup(request);
     }
 
+    /**
+     * 更新群组
+     */
+    @PostMapping("/updateCreate")
+    public AjaxResult updateCreate(@Validated @RequestBody CreateTeamRequest request) {
+        return neteaseGroupService.updateCreate(request);
+    }
+
+    /**
+     * 拉人进去
+     */
+    @PostMapping("/inviteTeamMembers")
+    public AjaxResult inviteTeamMembers(@Validated @RequestBody AddTeamMembersRequest request) {
+        return neteaseGroupService.inviteTeamMembers(request);
+    }
+
+    /**
+     * 转让群主
+     */
+    @PostMapping("/assignment")
+    public AjaxResult assignment(@Validated @RequestBody AssignmentRequest request) {
+        return neteaseGroupService.assignment(request);
+    }
+
+    /**
+     * 解散
+     */
+    @PostMapping("/dismiss")
+    public AjaxResult dismiss(@PathVariable("id") Long id) {
+        return neteaseGroupService.dismiss(id);
+    }
+
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java
new file mode 100644
index 0000000..2e0b91b
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/BasicSetupController.java
@@ -0,0 +1,86 @@
+package com.ruoyi.web.controller.system;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.im.config.CreateTeamRequest;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.IpBlacklist;
+import com.ruoyi.system.service.GroupWelcomeConfigService;
+import com.ruoyi.system.service.IpBlacklistService;
+import org.aspectj.weaver.loadtime.Aj;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:12
+ **/
+@RestController
+@RequestMapping("/system/basic")
+public class BasicSetupController {
+
+    @Autowired
+    GroupWelcomeConfigService groupWelcomeConfigService;
+
+    @Autowired
+    IpBlacklistService ipBlacklistService;
+
+
+    /**
+     * 创建群组
+     */
+    @PostMapping("/update")
+    public AjaxResult createGroup(@Validated @RequestBody GroupWelcomeConfig vo) {
+        GroupWelcomeConfig configServiceById = groupWelcomeConfigService.getById(vo.getId());
+        if(ObjectUtil.isEmpty(configServiceById)){
+            return AjaxResult.error("请联系管理员初始化配置");
+        }
+
+        configServiceById.setWebsiteName(vo.getWebsiteName());
+        configServiceById.setGroupId(vo.getGroupId());
+        configServiceById.setUserAccid(vo.getUserAccid());
+        configServiceById.setWelcomeMessage(vo.getWelcomeMessage());
+        configServiceById.setLegalInstitution(vo.getLegalInstitution());
+        configServiceById.setCopyrightInfo(vo.getCopyrightInfo());
+        groupWelcomeConfigService.updateById(configServiceById);
+        return AjaxResult.success("保存成功!");
+    }
+
+    /**
+     * 新增ip黑名单
+     */
+    @PostMapping("/addIp")
+    public AjaxResult addIp(@PathVariable("ip") String ip) {
+
+        long count = ipBlacklistService.count(new LambdaQueryWrapper<>(IpBlacklist.class).eq(IpBlacklist::getIpAddress, ip));
+        if(count > 0){
+            return AjaxResult.error("ip已存在!");
+        }
+        IpBlacklist ipBlacklist = new IpBlacklist();
+        ipBlacklist.setIpAddress(ip);
+        ipBlacklist.setCreateTime(new Date());
+        ipBlacklistService.save(ipBlacklist);
+        return AjaxResult.success("添加成功");
+    }
+
+    /**
+     * 新增ip黑名单
+     */
+    @PostMapping("/deleteIp")
+    public AjaxResult addIp(@PathVariable("id") Integer id) {
+
+        IpBlacklist ipBlacklist = ipBlacklistService.getById(id);
+        if(ObjectUtil.isEmpty(ipBlacklist)){
+            return AjaxResult.error("ip地址不存在!");
+        }
+        ipBlacklistService.removeById(id);
+        return AjaxResult.success("添加成功");
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java
new file mode 100644
index 0000000..95542fa
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/GroupWelcomeConfig.java
@@ -0,0 +1,66 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:06
+ **/
+@Data
+public class GroupWelcomeConfig {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 网站名称
+     */
+    private String websiteName;
+
+    /**
+     * 群组ID
+     */
+    private String groupId;
+
+    /**
+     * 用户Accid
+     */
+    private String userAccid;
+
+    /**
+     * 欢迎消息
+     */
+    private String welcomeMessage;
+
+    /**
+     * 法律机构
+     */
+    private String legalInstitution;
+
+    /**
+     * 版权信息
+     */
+    private String copyrightInfo;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/IpBlacklist.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/IpBlacklist.java
new file mode 100644
index 0000000..08d9d54
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/IpBlacklist.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:08
+ **/
+@Data
+public class IpBlacklist {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * IP地址
+     */
+    private String ipAddress;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/GroupWelcomeConfigVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/GroupWelcomeConfigVo.java
new file mode 100644
index 0000000..8837811
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/GroupWelcomeConfigVo.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:17
+ **/
+@Data
+public class GroupWelcomeConfigVo {
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/GroupWelcomeConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/GroupWelcomeConfigMapper.java
new file mode 100644
index 0000000..cb015d0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/GroupWelcomeConfigMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.NeteaseTeam;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:07
+ **/
+@Mapper
+public interface GroupWelcomeConfigMapper extends BaseMapper<GroupWelcomeConfig> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/IpBlacklistMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/IpBlacklistMapper.java
new file mode 100644
index 0000000..cb1f079
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/IpBlacklistMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.IpBlacklist;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:09
+ **/
+@Mapper
+public interface IpBlacklistMapper extends BaseMapper<IpBlacklist> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/GroupWelcomeConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/GroupWelcomeConfigService.java
new file mode 100644
index 0000000..e5194de
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/GroupWelcomeConfigService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.UserAccount;
+
+public interface GroupWelcomeConfigService extends IService<GroupWelcomeConfig> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IpBlacklistService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IpBlacklistService.java
new file mode 100644
index 0000000..3e79991
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IpBlacklistService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.IpBlacklist;
+
+public interface IpBlacklistService extends IService<IpBlacklist> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GroupWelcomeConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GroupWelcomeConfigServiceImpl.java
new file mode 100644
index 0000000..deb2b82
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/GroupWelcomeConfigServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.UserAccount;
+import com.ruoyi.system.mapper.GroupWelcomeConfigMapper;
+import com.ruoyi.system.mapper.UserAccountMapper;
+import com.ruoyi.system.service.GroupWelcomeConfigService;
+import com.ruoyi.system.service.UserAccountService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:07
+ **/
+@Service
+public class GroupWelcomeConfigServiceImpl extends ServiceImpl<GroupWelcomeConfigMapper, GroupWelcomeConfig> implements GroupWelcomeConfigService {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/IpBlacklistServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/IpBlacklistServiceImpl.java
new file mode 100644
index 0000000..6a0664b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/IpBlacklistServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.domain.GroupWelcomeConfig;
+import com.ruoyi.system.domain.IpBlacklist;
+import com.ruoyi.system.mapper.GroupWelcomeConfigMapper;
+import com.ruoyi.system.mapper.IpBlacklistMapper;
+import com.ruoyi.system.service.GroupWelcomeConfigService;
+import com.ruoyi.system.service.IpBlacklistService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @program: ruoyiim
+ * @description:
+ * @create: 2025-08-21 19:10
+ **/
+@Service
+public class IpBlacklistServiceImpl extends ServiceImpl<IpBlacklistMapper, IpBlacklist> implements IpBlacklistService {
+}

--
Gitblit v1.9.3