diff --git a/src/rpc/auth/auth/rpcAuth.go b/src/rpc/auth/auth/rpcAuth.go
index b93d7b8fc..237fc9bab 100644
--- a/src/rpc/auth/auth/rpcAuth.go
+++ b/src/rpc/auth/auth/rpcAuth.go
@@ -3,9 +3,9 @@ package rpcAuth
 import (
 	"Open_IM/src/common/config"
 	log2 "Open_IM/src/common/log"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbAuth "Open_IM/src/proto/auth"
 	"Open_IM/src/utils"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
 	"google.golang.org/grpc"
 	"net"
 	"strconv"
diff --git a/src/rpc/chat/chat/rpcChat.go b/src/rpc/chat/chat/rpcChat.go
index 85a800bdb..ca5aeefa0 100644
--- a/src/rpc/chat/chat/rpcChat.go
+++ b/src/rpc/chat/chat/rpcChat.go
@@ -4,9 +4,9 @@ import (
 	"Open_IM/src/common/config"
 	"Open_IM/src/common/kafka"
 	log2 "Open_IM/src/common/log"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbChat "Open_IM/src/proto/chat"
 	"Open_IM/src/utils"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
 	"google.golang.org/grpc"
 	"net"
 	"strconv"
diff --git a/src/rpc/chat/chat/send_msg.go b/src/rpc/chat/chat/send_msg.go
index 27d0a7a8f..c1764ab3a 100644
--- a/src/rpc/chat/chat/send_msg.go
+++ b/src/rpc/chat/chat/send_msg.go
@@ -1,16 +1,18 @@
 package rpcChat
 
 import (
+	"Open_IM/src/api/group"
 	"Open_IM/src/common/config"
 	"Open_IM/src/common/constant"
 	http2 "Open_IM/src/common/http"
 	"Open_IM/src/common/log"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbChat "Open_IM/src/proto/chat"
 	pbGroup "Open_IM/src/proto/group"
+	"Open_IM/src/push/content_struct"
 	"Open_IM/src/utils"
 	"context"
 	"encoding/json"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
 	"math/rand"
 	"net/http"
 	"strconv"
@@ -110,11 +112,38 @@ func (rpc *rpcChat) UserSendMsg(_ context.Context, pb *pbChat.UserSendMsgReq) (*
 				log.Error(pbData.Token, pbData.OperationID, "rpc send_msg getGroupInfo failed, err = %s", reply.ErrorMsg)
 				return returnMsg(&replay, pb, reply.ErrorCode, reply.ErrorMsg, "", 0)
 			}
+			var addUidList []string
+			switch pbData.ContentType {
+			case constant.KickGroupMemberTip:
+				var notification content_struct.NotificationContent
+				var kickContent group.KickGroupMemberReq
+				err := utils.JsonStringToStruct(pbData.Content, &notification)
+				if err != nil {
+					log.ErrorByKv("json unmarshall err", pbData.OperationID, "err", err.Error())
+					return returnMsg(&replay, pb, 200, err.Error(), "", 0)
+				} else {
+					err := utils.JsonStringToStruct(notification.Detail, &kickContent)
+					if err != nil {
+						log.ErrorByKv("json unmarshall err", pbData.OperationID, "err", err.Error())
+						return returnMsg(&replay, pb, 200, err.Error(), "", 0)
+					}
+					for _, v := range kickContent.UidListInfo {
+						addUidList = append(addUidList, v.UserId)
+					}
+				}
+			case constant.QuitGroupTip:
+				addUidList = append(addUidList, pbData.SendID)
+			default:
+			}
 			groupID := pbData.RecvID
 			for i, v := range reply.MemberList {
 				pbData.RecvID = v.UserId + " " + groupID
 				rpc.sendMsgToKafka(&pbData, utils.IntToString(i))
 			}
+			for i, v := range addUidList {
+				pbData.RecvID = v + " " + groupID
+				rpc.sendMsgToKafka(&pbData, utils.IntToString(i+1))
+			}
 			return returnMsg(&replay, pb, 0, "", serverMsgID, pbData.SendTime)
 		default:
 
diff --git a/src/rpc/friend/friend/get_firends_info.go b/src/rpc/friend/friend/get_firends_info.go
index f0f05f431..1da6ebaaf 100644
--- a/src/rpc/friend/friend/get_firends_info.go
+++ b/src/rpc/friend/friend/get_firends_info.go
@@ -5,11 +5,11 @@ import (
 	"Open_IM/src/common/constant"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbFriend "Open_IM/src/proto/friend"
 	"Open_IM/src/utils"
 	"context"
 	"fmt"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
 	"google.golang.org/grpc"
 	"net"
 	"strconv"
diff --git a/src/rpc/group/group/create_group.go b/src/rpc/group/group/create_group.go
index f5d99c325..ba578f3df 100644
--- a/src/rpc/group/group/create_group.go
+++ b/src/rpc/group/group/create_group.go
@@ -3,12 +3,14 @@ package group
 import (
 	"Open_IM/src/common/config"
 	"Open_IM/src/common/constant"
+	"Open_IM/src/common/db"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbGroup "Open_IM/src/proto/group"
 	"Open_IM/src/utils"
 	"context"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
+	"fmt"
 	"google.golang.org/grpc"
 	"net"
 	"strconv"
@@ -74,7 +76,7 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
 		return &pbGroup.CreateGroupResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
 	}
 	//Time stamp + MD5 to generate group chat id
-	groupId = utils.Md5(strconv.FormatInt(time.Now().Unix(), 10))
+	groupId = utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
 	err = im_mysql_model.InsertIntoGroup(groupId, req.GroupName, req.Introduction, req.Notification, req.FaceUrl)
 	if err != nil {
 		log.ErrorByKv("create group chat failed", req.OperationID, "err=%s", err.Error())
@@ -82,17 +84,38 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
 	}
 
 	//Add the group owner to the group first, otherwise the group creation will fail
-	err = im_mysql_model.InsertIntoGroupMember(groupId, claims.UID, "", "", constant.GroupCreator)
+	us, err := im_mysql_model.FindUserByUID(claims.UID)
+	if err != nil {
+		log.Error("", req.OperationID, "find userInfo failed", err.Error())
+		return &pbGroup.CreateGroupResp{ErrorCode: config.ErrCreateGroup.ErrCode, ErrorMsg: config.ErrCreateGroup.ErrMsg}, nil
+	}
+	err = im_mysql_model.InsertIntoGroupMember(groupId, claims.UID, us.Name, us.Icon, constant.GroupOwner)
 	if err != nil {
 		log.Error("", req.OperationID, "create group chat failed,err=%s", err.Error())
 		return &pbGroup.CreateGroupResp{ErrorCode: config.ErrCreateGroup.ErrCode, ErrorMsg: config.ErrCreateGroup.ErrMsg}, nil
 	}
+
+	err = db.DB.AddGroupMember(groupId, claims.UID)
+	if err != nil {
+		log.Error("", "", "create mongo group member failed, db.DB.AddGroupMember fail [err: %s]", err.Error())
+		return &pbGroup.CreateGroupResp{ErrorCode: config.ErrCreateGroup.ErrCode, ErrorMsg: config.ErrCreateGroup.ErrMsg}, nil
+	}
+
 	//Binding group id and member id
 	for _, user := range req.MemberList {
-		err = im_mysql_model.InsertIntoGroupMember(groupId, user.Uid, "", "", user.SetRole)
+		us, err := im_mysql_model.FindUserByUID(user.Uid)
+		if err != nil {
+			log.Error("", req.OperationID, "find userInfo failed,uid=%s", user.Uid, err.Error())
+			continue
+		}
+		err = im_mysql_model.InsertIntoGroupMember(groupId, user.Uid, us.Name, us.Icon, user.SetRole)
 		if err != nil {
 			log.ErrorByArgs("pull %s to group %s failed,err=%s", user.Uid, groupId, err.Error())
 		}
+		err = db.DB.AddGroupMember(groupId, user.Uid)
+		if err != nil {
+			log.Error("", "", "add mongo group member failed, db.DB.AddGroupMember fail [err: %s]", err.Error())
+		}
 	}
 	////Push message when create group chat
 	//logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
@@ -106,5 +129,10 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
 	//	OperationID: req.OperationID,
 	//})
 	log.Info(req.Token, req.OperationID, "rpc create group success return")
+
+	t := db.DB.GetGroupMember(groupId)
+	fmt.Println("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY")
+	fmt.Println(t)
+
 	return &pbGroup.CreateGroupResp{GroupID: groupId}, nil
 }
diff --git a/src/rpc/group/group/get_groups_info.go b/src/rpc/group/group/get_groups_info.go
index 7f8720a20..a7fecc773 100644
--- a/src/rpc/group/group/get_groups_info.go
+++ b/src/rpc/group/group/get_groups_info.go
@@ -17,14 +17,9 @@ func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsI
 		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
 		return &pbGroup.GetGroupsInfoResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
 	}
+	log.Info("", req.OperationID, "args:", req.GroupIDList, claims.UID)
 	groupsInfoList := make([]*pbGroup.GroupInfo, 0)
 	for _, groupID := range req.GroupIDList {
-		//	Get group information to check whether the current user is in the current group
-		_, err = im_mysql_model.FindGroupMemberInfoByGroupIdAndUserId(groupID, claims.UID)
-		if err != nil {
-			log.Error(req.Token, req.OperationID, "find group member failed,err=%s", err.Error())
-			continue
-		}
 		groupInfoFromMysql, err := im_mysql_model.FindGroupInfoByGroupId(groupID)
 		if err != nil {
 			log.Error(req.Token, req.OperationID, "find group info failed,err=%s", err.Error())
@@ -36,6 +31,7 @@ func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsI
 		groupInfo.Introduction = groupInfoFromMysql.Introduction
 		groupInfo.Notification = groupInfoFromMysql.Notification
 		groupInfo.FaceUrl = groupInfoFromMysql.FaceUrl
+		groupInfo.OwnerId = im_mysql_model.GetGroupOwnerByGroupId(groupID)
 		groupInfo.MemberCount = uint32(im_mysql_model.GetGroupMemberNumByGroupId(groupID))
 		groupInfo.CreateTime = uint64(groupInfoFromMysql.CreateTime.Unix())
 
diff --git a/src/rpc/group/group/group.go b/src/rpc/group/group/group.go
index 1d10f4427..5f77505f4 100644
--- a/src/rpc/group/group/group.go
+++ b/src/rpc/group/group/group.go
@@ -2,15 +2,14 @@ package group
 
 import (
 	"Open_IM/src/common/config"
-	"Open_IM/src/common/constant"
+	"Open_IM/src/common/db"
+
 	imdb "Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
-	pbChat "Open_IM/src/proto/chat"
 	pbGroup "Open_IM/src/proto/group"
-	"Open_IM/src/push/logic"
 	"Open_IM/src/utils"
 	"context"
-	"encoding/json"
+
 	"fmt"
 )
 
@@ -36,6 +35,7 @@ func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJo
 		owner := imdb.GetGroupOwnerByGroupId(v.GroupId)
 		group, err := imdb.FindGroupInfoByGroupId(v.GroupId)
 		if num > 0 && owner != "" && err == nil {
+			groupNode.GroupId = v.GroupId
 			groupNode.FaceUrl = group.FaceUrl
 			groupNode.CreateTime = uint64(group.CreateTime.Unix())
 			groupNode.GroupName = group.Name
@@ -58,16 +58,23 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 		return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
 	}
 	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())
+
+	if !imdb.IsExistGroupMember(req.GroupID, claims.UID) {
+		log.Error(req.Token, req.OperationID, "err= invite user not in group")
+		return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrAccess.ErrCode, ErrorMsg: config.ErrAccess.ErrMsg}, nil
+	}
+
 	//
 	//from User:  invite: applicant
 	//to user:  invite: invited
 	//to application
 	var resp pbGroup.InviteUserToGroupResp
-	fromUserInfo, err := imdb.FindUserByUID(claims.UID)
-	if err != nil {
-		log.Error(claims.UID, req.OperationID, "FindUserByUID failed, err: ", err.Error())
-		return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
-	}
+	/*
+		fromUserInfo, err := imdb.FindUserByUID(claims.UID)
+		if err != nil {
+			log.Error(claims.UID, req.OperationID, "FindUserByUID failed, err: ", err.Error())
+			return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
+		}*/
 
 	for _, v := range req.UidList {
 		var resultNode pbGroup.Id2Result
@@ -80,14 +87,24 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 			resp.Id2Result = append(resp.Id2Result, &resultNode)
 			continue
 		}
-		err = imdb.InsertGroupRequest(req.GroupID, fromUserInfo.UID, fromUserInfo.Name, fromUserInfo.Icon, toUserInfo.UID, req.Reason, "invited", 1)
-		if err != nil {
-			log.Error(v, req.OperationID, "InsertGroupRequest failed, err: ", err.Error(), "params: ",
-				req.GroupID, fromUserInfo.UID, fromUserInfo.Name, fromUserInfo.Icon, toUserInfo.UID, req.Reason)
+
+		if imdb.IsExistGroupMember(req.GroupID, v) {
+			log.Error(v, req.OperationID, "user has already in group")
 			resultNode.Result = -1
 			resp.Id2Result = append(resp.Id2Result, &resultNode)
 			continue
 		}
+		/*
+			err = imdb.InsertGroupRequest(req.GroupID, fromUserInfo.UID, fromUserInfo.Name, fromUserInfo.Icon, toUserInfo.UID, req.Reason, "invited", 1)
+			if err != nil {
+				log.Error(v, req.OperationID, "InsertGroupRequest failed, err: ", err.Error(), "params: ",
+					req.GroupID, fromUserInfo.UID, fromUserInfo.Name, fromUserInfo.Icon, toUserInfo.UID, req.Reason)
+				resultNode.Result = -1
+				resp.Id2Result = append(resp.Id2Result, &resultNode)
+				continue
+			}
+		*/
+
 		err = imdb.InsertGroupMember(req.GroupID, toUserInfo.UID, toUserInfo.Name, toUserInfo.Icon, 0)
 		if err != nil {
 			log.Error(v, req.OperationID, "InsertGroupMember failed, ", err.Error(), "params: ",
@@ -96,21 +113,31 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
 			resp.Id2Result = append(resp.Id2Result, &resultNode)
 			continue
 		}
+		err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UID)
+		if err != nil {
+			log.Error("", "", "add mongo group member failed, db.DB.AddGroupMember fail [err: %s]", err.Error())
+		}
+
 		resp.Id2Result = append(resp.Id2Result, &resultNode)
 	}
 	resp.ErrorCode = 0
 	resp.ErrorMsg = "ok"
+	/*
+		var chatMsg pbChat.WSToMsgSvrChatMsg
+		chatMsg.SendID = claims.UID
+		chatMsg.RecvID = req.GroupID
+		content, _ := json.Marshal(req)
+		chatMsg.Content = string(content)
+		chatMsg.SendTime = utils.GetCurrentTimestampBySecond()
+		chatMsg.MsgFrom = constant.UserMsgType
+		chatMsg.ContentType = constant.InviteUserToGroupTip
+		chatMsg.SessionType = constant.GroupChatType
+		logic.SendMsgByWS(&chatMsg)
+	*/
 
-	var chatMsg pbChat.WSToMsgSvrChatMsg
-	chatMsg.SendID = claims.UID
-	chatMsg.RecvID = req.GroupID
-	content, _ := json.Marshal(req)
-	chatMsg.Content = string(content)
-	chatMsg.SendTime = utils.GetCurrentTimestampBySecond()
-	chatMsg.MsgFrom = constant.UserMsgType
-	chatMsg.ContentType = constant.InviteUserToGroupTip
-	chatMsg.SessionType = constant.GroupChatType
-	logic.SendMsgByWS(&chatMsg)
+	t := db.DB.GetGroupMember(req.GroupID)
+	fmt.Println("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY")
+	fmt.Println(t)
 
 	return &resp, nil
 }
@@ -139,6 +166,7 @@ func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGro
 		node.Role = v.AdministratorLevel
 		node.NickName = v.NickName
 		node.UserId = v.Uid
+		node.FaceUrl = v.UserGroupFaceUrl
 		node.JoinTime = uint64(v.JoinTime.Unix())
 		resp.MemberList = append(resp.MemberList, &node)
 	}
