diff --git a/src/main/java/com/steadon/saber/biz/IGroupBiz.java b/src/main/java/com/steadon/saber/biz/IGroupBiz.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d6d4062df45fae197b5dc978ab0bdcd9ad2ec91
--- /dev/null
+++ b/src/main/java/com/steadon/saber/biz/IGroupBiz.java
@@ -0,0 +1,15 @@
+package com.steadon.saber.biz;
+
+import com.steadon.saber.pojo.SaberResponse;
+import com.steadon.saber.pojo.domain.Group;
+import com.steadon.saber.pojo.model.GroupRequest;
+import com.steadon.saber.pojo.model.GroupSearchRequest;
+import com.steadon.saber.pojo.model.pageData.PageData;
+
+public interface IGroupBiz {
+    SaberResponse<PageData<Group>> getGroupBatch(Integer pageNo, Integer pageSize);
+
+    SaberResponse<PageData<Group>> searchGroup(GroupSearchRequest request, Integer pageNo, Integer pageSize);
+
+    SaberResponse<String> updateGroup(Integer gid, GroupRequest request);
+}
diff --git a/src/main/java/com/steadon/saber/biz/impl/GroupBiz.java b/src/main/java/com/steadon/saber/biz/impl/GroupBiz.java
new file mode 100644
index 0000000000000000000000000000000000000000..140f7ebab7e267c9772d20f1a396398e7890dac8
--- /dev/null
+++ b/src/main/java/com/steadon/saber/biz/impl/GroupBiz.java
@@ -0,0 +1,41 @@
+package com.steadon.saber.biz.impl;
+
+import com.steadon.saber.biz.IGroupBiz;
+import com.steadon.saber.pojo.SaberResponse;
+import com.steadon.saber.pojo.domain.Group;
+import com.steadon.saber.pojo.model.GroupRequest;
+import com.steadon.saber.pojo.model.GroupSearchRequest;
+import com.steadon.saber.pojo.model.pageData.PageData;
+import com.steadon.saber.service.UserGroupService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class GroupBiz implements IGroupBiz {
+
+    private UserGroupService userGroupService;
+
+    @Override
+    public SaberResponse<PageData<Group>> getGroupBatch(Integer pageNo, Integer pageSize) {
+        PageData<Group> groupPageData = userGroupService.getGroupBatch(pageNo, pageSize);
+        return SaberResponse.success(groupPageData);
+    }
+
+    @Override
+    public SaberResponse<PageData<Group>> searchGroup(GroupSearchRequest request, Integer pageNo, Integer pageSize) {
+        PageData<Group> groupPageData = userGroupService.searchGroup(request.getKeyword(), pageNo, pageSize);
+        return SaberResponse.success(groupPageData);
+    }
+
+    @Override
+    public SaberResponse<String> updateGroup(Integer gid, GroupRequest request) {
+        Group group = new Group();
+        group.setId(gid);
+        group.loadDataFromReq(request);
+        group.updateStatus();
+
+        userGroupService.updateGroup(group);
+        return SaberResponse.success();
+    }
+}
diff --git a/src/main/java/com/steadon/saber/controller/GroupController.java b/src/main/java/com/steadon/saber/controller/GroupController.java
new file mode 100644
index 0000000000000000000000000000000000000000..b79dd68612fed8c6fa5efc517bc2926ce01d1ae8
--- /dev/null
+++ b/src/main/java/com/steadon/saber/controller/GroupController.java
@@ -0,0 +1,37 @@
+package com.steadon.saber.controller;
+
+import com.steadon.saber.biz.IGroupBiz;
+import com.steadon.saber.pojo.SaberResponse;
+import com.steadon.saber.pojo.domain.Group;
+import com.steadon.saber.pojo.model.GroupRequest;
+import com.steadon.saber.pojo.model.GroupSearchRequest;
+import com.steadon.saber.pojo.model.pageData.PageData;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/saber")
+public class GroupController {
+
+    private IGroupBiz iGroupBiz;
+
+    @GetMapping("/group/list")
+    public SaberResponse<PageData<Group>> showGroup(@RequestParam(value = "page_no", required = false, defaultValue = "1") Integer pageNo,
+                                                    @RequestParam(value = "page_size", required = false, defaultValue = "10") Integer pageSize){
+        return iGroupBiz.getGroupBatch(pageNo, pageSize);
+    }
+
+    @GetMapping("/group/search")
+    public SaberResponse<PageData<Group>> searchGroup(@Validated @RequestBody GroupSearchRequest request,
+            @RequestParam(value = "page_no", required = false, defaultValue = "1") Integer pageNo,
+            @RequestParam(value = "page_size", required = false, defaultValue = "10") Integer pageSize){
+        return iGroupBiz.searchGroup(request, pageNo, pageSize);
+    }
+    @PostMapping("/group/update")
+    public SaberResponse<String> updateGroup(@RequestParam(value = "gid") Integer gid,
+                                             @Validated @RequestBody GroupRequest request){
+        return iGroupBiz.updateGroup(gid, request);
+    }
+}
diff --git a/src/main/java/com/steadon/saber/pojo/domain/Group.java b/src/main/java/com/steadon/saber/pojo/domain/Group.java
index 3e763a6e7b6fae9c55bc9abab3196f038e815ea1..7745860ab767a3d2cb1da0db3a8d907514deed53 100644
--- a/src/main/java/com/steadon/saber/pojo/domain/Group.java
+++ b/src/main/java/com/steadon/saber/pojo/domain/Group.java
@@ -2,6 +2,7 @@ package com.steadon.saber.pojo.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.steadon.saber.handler.token.TokenHandler;
+import com.steadon.saber.pojo.model.GroupRequest;
 import lombok.Data;
 
 import java.io.Serial;
