feat: 修改展览页

This commit is contained in:
zerosaturation 2026-05-20 17:05:02 +08:00
parent e4fb5ddeab
commit 0d591fdd94
12 changed files with 683 additions and 1042 deletions

View File

@ -12,7 +12,7 @@ type Config struct {
Dubbo DubboConfig Dubbo DubboConfig
JWT JWTConfig JWT JWTConfig
OSS OSSConfig OSS OSSConfig
Redis RedisConfig // 新增 Redis RedisConfig
Root string Root string
} }

View File

@ -512,6 +512,99 @@ func (ctrl *ActivityController) GetMintingActivities(c *gin.Context) {
response.Success(c, data) response.Success(c, data)
} }
// GetLatestContributions 获取最新贡献记录(用于实时显示)
// @Summary 获取最新贡献记录
// @Description 获取活动最新贡献记录,用于实时显示
// @Tags activities
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param activity_id path int64 true "活动ID"
// @Param since_timestamp query int64 false "时间戳筛选,返回此时间之后的新记录"
// @Param since_id query int64 false "ID筛选配合since_timestamp使用"
// @Param limit query int false "返回数量默认5最大20"
// @Success 200 {object} response.Response
// @Router /api/v1/activities/{activity_id}/contributions/latest [get]
func (ctrl *ActivityController) GetLatestContributions(c *gin.Context) {
// 解析路径参数
activityIDStr := c.Param("id")
activityID, err := strconv.ParseInt(activityIDStr, 10, 64)
if err != nil {
response.Error(c, http.StatusBadRequest, "活动ID参数错误")
return
}
// 解析查询参数
sinceTimestamp, _ := strconv.ParseInt(c.DefaultQuery("since_timestamp", "0"), 10, 64)
sinceID, _ := strconv.ParseInt(c.DefaultQuery("since_id", "0"), 10, 64)
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "5"))
if limit <= 0 {
limit = 5
}
if limit > 20 {
limit = 20
}
logger.Logger.Info("GetLatestContributions request",
zap.Int64("activity_id", activityID),
zap.Int64("since_timestamp", sinceTimestamp),
zap.Int64("since_id", sinceID),
zap.Int("limit", limit),
)
// 设置上下文
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 调用 RPC
resp, err := ctrl.activityService.GetLatestContributions(ctx, &pbActivity.GetLatestContributionsRequest{
ActivityId: activityID,
SinceTimestamp: sinceTimestamp,
SinceId: sinceID,
Limit: int32(limit),
})
if err != nil {
logger.Logger.Error("GetLatestContributions RPC failed", zap.Error(err))
response.Error(c, http.StatusInternalServerError, "获取贡献记录失败")
return
}
if resp.Base.Code != pbCommon.StatusCode_STATUS_OK {
response.ErrorWithCode(c, int(resp.Base.Code), resp.Base.Message)
return
}
// 转换响应
data := convertLatestContributionsResponse(resp)
response.Success(c, data)
}
// convertLatestContributionsResponse 转换最新贡献记录响应
func convertLatestContributionsResponse(resp *pbActivity.GetLatestContributionsResponse) map[string]interface{} {
records := make([]map[string]interface{}, 0, len(resp.Records))
for _, record := range resp.Records {
records = append(records, map[string]interface{}{
"id": record.Id,
"user_id": record.UserId,
"nickname": record.Nickname,
"avatar_url": record.AvatarUrl,
"star_id": record.StarId,
"item_id": record.ItemId,
"item_type": record.ItemType,
"item_name": record.ItemName,
"item_icon": record.ItemIcon,
"quantity": record.Quantity,
"combo_count": record.ComboCount,
"created_at": record.CreatedAt,
})
}
return map[string]interface{}{
"records": records,
}
}
// convertMintingActivitiesResponse 转换铸造活动列表响应 // convertMintingActivitiesResponse 转换铸造活动列表响应
func convertMintingActivitiesResponse(resp *pbActivity.GetMintingActivitiesResponse) map[string]interface{} { func convertMintingActivitiesResponse(resp *pbActivity.GetMintingActivitiesResponse) map[string]interface{} {
activities := make([]map[string]interface{}, 0, len(resp.Activities)) activities := make([]map[string]interface{}, 0, len(resp.Activities))

View File

@ -250,6 +250,7 @@ func SetupRouter(userClient *client.Client, socialClient *client.Client, assetCl
activities.GET("/:id/progress", activityCtrl.GetProgress) // 获取活动进度 activities.GET("/:id/progress", activityCtrl.GetProgress) // 获取活动进度
activities.POST("/:id/purchase", activityCtrl.PurchaseItem) // 购买道具 activities.POST("/:id/purchase", activityCtrl.PurchaseItem) // 购买道具
activities.GET("/:id/ranking", activityCtrl.GetContributionRanking) // 获取贡献点排名 activities.GET("/:id/ranking", activityCtrl.GetContributionRanking) // 获取贡献点排名
activities.GET("/:id/contributions/latest", activityCtrl.GetLatestContributions) // 获取最新贡献记录
} }
// 铸造活动相关路由运营banner- 公开接口,不需要认证 // 铸造活动相关路由运营banner- 公开接口,不需要认证

View File

@ -1359,6 +1359,261 @@ func (x *GetMintingActivitiesResponse) GetTotal() int32 {
return 0 return 0
} }
// 获取最新贡献记录请求(用于实时显示)
type GetLatestContributionsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ActivityId int64 `protobuf:"varint,1,opt,name=activity_id,json=activityId,proto3" json:"activity_id,omitempty"`
SinceTimestamp int64 `protobuf:"varint,2,opt,name=since_timestamp,json=sinceTimestamp,proto3" json:"since_timestamp,omitempty"` // 时间戳筛选,返回此时间之后的新记录
SinceId int64 `protobuf:"varint,3,opt,name=since_id,json=sinceId,proto3" json:"since_id,omitempty"` // ID筛选配合since_timestamp使用
Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` // 返回数量默认5最大20
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetLatestContributionsRequest) Reset() {
*x = GetLatestContributionsRequest{}
mi := &file_activity_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetLatestContributionsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetLatestContributionsRequest) ProtoMessage() {}
func (x *GetLatestContributionsRequest) ProtoReflect() protoreflect.Message {
mi := &file_activity_proto_msgTypes[16]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetLatestContributionsRequest.ProtoReflect.Descriptor instead.
func (*GetLatestContributionsRequest) Descriptor() ([]byte, []int) {
return file_activity_proto_rawDescGZIP(), []int{16}
}
func (x *GetLatestContributionsRequest) GetActivityId() int64 {
if x != nil {
return x.ActivityId
}
return 0
}
func (x *GetLatestContributionsRequest) GetSinceTimestamp() int64 {
if x != nil {
return x.SinceTimestamp
}
return 0
}
func (x *GetLatestContributionsRequest) GetSinceId() int64 {
if x != nil {
return x.SinceId
}
return 0
}
func (x *GetLatestContributionsRequest) GetLimit() int32 {
if x != nil {
return x.Limit
}
return 0
}
// 单条贡献记录
type ContributionRecord struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
Nickname string `protobuf:"bytes,3,opt,name=nickname,proto3" json:"nickname,omitempty"`
AvatarUrl string `protobuf:"bytes,4,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"`
StarId int64 `protobuf:"varint,5,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
ItemId int64 `protobuf:"varint,6,opt,name=item_id,json=itemId,proto3" json:"item_id,omitempty"`
ItemType string `protobuf:"bytes,7,opt,name=item_type,json=itemType,proto3" json:"item_type,omitempty"`
ItemName string `protobuf:"bytes,8,opt,name=item_name,json=itemName,proto3" json:"item_name,omitempty"`
ItemIcon string `protobuf:"bytes,9,opt,name=item_icon,json=itemIcon,proto3" json:"item_icon,omitempty"`
Quantity int32 `protobuf:"varint,10,opt,name=quantity,proto3" json:"quantity,omitempty"`
ComboCount int32 `protobuf:"varint,11,opt,name=combo_count,json=comboCount,proto3" json:"combo_count,omitempty"`
CreatedAt int64 `protobuf:"varint,12,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ContributionRecord) Reset() {
*x = ContributionRecord{}
mi := &file_activity_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ContributionRecord) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ContributionRecord) ProtoMessage() {}
func (x *ContributionRecord) ProtoReflect() protoreflect.Message {
mi := &file_activity_proto_msgTypes[17]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ContributionRecord.ProtoReflect.Descriptor instead.
func (*ContributionRecord) Descriptor() ([]byte, []int) {
return file_activity_proto_rawDescGZIP(), []int{17}
}
func (x *ContributionRecord) GetId() int64 {
if x != nil {
return x.Id
}
return 0
}
func (x *ContributionRecord) GetUserId() int64 {
if x != nil {
return x.UserId
}
return 0
}
func (x *ContributionRecord) GetNickname() string {
if x != nil {
return x.Nickname
}
return ""
}
func (x *ContributionRecord) GetAvatarUrl() string {
if x != nil {
return x.AvatarUrl
}
return ""
}
func (x *ContributionRecord) GetStarId() int64 {
if x != nil {
return x.StarId
}
return 0
}
func (x *ContributionRecord) GetItemId() int64 {
if x != nil {
return x.ItemId
}
return 0
}
func (x *ContributionRecord) GetItemType() string {
if x != nil {
return x.ItemType
}
return ""
}
func (x *ContributionRecord) GetItemName() string {
if x != nil {
return x.ItemName
}
return ""
}
func (x *ContributionRecord) GetItemIcon() string {
if x != nil {
return x.ItemIcon
}
return ""
}
func (x *ContributionRecord) GetQuantity() int32 {
if x != nil {
return x.Quantity
}
return 0
}
func (x *ContributionRecord) GetComboCount() int32 {
if x != nil {
return x.ComboCount
}
return 0
}
func (x *ContributionRecord) GetCreatedAt() int64 {
if x != nil {
return x.CreatedAt
}
return 0
}
// 获取最新贡献记录响应
type GetLatestContributionsResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
Records []*ContributionRecord `protobuf:"bytes,2,rep,name=records,proto3" json:"records,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetLatestContributionsResponse) Reset() {
*x = GetLatestContributionsResponse{}
mi := &file_activity_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetLatestContributionsResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetLatestContributionsResponse) ProtoMessage() {}
func (x *GetLatestContributionsResponse) ProtoReflect() protoreflect.Message {
mi := &file_activity_proto_msgTypes[18]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetLatestContributionsResponse.ProtoReflect.Descriptor instead.
func (*GetLatestContributionsResponse) Descriptor() ([]byte, []int) {
return file_activity_proto_rawDescGZIP(), []int{18}
}
func (x *GetLatestContributionsResponse) GetBase() *common.BaseResponse {
if x != nil {
return x.Base
}
return nil
}
func (x *GetLatestContributionsResponse) GetRecords() []*ContributionRecord {
if x != nil {
return x.Records
}
return nil
}
var File_activity_proto protoreflect.FileDescriptor var File_activity_proto protoreflect.FileDescriptor
const file_activity_proto_rawDesc = "" + const file_activity_proto_rawDesc = "" +
@ -1488,7 +1743,33 @@ const file_activity_proto_rawDesc = "" +
"activities\x12\x12\n" + "activities\x12\x12\n" +
"\x04page\x18\x03 \x01(\x05R\x04page\x12\x1b\n" + "\x04page\x18\x03 \x01(\x05R\x04page\x12\x1b\n" +
"\tpage_size\x18\x04 \x01(\x05R\bpageSize\x12\x14\n" + "\tpage_size\x18\x04 \x01(\x05R\bpageSize\x12\x14\n" +
"\x05total\x18\x05 \x01(\x05R\x05total2\x91\b\n" + "\x05total\x18\x05 \x01(\x05R\x05total\"\x9a\x01\n" +
"\x1dGetLatestContributionsRequest\x12\x1f\n" +
"\vactivity_id\x18\x01 \x01(\x03R\n" +
"activityId\x12'\n" +
"\x0fsince_timestamp\x18\x02 \x01(\x03R\x0esinceTimestamp\x12\x19\n" +
"\bsince_id\x18\x03 \x01(\x03R\asinceId\x12\x14\n" +
"\x05limit\x18\x04 \x01(\x05R\x05limit\"\xdd\x02\n" +
"\x12ContributionRecord\x12\x0e\n" +
"\x02id\x18\x01 \x01(\x03R\x02id\x12\x17\n" +
"\auser_id\x18\x02 \x01(\x03R\x06userId\x12\x1a\n" +
"\bnickname\x18\x03 \x01(\tR\bnickname\x12\x1d\n" +
"\n" +
"avatar_url\x18\x04 \x01(\tR\tavatarUrl\x12\x17\n" +
"\astar_id\x18\x05 \x01(\x03R\x06starId\x12\x17\n" +
"\aitem_id\x18\x06 \x01(\x03R\x06itemId\x12\x1b\n" +
"\titem_type\x18\a \x01(\tR\bitemType\x12\x1b\n" +
"\titem_name\x18\b \x01(\tR\bitemName\x12\x1b\n" +
"\titem_icon\x18\t \x01(\tR\bitemIcon\x12\x1a\n" +
"\bquantity\x18\n" +
" \x01(\x05R\bquantity\x12\x1f\n" +
"\vcombo_count\x18\v \x01(\x05R\n" +
"comboCount\x12\x1d\n" +
"\n" +
"created_at\x18\f \x01(\x03R\tcreatedAt\"\x92\x01\n" +
"\x1eGetLatestContributionsResponse\x120\n" +
"\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12>\n" +
"\arecords\x18\x02 \x03(\v2$.topfans.activity.ContributionRecordR\arecords2\xce\t\n" +
"\x0fActivityService\x12\x82\x01\n" + "\x0fActivityService\x12\x82\x01\n" +
"\x0fGetActivityList\x12(.topfans.activity.GetActivityListRequest\x1a).topfans.activity.GetActivityListResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\x12\x12/api/v1/activities\x12y\n" + "\x0fGetActivityList\x12(.topfans.activity.GetActivityListRequest\x1a).topfans.activity.GetActivityListResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\x12\x12/api/v1/activities\x12y\n" +
"\vGetActivity\x12$.topfans.activity.GetProgressRequest\x1a\x1a.topfans.activity.Activity\"(\x82\xd3\xe4\x93\x02\"\x12 /api/v1/activities/{activity_id}\x12\x91\x01\n" + "\vGetActivity\x12$.topfans.activity.GetProgressRequest\x1a\x1a.topfans.activity.Activity\"(\x82\xd3\xe4\x93\x02\"\x12 /api/v1/activities/{activity_id}\x12\x91\x01\n" +
@ -1496,7 +1777,8 @@ const file_activity_proto_rawDesc = "" +
"\vGetProgress\x12$.topfans.activity.GetProgressRequest\x1a%.topfans.activity.GetProgressResponse\"1\x82\xd3\xe4\x93\x02+\x12)/api/v1/activities/{activity_id}/progress\x12\x93\x01\n" + "\vGetProgress\x12$.topfans.activity.GetProgressRequest\x1a%.topfans.activity.GetProgressResponse\"1\x82\xd3\xe4\x93\x02+\x12)/api/v1/activities/{activity_id}/progress\x12\x93\x01\n" +
"\fPurchaseItem\x12%.topfans.activity.PurchaseItemRequest\x1a&.topfans.activity.PurchaseItemResponse\"4\x82\xd3\xe4\x93\x02.:\x01*\")/api/v1/activities/{activity_id}/purchase\x12\xa7\x01\n" + "\fPurchaseItem\x12%.topfans.activity.PurchaseItemRequest\x1a&.topfans.activity.PurchaseItemResponse\"4\x82\xd3\xe4\x93\x02.:\x01*\")/api/v1/activities/{activity_id}/purchase\x12\xa7\x01\n" +
"\x16GetContributionRanking\x12,.topfans.activity.ContributionRankingRequest\x1a-.topfans.activity.ContributionRankingResponse\"0\x82\xd3\xe4\x93\x02*\x12(/api/v1/activities/{activity_id}/ranking\x12\x99\x01\n" + "\x16GetContributionRanking\x12,.topfans.activity.ContributionRankingRequest\x1a-.topfans.activity.ContributionRankingResponse\"0\x82\xd3\xe4\x93\x02*\x12(/api/v1/activities/{activity_id}/ranking\x12\x99\x01\n" +
"\x14GetMintingActivities\x12-.topfans.activity.GetMintingActivitiesRequest\x1a..topfans.activity.GetMintingActivitiesResponse\"\"\x82\xd3\xe4\x93\x02\x1c\x12\x1a/api/v1/minting-activitiesB8Z6github.com/topfans/backend/pkg/proto/activity;activityb\x06proto3" "\x14GetMintingActivities\x12-.topfans.activity.GetMintingActivitiesRequest\x1a..topfans.activity.GetMintingActivitiesResponse\"\"\x82\xd3\xe4\x93\x02\x1c\x12\x1a/api/v1/minting-activities\x12\xba\x01\n" +
"\x16GetLatestContributions\x12/.topfans.activity.GetLatestContributionsRequest\x1a0.topfans.activity.GetLatestContributionsResponse\"=\x82\xd3\xe4\x93\x027\x125/api/v1/activities/{activity_id}/contributions/latestB8Z6github.com/topfans/backend/pkg/proto/activity;activityb\x06proto3"
var ( var (
file_activity_proto_rawDescOnce sync.Once file_activity_proto_rawDescOnce sync.Once
@ -1510,57 +1792,64 @@ func file_activity_proto_rawDescGZIP() []byte {
return file_activity_proto_rawDescData return file_activity_proto_rawDescData
} }
var file_activity_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_activity_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
var file_activity_proto_goTypes = []any{ var file_activity_proto_goTypes = []any{
(*Activity)(nil), // 0: topfans.activity.Activity (*Activity)(nil), // 0: topfans.activity.Activity
(*ActivityItem)(nil), // 1: topfans.activity.ActivityItem (*ActivityItem)(nil), // 1: topfans.activity.ActivityItem
(*ActivityItemsResponse)(nil), // 2: topfans.activity.ActivityItemsResponse (*ActivityItemsResponse)(nil), // 2: topfans.activity.ActivityItemsResponse
(*PurchaseItemRequest)(nil), // 3: topfans.activity.PurchaseItemRequest (*PurchaseItemRequest)(nil), // 3: topfans.activity.PurchaseItemRequest
(*PurchaseItemResponse)(nil), // 4: topfans.activity.PurchaseItemResponse (*PurchaseItemResponse)(nil), // 4: topfans.activity.PurchaseItemResponse
(*ContributionRankingRequest)(nil), // 5: topfans.activity.ContributionRankingRequest (*ContributionRankingRequest)(nil), // 5: topfans.activity.ContributionRankingRequest
(*ContributionRankingItem)(nil), // 6: topfans.activity.ContributionRankingItem (*ContributionRankingItem)(nil), // 6: topfans.activity.ContributionRankingItem
(*ContributionRankingResponse)(nil), // 7: topfans.activity.ContributionRankingResponse (*ContributionRankingResponse)(nil), // 7: topfans.activity.ContributionRankingResponse
(*MyContribution)(nil), // 8: topfans.activity.MyContribution (*MyContribution)(nil), // 8: topfans.activity.MyContribution
(*GetActivityListRequest)(nil), // 9: topfans.activity.GetActivityListRequest (*GetActivityListRequest)(nil), // 9: topfans.activity.GetActivityListRequest
(*GetActivityListResponse)(nil), // 10: topfans.activity.GetActivityListResponse (*GetActivityListResponse)(nil), // 10: topfans.activity.GetActivityListResponse
(*GetProgressRequest)(nil), // 11: topfans.activity.GetProgressRequest (*GetProgressRequest)(nil), // 11: topfans.activity.GetProgressRequest
(*GetProgressResponse)(nil), // 12: topfans.activity.GetProgressResponse (*GetProgressResponse)(nil), // 12: topfans.activity.GetProgressResponse
(*MintingActivity)(nil), // 13: topfans.activity.MintingActivity (*MintingActivity)(nil), // 13: topfans.activity.MintingActivity
(*GetMintingActivitiesRequest)(nil), // 14: topfans.activity.GetMintingActivitiesRequest (*GetMintingActivitiesRequest)(nil), // 14: topfans.activity.GetMintingActivitiesRequest
(*GetMintingActivitiesResponse)(nil), // 15: topfans.activity.GetMintingActivitiesResponse (*GetMintingActivitiesResponse)(nil), // 15: topfans.activity.GetMintingActivitiesResponse
(*common.BaseResponse)(nil), // 16: topfans.common.BaseResponse (*GetLatestContributionsRequest)(nil), // 16: topfans.activity.GetLatestContributionsRequest
(*ContributionRecord)(nil), // 17: topfans.activity.ContributionRecord
(*GetLatestContributionsResponse)(nil), // 18: topfans.activity.GetLatestContributionsResponse
(*common.BaseResponse)(nil), // 19: topfans.common.BaseResponse
} }
var file_activity_proto_depIdxs = []int32{ var file_activity_proto_depIdxs = []int32{
1, // 0: topfans.activity.Activity.items:type_name -> topfans.activity.ActivityItem 1, // 0: topfans.activity.Activity.items:type_name -> topfans.activity.ActivityItem
1, // 1: topfans.activity.ActivityItemsResponse.items:type_name -> topfans.activity.ActivityItem 1, // 1: topfans.activity.ActivityItemsResponse.items:type_name -> topfans.activity.ActivityItem
16, // 2: topfans.activity.PurchaseItemResponse.base:type_name -> topfans.common.BaseResponse 19, // 2: topfans.activity.PurchaseItemResponse.base:type_name -> topfans.common.BaseResponse
16, // 3: topfans.activity.ContributionRankingResponse.base:type_name -> topfans.common.BaseResponse 19, // 3: topfans.activity.ContributionRankingResponse.base:type_name -> topfans.common.BaseResponse
6, // 4: topfans.activity.ContributionRankingResponse.items:type_name -> topfans.activity.ContributionRankingItem 6, // 4: topfans.activity.ContributionRankingResponse.items:type_name -> topfans.activity.ContributionRankingItem
8, // 5: topfans.activity.ContributionRankingResponse.my_contribution:type_name -> topfans.activity.MyContribution 8, // 5: topfans.activity.ContributionRankingResponse.my_contribution:type_name -> topfans.activity.MyContribution
16, // 6: topfans.activity.GetActivityListResponse.base:type_name -> topfans.common.BaseResponse 19, // 6: topfans.activity.GetActivityListResponse.base:type_name -> topfans.common.BaseResponse
0, // 7: topfans.activity.GetActivityListResponse.activities:type_name -> topfans.activity.Activity 0, // 7: topfans.activity.GetActivityListResponse.activities:type_name -> topfans.activity.Activity
16, // 8: topfans.activity.GetProgressResponse.base:type_name -> topfans.common.BaseResponse 19, // 8: topfans.activity.GetProgressResponse.base:type_name -> topfans.common.BaseResponse
16, // 9: topfans.activity.GetMintingActivitiesResponse.base:type_name -> topfans.common.BaseResponse 19, // 9: topfans.activity.GetMintingActivitiesResponse.base:type_name -> topfans.common.BaseResponse
13, // 10: topfans.activity.GetMintingActivitiesResponse.activities:type_name -> topfans.activity.MintingActivity 13, // 10: topfans.activity.GetMintingActivitiesResponse.activities:type_name -> topfans.activity.MintingActivity
9, // 11: topfans.activity.ActivityService.GetActivityList:input_type -> topfans.activity.GetActivityListRequest 19, // 11: topfans.activity.GetLatestContributionsResponse.base:type_name -> topfans.common.BaseResponse
11, // 12: topfans.activity.ActivityService.GetActivity:input_type -> topfans.activity.GetProgressRequest 17, // 12: topfans.activity.GetLatestContributionsResponse.records:type_name -> topfans.activity.ContributionRecord
11, // 13: topfans.activity.ActivityService.GetActivityItems:input_type -> topfans.activity.GetProgressRequest 9, // 13: topfans.activity.ActivityService.GetActivityList:input_type -> topfans.activity.GetActivityListRequest
11, // 14: topfans.activity.ActivityService.GetProgress:input_type -> topfans.activity.GetProgressRequest 11, // 14: topfans.activity.ActivityService.GetActivity:input_type -> topfans.activity.GetProgressRequest
3, // 15: topfans.activity.ActivityService.PurchaseItem:input_type -> topfans.activity.PurchaseItemRequest 11, // 15: topfans.activity.ActivityService.GetActivityItems:input_type -> topfans.activity.GetProgressRequest
5, // 16: topfans.activity.ActivityService.GetContributionRanking:input_type -> topfans.activity.ContributionRankingRequest 11, // 16: topfans.activity.ActivityService.GetProgress:input_type -> topfans.activity.GetProgressRequest
14, // 17: topfans.activity.ActivityService.GetMintingActivities:input_type -> topfans.activity.GetMintingActivitiesRequest 3, // 17: topfans.activity.ActivityService.PurchaseItem:input_type -> topfans.activity.PurchaseItemRequest
10, // 18: topfans.activity.ActivityService.GetActivityList:output_type -> topfans.activity.GetActivityListResponse 5, // 18: topfans.activity.ActivityService.GetContributionRanking:input_type -> topfans.activity.ContributionRankingRequest
0, // 19: topfans.activity.ActivityService.GetActivity:output_type -> topfans.activity.Activity 14, // 19: topfans.activity.ActivityService.GetMintingActivities:input_type -> topfans.activity.GetMintingActivitiesRequest
2, // 20: topfans.activity.ActivityService.GetActivityItems:output_type -> topfans.activity.ActivityItemsResponse 16, // 20: topfans.activity.ActivityService.GetLatestContributions:input_type -> topfans.activity.GetLatestContributionsRequest
12, // 21: topfans.activity.ActivityService.GetProgress:output_type -> topfans.activity.GetProgressResponse 10, // 21: topfans.activity.ActivityService.GetActivityList:output_type -> topfans.activity.GetActivityListResponse
4, // 22: topfans.activity.ActivityService.PurchaseItem:output_type -> topfans.activity.PurchaseItemResponse 0, // 22: topfans.activity.ActivityService.GetActivity:output_type -> topfans.activity.Activity
7, // 23: topfans.activity.ActivityService.GetContributionRanking:output_type -> topfans.activity.ContributionRankingResponse 2, // 23: topfans.activity.ActivityService.GetActivityItems:output_type -> topfans.activity.ActivityItemsResponse
15, // 24: topfans.activity.ActivityService.GetMintingActivities:output_type -> topfans.activity.GetMintingActivitiesResponse 12, // 24: topfans.activity.ActivityService.GetProgress:output_type -> topfans.activity.GetProgressResponse
18, // [18:25] is the sub-list for method output_type 4, // 25: topfans.activity.ActivityService.PurchaseItem:output_type -> topfans.activity.PurchaseItemResponse
11, // [11:18] is the sub-list for method input_type 7, // 26: topfans.activity.ActivityService.GetContributionRanking:output_type -> topfans.activity.ContributionRankingResponse
11, // [11:11] is the sub-list for extension type_name 15, // 27: topfans.activity.ActivityService.GetMintingActivities:output_type -> topfans.activity.GetMintingActivitiesResponse
11, // [11:11] is the sub-list for extension extendee 18, // 28: topfans.activity.ActivityService.GetLatestContributions:output_type -> topfans.activity.GetLatestContributionsResponse
0, // [0:11] is the sub-list for field type_name 21, // [21:29] is the sub-list for method output_type
13, // [13:21] is the sub-list for method input_type
13, // [13:13] is the sub-list for extension type_name
13, // [13:13] is the sub-list for extension extendee
0, // [0:13] is the sub-list for field type_name
} }
func init() { file_activity_proto_init() } func init() { file_activity_proto_init() }
@ -1574,7 +1863,7 @@ func file_activity_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_activity_proto_rawDesc), len(file_activity_proto_rawDesc)), RawDescriptor: unsafe.Slice(unsafe.StringData(file_activity_proto_rawDesc), len(file_activity_proto_rawDesc)),
NumEnums: 0, NumEnums: 0,
NumMessages: 16, NumMessages: 19,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },

View File

@ -1,284 +0,0 @@
// Code generated by protoc-gen-triple. DO NOT EDIT.
//
// Source: activity.proto
package activity
import (
"context"
)
import (
"dubbo.apache.org/dubbo-go/v3"
"dubbo.apache.org/dubbo-go/v3/client"
"dubbo.apache.org/dubbo-go/v3/common"
"dubbo.apache.org/dubbo-go/v3/common/constant"
"dubbo.apache.org/dubbo-go/v3/protocol/triple/triple_protocol"
"dubbo.apache.org/dubbo-go/v3/server"
)
// This is a compile-time assertion to ensure that this generated file and the Triple package
// are compatible. If you get a compiler error that this constant is not defined, this code was
// generated with a version of Triple newer than the one compiled into your binary. You can fix the
// problem by either regenerating this code with an older version of Triple or updating the Triple
// version compiled into your binary.
const _ = triple_protocol.IsAtLeastVersion0_1_0
const (
// ActivityServiceName is the fully-qualified name of the ActivityService service.
ActivityServiceName = "topfans.activity.ActivityService"
)
// These constants are the fully-qualified names of the RPCs defined in this package. They're
// exposed at runtime as procedure and as the final two segments of the HTTP route.
//
// Note that these are different from the fully-qualified method names used by
// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
// period.
const (
// ActivityServiceGetActivityListProcedure is the fully-qualified name of the ActivityService's GetActivityList RPC.
ActivityServiceGetActivityListProcedure = "/topfans.activity.ActivityService/GetActivityList"
// ActivityServiceGetActivityProcedure is the fully-qualified name of the ActivityService's GetActivity RPC.
ActivityServiceGetActivityProcedure = "/topfans.activity.ActivityService/GetActivity"
// ActivityServiceGetActivityItemsProcedure is the fully-qualified name of the ActivityService's GetActivityItems RPC.
ActivityServiceGetActivityItemsProcedure = "/topfans.activity.ActivityService/GetActivityItems"
// ActivityServiceGetProgressProcedure is the fully-qualified name of the ActivityService's GetProgress RPC.
ActivityServiceGetProgressProcedure = "/topfans.activity.ActivityService/GetProgress"
// ActivityServicePurchaseItemProcedure is the fully-qualified name of the ActivityService's PurchaseItem RPC.
ActivityServicePurchaseItemProcedure = "/topfans.activity.ActivityService/PurchaseItem"
// ActivityServiceGetContributionRankingProcedure is the fully-qualified name of the ActivityService's GetContributionRanking RPC.
ActivityServiceGetContributionRankingProcedure = "/topfans.activity.ActivityService/GetContributionRanking"
// ActivityServiceGetMintingActivitiesProcedure is the fully-qualified name of the ActivityService's GetMintingActivities RPC.
ActivityServiceGetMintingActivitiesProcedure = "/topfans.activity.ActivityService/GetMintingActivities"
)
var (
_ ActivityService = (*ActivityServiceImpl)(nil)
)
// ActivityService is a client for the topfans.activity.ActivityService service.
type ActivityService interface {
GetActivityList(ctx context.Context, req *GetActivityListRequest, opts ...client.CallOption) (*GetActivityListResponse, error)
GetActivity(ctx context.Context, req *GetProgressRequest, opts ...client.CallOption) (*Activity, error)
GetActivityItems(ctx context.Context, req *GetProgressRequest, opts ...client.CallOption) (*ActivityItemsResponse, error)
GetProgress(ctx context.Context, req *GetProgressRequest, opts ...client.CallOption) (*GetProgressResponse, error)
PurchaseItem(ctx context.Context, req *PurchaseItemRequest, opts ...client.CallOption) (*PurchaseItemResponse, error)
GetContributionRanking(ctx context.Context, req *ContributionRankingRequest, opts ...client.CallOption) (*ContributionRankingResponse, error)
GetMintingActivities(ctx context.Context, req *GetMintingActivitiesRequest, opts ...client.CallOption) (*GetMintingActivitiesResponse, error)
}
// NewActivityService constructs a client for the activity.ActivityService service.
func NewActivityService(cli *client.Client, opts ...client.ReferenceOption) (ActivityService, error) {
conn, err := cli.DialWithInfo("topfans.activity.ActivityService", &ActivityService_ClientInfo, opts...)
if err != nil {
return nil, err
}
return &ActivityServiceImpl{
conn: conn,
}, nil
}
func SetConsumerActivityService(srv common.RPCService) {
dubbo.SetConsumerServiceWithInfo(srv, &ActivityService_ClientInfo)
}
// ActivityServiceImpl implements ActivityService.
type ActivityServiceImpl struct {
conn *client.Connection
}
func (c *ActivityServiceImpl) GetActivityList(ctx context.Context, req *GetActivityListRequest, opts ...client.CallOption) (*GetActivityListResponse, error) {
resp := new(GetActivityListResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetActivityList", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *ActivityServiceImpl) GetActivity(ctx context.Context, req *GetProgressRequest, opts ...client.CallOption) (*Activity, error) {
resp := new(Activity)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetActivity", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *ActivityServiceImpl) GetActivityItems(ctx context.Context, req *GetProgressRequest, opts ...client.CallOption) (*ActivityItemsResponse, error) {
resp := new(ActivityItemsResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetActivityItems", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *ActivityServiceImpl) GetProgress(ctx context.Context, req *GetProgressRequest, opts ...client.CallOption) (*GetProgressResponse, error) {
resp := new(GetProgressResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetProgress", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *ActivityServiceImpl) PurchaseItem(ctx context.Context, req *PurchaseItemRequest, opts ...client.CallOption) (*PurchaseItemResponse, error) {
resp := new(PurchaseItemResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "PurchaseItem", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *ActivityServiceImpl) GetContributionRanking(ctx context.Context, req *ContributionRankingRequest, opts ...client.CallOption) (*ContributionRankingResponse, error) {
resp := new(ContributionRankingResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetContributionRanking", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *ActivityServiceImpl) GetMintingActivities(ctx context.Context, req *GetMintingActivitiesRequest, opts ...client.CallOption) (*GetMintingActivitiesResponse, error) {
resp := new(GetMintingActivitiesResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetMintingActivities", opts...); err != nil {
return nil, err
}
return resp, nil
}
var ActivityService_ClientInfo = client.ClientInfo{
InterfaceName: "topfans.activity.ActivityService",
MethodNames: []string{"GetActivityList", "GetActivity", "GetActivityItems", "GetProgress", "PurchaseItem", "GetContributionRanking", "GetMintingActivities"},
ConnectionInjectFunc: func(dubboCliRaw interface{}, conn *client.Connection) {
dubboCli := dubboCliRaw.(*ActivityServiceImpl)
dubboCli.conn = conn
},
}
// ActivityServiceHandler is an implementation of the topfans.activity.ActivityService service.
type ActivityServiceHandler interface {
GetActivityList(context.Context, *GetActivityListRequest) (*GetActivityListResponse, error)
GetActivity(context.Context, *GetProgressRequest) (*Activity, error)
GetActivityItems(context.Context, *GetProgressRequest) (*ActivityItemsResponse, error)
GetProgress(context.Context, *GetProgressRequest) (*GetProgressResponse, error)
PurchaseItem(context.Context, *PurchaseItemRequest) (*PurchaseItemResponse, error)
GetContributionRanking(context.Context, *ContributionRankingRequest) (*ContributionRankingResponse, error)
GetMintingActivities(context.Context, *GetMintingActivitiesRequest) (*GetMintingActivitiesResponse, error)
}
func RegisterActivityServiceHandler(srv *server.Server, hdlr ActivityServiceHandler, opts ...server.ServiceOption) error {
return srv.Register(hdlr, &ActivityService_ServiceInfo, opts...)
}
func SetProviderActivityService(srv common.RPCService) {
dubbo.SetProviderServiceWithInfo(srv, &ActivityService_ServiceInfo)
}
var ActivityService_ServiceInfo = server.ServiceInfo{
InterfaceName: "topfans.activity.ActivityService",
ServiceType: (*ActivityServiceHandler)(nil),
Methods: []server.MethodInfo{
{
Name: "GetActivityList",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetActivityListRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetActivityListRequest)
res, err := handler.(ActivityServiceHandler).GetActivityList(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetActivity",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetProgressRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetProgressRequest)
res, err := handler.(ActivityServiceHandler).GetActivity(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetActivityItems",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetProgressRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetProgressRequest)
res, err := handler.(ActivityServiceHandler).GetActivityItems(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetProgress",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetProgressRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetProgressRequest)
res, err := handler.(ActivityServiceHandler).GetProgress(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "PurchaseItem",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(PurchaseItemRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*PurchaseItemRequest)
res, err := handler.(ActivityServiceHandler).PurchaseItem(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetContributionRanking",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(ContributionRankingRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*ContributionRankingRequest)
res, err := handler.(ActivityServiceHandler).GetContributionRanking(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetMintingActivities",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetMintingActivitiesRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetMintingActivitiesRequest)
res, err := handler.(ActivityServiceHandler).GetMintingActivities(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
},
}

View File

@ -1,689 +0,0 @@
// Code generated by protoc-gen-triple. DO NOT EDIT.
//
// Source: user.proto
package user
import (
"context"
)
import (
"dubbo.apache.org/dubbo-go/v3"
"dubbo.apache.org/dubbo-go/v3/client"
"dubbo.apache.org/dubbo-go/v3/common"
"dubbo.apache.org/dubbo-go/v3/common/constant"
"dubbo.apache.org/dubbo-go/v3/protocol/triple/triple_protocol"
"dubbo.apache.org/dubbo-go/v3/server"
)
// This is a compile-time assertion to ensure that this generated file and the Triple package
// are compatible. If you get a compiler error that this constant is not defined, this code was
// generated with a version of Triple newer than the one compiled into your binary. You can fix the
// problem by either regenerating this code with an older version of Triple or updating the Triple
// version compiled into your binary.
const _ = triple_protocol.IsAtLeastVersion0_1_0
const (
// UserSocialServiceName is the fully-qualified name of the UserSocialService service.
UserSocialServiceName = "topfans.user.UserSocialService"
)
// These constants are the fully-qualified names of the RPCs defined in this package. They're
// exposed at runtime as procedure and as the final two segments of the HTTP route.
//
// Note that these are different from the fully-qualified method names used by
// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
// period.
const (
// UserSocialServiceRegisterProcedure is the fully-qualified name of the UserSocialService's Register RPC.
UserSocialServiceRegisterProcedure = "/topfans.user.UserSocialService/Register"
// UserSocialServiceLoginProcedure is the fully-qualified name of the UserSocialService's Login RPC.
UserSocialServiceLoginProcedure = "/topfans.user.UserSocialService/Login"
// UserSocialServiceRefreshTokenProcedure is the fully-qualified name of the UserSocialService's RefreshToken RPC.
UserSocialServiceRefreshTokenProcedure = "/topfans.user.UserSocialService/RefreshToken"
// UserSocialServiceValidateTokenProcedure is the fully-qualified name of the UserSocialService's ValidateToken RPC.
UserSocialServiceValidateTokenProcedure = "/topfans.user.UserSocialService/ValidateToken"
// UserSocialServiceLogoutProcedure is the fully-qualified name of the UserSocialService's Logout RPC.
UserSocialServiceLogoutProcedure = "/topfans.user.UserSocialService/Logout"
// UserSocialServiceCheckNicknameProcedure is the fully-qualified name of the UserSocialService's CheckNickname RPC.
UserSocialServiceCheckNicknameProcedure = "/topfans.user.UserSocialService/CheckNickname"
// UserSocialServiceCheckMobileProcedure is the fully-qualified name of the UserSocialService's CheckMobile RPC.
UserSocialServiceCheckMobileProcedure = "/topfans.user.UserSocialService/CheckMobile"
// UserSocialServiceGetUserProcedure is the fully-qualified name of the UserSocialService's GetUser RPC.
UserSocialServiceGetUserProcedure = "/topfans.user.UserSocialService/GetUser"
// UserSocialServiceGetFanProfileProcedure is the fully-qualified name of the UserSocialService's GetFanProfile RPC.
UserSocialServiceGetFanProfileProcedure = "/topfans.user.UserSocialService/GetFanProfile"
// UserSocialServiceUpdateFanProfileSocialProcedure is the fully-qualified name of the UserSocialService's UpdateFanProfileSocial RPC.
UserSocialServiceUpdateFanProfileSocialProcedure = "/topfans.user.UserSocialService/UpdateFanProfileSocial"
// UserSocialServiceUpdateCrystalBalanceProcedure is the fully-qualified name of the UserSocialService's UpdateCrystalBalance RPC.
UserSocialServiceUpdateCrystalBalanceProcedure = "/topfans.user.UserSocialService/UpdateCrystalBalance"
// UserSocialServiceUpdateAssetsCountProcedure is the fully-qualified name of the UserSocialService's UpdateAssetsCount RPC.
UserSocialServiceUpdateAssetsCountProcedure = "/topfans.user.UserSocialService/UpdateAssetsCount"
// UserSocialServiceAddExhibitionHoursProcedure is the fully-qualified name of the UserSocialService's AddExhibitionHours RPC.
UserSocialServiceAddExhibitionHoursProcedure = "/topfans.user.UserSocialService/AddExhibitionHours"
// UserSocialServiceGetCurrentUserProcedure is the fully-qualified name of the UserSocialService's GetCurrentUser RPC.
UserSocialServiceGetCurrentUserProcedure = "/topfans.user.UserSocialService/GetCurrentUser"
// UserSocialServiceGetMyProfileProcedure is the fully-qualified name of the UserSocialService's GetMyProfile RPC.
UserSocialServiceGetMyProfileProcedure = "/topfans.user.UserSocialService/GetMyProfile"
// UserSocialServiceUpdateNicknameProcedure is the fully-qualified name of the UserSocialService's UpdateNickname RPC.
UserSocialServiceUpdateNicknameProcedure = "/topfans.user.UserSocialService/UpdateNickname"
// UserSocialServiceUpdatePasswordProcedure is the fully-qualified name of the UserSocialService's UpdatePassword RPC.
UserSocialServiceUpdatePasswordProcedure = "/topfans.user.UserSocialService/UpdatePassword"
// UserSocialServiceUpdateAvatarProcedure is the fully-qualified name of the UserSocialService's UpdateAvatar RPC.
UserSocialServiceUpdateAvatarProcedure = "/topfans.user.UserSocialService/UpdateAvatar"
// UserSocialServiceGetFanIdentitiesProcedure is the fully-qualified name of the UserSocialService's GetFanIdentities RPC.
UserSocialServiceGetFanIdentitiesProcedure = "/topfans.user.UserSocialService/GetFanIdentities"
// UserSocialServiceGetMyFanIdentitiesProcedure is the fully-qualified name of the UserSocialService's GetMyFanIdentities RPC.
UserSocialServiceGetMyFanIdentitiesProcedure = "/topfans.user.UserSocialService/GetMyFanIdentities"
// UserSocialServiceAddIdentityProcedure is the fully-qualified name of the UserSocialService's AddIdentity RPC.
UserSocialServiceAddIdentityProcedure = "/topfans.user.UserSocialService/AddIdentity"
// UserSocialServiceSwitchIdentityProcedure is the fully-qualified name of the UserSocialService's SwitchIdentity RPC.
UserSocialServiceSwitchIdentityProcedure = "/topfans.user.UserSocialService/SwitchIdentity"
)
var (
_ UserSocialService = (*UserSocialServiceImpl)(nil)
)
// UserSocialService is a client for the topfans.user.UserSocialService service.
type UserSocialService interface {
Register(ctx context.Context, req *RegisterRequest, opts ...client.CallOption) (*RegisterResponse, error)
Login(ctx context.Context, req *LoginRequest, opts ...client.CallOption) (*LoginResponse, error)
RefreshToken(ctx context.Context, req *RefreshTokenRequest, opts ...client.CallOption) (*RefreshTokenResponse, error)
ValidateToken(ctx context.Context, req *ValidateTokenRequest, opts ...client.CallOption) (*ValidateTokenResponse, error)
Logout(ctx context.Context, req *LogoutRequest, opts ...client.CallOption) (*LogoutResponse, error)
CheckNickname(ctx context.Context, req *CheckNicknameRequest, opts ...client.CallOption) (*CheckNicknameResponse, error)
CheckMobile(ctx context.Context, req *CheckMobileRequest, opts ...client.CallOption) (*CheckMobileResponse, error)
GetUser(ctx context.Context, req *GetUserRequest, opts ...client.CallOption) (*GetUserResponse, error)
GetFanProfile(ctx context.Context, req *GetFanProfileRequest, opts ...client.CallOption) (*GetFanProfileResponse, error)
UpdateFanProfileSocial(ctx context.Context, req *UpdateFanProfileSocialRequest, opts ...client.CallOption) (*UpdateFanProfileSocialResponse, error)
UpdateCrystalBalance(ctx context.Context, req *UpdateCrystalBalanceRequest, opts ...client.CallOption) (*UpdateCrystalBalanceResponse, error)
UpdateAssetsCount(ctx context.Context, req *UpdateAssetsCountRequest, opts ...client.CallOption) (*UpdateAssetsCountResponse, error)
AddExhibitionHours(ctx context.Context, req *AddExhibitionHoursRequest, opts ...client.CallOption) (*AddExhibitionHoursResponse, error)
GetCurrentUser(ctx context.Context, req *GetCurrentUserRequest, opts ...client.CallOption) (*GetCurrentUserResponse, error)
GetMyProfile(ctx context.Context, req *GetMyProfileRequest, opts ...client.CallOption) (*GetMyProfileResponse, error)
UpdateNickname(ctx context.Context, req *UpdateNicknameRequest, opts ...client.CallOption) (*UpdateNicknameResponse, error)
UpdatePassword(ctx context.Context, req *UpdatePasswordRequest, opts ...client.CallOption) (*UpdatePasswordResponse, error)
UpdateAvatar(ctx context.Context, req *UpdateAvatarRequest, opts ...client.CallOption) (*UpdateAvatarResponse, error)
GetFanIdentities(ctx context.Context, req *GetFanIdentitiesRequest, opts ...client.CallOption) (*GetFanIdentitiesResponse, error)
GetMyFanIdentities(ctx context.Context, req *GetMyFanIdentitiesRequest, opts ...client.CallOption) (*GetMyFanIdentitiesResponse, error)
AddIdentity(ctx context.Context, req *AddIdentityRequest, opts ...client.CallOption) (*AddIdentityResponse, error)
SwitchIdentity(ctx context.Context, req *SwitchIdentityRequest, opts ...client.CallOption) (*SwitchIdentityResponse, error)
}
// NewUserSocialService constructs a client for the user.UserSocialService service.
func NewUserSocialService(cli *client.Client, opts ...client.ReferenceOption) (UserSocialService, error) {
conn, err := cli.DialWithInfo("topfans.user.UserSocialService", &UserSocialService_ClientInfo, opts...)
if err != nil {
return nil, err
}
return &UserSocialServiceImpl{
conn: conn,
}, nil
}
func SetConsumerUserSocialService(srv common.RPCService) {
dubbo.SetConsumerServiceWithInfo(srv, &UserSocialService_ClientInfo)
}
// UserSocialServiceImpl implements UserSocialService.
type UserSocialServiceImpl struct {
conn *client.Connection
}
func (c *UserSocialServiceImpl) Register(ctx context.Context, req *RegisterRequest, opts ...client.CallOption) (*RegisterResponse, error) {
resp := new(RegisterResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "Register", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) Login(ctx context.Context, req *LoginRequest, opts ...client.CallOption) (*LoginResponse, error) {
resp := new(LoginResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "Login", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) RefreshToken(ctx context.Context, req *RefreshTokenRequest, opts ...client.CallOption) (*RefreshTokenResponse, error) {
resp := new(RefreshTokenResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "RefreshToken", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) ValidateToken(ctx context.Context, req *ValidateTokenRequest, opts ...client.CallOption) (*ValidateTokenResponse, error) {
resp := new(ValidateTokenResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "ValidateToken", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) Logout(ctx context.Context, req *LogoutRequest, opts ...client.CallOption) (*LogoutResponse, error) {
resp := new(LogoutResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "Logout", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) CheckNickname(ctx context.Context, req *CheckNicknameRequest, opts ...client.CallOption) (*CheckNicknameResponse, error) {
resp := new(CheckNicknameResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "CheckNickname", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) CheckMobile(ctx context.Context, req *CheckMobileRequest, opts ...client.CallOption) (*CheckMobileResponse, error) {
resp := new(CheckMobileResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "CheckMobile", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) GetUser(ctx context.Context, req *GetUserRequest, opts ...client.CallOption) (*GetUserResponse, error) {
resp := new(GetUserResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetUser", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) GetFanProfile(ctx context.Context, req *GetFanProfileRequest, opts ...client.CallOption) (*GetFanProfileResponse, error) {
resp := new(GetFanProfileResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetFanProfile", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) UpdateFanProfileSocial(ctx context.Context, req *UpdateFanProfileSocialRequest, opts ...client.CallOption) (*UpdateFanProfileSocialResponse, error) {
resp := new(UpdateFanProfileSocialResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "UpdateFanProfileSocial", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) UpdateCrystalBalance(ctx context.Context, req *UpdateCrystalBalanceRequest, opts ...client.CallOption) (*UpdateCrystalBalanceResponse, error) {
resp := new(UpdateCrystalBalanceResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "UpdateCrystalBalance", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) UpdateAssetsCount(ctx context.Context, req *UpdateAssetsCountRequest, opts ...client.CallOption) (*UpdateAssetsCountResponse, error) {
resp := new(UpdateAssetsCountResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "UpdateAssetsCount", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) AddExhibitionHours(ctx context.Context, req *AddExhibitionHoursRequest, opts ...client.CallOption) (*AddExhibitionHoursResponse, error) {
resp := new(AddExhibitionHoursResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "AddExhibitionHours", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) GetCurrentUser(ctx context.Context, req *GetCurrentUserRequest, opts ...client.CallOption) (*GetCurrentUserResponse, error) {
resp := new(GetCurrentUserResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetCurrentUser", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) GetMyProfile(ctx context.Context, req *GetMyProfileRequest, opts ...client.CallOption) (*GetMyProfileResponse, error) {
resp := new(GetMyProfileResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetMyProfile", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) UpdateNickname(ctx context.Context, req *UpdateNicknameRequest, opts ...client.CallOption) (*UpdateNicknameResponse, error) {
resp := new(UpdateNicknameResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "UpdateNickname", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) UpdatePassword(ctx context.Context, req *UpdatePasswordRequest, opts ...client.CallOption) (*UpdatePasswordResponse, error) {
resp := new(UpdatePasswordResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "UpdatePassword", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) UpdateAvatar(ctx context.Context, req *UpdateAvatarRequest, opts ...client.CallOption) (*UpdateAvatarResponse, error) {
resp := new(UpdateAvatarResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "UpdateAvatar", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) GetFanIdentities(ctx context.Context, req *GetFanIdentitiesRequest, opts ...client.CallOption) (*GetFanIdentitiesResponse, error) {
resp := new(GetFanIdentitiesResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetFanIdentities", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) GetMyFanIdentities(ctx context.Context, req *GetMyFanIdentitiesRequest, opts ...client.CallOption) (*GetMyFanIdentitiesResponse, error) {
resp := new(GetMyFanIdentitiesResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetMyFanIdentities", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) AddIdentity(ctx context.Context, req *AddIdentityRequest, opts ...client.CallOption) (*AddIdentityResponse, error) {
resp := new(AddIdentityResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "AddIdentity", opts...); err != nil {
return nil, err
}
return resp, nil
}
func (c *UserSocialServiceImpl) SwitchIdentity(ctx context.Context, req *SwitchIdentityRequest, opts ...client.CallOption) (*SwitchIdentityResponse, error) {
resp := new(SwitchIdentityResponse)
if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "SwitchIdentity", opts...); err != nil {
return nil, err
}
return resp, nil
}
var UserSocialService_ClientInfo = client.ClientInfo{
InterfaceName: "topfans.user.UserSocialService",
MethodNames: []string{"Register", "Login", "RefreshToken", "ValidateToken", "Logout", "CheckNickname", "CheckMobile", "GetUser", "GetFanProfile", "UpdateFanProfileSocial", "UpdateCrystalBalance", "UpdateAssetsCount", "AddExhibitionHours", "GetCurrentUser", "GetMyProfile", "UpdateNickname", "UpdatePassword", "UpdateAvatar", "GetFanIdentities", "GetMyFanIdentities", "AddIdentity", "SwitchIdentity"},
ConnectionInjectFunc: func(dubboCliRaw interface{}, conn *client.Connection) {
dubboCli := dubboCliRaw.(*UserSocialServiceImpl)
dubboCli.conn = conn
},
}
// UserSocialServiceHandler is an implementation of the topfans.user.UserSocialService service.
type UserSocialServiceHandler interface {
Register(context.Context, *RegisterRequest) (*RegisterResponse, error)
Login(context.Context, *LoginRequest) (*LoginResponse, error)
RefreshToken(context.Context, *RefreshTokenRequest) (*RefreshTokenResponse, error)
ValidateToken(context.Context, *ValidateTokenRequest) (*ValidateTokenResponse, error)
Logout(context.Context, *LogoutRequest) (*LogoutResponse, error)
CheckNickname(context.Context, *CheckNicknameRequest) (*CheckNicknameResponse, error)
CheckMobile(context.Context, *CheckMobileRequest) (*CheckMobileResponse, error)
GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)
GetFanProfile(context.Context, *GetFanProfileRequest) (*GetFanProfileResponse, error)
UpdateFanProfileSocial(context.Context, *UpdateFanProfileSocialRequest) (*UpdateFanProfileSocialResponse, error)
UpdateCrystalBalance(context.Context, *UpdateCrystalBalanceRequest) (*UpdateCrystalBalanceResponse, error)
UpdateAssetsCount(context.Context, *UpdateAssetsCountRequest) (*UpdateAssetsCountResponse, error)
AddExhibitionHours(context.Context, *AddExhibitionHoursRequest) (*AddExhibitionHoursResponse, error)
GetCurrentUser(context.Context, *GetCurrentUserRequest) (*GetCurrentUserResponse, error)
GetMyProfile(context.Context, *GetMyProfileRequest) (*GetMyProfileResponse, error)
UpdateNickname(context.Context, *UpdateNicknameRequest) (*UpdateNicknameResponse, error)
UpdatePassword(context.Context, *UpdatePasswordRequest) (*UpdatePasswordResponse, error)
UpdateAvatar(context.Context, *UpdateAvatarRequest) (*UpdateAvatarResponse, error)
GetFanIdentities(context.Context, *GetFanIdentitiesRequest) (*GetFanIdentitiesResponse, error)
GetMyFanIdentities(context.Context, *GetMyFanIdentitiesRequest) (*GetMyFanIdentitiesResponse, error)
AddIdentity(context.Context, *AddIdentityRequest) (*AddIdentityResponse, error)
SwitchIdentity(context.Context, *SwitchIdentityRequest) (*SwitchIdentityResponse, error)
}
func RegisterUserSocialServiceHandler(srv *server.Server, hdlr UserSocialServiceHandler, opts ...server.ServiceOption) error {
return srv.Register(hdlr, &UserSocialService_ServiceInfo, opts...)
}
func SetProviderUserSocialService(srv common.RPCService) {
dubbo.SetProviderServiceWithInfo(srv, &UserSocialService_ServiceInfo)
}
var UserSocialService_ServiceInfo = server.ServiceInfo{
InterfaceName: "topfans.user.UserSocialService",
ServiceType: (*UserSocialServiceHandler)(nil),
Methods: []server.MethodInfo{
{
Name: "Register",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(RegisterRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*RegisterRequest)
res, err := handler.(UserSocialServiceHandler).Register(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "Login",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(LoginRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*LoginRequest)
res, err := handler.(UserSocialServiceHandler).Login(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "RefreshToken",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(RefreshTokenRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*RefreshTokenRequest)
res, err := handler.(UserSocialServiceHandler).RefreshToken(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "ValidateToken",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(ValidateTokenRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*ValidateTokenRequest)
res, err := handler.(UserSocialServiceHandler).ValidateToken(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "Logout",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(LogoutRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*LogoutRequest)
res, err := handler.(UserSocialServiceHandler).Logout(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "CheckNickname",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(CheckNicknameRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*CheckNicknameRequest)
res, err := handler.(UserSocialServiceHandler).CheckNickname(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "CheckMobile",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(CheckMobileRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*CheckMobileRequest)
res, err := handler.(UserSocialServiceHandler).CheckMobile(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetUser",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetUserRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetUserRequest)
res, err := handler.(UserSocialServiceHandler).GetUser(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetFanProfile",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetFanProfileRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetFanProfileRequest)
res, err := handler.(UserSocialServiceHandler).GetFanProfile(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "UpdateFanProfileSocial",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(UpdateFanProfileSocialRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*UpdateFanProfileSocialRequest)
res, err := handler.(UserSocialServiceHandler).UpdateFanProfileSocial(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "UpdateCrystalBalance",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(UpdateCrystalBalanceRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*UpdateCrystalBalanceRequest)
res, err := handler.(UserSocialServiceHandler).UpdateCrystalBalance(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "UpdateAssetsCount",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(UpdateAssetsCountRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*UpdateAssetsCountRequest)
res, err := handler.(UserSocialServiceHandler).UpdateAssetsCount(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "AddExhibitionHours",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(AddExhibitionHoursRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*AddExhibitionHoursRequest)
res, err := handler.(UserSocialServiceHandler).AddExhibitionHours(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetCurrentUser",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetCurrentUserRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetCurrentUserRequest)
res, err := handler.(UserSocialServiceHandler).GetCurrentUser(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetMyProfile",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetMyProfileRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetMyProfileRequest)
res, err := handler.(UserSocialServiceHandler).GetMyProfile(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "UpdateNickname",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(UpdateNicknameRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*UpdateNicknameRequest)
res, err := handler.(UserSocialServiceHandler).UpdateNickname(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "UpdatePassword",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(UpdatePasswordRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*UpdatePasswordRequest)
res, err := handler.(UserSocialServiceHandler).UpdatePassword(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "UpdateAvatar",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(UpdateAvatarRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*UpdateAvatarRequest)
res, err := handler.(UserSocialServiceHandler).UpdateAvatar(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetFanIdentities",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetFanIdentitiesRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetFanIdentitiesRequest)
res, err := handler.(UserSocialServiceHandler).GetFanIdentities(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "GetMyFanIdentities",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(GetMyFanIdentitiesRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*GetMyFanIdentitiesRequest)
res, err := handler.(UserSocialServiceHandler).GetMyFanIdentities(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "AddIdentity",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(AddIdentityRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*AddIdentityRequest)
res, err := handler.(UserSocialServiceHandler).AddIdentity(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
{
Name: "SwitchIdentity",
Type: constant.CallUnary,
ReqInitFunc: func() interface{} {
return new(SwitchIdentityRequest)
},
MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
req := args[0].(*SwitchIdentityRequest)
res, err := handler.(UserSocialServiceHandler).SwitchIdentity(ctx, req)
if err != nil {
return nil, err
}
return triple_protocol.NewResponse(res), nil
},
},
},
}

View File

@ -168,6 +168,36 @@ message GetMintingActivitiesResponse {
int32 total = 5; int32 total = 5;
} }
//
message GetLatestContributionsRequest {
int64 activity_id = 1;
int64 since_timestamp = 2; //
int64 since_id = 3; // ID筛选since_timestamp使用
int32 limit = 4; // 520
}
//
message ContributionRecord {
int64 id = 1;
int64 user_id = 2;
string nickname = 3;
string avatar_url = 4;
int64 star_id = 5;
int64 item_id = 6;
string item_type = 7;
string item_name = 8;
string item_icon = 9;
int32 quantity = 10;
int32 combo_count = 11;
int64 created_at = 12;
}
//
message GetLatestContributionsResponse {
topfans.common.BaseResponse base = 1;
repeated ContributionRecord records = 2;
}
// ==================== ==================== // ==================== ====================
service ActivityService { service ActivityService {
@ -220,4 +250,11 @@ service ActivityService {
get: "/api/v1/minting-activities" get: "/api/v1/minting-activities"
}; };
} }
//
rpc GetLatestContributions(GetLatestContributionsRequest) returns (GetLatestContributionsResponse) {
option (google.api.http) = {
get: "/api/v1/activities/{activity_id}/contributions/latest"
};
}
} }

View File

@ -0,0 +1,40 @@
-- Migration: Create activity_contributions table
-- Description: 用户活动贡献记录表,用于实时显示最新贡献
-- 1. 创建 activity_contributions 表
CREATE TABLE IF NOT EXISTS activity_contributions (
id BIGSERIAL PRIMARY KEY,
activity_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
star_id BIGINT NOT NULL,
item_id BIGINT NOT NULL,
item_type VARCHAR(50) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
crystal_spent BIGINT NOT NULL,
contribution_points BIGINT NOT NULL,
created_at BIGINT NOT NULL
);
-- 2. 创建索引
CREATE INDEX IF NOT EXISTS idx_activity_contributions_activity ON activity_contributions(activity_id);
CREATE INDEX IF NOT EXISTS idx_activity_contributions_user_star ON activity_contributions(user_id, star_id);
CREATE INDEX IF NOT EXISTS idx_activity_contributions_created ON activity_contributions(created_at DESC);
-- 3. 添加外键约束
ALTER TABLE activity_contributions
ADD CONSTRAINT fk_activity_contributions_activity FOREIGN KEY (activity_id) REFERENCES activities(id) ON DELETE CASCADE,
ADD CONSTRAINT fk_activity_contributions_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
ADD CONSTRAINT fk_activity_contributions_item FOREIGN KEY (item_id) REFERENCES activity_items(id) ON DELETE CASCADE,
ADD CONSTRAINT fk_activity_contributions_star FOREIGN KEY (star_id) REFERENCES stars(star_id) ON DELETE CASCADE;
-- 4. 添加注释
COMMENT ON TABLE activity_contributions IS '用户活动贡献记录表';
COMMENT ON COLUMN activity_contributions.activity_id IS '活动ID';
COMMENT ON COLUMN activity_contributions.user_id IS '用户ID';
COMMENT ON COLUMN activity_contributions.star_id IS '粉丝身份ID';
COMMENT ON COLUMN activity_contributions.item_id IS '道具ID';
COMMENT ON COLUMN activity_contributions.item_type IS '道具类型';
COMMENT ON COLUMN activity_contributions.quantity IS '购买数量';
COMMENT ON COLUMN activity_contributions.crystal_spent IS '消耗水晶数';
COMMENT ON COLUMN activity_contributions.contribution_points IS '贡献点数';
COMMENT ON COLUMN activity_contributions.created_at IS '创建时间(毫秒时间戳)';

View File

@ -42,6 +42,9 @@ type ActivityRepository interface {
// GetUserRank 获取用户排名 // GetUserRank 获取用户排名
GetUserRank(userID, activityID, starID int64) (int, error) GetUserRank(userID, activityID, starID int64) (int, error)
// GetLatestContributions 获取最新贡献记录(用于实时显示)
GetLatestContributions(activityID int64, sinceTimestamp int64, sinceID int64, limit int) ([]*models.ActivityContribution, error)
} }
// activityRepository Activity仓库实现 // activityRepository Activity仓库实现
@ -287,3 +290,34 @@ func (r *activityRepository) GetUserRank(userID, activityID, starID int64) (int,
return int(count) + 1, nil return int(count) + 1, nil
} }
// GetLatestContributions 获取最新贡献记录(用于实时显示)
func (r *activityRepository) GetLatestContributions(activityID int64, sinceTimestamp int64, sinceID int64, limit int) ([]*models.ActivityContribution, error) {
if activityID <= 0 {
return nil, errors.New("activity_id must be greater than 0")
}
if limit <= 0 {
limit = 5
}
if limit > 20 {
limit = 20 // 最多返回20条
}
query := r.db.Model(&models.ActivityContribution{}).
Where("activity_id = ?", activityID).
Order("created_at DESC, id DESC")
// 如果有 sinceTimestamp 和 sinceID进行分页查询
// 用于增量获取:获取 created_at > sinceTimestamp 或者 (created_at == sinceTimestamp AND id > sinceID) 的记录
if sinceTimestamp > 0 {
query = query.Where("created_at > ? OR (created_at = ? AND id > ?)", sinceTimestamp, sinceTimestamp, sinceID)
}
var contributions []*models.ActivityContribution
if err := query.Limit(limit).Find(&contributions).Error; err != nil {
return nil, err
}
return contributions, nil
}

View File

@ -37,6 +37,9 @@ type ActivityService interface {
// GetMintingActivities 获取铸造活动列表用于运营banner // GetMintingActivities 获取铸造活动列表用于运营banner
GetMintingActivities(ctx context.Context, req *pb.GetMintingActivitiesRequest) (*pb.GetMintingActivitiesResponse, error) GetMintingActivities(ctx context.Context, req *pb.GetMintingActivitiesRequest) (*pb.GetMintingActivitiesResponse, error)
// GetLatestContributions 获取最新贡献记录(用于实时显示)
GetLatestContributions(ctx context.Context, req *pb.GetLatestContributionsRequest) (*pb.GetLatestContributionsResponse, error)
} }
// activityService 活动Service实现 // activityService 活动Service实现
@ -611,4 +614,93 @@ func (s *activityService) GetMintingActivities(ctx context.Context, req *pb.GetM
PageSize: req.PageSize, PageSize: req.PageSize,
Total: int32(total), Total: int32(total),
}, nil }, nil
}
// GetLatestContributions 获取最新贡献记录(用于实时显示)
func (s *activityService) GetLatestContributions(ctx context.Context, req *pb.GetLatestContributionsRequest) (*pb.GetLatestContributionsResponse, error) {
logger.Logger.Info("GetLatestContributions request",
zap.Int64("activity_id", req.ActivityId),
zap.Int64("since_timestamp", req.SinceTimestamp),
zap.Int64("since_id", req.SinceId),
zap.Int32("limit", req.Limit),
)
if req.ActivityId <= 0 {
return &pb.GetLatestContributionsResponse{
Base: &pbCommon.BaseResponse{
Code: 400,
Message: "activity_id is required",
},
}, nil
}
limit := int(req.Limit)
if limit <= 0 {
limit = 5
}
if limit > 20 {
limit = 20
}
// 获取贡献记录
contributions, err := s.activityRepo.GetLatestContributions(req.ActivityId, req.SinceTimestamp, req.SinceId, limit)
if err != nil {
logger.Logger.Error("GetLatestContributions failed", zap.Error(err))
return &pb.GetLatestContributionsResponse{
Base: &pbCommon.BaseResponse{
Code: 500,
Message: "获取贡献记录失败: " + err.Error(),
},
}, nil
}
// 转换结果
records := make([]*pb.ContributionRecord, len(contributions))
for i, c := range contributions {
// 获取用户昵称和头像
nickname, avatarUrl := "", ""
if req.SinceTimestamp == 0 && req.SinceId == 0 {
// 只在首次全量拉取时获取用户信息
fanProfile, err := s.userRPCClient.GetFanProfile(c.UserID, c.StarID)
if err == nil && fanProfile != nil {
nickname = fanProfile.Nickname
avatarUrl = fanProfile.AvatarUrl
}
}
// 获取道具信息
itemName, itemIcon := "", ""
items, err := s.activityRepo.GetActivityItems(req.ActivityId)
if err == nil {
for _, item := range items {
if item.ID == c.ItemID {
itemName = item.ItemName
itemIcon = item.IconURL
break
}
}
}
records[i] = &pb.ContributionRecord{
Id: c.ID,
UserId: c.UserID,
Nickname: nickname,
AvatarUrl: avatarUrl,
StarId: c.StarID,
ItemId: c.ItemID,
ItemType: c.ItemType,
ItemName: itemName,
ItemIcon: itemIcon,
Quantity: int32(c.Quantity),
CreatedAt: c.CreatedAt,
}
}
return &pb.GetLatestContributionsResponse{
Base: &pbCommon.BaseResponse{
Code: 200,
Message: "ok",
},
Records: records,
}, nil
} }

View File

@ -28,15 +28,29 @@
<!-- 左边展位 (slot_index=1) --> <!-- 左边展位 (slot_index=1) -->
<view v-if="exhibitionAtSlot[0]" class="exhibition-card card-tilt-left" <view v-if="exhibitionAtSlot[0]" class="exhibition-card card-tilt-left"
@tap="handleExhibitionCardTap(exhibitionAtSlot[0], 0)"> @tap="handleExhibitionCardTap(exhibitionAtSlot[0], 0)">
<image v-if="!exhibitionAtSlot[0].is_lenticular" class="card-image" :src="exhibitionAtSlot[0].cover_url || '/static/nft/placeholder.png'" mode="aspectFill"></image> <LenticularCard v-if="exhibitionAtSlot[0].is_lenticular" class="card-lenticular"
<image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill"></image> :layers="getLenticularLayers(exhibitionAtSlot[0].id)" :transforms="getLenticularTransforms(exhibitionAtSlot[0].id)"
:gyro-source="gyroSourceLabel" :skip-built-in-touch="false" :shimmer-mid-opacity="0.16"
@simulate="(x, y) => onLenticularSimulate(exhibitionAtSlot[0].id, x, y)" />
<image v-else class="card-image" :src="exhibitionAtSlot[0].cover_url || '/static/nft/placeholder.png'"
mode="aspectFill"></image>
<!-- 领取收益按钮 -->
<view class="claim-reward-btn" v-if="isRewardClaimable(exhibitionAtSlot[0].id)">
<image class="claim-crystal-icon" src="/static/square/shuijingtubiao.png" mode="aspectFit">
</image>
<view @tap.stop="handleClaimReward(exhibitionAtSlot[0], 0)" class="claim-btn-text">领取收益</view>
</view>
<image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill">
</image>
<!-- 点赞数 -->
<view class="card-rate-badge"> <view class="card-rate-badge">
<image class="heart-icon" src="/static/icon/heart-icon.png" mode="aspectFit"></image> <image class="heart-icon" src="/static/icon/heart-icon.png" mode="aspectFit"></image>
<view class="card-rate-text-wrap"> <view class="card-rate-text-wrap">
<text class="card-rate-text">{{ exhibitionAtSlot[0].like_count || 0 }}</text> <text class="card-rate-text">{{ exhibitionAtSlot[0].like_count || 0 }}</text>
</view> </view>
</view> </view>
<view class="countdown-background" v-if="!isRewardClaimable(exhibitionAtSlot[0].id)" :style="getCountdownBackgroundStyle()"> <view class="countdown-background" v-if="!isRewardClaimable(exhibitionAtSlot[0].id)"
:style="getCountdownBackgroundStyle()">
<text class="countdown-text">{{ formatCountdown(exhibitionAtSlot[0].id) }}</text> <text class="countdown-text">{{ formatCountdown(exhibitionAtSlot[0].id) }}</text>
</view> </view>
<view class="card-income-row income-tilt-right"> <view class="card-income-row income-tilt-right">
@ -48,22 +62,37 @@
</view> </view>
<view v-else class="empty-card empty-card-left" @tap="openAssetSelector(1)"> <view v-else class="empty-card empty-card-left" @tap="openAssetSelector(1)">
<image class="empty-cover" src="/static/nft/placeholder.png" mode="aspectFill"></image> <image class="empty-cover" src="/static/nft/placeholder.png" mode="aspectFill"></image>
<image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill"></image> <image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill">
</image>
<view class="empty-add-btn"><text class="empty-add-icon">+</text></view> <view class="empty-add-btn"><text class="empty-add-icon">+</text></view>
</view> </view>
<!-- 右边展位 (slot_index=2) --> <!-- 右边展位 (slot_index=2) -->
<view v-if="exhibitionAtSlot[1]" class="exhibition-card card-tilt-right" <view v-if="exhibitionAtSlot[1]" class="exhibition-card card-tilt-right"
@tap="handleExhibitionCardTap(exhibitionAtSlot[1], 1)"> @tap="handleExhibitionCardTap(exhibitionAtSlot[1], 1)">
<image v-if="!exhibitionAtSlot[1].is_lenticular" class="card-image" :src="exhibitionAtSlot[1].cover_url || '/static/nft/placeholder.png'" mode="aspectFill"></image> <LenticularCard v-if="exhibitionAtSlot[1].is_lenticular" class="card-lenticular"
<image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill"></image> :layers="getLenticularLayers(exhibitionAtSlot[1].id)" :transforms="getLenticularTransforms(exhibitionAtSlot[1].id)"
:gyro-source="gyroSourceLabel" :skip-built-in-touch="false" :shimmer-mid-opacity="0.16"
@simulate="(x, y) => onLenticularSimulate(exhibitionAtSlot[1].id, x, y)" />
<image v-else class="card-image"
:src="exhibitionAtSlot[1].cover_url || '/static/nft/placeholder.png'" mode="aspectFill">
</image>
<!-- 领取收益按钮 -->
<view class="claim-reward-btn" v-if="isRewardClaimable(exhibitionAtSlot[1].id)">
<image class="claim-crystal-icon" src="/static/square/shuijingtubiao.png" mode="aspectFit">
</image>
<view @tap.stop="handleClaimReward(exhibitionAtSlot[1], 1)" class="claim-btn-text">领取收益</view>
</view>
<image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill">
</image>
<view class="card-rate-badge"> <view class="card-rate-badge">
<image class="heart-icon" src="/static/icon/heart-icon.png" mode="aspectFit"></image> <image class="heart-icon" src="/static/icon/heart-icon.png" mode="aspectFit"></image>
<view class="card-rate-text-wrap"> <view class="card-rate-text-wrap">
<text class="card-rate-text">{{ exhibitionAtSlot[1].like_count || 0 }}</text> <text class="card-rate-text">{{ exhibitionAtSlot[1].like_count || 0 }}</text>
</view> </view>
</view> </view>
<view class="countdown-background" v-if="!isRewardClaimable(exhibitionAtSlot[1].id)" :style="getCountdownBackgroundStyle()"> <view class="countdown-background" v-if="!isRewardClaimable(exhibitionAtSlot[1].id)"
:style="getCountdownBackgroundStyle()">
<text class="countdown-text">{{ formatCountdown(exhibitionAtSlot[1].id) }}</text> <text class="countdown-text">{{ formatCountdown(exhibitionAtSlot[1].id) }}</text>
</view> </view>
<view class="card-income-row income-tilt-left"> <view class="card-income-row income-tilt-left">
@ -75,7 +104,8 @@
</view> </view>
<view v-else class="empty-card empty-card-right" @tap="openAssetSelector(2)"> <view v-else class="empty-card empty-card-right" @tap="openAssetSelector(2)">
<image class="empty-cover" src="/static/nft/placeholder.png" mode="aspectFill"></image> <image class="empty-cover" src="/static/nft/placeholder.png" mode="aspectFill"></image>
<image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill"></image> <image class="card-frame" src="/static/square/gerenzhongxincangpinkuang.png" mode="aspectFill">
</image>
<view class="empty-add-btn"><text class="empty-add-icon">+</text></view> <view class="empty-add-btn"><text class="empty-add-icon">+</text></view>
</view> </view>
</view> </view>
@ -116,16 +146,11 @@
<view class="liked-item" :class="index === 0 ? 'liked-item-first' : ''"> <view class="liked-item" :class="index === 0 ? 'liked-item-first' : ''">
<!-- 作品封面 --> <!-- 作品封面 -->
<view class="liked-cover-wrap" :class="index === 0 ? 'liked-cover-wrap-first' : ''"> <view class="liked-cover-wrap" :class="index === 0 ? 'liked-cover-wrap-first' : ''">
<LenticularCard <LenticularCard v-if="item.is_lenticular" class="liked-lenticular"
v-if="item.is_lenticular"
class="liked-lenticular"
:layers="getLikedLenticularLayers(item.id)" :layers="getLikedLenticularLayers(item.id)"
:transforms="getLikedLenticularTransforms(item.id)" :transforms="getLikedLenticularTransforms(item.id)" :gyro-source="gyroSourceLabel"
:gyro-source="gyroSourceLabel" :skip-built-in-touch="false" :shimmer-mid-opacity="0.16"
:skip-built-in-touch="false" @simulate="(x, y) => onLikedLenticularSimulate(item.id, x, y)" />
:shimmer-mid-opacity="0.16"
@simulate="(x, y) => onLikedLenticularSimulate(item.id, x, y)"
/>
<image v-else class="liked-cover" :src="item.cover_url || '/static/nft/placeholder.png'" <image v-else class="liked-cover" :src="item.cover_url || '/static/nft/placeholder.png'"
mode="aspectFill"></image> mode="aspectFill"></image>
<image class="liked-cover-frame" src="/static/square/cangpinkuang1.png" <image class="liked-cover-frame" src="/static/square/cangpinkuang1.png"
@ -398,10 +423,10 @@ const handleExhibitionCardTap = (item, index) => {
// if (data?.earnings !== undefined) { // if (data?.earnings !== undefined) {
// exhibitionWorks.value[index].earnings = data.earnings; // exhibitionWorks.value[index].earnings = data.earnings;
// } else { // } else {
// //
await loadExhibitedAssets(); await loadExhibitedAssets();
await loadLikedAssets(); await loadLikedAssets();
// } // }
uni.showToast({ title: '点赞成功', icon: 'success' }); uni.showToast({ title: '点赞成功', icon: 'success' });
@ -795,7 +820,7 @@ const loadExhibitedAssets = async () => {
cover_url: item.cover_url, cover_url: item.cover_url,
like_count: item.like_count, like_count: item.like_count,
earnings: item.earnings, earnings: item.earnings,
hourly_earnings:item.hourly_earnings, hourly_earnings: item.hourly_earnings,
exhibited_at: item.exhibited_at, exhibited_at: item.exhibited_at,
expire_at: item.expire_at, expire_at: item.expire_at,
name: item.name, name: item.name,
@ -1056,13 +1081,14 @@ onShow(() => {
.card-tilt-left { .card-tilt-left {
transform: rotate(-4deg) translateY(10rpx); transform: rotate(-4deg) translateY(10rpx);
margin-right: 64rpx; margin-right: 32rpx;
border-radius: 32rpx; border-radius: 32rpx;
box-shadow: -16rpx 16rpx 16rpx rgba(229, 76, 93, 0.9); box-shadow: -16rpx 16rpx 16rpx rgba(229, 76, 93, 0.9);
} }
.card-tilt-right { .card-tilt-right {
transform: rotate(4deg) translateY(10rpx); transform: rotate(4deg) translateY(10rpx);
margin-left: 32rpx;
border-radius: 32rpx; border-radius: 32rpx;
box-shadow: 16rpx 16rpx 16rpx rgba(229, 76, 93, 0.9); box-shadow: 16rpx 16rpx 16rpx rgba(229, 76, 93, 0.9);
} }
@ -1294,6 +1320,7 @@ onShow(() => {
border-radius: 20rpx; border-radius: 20rpx;
overflow: visible; overflow: visible;
position: relative; position: relative;
margin: 0 32rpx;
} }
.empty-card-left { .empty-card-left {
@ -1312,6 +1339,7 @@ onShow(() => {
z-index: 3; z-index: 3;
padding: 16rpx; padding: 16rpx;
opacity: 0.5; opacity: 0.5;
} }
/* 卡片内的添加按钮 */ /* 卡片内的添加按钮 */

View File

@ -22,11 +22,11 @@
/> />
<!-- 实时贡献列表 --> <!-- 实时贡献列表 -->
<!-- <ContributionList <ContributionList
v-if="activityId && !isLoading" v-if="activityId && !isLoading"
:activity-id="activityId" :activity-id="activityId"
class="contribution-list-wrapper" class="contribution-list-wrapper"
/> --> />
<!-- 舞台区域 --> <!-- 舞台区域 -->
<StageArea <StageArea