Преглед изворни кода

Merge branch 'feature/v1.2.7' into dev/v1.2.7_rjj

renjiaojiao пре 2 година
родитељ
комит
d5bd2dd128

+ 28 - 0
api/internal/handler/clearunreadmessageshandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"app.yhyue.com/moapp/MessageCenter/api/internal/logic"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func ClearUnreadMessagesHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.ClearUnreadMsgReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewClearUnreadMessagesLogic(r.Context(), svcCtx)
+		resp, err := l.ClearUnreadMessages(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/messagelisthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"app.yhyue.com/moapp/MessageCenter/api/internal/logic"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func MessageListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.MessageListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewMessageListLogic(r.Context(), svcCtx)
+		resp, err := l.MessageList(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 10 - 0
api/internal/handler/routes.go

@@ -72,6 +72,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 				Path:    "/messageCenter/GetBuoyMsg",
 				Handler: GetBuoyMsgHandler(serverCtx),
 			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/messageCenter/ClearUnreadMsg",
+				Handler: ClearUnreadMessagesHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/messageCenter/MessageList",
+				Handler: MessageListHandler(serverCtx),
+			},
 		},
 	)
 }

+ 42 - 0
api/internal/logic/clearunreadmessageslogic.go

@@ -0,0 +1,42 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/rpc/messageclient"
+	"context"
+
+	"app.yhyue.com/moapp/MessageCenter/api/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type ClearUnreadMessagesLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewClearUnreadMessagesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ClearUnreadMessagesLogic {
+	return &ClearUnreadMessagesLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *ClearUnreadMessagesLogic) ClearUnreadMessages(req *types.ClearUnreadMsgReq) (result *types.Response, err error) {
+	result = new(types.Response)
+	lsi := l.svcCtx.MessageCenter
+	res, err := lsi.ClearUnreadMsg(l.ctx, &messageclient.ClearUnreadMsgReq{
+		Userid:     req.UserId,
+		EntId:      req.EntId,
+		PositionId: req.PositionId,
+		AppId:      req.AppId,
+	})
+	if err != nil {
+		result.Code = -1
+	}
+	result.Code = res.Code
+	result.Message = res.Message
+	return result, nil
+}

+ 125 - 0
api/internal/logic/messagelistlogic.go

@@ -0,0 +1,125 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/rpc/messageclient"
+	"context"
+	"fmt"
+
+	"app.yhyue.com/moapp/MessageCenter/api/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type MessageListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewMessageListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MessageListLogic {
+	return &MessageListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *MessageListLogic) MessageList(req *types.MessageListReq) (resp *types.MessageListResp, err error) {
+	// todo: add your logic here and delete this line
+	result := new(types.MessageListResp)
+	lsi := l.svcCtx.MessageCenter
+	fmt.Println(req)
+	res, err := lsi.UserMsgList(l.ctx, &messageclient.UserMsgListReq{
+		MsgType:    req.MsgType,
+		Appid:      req.AppId,
+		SortSize:   req.SortSize,
+		UserId:     req.UserId,
+		Read:       req.IsRead,
+		OffSet:     req.Offset,
+		PageSize:   req.Size,
+		IsPc:       req.IsPc,
+		MobileHome: req.MobileHome,
+	})
+	if err != nil {
+		return nil, err
+	}
+
+	result.Code = res.Code
+	result.Message = res.Message
+	result.Total = res.Count
+	if res.List != nil && len(res.List) > 0 {
+		for _, v := range res.List {
+			result.Data = append(result.Data, map[string]interface{}{
+				"id":           v.Id,
+				"appid":        v.Appid,
+				"receive_name": v.ReceiveName,
+				"send_userid":  v.SendUserId,
+				"send_name":    v.SendName,
+				"createtime":   v.Createtime,
+				"title":        v.Title,
+				"msg_type":     v.MsgType,
+				"link":         v.Link,
+				"cite_id":      v.CiteId,
+				"content":      v.Content,
+				"isRead":       v.IsRead,
+				"msgLogId":     v.MsgLogId,
+				"url":          v.Url,
+			})
+		}
+	}
+	if res.Last != nil {
+		result.Last = map[string]interface{}{
+			"id":           res.Last.Id,
+			"appid":        res.Last.Appid,
+			"receive_name": res.Last.ReceiveName,
+			"send_userid":  res.Last.SendUserId,
+			"send_name":    res.Last.SendName,
+			"createtime":   res.Last.Createtime,
+			"title":        res.Last.Title,
+			"msg_type":     res.Last.MsgType,
+			"link":         res.Last.Link,
+			"cite_id":      res.Last.CiteId,
+			"content":      res.Last.Content,
+			"isRead":       res.Last.IsRead,
+			"msgLogId":     res.Last.MsgLogId,
+			"url":          res.Last.Url,
+		}
+	}
+
+	if res.Column != nil && len(res.Column) > 0 {
+		var columns []map[string]interface{}
+		for _, vs := range res.Column {
+			var column = map[string]interface{}{
+				"name":           vs.Name,
+				"img":            vs.Img,
+				"msg_type":       vs.MsgType,
+				"unreadMessages": vs.UnreadMessages,
+			}
+			var cn []map[string]interface{}
+			for _, v := range vs.Data {
+				cn = append(cn, map[string]interface{}{
+					"id":           v.Id,
+					"appid":        v.Appid,
+					"receive_name": v.ReceiveName,
+					"send_userid":  v.SendUserId,
+					"send_name":    v.SendName,
+					"createtime":   v.Createtime,
+					"title":        v.Title,
+					"msg_type":     v.MsgType,
+					"link":         v.Link,
+					"cite_id":      v.CiteId,
+					"content":      v.Content,
+					"isRead":       v.IsRead,
+					"msgLogId":     v.MsgLogId,
+				})
+			}
+			column["msgData"] = cn
+			columns = append(columns, column)
+		}
+		result.Column = columns
+	}
+
+	return result, nil
+
+}