@@ -211,46 +239,58 @@ func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGrou
 		return &pbGroup.KickGroupMemberResp{ErrorCode: config.ErrAccess.ErrCode, ErrorMsg: config.ErrAccess.ErrMsg}, nil
 	}
 
-	if len(req.UidList) == 0 {
+	if len(req.UidListInfo) == 0 {
 		log.Error(claims.UID, req.OperationID, "kick list 0")
 		return &pbGroup.KickGroupMemberResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
 	}
 	//remove
 	var resp pbGroup.KickGroupMemberResp
-	for _, v := range req.UidList {
+	for _, v := range req.UidListInfo {
 		//owner cant kicked
-		if v == claims.UID {
-			log.Error(claims.UID, req.OperationID, v, "cant kick owner")
-			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v, Result: -1})
+		if v.UserId == claims.UID {
+			log.Error(claims.UID, req.OperationID, v.UserId, "cant kick owner")
+			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: -1})
 			continue
 		}
-		err := imdb.RemoveGroupMember(req.GroupID, v)
+		err := imdb.RemoveGroupMember(req.GroupID, v.UserId)
 		if err != nil {
-			log.Error(claims.UID, req.OperationID, v, req.GroupID, "RemoveGroupMember failed ", err.Error())
-			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v, Result: -1})
+			log.Error(claims.UID, req.OperationID, v.UserId, req.GroupID, "RemoveGroupMember failed ", err.Error())
+			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: -1})
 		} else {
-			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v, Result: 0})
+			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: 0})
 		}