@@ -58,4 +59,8 @@ public class Group implements Serializable {
         this.updateBy = TokenHandler.getUsername();
         this.updateTime = LocalDateTime.now();
     }
+
+    public void loadDataFromReq(GroupRequest request) {
+        this.name = request.getName();
+    }
 }
diff --git a/src/main/java/com/steadon/saber/pojo/model/GroupRequest.java b/src/main/java/com/steadon/saber/pojo/model/GroupRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a106290c4e7c892bdd1db215cd367d8095a2008
--- /dev/null
+++ b/src/main/java/com/steadon/saber/pojo/model/GroupRequest.java
@@ -0,0 +1,8 @@
+package com.steadon.saber.pojo.model;
+
+import lombok.Data;
+
+@Data
+public class GroupRequest {
+    private String name;
+}
\ No newline at end of file
diff --git a/src/main/java/com/steadon/saber/pojo/model/GroupSearchRequest.java b/src/main/java/com/steadon/saber/pojo/model/GroupSearchRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..94506b2cf5a65fba6797e0c1cc9a2d6d86fa8561
--- /dev/null
+++ b/src/main/java/com/steadon/saber/pojo/model/GroupSearchRequest.java
@@ -0,0 +1,8 @@
+package com.steadon.saber.pojo.model;
+
+import lombok.Data;
+
+@Data
+public class GroupSearchRequest {
+    private String keyword;
+}
diff --git a/src/main/java/com/steadon/saber/service/UserGroupService.java b/src/main/java/com/steadon/saber/service/UserGroupService.java
index e0c849721e30277bddcc1d0764c81eccb7568b19..13b17e00854c276a158de7615ed6b908d83f8665 100644
--- a/src/main/java/com/steadon/saber/service/UserGroupService.java
+++ b/src/main/java/com/steadon/saber/service/UserGroupService.java
@@ -1,6 +1,8 @@
 package com.steadon.saber.service;
 
+import com.steadon.saber.pojo.domain.Group;
 import com.steadon.saber.pojo.domain.UserInfo;
+import com.steadon.saber.pojo.model.GroupSearchRequest;
 import com.steadon.saber.pojo.model.UserInfoRequest;
 import com.steadon.saber.pojo.model.pageData.PageData;
 
@@ -16,4 +18,10 @@ public interface UserGroupService {
     PageData<UserInfo> getInfoBatch(Integer pageNo, Integer pageSize);
 
     PageData<UserInfo> searchUserInfo(String keyword, Integer pageNo, Integer pageSize);
+
+    PageData<Group> getGroupBatch(Integer pageNo, Integer pageSize);
+
+    PageData<Group> searchGroup(String keyword, Integer pageNo, Integer pageSize);
+
+    void updateGroup(Group group);
 }
\ No newline at end of file
diff --git a/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java b/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java
index b44dfbe765592749a5bd9c43b48e7603cade1f6a..463ed9d6a169bfc26272e5da32e19725d3564ff5 100644
--- a/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java
+++ b/src/main/java/com/steadon/saber/service/impl/UserGroupServiceImpl.java
@@ -66,6 +66,36 @@ public class UserGroupServiceImpl implements UserGroupService {
         return userInfoPageData;
     }
 
+    @Override
+    public PageData<Group> getGroupBatch(Integer pageNo, Integer pageSize) {
+        Page<Group> page = new Page<>(pageNo, pageSize);
+        Page<Group> groupPage = groupMapper.selectPage(page, null);
+
+        PageData<Group> groupPageData = new PageData<>();
+        groupPageData.praiseIPage(groupPage);
+        return groupPageData;
+    }
+
+    @Override
+    public PageData<Group> searchGroup(String keyword, Integer pageNo, Integer pageSize) {
+        QueryWrapper<Group> wrapper = new QueryWrapper<Group>().like("name", keyword);
+
+        Page<Group> page = new Page<>(pageNo, pageSize);
+        Page<Group> groupPage = groupMapper.selectPage(page, wrapper);
+
+        PageData<Group> groupPageData = new PageData<>();
+        groupPageData.praiseIPage(groupPage);
+        return groupPageData;
+    }
+
+    @Override
+    @Retryable(retryFor = OptimisticLockingFailureException.class)
+    public void updateGroup(Group group) {
+        if (groupMapper.updateById(group) == 0){
+            throw new OptimisticLockingFailureException("Optimistic locking failed");
+        }
+    }
+
     @Override
     @Retryable(retryFor = OptimisticLockingFailureException.class)
     @Transactional(noRollbackFor = OptimisticLockingFailureException.class)