Browse Source

新增阿里云sts接口

宋伯文 5 months ago
parent
commit
9002b6861a

+ 25 - 0
desc/wechat/avatar.api

@@ -40,6 +40,21 @@ type (
 		Live int64 `json:"live"`
 		Total int64 `json:"total"`
 	}
+
+	AvatarStsResp {
+	    BaseDataInfo
+
+        // Sts information | Sts 数据
+        Data StsInfo `json:"data"`
+	}
+
+	StsInfo {
+        Expiration *string `json:"expiration"`
+        AccessKeyId *string `json:"accessKeyId"`
+        AccessKeySecret *string `json:"accessKeySecret"`
+        SecurityToken *string `json:"securityToken"`
+        RequestId *string `json:"requestId"`
+	}
 )
 
 @server(
@@ -53,3 +68,13 @@ service Wechat {
 	@handler getApiAvatarConfig
 	post /api/avatar/config (AvatarConfigReq) returns (AvatarConfigResp)
 }
+
+@server(
+    group: avatar
+)
+
+service Wechat {
+	// get avatar configuration | 获取数字人配置信息
+    @handler getAcsResponse
+    post /api/avatar/sts () returns (AvatarStsResp)
+}

+ 0 - 10
ent/contact/where.go

@@ -390,16 +390,6 @@ func WxWxidHasSuffix(v string) predicate.Contact {
 	return predicate.Contact(sql.FieldHasSuffix(FieldWxWxid, v))
 }
 
-// WxWxidIsNil applies the IsNil predicate on the "wx_wxid" field.
-func WxWxidIsNil() predicate.Contact {
-	return predicate.Contact(sql.FieldIsNull(FieldWxWxid))
-}
-
-// WxWxidNotNil applies the NotNil predicate on the "wx_wxid" field.
-func WxWxidNotNil() predicate.Contact {
-	return predicate.Contact(sql.FieldNotNull(FieldWxWxid))
-}
-
 // WxWxidEqualFold applies the EqualFold predicate on the "wx_wxid" field.
 func WxWxidEqualFold(v string) predicate.Contact {
 	return predicate.Contact(sql.FieldEqualFold(FieldWxWxid, v))

+ 3 - 20
ent/contact_create.go

@@ -470,6 +470,9 @@ func (cc *ContactCreate) check() error {
 	if _, ok := cc.mutation.UpdatedAt(); !ok {
 		return &ValidationError{Name: "updated_at", err: errors.New(`ent: missing required field "Contact.updated_at"`)}
 	}
+	if _, ok := cc.mutation.WxWxid(); !ok {
+		return &ValidationError{Name: "wx_wxid", err: errors.New(`ent: missing required field "Contact.wx_wxid"`)}
+	}
 	if _, ok := cc.mutation.Wxid(); !ok {
 		return &ValidationError{Name: "wxid", err: errors.New(`ent: missing required field "Contact.wxid"`)}
 	}
@@ -772,12 +775,6 @@ func (u *ContactUpsert) UpdateWxWxid() *ContactUpsert {
 	return u
 }
 
-// ClearWxWxid clears the value of the "wx_wxid" field.
-func (u *ContactUpsert) ClearWxWxid() *ContactUpsert {
-	u.SetNull(contact.FieldWxWxid)
-	return u
-}
-
 // SetType sets the "type" field.
 func (u *ContactUpsert) SetType(v int) *ContactUpsert {
 	u.Set(contact.FieldType, v)
@@ -1128,13 +1125,6 @@ func (u *ContactUpsertOne) UpdateWxWxid() *ContactUpsertOne {
 	})
 }
 
-// ClearWxWxid clears the value of the "wx_wxid" field.
-func (u *ContactUpsertOne) ClearWxWxid() *ContactUpsertOne {
-	return u.Update(func(s *ContactUpsert) {
-		s.ClearWxWxid()
-	})
-}
-
 // SetType sets the "type" field.
 func (u *ContactUpsertOne) SetType(v int) *ContactUpsertOne {
 	return u.Update(func(s *ContactUpsert) {
@@ -1688,13 +1678,6 @@ func (u *ContactUpsertBulk) UpdateWxWxid() *ContactUpsertBulk {
 	})
 }
 
-// ClearWxWxid clears the value of the "wx_wxid" field.
-func (u *ContactUpsertBulk) ClearWxWxid() *ContactUpsertBulk {
-	return u.Update(func(s *ContactUpsert) {
-		s.ClearWxWxid()
-	})
-}
-
 // SetType sets the "type" field.
 func (u *ContactUpsertBulk) SetType(v int) *ContactUpsertBulk {
 	return u.Update(func(s *ContactUpsert) {

+ 0 - 18
ent/contact_update.go

@@ -97,12 +97,6 @@ func (cu *ContactUpdate) SetNillableWxWxid(s *string) *ContactUpdate {
 	return cu
 }
 
-// ClearWxWxid clears the value of the "wx_wxid" field.
-func (cu *ContactUpdate) ClearWxWxid() *ContactUpdate {
-	cu.mutation.ClearWxWxid()
-	return cu
-}
-
 // SetType sets the "type" field.
 func (cu *ContactUpdate) SetType(i int) *ContactUpdate {
 	cu.mutation.ResetType()
@@ -509,9 +503,6 @@ func (cu *ContactUpdate) sqlSave(ctx context.Context) (n int, err error) {
 	if value, ok := cu.mutation.WxWxid(); ok {
 		_spec.SetField(contact.FieldWxWxid, field.TypeString, value)
 	}
-	if cu.mutation.WxWxidCleared() {
-		_spec.ClearField(contact.FieldWxWxid, field.TypeString)
-	}
 	if value, ok := cu.mutation.GetType(); ok {
 		_spec.SetField(contact.FieldType, field.TypeInt, value)
 	}
@@ -755,12 +746,6 @@ func (cuo *ContactUpdateOne) SetNillableWxWxid(s *string) *ContactUpdateOne {
 	return cuo
 }
 
-// ClearWxWxid clears the value of the "wx_wxid" field.
-func (cuo *ContactUpdateOne) ClearWxWxid() *ContactUpdateOne {
-	cuo.mutation.ClearWxWxid()
-	return cuo
-}
-
 // SetType sets the "type" field.
 func (cuo *ContactUpdateOne) SetType(i int) *ContactUpdateOne {
 	cuo.mutation.ResetType()
@@ -1197,9 +1182,6 @@ func (cuo *ContactUpdateOne) sqlSave(ctx context.Context) (_node *Contact, err e
 	if value, ok := cuo.mutation.WxWxid(); ok {
 		_spec.SetField(contact.FieldWxWxid, field.TypeString, value)
 	}
-	if cuo.mutation.WxWxidCleared() {
-		_spec.ClearField(contact.FieldWxWxid, field.TypeString)
-	}
 	if value, ok := cuo.mutation.GetType(); ok {
 		_spec.SetField(contact.FieldType, field.TypeInt, value)
 	}

+ 1 - 1
ent/migrate/schema.go

@@ -180,7 +180,7 @@ var (
 		{Name: "updated_at", Type: field.TypeTime, Comment: "Update Time | 修改日期"},
 		{Name: "status", Type: field.TypeUint8, Nullable: true, Comment: "Status 1: normal 2: ban | 状态 1 正常 2 禁用", Default: 1},
 		{Name: "deleted_at", Type: field.TypeTime, Nullable: true, Comment: "Delete Time | 删除日期"},
-		{Name: "wx_wxid", Type: field.TypeString, Nullable: true, Comment: "属主微信id", Default: ""},
+		{Name: "wx_wxid", Type: field.TypeString, Comment: "属主微信id", Default: ""},
 		{Name: "type", Type: field.TypeInt, Nullable: true, Comment: "联系人类型:1好友,2群组,3公众号,4企业微信联系人", Default: 1},
 		{Name: "wxid", Type: field.TypeString, Comment: "微信id 公众号微信ID", Default: ""},
 		{Name: "account", Type: field.TypeString, Comment: "微信账号", Default: ""},

+ 0 - 19
ent/mutation.go

@@ -6743,22 +6743,9 @@ func (m *ContactMutation) OldWxWxid(ctx context.Context) (v string, err error) {
 	return oldValue.WxWxid, nil
 }
 
-// ClearWxWxid clears the value of the "wx_wxid" field.
-func (m *ContactMutation) ClearWxWxid() {
-	m.wx_wxid = nil
-	m.clearedFields[contact.FieldWxWxid] = struct{}{}
-}
-
-// WxWxidCleared returns if the "wx_wxid" field was cleared in this mutation.
-func (m *ContactMutation) WxWxidCleared() bool {
-	_, ok := m.clearedFields[contact.FieldWxWxid]
-	return ok
-}
-
 // ResetWxWxid resets all changes to the "wx_wxid" field.
 func (m *ContactMutation) ResetWxWxid() {
 	m.wx_wxid = nil
-	delete(m.clearedFields, contact.FieldWxWxid)
 }
 
 // SetType sets the "type" field.
@@ -7989,9 +7976,6 @@ func (m *ContactMutation) ClearedFields() []string {
 	if m.FieldCleared(contact.FieldDeletedAt) {
 		fields = append(fields, contact.FieldDeletedAt)
 	}
-	if m.FieldCleared(contact.FieldWxWxid) {
-		fields = append(fields, contact.FieldWxWxid)
-	}
 	if m.FieldCleared(contact.FieldType) {
 		fields = append(fields, contact.FieldType)
 	}
@@ -8018,9 +8002,6 @@ func (m *ContactMutation) ClearField(name string) error {
 	case contact.FieldDeletedAt:
 		m.ClearDeletedAt()
 		return nil
-	case contact.FieldWxWxid:
-		m.ClearWxWxid()
-		return nil
 	case contact.FieldType:
 		m.ClearType()
 		return nil

+ 1 - 1
ent/schema/contact.go

@@ -18,7 +18,7 @@ type Contact struct {
 
 func (Contact) Fields() []ent.Field {
 	return []ent.Field{
-		field.String("wx_wxid").Optional().Default("").
+		field.String("wx_wxid").Default("").
 			Annotations(entsql.WithComments(true)).
 			Comment("属主微信id"),
 		field.Int("type").Optional().Default(1).

+ 1 - 0
ent/schema/wx.go

@@ -1,5 +1,6 @@
 package schema
 
+import "C"
 import (
 	"wechat-api/ent/schema/localmixin"
 

+ 1 - 1
etc/wechat-docker.yaml

@@ -47,7 +47,7 @@ CasbinDatabaseConf:
   Type: mysql
   Host: mysql-server
   Port: 3306
-  DBName: simple_admin
+  DBName: wechat-admin
   Username: root
   Password: simple-admin.
   MaxOpenConn: 100

+ 8 - 2
etc/wechat.yaml

@@ -47,7 +47,7 @@ CasbinDatabaseConf:
   Type: mysql
   Host: localhost
   Port: 3306
-  DBName: simple_admin
+  DBName: wechat-admin
   Username: root
   Password: simple-admin.
   MaxOpenConn: 100
@@ -70,4 +70,10 @@ CasbinConf:
 Miniprogram:
   Appid: wx1452f34bba8fe718
   Secret: 171fdab212fdde0d51b59fa59c9ee070
-  redisaddr: redis-server:6379
+  redisaddr: redis-server:6379
+
+Aliyun:
+  ACCESS_KEY_ID: LTAI5tSJwCQyuaxXR3UxfnWw
+  ACCESS_KEY_SECRET: 0pv4xhSPJv9IPSxrkB52FspJk27W7V
+  OSS_ENDPOINT: sts.cn-beijing.aliyuncs.com
+  OSS_ROLEARN: acs:ram::1317798064750399:role/ramoss

+ 3 - 2
go.mod

@@ -7,16 +7,18 @@ require (
 	github.com/ArtisanCloud/PowerWeChat/v2 v2.0.40
 	github.com/alibabacloud-go/avatar-20220130/v2 v2.5.3
 	github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10
+	github.com/alibabacloud-go/sts-20150401/v2 v2.0.2
 	github.com/alibabacloud-go/tea v1.2.2
 	github.com/alibabacloud-go/tea-utils/v2 v2.0.7
 	github.com/casbin/casbin/v2 v2.85.0
 	github.com/go-resty/resty/v2 v2.14.0
+	github.com/gofrs/uuid/v5 v5.0.0
 	github.com/golang-jwt/jwt/v5 v5.2.1
 	github.com/imroc/req/v3 v3.43.1
 	github.com/redis/go-redis/v9 v9.6.1
 	github.com/robfig/cron/v3 v3.0.1
-	github.com/speps/go-hashids/v2 v2.0.1
 	github.com/sashabaranov/go-openai v1.31.0
+	github.com/speps/go-hashids/v2 v2.0.1
 	github.com/spf13/cast v1.6.0
 	github.com/suyuan32/simple-admin-common v1.3.11
 	github.com/suyuan32/simple-admin-core v1.3.11
@@ -64,7 +66,6 @@ require (
 	github.com/go-redis/redis/v8 v8.11.0 // indirect
 	github.com/go-sql-driver/mysql v1.8.0 // indirect
 	github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
-	github.com/gofrs/uuid/v5 v5.0.0 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/mock v1.6.0 // indirect
 	github.com/golang/protobuf v1.5.4 // indirect

+ 8 - 0
go.sum

@@ -50,6 +50,7 @@ github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC
 github.com/alibabacloud-go/darabonba-encode-util v0.0.2/go.mod h1:JiW9higWHYXm7F4PKuMgEUETNZasrDM6vqVr/Can7H8=
 github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIpjmafa0qOTp6udc=
 github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc=
+github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.2/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ=
 github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.6/go.mod h1:CzQnh+94WDnJOnKZH5YRyouL+OOcdBnXY5VWAf0McgI=
 github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10 h1:GEYkMApgpKEVDn6z12DcH1EGYpDYRB8JxsazM4Rywak=
 github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10/go.mod h1:26a14FGhZVELuz2cc2AolvW4RHmIO3/HRwsdHhaIPDE=
@@ -63,23 +64,30 @@ github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA
 github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc=
 github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q=
 github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE=
+github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
 github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY=
 github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
+github.com/alibabacloud-go/sts-20150401/v2 v2.0.2 h1:sz6ULL9xaAndxpCXtG5fDBD2aF9L/GXyHfDj1hUnaCs=
+github.com/alibabacloud-go/sts-20150401/v2 v2.0.2/go.mod h1:JXPMuEvl9zJzUAYffyFMxxXGOUbNdvZYWP6MpJq1658=
 github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg=
 github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 github.com/alibabacloud-go/tea v1.1.11/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
+github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
 github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
 github.com/alibabacloud-go/tea v1.2.1/go.mod h1:qbzof29bM/IFhLMtJPrgTGK3eauV5J2wSyEUo4OEmnA=
 github.com/alibabacloud-go/tea v1.2.2 h1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU=
 github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk=
 github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I=
 github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
+github.com/alibabacloud-go/tea-utils/v2 v2.0.0/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4=
+github.com/alibabacloud-go/tea-utils/v2 v2.0.4/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ=
 github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4=
 github.com/alibabacloud-go/tea-utils/v2 v2.0.6/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I=
 github.com/alibabacloud-go/tea-utils/v2 v2.0.7 h1:WDx5qW3Xa5ZgJ1c8NfqJkF6w+AU5wB8835UdhPr6Ax0=
 github.com/alibabacloud-go/tea-utils/v2 v2.0.7/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I=
+github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
 github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0=
 github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=

+ 1 - 0
internal/config/config.go

@@ -17,5 +17,6 @@ type Config struct {
 	CasbinConf         casbin.CasbinConf
 	DatabaseConf       config.DatabaseConf
 	Miniprogram        types.Miniprogram
+	Aliyun             types.Aliyun
 	CoreRpc            zrpc.RpcClientConf
 }

+ 31 - 0
internal/handler/avatar/get_acs_response_handler.go

@@ -0,0 +1,31 @@
+package avatar
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/avatar"
+	"wechat-api/internal/svc"
+)
+
+// swagger:route post /api/avatar/sts avatar GetAcsResponse
+//
+// get avatar configuration | 获取数字人配置信息
+//
+// get avatar configuration | 获取数字人配置信息
+//
+// Responses:
+//  200: AvatarStsResp
+
+func GetAcsResponseHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		l := avatar.NewGetAcsResponseLogic(r.Context(), svcCtx)
+		resp, err := l.GetAcsResponse()
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 10 - 0
internal/handler/routes.go

@@ -1292,4 +1292,14 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 		),
 		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),
 	)
+
+	server.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/avatar/sts",
+				Handler: avatar.GetAcsResponseHandler(serverCtx),
+			},
+		},
+	)
 }

+ 0 - 3
internal/logic/Wxhook/get_friends_and_groups_logic.go

@@ -97,9 +97,7 @@ func (l *GetFriendsAndGroupsLogic) GetFriendsAndGroups(req *types.IDReq) (resp *
 				if lagId == "" {
 					continue
 				}
-				l.Logger.Errorf("------------------------lagId--------------------------- %+v", lagId)
 				name := wxLagIdsSet[lagId]
-				l.Logger.Errorf("------------------------name--------------------------- %+v", name)
 				label, err := l.svcCtx.DB.Label.Query().
 					Where(
 						label.NameEQ(name), // Filter by ID
@@ -107,7 +105,6 @@ func (l *GetFriendsAndGroupsLogic) GetFriendsAndGroups(req *types.IDReq) (resp *
 						label.OrganizationID(organizationId), // Additional filter by organizationId
 					).
 					Only(l.ctx)
-				l.Logger.Errorf("------------------------err--------------------------- %+v", err)
 				if err != nil {
 					// 如果标签不存在则创建
 					newLabel, err := l.svcCtx.DB.Label.Create().

+ 75 - 0
internal/logic/avatar/get_acs_response_logic.go

@@ -0,0 +1,75 @@
+package avatar
+
+import (
+	"context"
+	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
+	util "github.com/alibabacloud-go/tea-utils/v2/service"
+	"github.com/alibabacloud-go/tea/tea"
+	"github.com/suyuan32/simple-admin-common/msg/errormsg"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+
+	sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
+)
+
+type GetAcsResponseLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetAcsResponseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAcsResponseLogic {
+	return &GetAcsResponseLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *GetAcsResponseLogic) GetAcsResponse() (resp *types.AvatarStsResp, err error) {
+	client, _err := CreateClient(l.svcCtx.Config.Aliyun.ACCESS_KEY_ID, l.svcCtx.Config.Aliyun.ACCESS_KEY_SECRET, l.svcCtx.Config.Aliyun.OSS_ENDPOINT)
+	if _err != nil {
+		return nil, _err
+	}
+
+	assumeRoleRequest := &sts20150401.AssumeRoleRequest{
+		RoleArn:         tea.String(l.svcCtx.Config.Aliyun.OSS_ROLEARN),
+		RoleSessionName: tea.String("mini_program"),
+	}
+
+	runtime := &util.RuntimeOptions{}
+	r, _err := client.AssumeRoleWithOptions(assumeRoleRequest, runtime)
+	if _err != nil {
+		return nil, _err
+	}
+	return &types.AvatarStsResp{
+		BaseDataInfo: types.BaseDataInfo{
+			Code: 0,
+			Msg:  errormsg.Success,
+		},
+		Data: types.StsInfo{
+			Expiration:      r.Body.Credentials.Expiration,
+			AccessKeyId:     r.Body.Credentials.AccessKeyId,
+			AccessKeySecret: r.Body.Credentials.AccessKeySecret,
+			SecurityToken:   r.Body.Credentials.SecurityToken,
+			RequestId:       r.Body.RequestId,
+		},
+	}, nil
+}
+
+func CreateClient(AccessKeyId string, AccessKeySecret string, Endpoint string) (_result *sts20150401.Client, _err error) {
+	// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+	// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378661.html。
+	config := &openapi.Config{
+		// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+		AccessKeyId: tea.String(AccessKeyId),
+		// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+		AccessKeySecret: tea.String(AccessKeySecret),
+	}
+	// Endpoint 请参考 https://api.aliyun.com/product/Sts
+	config.Endpoint = tea.String(Endpoint)
+	_result = &sts20150401.Client{}
+	_result, _err = sts20150401.NewClient(config)
+	return _result, _err
+}

+ 26 - 1
internal/logic/contact/get_contact_list_logic.go

@@ -5,6 +5,7 @@ import (
 	"wechat-api/ent"
 	"wechat-api/ent/label"
 	"wechat-api/ent/labelrelationship"
+	"wechat-api/ent/wx"
 
 	"wechat-api/ent/contact"
 	"wechat-api/ent/predicate"
@@ -87,6 +88,16 @@ func (l *GetContactListLogic) GetContactList(req *types.ContactListReq) (*types.
 	resp.Msg = errormsg.Success
 	resp.Data.Total = data.PageDetails.Total
 
+	wxWxids := []string{}
+	wxWxidsSet := make(map[string]string)
+	for _, v := range data.List {
+		wxWxids = append(wxWxids, v.WxWxid)
+	}
+	wxs, err := l.svcCtx.DB.Wx.Query().Where(wx.WxidIn(wxWxids...)).All(l.ctx)
+	for _, w := range wxs {
+		wxWxidsSet[w.Wxid] = w.Nickname
+	}
+
 	for _, v := range data.List {
 		labelRelationships := make([]types.ContactLabelList, 0)
 		if v.Edges.ContactRelationships != nil {
@@ -100,6 +111,20 @@ func (l *GetContactListLogic) GetContactList(req *types.ContactListReq) (*types.
 				})
 			}
 		}
+		//wxWxName := ""
+		//l.Logger.Errorf("------------------------v.Edges.ContactWxWxid--------------------------- %+v", v.Edges.ContactWxWxid)
+		//if v.Edges.ContactWxWxid != nil {
+		//	wxWxName = v.Edges.ContactWxWxid[0].Wxid
+		//}
+		l.Logger.Errorf("------------------------v.WxWxid--------------------------- %+v", v.WxWxid)
+		var wxNickname string
+		if wxWxidsSet[v.WxWxid] == "" {
+			wxNickname = v.WxWxid
+		} else {
+			wxNickname = wxWxidsSet[v.WxWxid]
+		}
+
+		l.Logger.Errorf("------------------------wxNickname--------------------------- %+v", wxNickname)
 		resp.Data.Data = append(resp.Data.Data,
 			types.ContactInfo{
 				BaseIDInfo: types.BaseIDInfo{
@@ -108,7 +133,7 @@ func (l *GetContactListLogic) GetContactList(req *types.ContactListReq) (*types.
 					UpdatedAt: pointy.GetPointer(v.UpdatedAt.UnixMilli()),
 				},
 				Status:             &v.Status,
-				WxWxid:             &v.WxWxid,
+				WxWxid:             &wxNickname,
 				Type:               &v.Type,
 				Wxid:               &v.Wxid,
 				Account:            &v.Account,

+ 7 - 0
internal/types/miniprograme.go

@@ -5,3 +5,10 @@ type Miniprogram struct {
 	Secret    string
 	Redisaddr string
 }
+
+type Aliyun struct {
+	ACCESS_KEY_ID     string
+	ACCESS_KEY_SECRET string
+	OSS_ENDPOINT      string
+	OSS_ROLEARN       string
+}

+ 16 - 0
internal/types/types.go

@@ -2474,3 +2474,19 @@ type Extra struct {
 	Live  int64 `json:"live"`
 	Total int64 `json:"total"`
 }
+
+// swagger:model AvatarStsResp
+type AvatarStsResp struct {
+	BaseDataInfo
+	// Sts information | Sts 数据
+	Data StsInfo `json:"data"`
+}
+
+// swagger:model StsInfo
+type StsInfo struct {
+	Expiration      *string `json:"expiration"`
+	AccessKeyId     *string `json:"accessKeyId"`
+	AccessKeySecret *string `json:"accessKeySecret"`
+	SecurityToken   *string `json:"securityToken"`
+	RequestId       *string `json:"requestId"`
+}