+
+		err = db.DB.DelGroupMember(req.GroupID, v.UserId)
+		if err != nil {
+			log.Error("", "", "delete mongo group member failed, db.DB.DelGroupMember fail [err: %s]", err.Error())
+		}
+
 	}
 
-	var chatMsg pbChat.WSToMsgSvrChatMsg
-	chatMsg.SendID = claims.UID
-	chatMsg.RecvID = req.GroupID
-	content, _ := json.Marshal(req)
-	chatMsg.Content = string(content)
-	chatMsg.SendTime = utils.GetCurrentTimestampBySecond()
-	chatMsg.MsgFrom = constant.UserMsgType
-	chatMsg.ContentType = constant.KickGroupMemberTip
-	chatMsg.SessionType = constant.GroupChatType
-	logic.SendMsgByWS(&chatMsg)
+	/*
+		var chatMsg pbChat.WSToMsgSvrChatMsg
+		chatMsg.SendID = claims.UID
+		chatMsg.RecvID = req.GroupID
+		content, _ := json.Marshal(req)
+		chatMsg.Content = string(content)
+		chatMsg.SendTime = utils.GetCurrentTimestampBySecond()
+		chatMsg.MsgFrom = constant.UserMsgType
+		chatMsg.ContentType = constant.KickGroupMemberTip
+		chatMsg.SessionType = constant.GroupChatType
+		logic.SendMsgByWS(&chatMsg)
 
-	for _, v := range req.UidList {
-		kickChatMsg := chatMsg
-		kickChatMsg.RecvID = v
-		kickChatMsg.SendTime = utils.GetCurrentTimestampBySecond()
-		kickChatMsg.SessionType = constant.SingleChatType
-		logic.SendMsgByWS(&kickChatMsg)
-	}
+		for _, v := range req.UidList {
+			kickChatMsg := chatMsg
+			kickChatMsg.RecvID = v
+			kickChatMsg.SendTime = utils.GetCurrentTimestampBySecond()
+			kickChatMsg.SessionType = constant.SingleChatType
+			logic.SendMsgByWS(&kickChatMsg)
+		}
+	*/
+
+	t := db.DB.GetGroupMember(req.GroupID)
+	fmt.Println("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY")
+	fmt.Println(t)
 
 	resp.ErrorCode = 0
 	return &resp, nil