+ 29 - 0
api/internal/types/types.go

@@ -150,3 +150,32 @@ type GetBuoyMsgResp struct {
 	Message string                   `json:"error_msg"`
 	Data    []map[string]interface{} `json:"data"`
 }
+
+type ClearUnreadMsgReq struct {
+	UserId     string `header:"mgoUserId"`
+	AppId      string `header:"appId"`
+	EntId      int64  `header:"entId,optional"`
+	PositionId int64  `header:"positionId,optional"`
+}
+
+type MessageListReq struct {
+	UserId     string `header:"mgoUserId"`
+	AppId      string `header:"appId"`
+	EntId      int64  `header:"entId,optional"`
+	SortSize   int64  `json:"sortSize,optional"` //分类获取数
+	Offset     int64  `json:"offset"`            //
+	Size       int64  `json:"size,optional"`
+	MsgType    int64  `json:"msgType,optional"`
+	IsRead     int64  `json:"isRead,optional"`
+	IsPc       bool   `json:"isPc"`
+	MobileHome bool   `json:"mobileHome"`
+}
+
+type MessageListResp struct {
+	Code    int64                    `json:"code"`
+	Message string                   `json:"message"`
+	Data    []map[string]interface{} `json:"data"`
+	Last    map[string]interface{}   `json:"last"`
+	Total   int64                    `json:"total"`
+	Column  []map[string]interface{} `json:"column"`
+}

+ 36 - 0
api/message.api

@@ -148,6 +148,35 @@ type GetBuoyMsgResp {
 	Data    []map[string]interface{} `json:"data"`
 }
 