diff --git a/src/rpc/group/group/group_application_response.go b/src/rpc/group/group/group_application_response.go
index ceecd5ee3..5cae88a0c 100644
--- a/src/rpc/group/group/group_application_response.go
+++ b/src/rpc/group/group/group_application_response.go
@@ -1,16 +1,12 @@
 package group
 
 import (
-	"Open_IM/src/common/constant"
+	"Open_IM/src/common/db"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
-	pbChat "Open_IM/src/proto/chat"
 	"Open_IM/src/proto/group"
-	"Open_IM/src/push/content_struct"
-	"Open_IM/src/push/logic"
-	"Open_IM/src/utils"
 	"context"
-	"encoding/json"
+	"fmt"
 )
 
 func (s *groupServer) GroupApplicationResponse(_ context.Context, pb *group.GroupApplicationResponseReq) (*group.GroupApplicationResponseResp, error) {
@@ -21,70 +17,28 @@ func (s *groupServer) GroupApplicationResponse(_ context.Context, pb *group.Grou
 		log.Error("", "", "rpc GroupApplicationResponse call..., im_mysql_model.GroupApplicationResponse fail [pb: %s] [err: %s]", pb.String(), err.Error())
 		return nil, err
 	}
+
+	if pb.HandleResult == 1 {
+		if pb.ToUserID == "0" {
+			err = db.DB.AddGroupMember(pb.GroupID, pb.FromUserID)
+			if err != nil {
+				log.Error("", "", "rpc GroupApplicationResponse call..., db.DB.AddGroupMember fail [pb: %s] [err: %s]", pb.String(), err.Error())
+				return nil, err
+			}
+		} else {
+			err = db.DB.AddGroupMember(pb.GroupID, pb.ToUserID)
+			if err != nil {
+				log.Error("", "", "rpc GroupApplicationResponse call..., db.DB.AddGroupMember fail [pb: %s] [err: %s]", pb.String(), err.Error())
+				return nil, err
+			}
+		}
+	}
+
+	t := db.DB.GetGroupMember(pb.GroupID)
+	fmt.Println("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY")
+	fmt.Println(t)
+
 	log.Info("", "", "rpc GroupApplicationResponse call..., im_mysql_model.GroupApplicationResponse")
 
-	if pb.HandleResult == 1 {
-		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-			SendID:      pb.OwnerID,
-			RecvID:      pb.GroupID,
-			Content:     pb.String(),
-			SendTime:    utils.GetCurrentTimestampBySecond(),
-			MsgFrom:     constant.SysMsgType,
-			ContentType: constant.AcceptGroupApplicationTip,
-			SessionType: constant.GroupChatType,
-			OperationID: pb.OperationID,
-		})
-	}
-
-	var recvID string
-	if pb.ToUserID == "0" {
-		recvID = pb.FromUserID
-	} else {
-		recvID = pb.ToUserID
-	}
-
-	ownerUser, err := im_mysql_model.FindGroupMemberInfoByGroupIdAndUserId(pb.GroupID, pb.OwnerID)
-	if err != nil {
-		return nil, err
-	}
-
-	agreeOrReject := content_struct.AgreeOrRejectGroupMember{
-		GroupId:  ownerUser.GroupId,
-		UserId:   ownerUser.Uid,
-		Role:     int(ownerUser.AdministratorLevel),
-		JoinTime: uint64(ownerUser.JoinTime.Unix()),
-		NickName: ownerUser.NickName,
-		FaceUrl:  ownerUser.UserGroupFaceUrl,
-		Reason:   pb.HandledMsg,
-	}
-	bAgreeOrReject, err := json.Marshal(agreeOrReject)
-	if err != nil {
-		return nil, err
-	}
-
-	if pb.HandleResult == 1 {
-		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-			SendID:      pb.OwnerID,
-			RecvID:      recvID,
-			Content:     string(bAgreeOrReject),
-			SendTime:    utils.GetCurrentTimestampBySecond(),
-			MsgFrom:     constant.SysMsgType,
-			ContentType: constant.AcceptGroupApplicationResultTip,
-			SessionType: constant.SingleChatType,
-			OperationID: pb.OperationID,
-		})
-	} else {
-		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-			SendID:      pb.OwnerID,
-			RecvID:      recvID,
-			Content:     string(bAgreeOrReject),
-			SendTime:    utils.GetCurrentTimestampBySecond(),
-			MsgFrom:     constant.SysMsgType,
-			ContentType: constant.RefuseGroupApplicationResultTip,
-			SessionType: constant.SingleChatType,
-			OperationID: pb.OperationID,
-		})
-	}
-
 	return reply, nil
 }
diff --git a/src/rpc/group/group/join_group.go b/src/rpc/group/group/join_group.go
index 8826986bc..a3993f67d 100644
--- a/src/rpc/group/group/join_group.go
+++ b/src/rpc/group/group/join_group.go
@@ -2,7 +2,6 @@ package group
 
 import (
 	"Open_IM/src/common/config"
-	"Open_IM/src/common/constant"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
 	pbGroup "Open_IM/src/proto/group"
@@ -23,16 +22,14 @@ func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq)
 		log.Error(req.Token, req.OperationID, "No this user,err=%s", err.Error())
 		return &pbGroup.CommonResp{ErrorCode: config.ErrSearchUserInfo.ErrCode, ErrorMsg: config.ErrSearchUserInfo.ErrMsg}, nil
 	}
-	//todo Actively apply or be invited, apply to join the group and keep a record
-	requestUserInfo, err := im_mysql_model.FindGroupRequestUserInfoByUidAndGroupID(req.GroupID, claims.UID)
+
+	_, err = im_mysql_model.FindGroupRequestUserInfoByGroupIDAndUid(req.GroupID, claims.UID)
 	if err == nil {
-		if requestUserInfo.Flag == constant.AgreeApplication {
-			return &pbGroup.CommonResp{ErrorCode: config.ErrJoinGroupApplication.ErrCode, ErrorMsg: config.ErrJoinGroupApplication.ErrMsg}, nil
-		}
-		if requestUserInfo.Flag == constant.Application {
-			err = im_mysql_model.DelGroupRequest(req.GroupID, claims.UID, "0")
-		}
+		err = im_mysql_model.DelGroupRequest(req.GroupID, claims.UID, "0")
 	}