+type ClearUnreadMsgReq {
+	UserId     string `header:"mgoUserId"`
+	AppId      string `header:"appId"`
+	EntId      int64  `header:"entId,optional"`
+	PositionId int64  `header:"positionId,optional"`
+}
+
+type MessageListReq {
+	UserId     string `header:"mgoUserId"`
+	AppId      string `header:"appId"`
+	EntId      int64  `header:"entId,optional"`
+	SortSize   int64  `json:"sortSize,optional"` //分类获取数
+	Offset     int64  `json:"offset"`            //
+	Size       int64  `json:"size,optional"`
+	MsgType    int64  `json:"msgType,optional"`
+	IsRead     int64  `json:"isRead,optional"`
+	IsPc       bool   `json:"isPc"`
+	MobileHome bool   `json:"mobileHome"`
+}
+
+type MessageListResp {
+	Code    int64                    `json:"code"`
+	Message string                   `json:"message"`
+	Data    []map[string]interface{} `json:"data"`
+	Last    map[string]interface{}   `json:"last"`
+	Total   int64                    `json:"total"`
+	Column  []map[string]interface{} `json:"column"`
+}
+
 service message-api {
 	//删除消息
 	@handler MessageDeleteHandler // TODO: set handler name and delete this comment
@@ -187,4 +216,11 @@ service message-api {
 	// 查询浮标信息
 	@handler GetBuoyMsgHandler
 	post /messageCenter/GetBuoyMsg (GetBuoyMsgReq) returns (GetBuoyMsgResp)
+	
+	// 一键清空未读消息
+	@handler ClearUnreadMessages
+	post /messageCenter/ClearUnreadMsg (ClearUnreadMsgReq) returns (response)
+	
+	@handler MessageList
+	post /messageCenter/MessageList (MessageListReq) returns (MessageListResp)
 }

+ 2 - 1
entity/message.go

@@ -9,10 +9,11 @@ import (
 	"github.com/go-xorm/xorm"
 )
 
-//定义orm引擎
+// 定义orm引擎
 var Engine *xorm.Engine
 var EtcdCli *clientv3.Client
 var Mysql *mysql.Mysql
+var MessageColumn []map[string]interface{}
 var Mysql11 *sql.DB
 var SurvivalTime int
 var SaveConcurrencyChan chan int //  定义保存消息并发

+ 35 - 0
rpc/internal/logic/clearunreadmsglogic.go

@@ -0,0 +1,35 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/service"
+	"context"
+
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type ClearUnreadMsgLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewClearUnreadMsgLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ClearUnreadMsgLogic {
+	return &ClearUnreadMsgLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// 一键清空未读消息
+func (l *ClearUnreadMsgLogic) ClearUnreadMsg(in *message.ClearUnreadMsgReq) (*message.Response, error) {
+	// todo: add your logic here and delete this line
+	err := service.ClearUnreadMsg(in)
+	if err != nil {
+		return &message.Response{Code: -1, Message: err.Error()}, err
+	}
+	return &message.Response{}, err
+}

+ 68 - 0
rpc/internal/logic/usermsglistlogic.go

@@ -0,0 +1,68 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/service"
+	"app.yhyue.com/moapp/MessageCenter/util"
+	"context"
+
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UserMsgListLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewUserMsgListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserMsgListLogic {
+	return &UserMsgListLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// new用户消息列表
+func (l *UserMsgListLogic) UserMsgList(in *message.UserMsgListReq) (*message.UserMsgListRes, error) {
+	// todo: add your logic here and delete this line
+
+	data := new(message.UserMsgListRes)
+	res1 := service.UserMsgList(in)    //具体信息
+	res2 := service.MessageGetLast(in) //最新信息
+	if res2 != nil || res1.Data != nil {
+		var finalData []*message.Messages
+		if res1.Data != nil {
+			for _, v := range res1.Data {
+				link3, androidUrl3, iosUrl3, weChatUrl3 := util.LinkSplit(v.Link)
+				v.Link = link3
+				v.Url = map[string]string{
+					"androidUrl": androidUrl3,
+					"iosUrl":     iosUrl3,
+					"weChatUrl":  weChatUrl3,
+				}
+				finalData = append(finalData, v)
+			}
+		}
+
+		lastMsg := new(message.Messages)
+		if res2 != nil {
+			lastMsg = res2
+			links4 := lastMsg.Link
+			link4, androidUrl4, iosUrl4, weChatUrl4 := util.LinkSplit(links4)
+			lastMsg.Link = link4
+			lastMsg.Url = map[string]string{
+				"androidUrl": androidUrl4,
+				"iosUrl":     iosUrl4,
+				"weChatUrl":  weChatUrl4,
+			}
+		}
+		data.Column = res1.SortData
+		data.List = finalData
+		data.Last = lastMsg
+		data.Count = res1.Count
+	}
+	return data, nil
+}

+ 12 - 0
rpc/internal/server/messageserver.go

@@ -87,3 +87,15 @@ func (s *MessageServer) FindUserBuoyMsg(ctx context.Context, in *message.FindUse
 	l := logic.NewFindUserBuoyMsgLogic(ctx, s.svcCtx)
 	return l.FindUserBuoyMsg(in)
 }
+
+//    一键清空未读消息
+func (s *MessageServer) ClearUnreadMsg(ctx context.Context, in *message.ClearUnreadMsgReq) (*message.Response, error) {
+	l := logic.NewClearUnreadMsgLogic(ctx, s.svcCtx)
+	return l.ClearUnreadMsg(in)
+}
+
+//    new用户消息列表
+func (s *MessageServer) UserMsgList(ctx context.Context, in *message.UserMsgListReq) (*message.UserMsgListRes, error) {
+	l := logic.NewUserMsgListLogic(ctx, s.svcCtx)
+	return l.UserMsgList(in)
+}

+ 5 - 1
rpc/message.go

@@ -43,7 +43,7 @@ func main() {
 	s.Start()
 }
 
-//创建orm引擎
+// 创建orm引擎
 func init() {
 	conf.MustLoad(*configFile, &config.ConfigJson)
 	log.Println("开始初始化数据库。。。。。")
@@ -57,6 +57,10 @@ func init() {
 		MaxIdleConns: config.ConfigJson.DataSource.MaxIdleConns,
 	}
 	entity.Mysql.Init()
+	data := entity.Mysql.Find("message_column", map[string]interface{}{"equity": "private_msg"}, "", "sequence", -1, -1)
+	if data != nil && len(*data) > 0 {
+		entity.MessageColumn = *data
+	}
 	//初始化 redis
 	if config.ConfigJson.Redis.Addr != "" {
 		if config.ConfigJson.Redis.Modules == "" {

+ 48 - 0
rpc/message.proto

@@ -67,6 +67,7 @@ message Messages {
     string appid = 12; //应用标识
     string id = 13; //消息id
     int64 msgLogId = 14;
+    map<string, string> url = 15;
 }
 
 message FindUserMsgRes {
@@ -172,6 +173,47 @@ message BuoyMessages {
 
 }
 
+message ClearUnreadMsgReq {
+    string userid = 1; //mgoId
+    int64  entId = 2;
+    int64 positionId = 3; //职位id
+    string appId = 4;
+}
+
+message UserMsgListReq {
+    string userId = 1; //用户id
+    string appid = 3; //应用标识
+    int64 offSet = 4; //当前
+    int64 pageSize = 5; //大小
+    int64 msgType = 6; //是否区分类型
+    int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
+    int64 SortSize = 8; //分类 每类数
+    bool isPc = 9;
+    bool  mobileHome = 10;
+}
+
+message UserMsgListRes {
+    int64 code = 1; //状态码
+    string message = 2; //响应消息
+    repeated Messages list = 3; //
+    Messages last = 4; //
+    repeated AllSortData column = 5; //
+    int64 count = 6; //总数
+}
+
+message UserMsgList {
+    repeated Messages data = 1; //
+    repeated AllSortData sortData = 2; //
+    int64 count = 3; //总数
+}
+
+message AllSortData {
+    int64 unreadMessages =1 ;
+   string name =2;
+   string img = 3;
+   int64 msgType = 4; //是否区分类型;
+   repeated Messages data = 5; //
+}
 
 service Message {
     //批量保存消息
@@ -196,4 +238,10 @@ service Message {
     rpc GetMsgType (GetMsgTypeReq) returns (GetMsgTypeRes);
     //  查询指定用户的浮标消息
     rpc FindUserBuoyMsg (FindUserBuoyMsgReq) returns (FindUserBuoyMsgRes);
+
+    //   一键清空未读消息
+    rpc ClearUnreadMsg (ClearUnreadMsgReq) returns (Response);
+
+    //   new用户消息列表
+    rpc UserMsgList (UserMsgListReq) returns (UserMsgListRes);
 }

+ 31 - 10
rpc/messageclient/message.go

@@ -13,8 +13,10 @@ import (
 )
 
 type (
+	AllSortData                  = message.AllSortData
 	BuoyMessages                 = message.BuoyMessages
 	ChangeReadStatusRequest      = message.ChangeReadStatusRequest
+	ClearUnreadMsgReq            = message.ClearUnreadMsgReq
 	DeleteMultipleMessageRequest = message.DeleteMultipleMessageRequest
 	DeleteSingleMessageRequest   = message.DeleteSingleMessageRequest
 	FindUserBuoyMsgReq           = message.FindUserBuoyMsgReq
@@ -41,6 +43,9 @@ type (
 	UpdateMessageReadReq         = message.UpdateMessageReadReq
 	UpdateMessageReadResp        = message.UpdateMessageReadResp
 	User                         = message.User
+	UserMsgList                  = message.UserMsgList
+	UserMsgListReq               = message.UserMsgListReq
+	UserMsgListRes               = message.UserMsgListRes
 
 	Message interface {
 		// 批量保存消息
@@ -71,6 +76,10 @@ type (
 		UpdateMessageRead(ctx context.Context, in *UpdateMessageReadReq, opts ...grpc.CallOption) (*UpdateMessageReadResp, error)
 		//   查询指定用户的浮标消息
 		FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsgReq, opts ...grpc.CallOption) (*FindUserBuoyMsgRes, error)
+		//    一键清空未读消息
+		ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error)
+		//    new用户消息列表
+		UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error)
 	}
 
 	defaultMessage struct {
@@ -90,7 +99,7 @@ func (m *defaultMessage) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMs
 	return client.MultipleSaveMsg(ctx, in, opts...)
 }
 
-//  修改消息阅读状态
+// 修改消息阅读状态
 func (m *defaultMessage) ChangeReadStatus(ctx context.Context, in *ChangeReadStatusRequest, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.ChangeReadStatus(ctx, in, opts...)
@@ -102,37 +111,37 @@ func (m *defaultMessage) SendUserMsg(ctx context.Context, in *SendMsgRequest, op
 	return client.SendUserMsg(ctx, in, opts...)
 }
 
-//  删除单一消息
+// 删除单一消息
 func (m *defaultMessage) DeleteSingleMessage(ctx context.Context, in *DeleteSingleMessageRequest, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.DeleteSingleMessage(ctx, in, opts...)
 }
 
-//  删除多条消息
+// 删除多条消息
 func (m *defaultMessage) DeleteMultipleMessage(ctx context.Context, in *DeleteMultipleMessageRequest, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.DeleteMultipleMessage(ctx, in, opts...)
 }
 
-//   查询指定用户未读消息合计
+// 查询指定用户未读消息合计
 func (m *defaultMessage) GetUnreadCount(ctx context.Context, in *GetUnreadCountRequest, opts ...grpc.CallOption) (*GetUnreadCountResponse, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.GetUnreadCount(ctx, in, opts...)
 }
 
-//   查询指定用户的历史消息记录
+// 查询指定用户的历史消息记录
 func (m *defaultMessage) FindUserMsg(ctx context.Context, in *FindUserMsgReq, opts ...grpc.CallOption) (*FindUserMsgRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.FindUserMsg(ctx, in, opts...)
 }
 
-//   查询指定用户指定分类的未读消息合计
+// 查询指定用户指定分类的未读消息合计
 func (m *defaultMessage) GetClassUnreadCount(ctx context.Context, in *GetClassUnreadCountReq, opts ...grpc.CallOption) (*GetUnreadCountResponse, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.GetClassUnreadCount(ctx, in, opts...)
 }
 
-//   获取指定用户指定分类的最新一条消息
+// 获取指定用户指定分类的最新一条消息
 func (m *defaultMessage) GetLastMessage(ctx context.Context, in *GetLastMessageReq, opts ...grpc.CallOption) (*GetLastMessageRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.GetLastMessage(ctx, in, opts...)
@@ -144,13 +153,13 @@ func (m *defaultMessage) FindMessageDetail(ctx context.Context, in *MessageDetai
 	return client.FindMessageDetail(ctx, in, opts...)
 }
 
-//   获取指定用户的分类及未读消息数量
+// 获取指定用户的分类及未读消息数量
 func (m *defaultMessage) GetUnreadClassCount(ctx context.Context, in *GetUnreadClassCountReq, opts ...grpc.CallOption) (*GetUnreadClassCountRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.GetUnreadClassCount(ctx, in, opts...)
 }
 
-//   获取指定用户收到消息的分类
+// 获取指定用户收到消息的分类
 func (m *defaultMessage) GetMsgType(ctx context.Context, in *GetMsgTypeReq, opts ...grpc.CallOption) (*GetMsgTypeRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.GetMsgType(ctx, in, opts...)
@@ -162,8 +171,20 @@ func (m *defaultMessage) UpdateMessageRead(ctx context.Context, in *UpdateMessag
 	return client.UpdateMessageRead(ctx, in, opts...)
 }
 
-//   查询指定用户的浮标消息
+// 查询指定用户的浮标消息
 func (m *defaultMessage) FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsgReq, opts ...grpc.CallOption) (*FindUserBuoyMsgRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.FindUserBuoyMsg(ctx, in, opts...)
 }
+
+// 一键清空未读消息
+func (m *defaultMessage) ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error) {
+	client := message.NewMessageClient(m.cli.Conn())
+	return client.ClearUnreadMsg(ctx, in, opts...)
+}
+
+// new用户消息列表
+func (m *defaultMessage) UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error) {
+	client := message.NewMessageClient(m.cli.Conn())
+	return client.UserMsgList(ctx, in, opts...)
+}

Разлика између датотеке није приказан због своје велике величине
+ 758 - 254
rpc/type/message/message.pb.go


+ 98 - 22
rpc/type/message/message_grpc.pb.go

@@ -22,34 +22,38 @@ const _ = grpc.SupportPackageIsVersion7
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type MessageClient interface {
-	//批量保存消息
+	// 批量保存消息
 	MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 	// 修改消息阅读状态
 	ChangeReadStatus(ctx context.Context, in *ChangeReadStatusRequest, opts ...grpc.CallOption) (*Response, error)
-	//指定用户发消息
+	// 指定用户发消息
 	SendUserMsg(ctx context.Context, in *SendMsgRequest, opts ...grpc.CallOption) (*Response, error)
 	// 删除单一消息
 	DeleteSingleMessage(ctx context.Context, in *DeleteSingleMessageRequest, opts ...grpc.CallOption) (*Response, error)
 	// 删除多条消息
 	DeleteMultipleMessage(ctx context.Context, in *DeleteMultipleMessageRequest, opts ...grpc.CallOption) (*Response, error)
-	//  查询指定用户未读消息合计
+	// 查询指定用户未读消息合计
 	GetUnreadCount(ctx context.Context, in *GetUnreadCountRequest, opts ...grpc.CallOption) (*GetUnreadCountResponse, error)
-	//  查询指定用户的历史消息记录
+	// 查询指定用户的历史消息记录
 	FindUserMsg(ctx context.Context, in *FindUserMsgReq, opts ...grpc.CallOption) (*FindUserMsgRes, error)
-	//  查询指定用户指定分类的未读消息合计
+	// 查询指定用户指定分类的未读消息合计
 	GetClassUnreadCount(ctx context.Context, in *GetClassUnreadCountReq, opts ...grpc.CallOption) (*GetUnreadCountResponse, error)
-	//  获取指定用户指定分类的最新一条消息
+	// 获取指定用户指定分类的最新一条消息
 	GetLastMessage(ctx context.Context, in *GetLastMessageReq, opts ...grpc.CallOption) (*GetLastMessageRes, error)
-	//查看详细详情
+	// 查看详细详情
 	FindMessageDetail(ctx context.Context, in *MessageDetailReq, opts ...grpc.CallOption) (*MessageDetailResp, error)
-	//  获取指定用户的分类及未读消息数量
+	// 获取指定用户的分类及未读消息数量
 	GetUnreadClassCount(ctx context.Context, in *GetUnreadClassCountReq, opts ...grpc.CallOption) (*GetUnreadClassCountRes, error)
-	//  获取指定用户收到消息的分类
+	// 获取指定用户收到消息的分类
 	GetMsgType(ctx context.Context, in *GetMsgTypeReq, opts ...grpc.CallOption) (*GetMsgTypeRes, error)
-	//修改用户指定分类下的消息已读未读
+	// 修改用户指定分类下的消息已读未读
 	UpdateMessageRead(ctx context.Context, in *UpdateMessageReadReq, opts ...grpc.CallOption) (*UpdateMessageReadResp, error)
-	//  查询指定用户的浮标消息
+	// 查询指定用户的浮标消息
 	FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsgReq, opts ...grpc.CallOption) (*FindUserBuoyMsgRes, error)
+	// 一键清空未读消息
+	ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error)
+	// new用户消息列表
+	UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error)
 }
 
 type messageClient struct {
@@ -186,38 +190,60 @@ func (c *messageClient) FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsg
 	return out, nil
 }
 
+func (c *messageClient) ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error) {
+	out := new(Response)
+	err := c.cc.Invoke(ctx, "/message.Message/ClearUnreadMsg", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *messageClient) UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error) {
+	out := new(UserMsgListRes)
+	err := c.cc.Invoke(ctx, "/message.Message/UserMsgList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // MessageServer is the server API for Message service.
 // All implementations must embed UnimplementedMessageServer
 // for forward compatibility
 type MessageServer interface {
-	//批量保存消息
+	// 批量保存消息
 	MultipleSaveMsg(context.Context, *MultipleSaveMsgReq) (*MultipleSaveMsgResp, error)
 	// 修改消息阅读状态
 	ChangeReadStatus(context.Context, *ChangeReadStatusRequest) (*Response, error)
-	//指定用户发消息
+	// 指定用户发消息
 	SendUserMsg(context.Context, *SendMsgRequest) (*Response, error)
 	// 删除单一消息
 	DeleteSingleMessage(context.Context, *DeleteSingleMessageRequest) (*Response, error)
 	// 删除多条消息
 	DeleteMultipleMessage(context.Context, *DeleteMultipleMessageRequest) (*Response, error)
-	//  查询指定用户未读消息合计
+	// 查询指定用户未读消息合计
 	GetUnreadCount(context.Context, *GetUnreadCountRequest) (*GetUnreadCountResponse, error)
-	//  查询指定用户的历史消息记录
+	// 查询指定用户的历史消息记录
 	FindUserMsg(context.Context, *FindUserMsgReq) (*FindUserMsgRes, error)
-	//  查询指定用户指定分类的未读消息合计
+	// 查询指定用户指定分类的未读消息合计
 	GetClassUnreadCount(context.Context, *GetClassUnreadCountReq) (*GetUnreadCountResponse, error)
-	//  获取指定用户指定分类的最新一条消息
+	// 获取指定用户指定分类的最新一条消息
 	GetLastMessage(context.Context, *GetLastMessageReq) (*GetLastMessageRes, error)
-	//查看详细详情
+	// 查看详细详情
 	FindMessageDetail(context.Context, *MessageDetailReq) (*MessageDetailResp, error)
-	//  获取指定用户的分类及未读消息数量
+	// 获取指定用户的分类及未读消息数量
 	GetUnreadClassCount(context.Context, *GetUnreadClassCountReq) (*GetUnreadClassCountRes, error)
-	//  获取指定用户收到消息的分类
+	// 获取指定用户收到消息的分类
 	GetMsgType(context.Context, *GetMsgTypeReq) (*GetMsgTypeRes, error)
-	//修改用户指定分类下的消息已读未读
+	// 修改用户指定分类下的消息已读未读
 	UpdateMessageRead(context.Context, *UpdateMessageReadReq) (*UpdateMessageReadResp, error)
-	//  查询指定用户的浮标消息
+	// 查询指定用户的浮标消息
 	FindUserBuoyMsg(context.Context, *FindUserBuoyMsgReq) (*FindUserBuoyMsgRes, error)
+	// 一键清空未读消息
+	ClearUnreadMsg(context.Context, *ClearUnreadMsgReq) (*Response, error)
+	// new用户消息列表
+	UserMsgList(context.Context, *UserMsgListReq) (*UserMsgListRes, error)
 	mustEmbedUnimplementedMessageServer()
 }
 
@@ -267,6 +293,12 @@ func (UnimplementedMessageServer) UpdateMessageRead(context.Context, *UpdateMess
 func (UnimplementedMessageServer) FindUserBuoyMsg(context.Context, *FindUserBuoyMsgReq) (*FindUserBuoyMsgRes, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method FindUserBuoyMsg not implemented")
 }
+func (UnimplementedMessageServer) ClearUnreadMsg(context.Context, *ClearUnreadMsgReq) (*Response, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ClearUnreadMsg not implemented")
+}
+func (UnimplementedMessageServer) UserMsgList(context.Context, *UserMsgListReq) (*UserMsgListRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UserMsgList not implemented")
+}
 func (UnimplementedMessageServer) mustEmbedUnimplementedMessageServer() {}
 
 // UnsafeMessageServer may be embedded to opt out of forward compatibility for this service.
@@ -532,6 +564,42 @@ func _Message_FindUserBuoyMsg_Handler(srv interface{}, ctx context.Context, dec
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Message_ClearUnreadMsg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ClearUnreadMsgReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).ClearUnreadMsg(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/ClearUnreadMsg",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).ClearUnreadMsg(ctx, req.(*ClearUnreadMsgReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Message_UserMsgList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UserMsgListReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).UserMsgList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/UserMsgList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).UserMsgList(ctx, req.(*UserMsgListReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // Message_ServiceDesc is the grpc.ServiceDesc for Message service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -595,6 +663,14 @@ var Message_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "FindUserBuoyMsg",
 			Handler:    _Message_FindUserBuoyMsg_Handler,
 		},
+		{
+			MethodName: "ClearUnreadMsg",
+			Handler:    _Message_ClearUnreadMsg_Handler,
+		},
+		{
+			MethodName: "UserMsgList",
+			Handler:    _Message_UserMsgList_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "message.proto",

+ 30 - 0
service/getBuoyMsg.go

@@ -5,6 +5,7 @@ import (
 	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
 	"app.yhyue.com/moapp/MessageCenter/util"
 	"fmt"
+	"log"
 	"strconv"
 	"strings"
 )
@@ -62,3 +63,32 @@ func LinkSplit(url string) (link, androidUrl, iosUrl, weChatUrl string) {
 	}
 	return link, androidUrl, iosUrl, weChatUrl
 }
+
+func ClearUnreadMsg(in *message.ClearUnreadMsgReq) error {
+	if in.Userid != "" {
+		query := map[string]interface{}{
+			"receive_userid": in.Userid,
+			"appid":          in.AppId,
+			"isdel":          1,
+			"isRead":         0,
+		}
+
+		//更新服务未读数
+		if !entity.Mysql.Update("message", query, map[string]interface{}{"isRead": 1}) {
+			log.Println("更新服务未读数失败")
+		}
+	}
+
+	//更新私信未读数
+	if in.PositionId > 0 {
+		sQuery := map[string]interface{}{
+			"my_position_id": in.PositionId,
+			"ent_id":         in.EntId,
+		}
+		if !entity.Mysql.Update("socialize_summary", sQuery, map[string]interface{}{"unread": 0}) {
+			log.Println("更新私信未读数失败")
+		}
+	}
+
+	return nil
+}

+ 152 - 2
service/sendMsg.go

@@ -21,10 +21,14 @@ const order = "1,4"
 const MsgCountKey = "count_%s_%s" //redis 消息未读数量 Count.用户id.消息类型=数量
 const redisModule = "msgCount"
 
-/*var (
+/*
+var (
+
 	UserLockMap = map[string]*sync.Mutex{}
 	//MainLock    = sync.Mutex{}
-)*/
+
+)
+*/
 
 func SendMsg(this message.SendMsgRequest) (int64, string) {
 	r, err := entity.Mysql11.Query("select count(*) as c from conversation where receive_id = ? and send_id = ? ", this.ReceiveUserId, this.SendUserId)
@@ -145,6 +149,152 @@ func FindUserMsg(this message.FindUserMsgReq, isClean bool) message.FindUserMsgR
 	return data
 }
 
+// this.IsPc 是否pc端请求 this.MobileHome是否移动消息列表页
+func UserMsgList(this *message.UserMsgListReq) *message.UserMsgList {
+	var count int64
+	cquery := map[string]interface{}{
+		"receive_userid": this.UserId,
+		"isdel":          1,
+		"appid":          this.Appid,
+	}
+	if this.MsgType > 0 {
+		cquery["msg_type"] = this.MsgType
+	}
+	if this.Read != -1 {
+		cquery["isRead"] = this.Read
+	}
+	data := new(message.UserMsgList)
+	//获取栏目下的数据
+	sData := make(map[string][]*message.Messages)
+	if this.MobileHome {
+		if this.SortSize > 0 {
+			sortData := entity.Mysql.SelectBySql(fmt.Sprintf(`SELECT * FROM (
+  			SELECT *, ROW_NUMBER() OVER (PARTITION BY msg_type, receive_userid ORDER BY createtime DESC) AS row_num
+  			FROM message
+  			WHERE receive_userid = '%s' and isdel = 1 and  appid = %s
+		) AS message_ranked
+		WHERE row_num <=%d;`, this.UserId, this.Appid, this.SortSize))
+			if sortData != nil {
+				for _, v := range *sortData {
+					_id := util.Int64All(v["id"])
+					id := strconv.FormatInt(_id, 10)
+					var msg = message.Messages{
+						Id:            id,
+						Appid:         common.InterfaceToStr(v["appId"]),
+						ReceiveUserId: common.InterfaceToStr(v["receive_userid"]),
+						ReceiveName:   common.InterfaceToStr(v["receive_name"]),
+						SendUserId:    common.InterfaceToStr(v["send_userid"]),
+						SendName:      common.InterfaceToStr(v["send_name"]),
+						Createtime:    common.InterfaceToStr(v["createtime"]),
+						Title:         common.InterfaceToStr(v["title"]),
+						MsgType:       int64(util.IntAll(v["msg_type"])),
+						Link:          common.InterfaceToStr(v["link"]),
+						CiteId:        util.Int64All(v["cite_id"]),
+						Content:       common.InterfaceToStr(v["content"]),
+						IsRead:        util.Int64All(v["isRead"]),
+						MsgLogId:      util.Int64All(v["msg_log_id"]),
+					}
+					if sData[common.InterfaceToStr(v["msg_type"])] == nil {
+						sData[common.InterfaceToStr(v["msg_type"])] = []*message.Messages{&msg}
+					} else {
+						sData[common.InterfaceToStr(v["msg_type"])] = append(sData[common.InterfaceToStr(v["msg_type"])], &msg)
+					}
+				}
+			}
+		}
+	}
+
+	//消息栏目下的最新消息
+	var columnData []*message.AllSortData
+	if this.IsPc || this.MobileHome {
+		for _, v := range entity.MessageColumn {
+			var column message.AllSortData
+			column.Name = common.InterfaceToStr(v["name"])
+			column.Img = common.InterfaceToStr(v["img"])
+			column.MsgType = common.Int64All(v["msg_type"])
+			//消息未读数
+			sQuery := map[string]interface{}{
+				"receive_userid": this.UserId,
+				"isdel":          1,
+				"appid":          this.Appid,
+				"msg_type":       column.MsgType,
+				"isRead":         0,
+			}
+			column.UnreadMessages = entity.Mysql.Count("message", sQuery)
+			column.Data = sData[common.InterfaceToStr(v["msg_type"])]
+			columnData = append(columnData, &column)
+		}
+	}
+
+	if this.IsPc || !this.MobileHome {
+		data.SortData = columnData
+		count = entity.Mysql.Count("message", cquery)
+		if count > 0 {
+			res := entity.Mysql.Find("message", cquery, "", "createtime desc", (int(this.OffSet)-1)*int(this.PageSize), int(this.PageSize))
+			if res != nil && len(*res) > 0 {
+				for _, v := range *res {
+					_id := util.Int64All(v["id"])
+					id := strconv.FormatInt(_id, 10)
+					data.Data = append(data.Data, &message.Messages{
+						Id:            id,
+						Appid:         common.InterfaceToStr(v["appId"]),
+						ReceiveUserId: common.InterfaceToStr(v["receive_userid"]),
+						ReceiveName:   common.InterfaceToStr(v["receive_name"]),
+						SendUserId:    common.InterfaceToStr(v["send_userid"]),
+						SendName:      common.InterfaceToStr(v["send_name"]),
+						Createtime:    common.InterfaceToStr(v["createtime"]),
+						Title:         common.InterfaceToStr(v["title"]),
+						MsgType:       int64(util.IntAll(v["msg_type"])),
+						Link:          common.InterfaceToStr(v["link"]),
+						CiteId:        util.Int64All(v["cite_id"]),
+						Content:       common.InterfaceToStr(v["content"]),
+						IsRead:        util.Int64All(v["isRead"]),
+						MsgLogId:      util.Int64All(v["msg_log_id"]),
+					})
+				}
+			}
+		}
+		data.Count = count
+	}
+
+	return data
+}
+
+func MessageGetLast(this *message.UserMsgListReq) *message.Messages {
+	if this.IsPc || this.MobileHome {
+		query := map[string]interface{}{
+			"receive_userid": this.UserId,
+			"isdel":          1,
+			"appid":          this.Appid,
+			"isRead":         0,
+			"msg_type":       1,
+		}
+		lastMsg := entity.Mysql.FindOne("message", query, "", "createtime desc")
+		if lastMsg != nil && len(*lastMsg) > 0 {
+			_id := util.Int64All((*lastMsg)["id"])
+			id := strconv.FormatInt(_id, 10)
+			msg := message.Messages{
+				Id:            id,
+				Appid:         common.InterfaceToStr((*lastMsg)["appid"]),
+				ReceiveUserId: common.InterfaceToStr((*lastMsg)["receive_userid"]),
+				ReceiveName:   common.InterfaceToStr((*lastMsg)["receive_name"]),
+				SendUserId:    common.InterfaceToStr((*lastMsg)["send_userid"]),
+				SendName:      common.InterfaceToStr((*lastMsg)["send_name"]),
+				Createtime:    common.InterfaceToStr((*lastMsg)["createtime"]),
+				Title:         common.InterfaceToStr((*lastMsg)["title"]),
+				MsgType:       common.Int64All((*lastMsg)["msg_type"]),
+				Link:          common.InterfaceToStr((*lastMsg)["link"]),
+				CiteId:        common.Int64All((*lastMsg)["cite_id"]),
+				Content:       common.InterfaceToStr((*lastMsg)["content"]),
+				IsRead:        common.Int64All((*lastMsg)["isRead"]),
+				MsgLogId:      common.Int64All((*lastMsg)["msg_log_id"]),
+			}
+			return &msg
+		}
+	}
+	return nil
+}
+
 // 指定分类未读消息合计
 func ClassCountUnread(msgType int, userId string, appId string) (int64, string, int64) {
 	query := map[string]interface{}{

+ 39 - 19
util/common.go

@@ -35,7 +35,7 @@ func Uuid(length int) string {
 	return strings.Join(ret, "")
 }
 
-//计算字符串和值
+// 计算字符串和值
 func Sumstring(code string) (sum int) {
 	tmp := []rune(code)
 	for _, v := range tmp {
@@ -44,7 +44,7 @@ func Sumstring(code string) (sum int) {
 	return
 }
 
-//获取复杂的随机数
+// 获取复杂的随机数
 func GetLetterRandom(length int, flag ...bool) string {
 	var idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
 	var mod byte = 52
@@ -78,7 +78,6 @@ EXIT:
 	return string(b)
 }
 
-
 /*隐藏部分账号
  *返回手机号:150...70765 邮箱:...shenjun@vip.qq.com
  */
@@ -97,14 +96,14 @@ func EncryCode(value string) string {
 	return value
 }
 
-//生成32位md5字串
+// 生成32位md5字串
 func GetMd5String(s string) string {
 	h := md5.New()
 	h.Write([]byte(s))
 	return hex.EncodeToString(h.Sum(nil))
 }
 
-//obj(string,M)转M,查询用到
+// obj(string,M)转M,查询用到
 func ObjToMap(obj interface{}) *map[string]interface{} {
 	data := make(map[string]interface{})
 	if s, ok := obj.(string); ok {
@@ -263,7 +262,7 @@ func ObjToStringDef(old interface{}, defaultstr string) string {
 	}
 }
 
-//对象数组转成string数组
+// 对象数组转成string数组
 func ObjArrToStringArr(old []interface{}) []string {
 	if old != nil {
 		new := make([]string, len(old))
@@ -276,7 +275,7 @@ func ObjArrToStringArr(old []interface{}) []string {
 	}
 }
 
-//对象数组转成map数组
+// 对象数组转成map数组
 func ObjArrToMapArr(old []interface{}) []map[string]interface{} {
 	if old != nil {
 		new := make([]map[string]interface{}, len(old))
@@ -289,7 +288,7 @@ func ObjArrToMapArr(old []interface{}) []map[string]interface{} {
 	}
 }
 
-//map数组转成对象数组
+// map数组转成对象数组
 func MapArrToObjArr(old []map[string]interface{}) []interface{} {
 	if old != nil {
 		new := make([]interface{}, len(old))
@@ -354,7 +353,7 @@ func SubString(str string, begin, length int) (substr string) {
 	return string(rs[begin:end])
 }
 
-//捕获异常
+// 捕获异常
 func Try(fun func(), handler func(interface{})) {
 	defer func() {
 		if err := recover(); err != nil {
@@ -371,7 +370,7 @@ func Try(fun func(), handler func(interface{})) {
 	fun()
 }
 
-//3目运算
+// 3目运算
 func If(b bool, to, fo interface{}) interface{} {
 	if b {
 		return to
@@ -380,7 +379,7 @@ func If(b bool, to, fo interface{}) interface{} {
 	}
 }
 
-//HashCode值
+// HashCode值
 func HashCode(uid string) int {
 	var h uint32 = 0
 	rs := []rune(uid)
@@ -390,7 +389,7 @@ func HashCode(uid string) int {
 	return int(h)
 }
 
-//获取离n天的秒差
+// 获取离n天的秒差
 func GetDayStartSecond(n int) int64 {
 	now := time.Now()
 	tom := time.Date(now.Year(), now.Month(), now.Day()+n, 0, 0, 0, 0, time.Local)
@@ -428,7 +427,7 @@ func EndWith(value, str string) bool {
 	return ok
 }
 
-//出错拦截
+// 出错拦截
 func Catch() {
 	if r := recover(); r != nil {
 		log.Println(r)
@@ -465,7 +464,7 @@ func ConvertFileSize(s int) string {
 	return fmt.Sprintf("%d B", s)
 }
 
-//MD5签名
+// MD5签名
 func WxSign(format string, param ...interface{}) string {
 	data := fmt.Sprintf(format, param...)
 	h := md5.New()
@@ -474,15 +473,13 @@ func WxSign(format string, param ...interface{}) string {
 	return sign
 }
 
-
-
 func FloatFormat(tmp float64, n int) float64 {
 	fs := fmt.Sprintf("%."+fmt.Sprint(n)+"f", tmp)
 	f, _ := strconv.ParseFloat(fs, 64)
 	return f
 }
 
-//生成微信支付的签名
+// 生成微信支付的签名
 func CreateWxSign(afterStr string, obj interface{}, filter ...string) string {
 	filter = append(filter, "sign", "xml")
 	keys := []string{}
@@ -530,7 +527,7 @@ L:
 	return WxSign(strings.Join(vs, "&") + afterStr)
 }
 
-//简单的xml转map,只有一个层级,没有多层嵌套
+// 简单的xml转map,只有一个层级,没有多层嵌套
 func XmlToMap(input string) map[string]string {
 	var t xml.Token
 	var err error
@@ -586,8 +583,31 @@ func SimpleCrontab(flag bool, c string, f func()) {
 	}
 }
 
-//v保留n为小数,n后的四舍五入
+// v保留n为小数,n后的四舍五入
 func RetainDecimal(v float64, n int) float64 {
 	n10 := math.Pow10(n)
 	return math.Trunc((v+0.5/n10)*n10) / n10
 }
+
+func LinkSplit(url string) (link, androidUrl, iosUrl, weChatUrl string) {
+
+	if url != "" {
+		arr := strings.Split(url, ",")
+		if len(arr) == 4 {
+			link = arr[0]
+			androidUrl = arr[1]
+			iosUrl = arr[2]
+			weChatUrl = arr[3]
+		} else {
+			if len(arr) > 0 {
+				link = arr[0]
+			} else {
+				link = ""
+			}
+			androidUrl = ""
+			iosUrl = ""
+			weChatUrl = ""
+		}
+	}
+	return link, androidUrl, iosUrl, weChatUrl
+}

Неке датотеке нису приказане због велике количине промена