+
+	log.Info(req.Token, req.OperationID, "args: ", req.GroupID, claims.UID, "0", req.Message, applicationUserInfo.Name, applicationUserInfo.Icon)
+
 	if err = im_mysql_model.InsertIntoGroupRequest(req.GroupID, claims.UID, "0", req.Message, applicationUserInfo.Name, applicationUserInfo.Icon); err != nil {
 		log.Error(req.Token, req.OperationID, "Insert into group request failed,er=%s", err.Error())
 		return &pbGroup.CommonResp{ErrorCode: config.ErrJoinGroupApplication.ErrCode, ErrorMsg: config.ErrJoinGroupApplication.ErrMsg}, nil
diff --git a/src/rpc/group/group/quti_group.go b/src/rpc/group/group/quit_group.go
similarity index 70%
rename from src/rpc/group/group/quti_group.go
rename to src/rpc/group/group/quit_group.go
index 06d0b18a2..21533c569 100644
--- a/src/rpc/group/group/quti_group.go
+++ b/src/rpc/group/group/quit_group.go
@@ -2,31 +2,40 @@ package group
 
 import (
 	"Open_IM/src/common/config"
+	"Open_IM/src/common/db"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
 	pbGroup "Open_IM/src/proto/group"
 	"Open_IM/src/utils"
 	"context"
+	"fmt"
 )
 
 func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq) (*pbGroup.CommonResp, error) {
-	log.InfoByArgs("rpc quit group is server,args=%s", req.String())
+	log.InfoByArgs("rpc quit group is server,args:", req.String())
 	//Parse token, to find current user information
 	claims, err := utils.ParseToken(req.Token)
 	if err != nil {
 		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
 		return &pbGroup.CommonResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
 	}
-	//Check to see if there is a group and whether there is a user in the group.
+	log.InfoByKv("args:", req.OperationID, req.GetGroupID(), claims.UID)
+	//Check to see  whether there is a user in the group.
 	_, err = im_mysql_model.FindGroupMemberInfoByGroupIdAndUserId(req.GroupID, claims.UID)
 	if err != nil {
-		log.Error(req.Token, req.OperationID, "no such group or you are not in the group,err=%s", err.Error())
+		log.Error(req.Token, req.OperationID, "no such group or you are not in the group,err=%s", err.Error(), req.OperationID, req.GroupID, claims.UID)
 		return &pbGroup.CommonResp{ErrorCode: config.ErrQuitGroup.ErrCode, ErrorMsg: config.ErrQuitGroup.ErrMsg}, nil
 	}
 	//After the user's verification is successful, user will quit the group chat.
 	err = im_mysql_model.DeleteGroupMemberByGroupIdAndUserId(req.GroupID, claims.UID)
 	if err != nil {
-		log.ErrorByArgs("this user exit the group failed,err=%s", err.Error())
+		log.ErrorByArgs("this user exit the group failed,err=%s", err.Error(), req.OperationID, req.GroupID, claims.UID)
+		return &pbGroup.CommonResp{ErrorCode: config.ErrQuitGroup.ErrCode, ErrorMsg: config.ErrQuitGroup.ErrMsg}, nil
+	}
+
+	err = db.DB.DelGroupMember(req.GroupID, claims.UID)
+	if err != nil {
+		log.Error("", "", "delete mongo group member failed, db.DB.DelGroupMember fail [err: %s]", err.Error())
 		return &pbGroup.CommonResp{ErrorCode: config.ErrQuitGroup.ErrCode, ErrorMsg: config.ErrQuitGroup.ErrMsg}, nil
 	}
 	////Push message when quit group chat
@@ -42,5 +51,10 @@ func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq)
 	//	OperationID: req.OperationID,
 	//})
 	log.Info(req.Token, req.OperationID, "rpc quit group is success return")
+
+	t := db.DB.GetGroupMember(req.GroupID)
+	fmt.Println("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY")
+	fmt.Println(t)
+
 	return &pbGroup.CommonResp{}, nil
 }
diff --git a/src/rpc/group/group/transfer_group_owner.go b/src/rpc/group/group/transfer_group_owner.go
index 9e2c0fa82..088241a46 100644
--- a/src/rpc/group/group/transfer_group_owner.go
+++ b/src/rpc/group/group/transfer_group_owner.go
@@ -1,13 +1,9 @@
 package group
 
 import (
-	"Open_IM/src/common/constant"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
-	pbChat "Open_IM/src/proto/chat"
 	"Open_IM/src/proto/group"
-	"Open_IM/src/push/logic"
-	"Open_IM/src/utils"
 	"context"
 )
 
@@ -21,16 +17,5 @@ func (s *groupServer) TransferGroupOwner(_ context.Context, pb *group.TransferGr
 	}
 	log.Info("", "", "rpc TransferGroupOwner call..., im_mysql_model.TransferGroupOwner")
 
-	logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-		SendID:      pb.OldOwner,
-		RecvID:      pb.GroupID,
-		Content:     pb.String(),
-		SendTime:    utils.GetCurrentTimestampBySecond(),
-		MsgFrom:     constant.UserMsgType,
-		ContentType: constant.TransferGroupOwnerTip,
-		SessionType: constant.GroupChatType,
-		OperationID: pb.OperationID,
-	})
-
 	return reply, nil
 }
diff --git a/src/rpc/user/internal_service/get_user_info_to_client.go b/src/rpc/user/internal_service/get_user_info_to_client.go
index 6019a77cf..8c0b93511 100644
--- a/src/rpc/user/internal_service/get_user_info_to_client.go
+++ b/src/rpc/user/internal_service/get_user_info_to_client.go
@@ -2,9 +2,9 @@ package internal_service
 
 import (
 	"Open_IM/src/common/config"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbUser "Open_IM/src/proto/user"
 	"context"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
 	"strings"
 )
 
diff --git a/src/rpc/user/user/get_user_info.go b/src/rpc/user/user/get_user_info.go
index cc2ba0d6c..74ee468c4 100644
--- a/src/rpc/user/user/get_user_info.go
+++ b/src/rpc/user/user/get_user_info.go
@@ -4,10 +4,10 @@ import (
 	"Open_IM/src/common/config"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbUser "Open_IM/src/proto/user"
 	"Open_IM/src/utils"
 	"context"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
 	"google.golang.org/grpc"
 	"net"
 	"strconv"
diff --git a/src/rpc/user/user/update_user_info.go b/src/rpc/user/user/update_user_info.go
index b9383c1bb..46db95d43 100644
--- a/src/rpc/user/user/update_user_info.go
+++ b/src/rpc/user/user/update_user_info.go
@@ -5,13 +5,13 @@ import (
 	"Open_IM/src/common/constant"
 	"Open_IM/src/common/db/mysql_model/im_mysql_model"
 	"Open_IM/src/common/log"
+	"Open_IM/src/grpc-etcdv3/getcdv3"
 	pbChat "Open_IM/src/proto/chat"
 	pbFriend "Open_IM/src/proto/friend"
 	pbUser "Open_IM/src/proto/user"
 	"Open_IM/src/push/logic"
 	"Open_IM/src/utils"
 	"context"
-	"github.com/skiffer-git/grpc-etcdv3/getcdv3"
 	"strings"
 )
 
@@ -27,37 +27,34 @@ func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbUser.UpdateUserI
 		log.Error(req.Token, req.OperationID, "update user some attribute failed,err=%s", err.Error())
 		return &pbUser.CommonResp{ErrorCode: config.ErrModifyUserInfo.ErrCode, ErrorMsg: config.ErrModifyUserInfo.ErrMsg}, nil
 	}
-	go func() {
-		etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
-		client := pbFriend.NewFriendClient(etcdConn)
-		defer etcdConn.Close()
-		newReq := &pbFriend.GetFriendListReq{
+	etcdConn := getcdv3.GetConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImFriendName)
+	client := pbFriend.NewFriendClient(etcdConn)
+	newReq := &pbFriend.GetFriendListReq{
+		OperationID: req.OperationID,
+		Token:       req.Token,
+	}
+
+	RpcResp, err := client.GetFriendList(context.Background(), newReq)
+	if err != nil {
+		log.Error(req.Token, req.OperationID, "err=%s,call get friend list rpc server failed", err)
+		log.ErrorByKv("get friend list rpc server failed", req.OperationID, "err", err.Error(), "req", req.String())
+	}
+	if RpcResp.ErrorCode != 0 {
+		log.ErrorByKv("get friend list rpc server failed", req.OperationID, "err", err.Error(), "req", req.String())
+	}
+	for _, v := range RpcResp.Data {
+		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
+			SendID:      claims.UID,
+			RecvID:      v.Uid,
+			Content:     claims.UID + "'s info has changed",
+			SendTime:    utils.GetCurrentTimestampBySecond(),
+			MsgFrom:     constant.SysMsgType,
+			ContentType: constant.SetSelfInfoTip,
+			SessionType: constant.SingleChatType,
 			OperationID: req.OperationID,
 			Token:       req.Token,
-		}
+		})
 
-		RpcResp, err := client.GetFriendList(context.Background(), newReq)
-		if err != nil {
-			log.Error(req.Token, req.OperationID, "err=%s,call get friend list rpc server failed", err)
-			log.ErrorByKv("get friend list rpc server failed", req.OperationID, "err", err.Error(), "req", req.String())
-		}
-		if RpcResp.ErrorCode != 0 {
-			log.ErrorByKv("get friend list rpc server failed", req.OperationID, "err", err.Error(), "req", req.String())
-		}
-		for _, v := range RpcResp.Data {
-			logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
-				SendID:      claims.UID,
-				RecvID:      v.Uid,
-				Content:     claims.UID + "'s info has changed",
-				SendTime:    utils.GetCurrentTimestampBySecond(),
-				MsgFrom:     constant.SysMsgType,
-				ContentType: constant.SetSelfInfoTip,
-				SessionType: constant.SingleChatType,
-				OperationID: req.OperationID,
-				Token:       req.Token,
-			})
-
-		}
-	}()
+	}
 	return &pbUser.CommonResp{}, nil
 }