diff --git a/backend/dev.sh b/backend/dev.sh
index 7d3f1d8..86825c0 100755
--- a/backend/dev.sh
+++ b/backend/dev.sh
@@ -21,7 +21,7 @@ cleanup() {
fi
# 清理所有 PID 文件并杀服务进程
- for service in gateway activityService galleryService socialService assetService userService; do
+ for service in gateway activityService galleryService socialService assetService userService taskService; do
pkill -9 -f "$service" 2>/dev/null || true
rm -f "/tmp/dev_sh_${service}.pid" "/tmp/dev_sh_${service}_restart" "/tmp/dev_sh_${service}.lock"
echo -e "${YELLOW} 🛑 $service 已停止${NC}"
@@ -155,9 +155,25 @@ restart_service() {
fi
cd "$SCRIPT_DIR/$dir"
- if ! go build -o "$SCRIPT_DIR/$binary" . 2>&1; then
- echo -e "${RED}❌ [$name] 编译失败,旧进程保持运行${NC}"
+ # 重试编译(最多3次)
+ local max_retries=3
+ local retry_count=0
+ local build_success=false
+ while [ $retry_count -lt $max_retries ]; do
+ if go build -o "$SCRIPT_DIR/$binary" . 2>&1; then
+ build_success=true
+ break
+ fi
+ retry_count=$((retry_count + 1))
+ if [ $retry_count -lt $max_retries ]; then
+ echo -e "${YELLOW}⚠️ [$name] 编译失败,${retry_count}/${max_retries} 次重试...${NC}"
+ sleep 1
+ fi
+ done
+ if [ "$build_success" = false ]; then
+ echo -e "${RED}❌ [$name] 编译失败 (已重试 ${max_retries} 次),旧进程保持运行${NC}"
echo -e "${RED} 查看详细日志: tail -f /tmp/${name}.log${NC}"
+ rm -f "$lock_file"
return 1
fi
echo -e "${GREEN}✅ [$name] 编译成功${NC}"
@@ -225,7 +241,8 @@ start_watcher() {
--exclude='assetService$' \
--exclude='socialService$' \
--exclude='galleryService$' \
- --exclude='activityService$'
+ --exclude='activityService$' \
+ --exclude='taskService$'
else
inotifywait -r -m -e modify,create,write "$watch_path" \
--exclude='\.git' \
@@ -236,7 +253,8 @@ start_watcher() {
--exclude='assetService$' \
--exclude='socialService$' \
--exclude='galleryService$' \
- --exclude='activityService$'
+ --exclude='activityService$' \
+ --exclude='taskService$'
fi | while read event; do
# 时间戳防抖:每次事件更新标记文件
# Darwin 不支持 date +%s%N,使用 python 获取纳秒时间戳
@@ -289,13 +307,13 @@ echo ""
> /tmp/dev_sh_watchers.tmp
# 清理残留 PID 文件(上次非正常退出可能留下)
-for service in activityService galleryService socialService assetService userService gateway; do
+for service in activityService galleryService socialService assetService userService taskService gateway; do
rm -f "/tmp/dev_sh_${service}.pid" "/tmp/dev_sh_${service}_restart"
done
# 停止现有服务(清理环境)
echo -e "${YELLOW}🛑 停止现有服务...${NC}"
-for service in gateway userService socialService assetService galleryService activityService; do
+for service in gateway userService socialService assetService galleryService activityService taskService; do
pkill -9 -f "$service" 2>/dev/null || true
done
sleep 1
@@ -309,6 +327,7 @@ build_service "assetService" "services/assetService" "services/assetService/
build_service "socialService" "services/socialService" "services/socialService/socialService"
build_service "galleryService" "services/galleryService" "services/galleryService/galleryService"
build_service "activityService" "services/activityService" "services/activityService/activityService"
+build_service "taskService" "services/taskService" "services/taskService/taskService"
cd "$SCRIPT_DIR"
# 启动所有服务
@@ -319,6 +338,7 @@ start_service "assetService" "services/assetService/assetService" 20003
start_service "socialService" "services/socialService/socialService" 20002 1
start_service "galleryService" "services/galleryService/galleryService" 20004 1
start_service "activityService" "services/activityService/activityService" 20005 1
+start_service "taskService" "services/taskService/taskService" 20006 1
start_service "gateway" "gateway/gateway" 8080 0
# 启动所有文件监听器
@@ -330,6 +350,7 @@ start_watcher "assetService" "services/assetService" "services/assetService/
start_watcher "socialService" "services/socialService" "services/socialService/socialService" 20002 1
start_watcher "galleryService" "services/galleryService" "services/galleryService/galleryService" 20004 1
start_watcher "activityService" "services/activityService" "services/activityService/activityService" 20005 1
+start_watcher "taskService" "services/taskService" "services/taskService/taskService" 20006 1
echo ""
echo -e "${GREEN}========================================${NC}"
@@ -344,6 +365,7 @@ echo " - Social Service: tri://localhost:20002"
echo " - Asset Service: tri://localhost:20003"
echo " - Gallery Service: tri://localhost:20004"
echo " - Activity Service: tri://localhost:20005"
+echo " - Task Service: tri://localhost:20006"
echo ""
echo -e "${YELLOW}按 Ctrl+C 停止所有服务${NC}"
echo ""
diff --git a/backend/gateway/config/config.go b/backend/gateway/config/config.go
index bc0a2ea..6029082 100644
--- a/backend/gateway/config/config.go
+++ b/backend/gateway/config/config.go
@@ -27,6 +27,7 @@ type DubboConfig struct {
AssetServiceURL string
GalleryServiceURL string
ActivityServiceURL string
+ TaskServiceURL string
}
// JWTConfig JWT 配置
@@ -71,6 +72,7 @@ func Load() *Config {
AssetServiceURL: getEnv("DUBBO_ASSET_SERVICE_URL", "tri://127.0.0.1:20003"),
GalleryServiceURL: getEnv("DUBBO_GALLERY_SERVICE_URL", "tri://127.0.0.1:20004"),
ActivityServiceURL: getEnv("DUBBO_ACTIVITY_SERVICE_URL", "tri://127.0.0.1:20005"),
+ TaskServiceURL: getEnv("DUBBO_TASK_SERVICE_URL", "tri://127.0.0.1:20006"),
},
JWT: JWTConfig{
Secret: getEnv("JWT_SECRET", "topfans-secret-key-please-change-in-production"),
@@ -130,6 +132,9 @@ func (c *Config) Validate() error {
if c.Dubbo.ActivityServiceURL == "" {
return fmt.Errorf("dubbo activity service URL is required")
}
+ if c.Dubbo.TaskServiceURL == "" {
+ return fmt.Errorf("dubbo task service URL is required")
+ }
if c.JWT.Secret == "" {
return fmt.Errorf("JWT secret is required")
}
diff --git a/backend/gateway/controller/task_controller.go b/backend/gateway/controller/task_controller.go
new file mode 100644
index 0000000..38d6e88
--- /dev/null
+++ b/backend/gateway/controller/task_controller.go
@@ -0,0 +1,771 @@
+package controller
+
+import (
+ "context"
+ "net/http"
+ "strconv"
+ "time"
+
+ "dubbo.apache.org/dubbo-go/v3/client"
+ "dubbo.apache.org/dubbo-go/v3/common/constant"
+ "github.com/gin-gonic/gin"
+ "github.com/topfans/backend/gateway/pkg/response"
+ pbCommon "github.com/topfans/backend/pkg/proto/common"
+ pbTask "github.com/topfans/backend/pkg/proto/task"
+ "github.com/topfans/backend/pkg/logger"
+ "go.uber.org/zap"
+)
+
+// TaskController 任务控制器
+type TaskController struct {
+ taskMobileService pbTask.TaskMobileService
+}
+
+// NewTaskController 创建任务控制器
+func NewTaskController(dubboClient *client.Client) (*TaskController, error) {
+ taskMobileService, err := pbTask.NewTaskMobileService(dubboClient)
+ if err != nil {
+ return nil, err
+ }
+ return &TaskController{
+ taskMobileService: taskMobileService,
+ }, nil
+}
+
+// GetDailyTasks 获取每日任务列表
+// @Summary 获取每日任务列表
+// @Description 获取每日任务列表
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param star_id query int64 true "粉丝身份ID"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/daily [get]
+func (ctrl *TaskController) GetDailyTasks(c *gin.Context) {
+ starIDStr := c.Query("star_id")
+ if starIDStr == "" {
+ response.Error(c, http.StatusBadRequest, "star_id 是必填参数")
+ return
+ }
+ starID, err := strconv.ParseInt(starIDStr, 10, 64)
+ if err != nil {
+ response.Error(c, http.StatusBadRequest, "star_id 参数错误")
+ return
+ }
+
+ userID, _ := c.Get("user_id")
+
+ logger.Logger.Info("GetDailyTasks request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.Int64("star_id", starID),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": strconv.FormatInt(starID, 10),
+ })
+
+ resp, err := ctrl.taskMobileService.GetDailyTasks(ctx, &pbTask.GetDailyTasksRequest{
+ StarId: starID,
+ })
+
+ if err != nil {
+ logger.Logger.Error("GetDailyTasks 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 := convertDailyTasksResponse(resp)
+ response.Success(c, data)
+}
+
+// ReportEvent 上报任务事件
+// @Summary 上报任务事件
+// @Description 上报任务事件,如 daily_login, daily_browse_asset
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param request body pbTask.ReportEventRequest true "事件上报请求"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/report-event [post]
+func (ctrl *TaskController) ReportEvent(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ var req struct {
+ EventType string `json:"event_type"`
+ StarId int64 `json:"star_id"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ response.Error(c, http.StatusBadRequest, "请求参数错误")
+ return
+ }
+ if req.EventType == "" {
+ response.Error(c, http.StatusBadRequest, "event_type 是必填参数")
+ return
+ }
+
+ logger.Logger.Info("ReportEvent request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.String("event_type", req.EventType),
+ zap.Int64("star_id", req.StarId),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": strconv.FormatInt(req.StarId, 10),
+ })
+
+ resp, err := ctrl.taskMobileService.ReportEvent(ctx, &pbTask.ReportEventRequest{
+ EventType: req.EventType,
+ StarId: req.StarId,
+ })
+
+ if err != nil {
+ logger.Logger.Error("ReportEvent 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
+ }
+
+ response.Success(c, map[string]interface{}{
+ "success": resp.Success,
+ "task_key": resp.TaskKey,
+ "task_completed": resp.TaskCompleted,
+ "message": resp.Message,
+ })
+}
+
+// ClaimDailyTask 领取单个每日任务奖励
+// @Summary 领取每日任务奖励
+// @Description 领取单个每日任务奖励
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param request body pbTask.ClaimDailyTaskRequest true "领取请求"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/daily/claim [post]
+func (ctrl *TaskController) ClaimDailyTask(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ var req struct {
+ TaskKey string `json:"task_key"`
+ StarId int64 `json:"star_id"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ response.Error(c, http.StatusBadRequest, "请求参数错误")
+ return
+ }
+ if req.TaskKey == "" {
+ response.Error(c, http.StatusBadRequest, "task_key 是必填参数")
+ return
+ }
+
+ logger.Logger.Info("ClaimDailyTask request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.String("task_key", req.TaskKey),
+ zap.Int64("star_id", req.StarId),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": strconv.FormatInt(req.StarId, 10),
+ })
+
+ resp, err := ctrl.taskMobileService.ClaimDailyTask(ctx, &pbTask.ClaimDailyTaskRequest{
+ TaskKey: req.TaskKey,
+ StarId: req.StarId,
+ })
+
+ if err != nil {
+ logger.Logger.Error("ClaimDailyTask 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
+ }
+
+ response.Success(c, map[string]interface{}{
+ "success": resp.Success,
+ "crystal_balance": resp.CrystalBalance,
+ "experience": resp.Experience,
+ })
+}
+
+// ClaimAllDailyTasks 一键领取所有每日任务
+// @Summary 一键领取所有每日任务
+// @Description 一键领取所有可领取的每日任务奖励
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param star_id query int64 true "粉丝身份ID"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/daily/claim-all [post]
+func (ctrl *TaskController) ClaimAllDailyTasks(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ starIDStr := c.Query("star_id")
+ if starIDStr == "" {
+ response.Error(c, http.StatusBadRequest, "star_id 是必填参数")
+ return
+ }
+ starID, err := strconv.ParseInt(starIDStr, 10, 64)
+ if err != nil {
+ response.Error(c, http.StatusBadRequest, "star_id 参数错误")
+ return
+ }
+
+ logger.Logger.Info("ClaimAllDailyTasks request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.Int64("star_id", starID),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": strconv.FormatInt(starID, 10),
+ })
+
+ resp, err := ctrl.taskMobileService.ClaimAllDailyTasks(ctx, &pbTask.ClaimAllDailyTasksRequest{
+ StarId: starID,
+ })
+
+ if err != nil {
+ logger.Logger.Error("ClaimAllDailyTasks 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
+ }
+
+ response.Success(c, map[string]interface{}{
+ "claimed_count": resp.ClaimedCount,
+ "crystal_balance": resp.CrystalBalance,
+ "experience": resp.Experience,
+ "claimed_task_keys": resp.ClaimedTaskKeys,
+ })
+}
+
+// CompleteGuide 完成引导任务
+// @Summary 完成引导任务
+// @Description 完成引导任务步骤
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param request body pbTask.CompleteGuideRequest true "引导完成请求"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/guide/complete [post]
+func (ctrl *TaskController) CompleteGuide(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ var req struct {
+ TaskKey string `json:"task_key"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ response.Error(c, http.StatusBadRequest, "请求参数错误")
+ return
+ }
+ if req.TaskKey == "" {
+ response.Error(c, http.StatusBadRequest, "task_key 是必填参数")
+ return
+ }
+
+ logger.Logger.Info("CompleteGuide request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.String("task_key", req.TaskKey),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": "0",
+ })
+
+ resp, err := ctrl.taskMobileService.CompleteGuide(ctx, &pbTask.CompleteGuideRequest{
+ TaskKey: req.TaskKey,
+ })
+
+ if err != nil {
+ logger.Logger.Error("CompleteGuide 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 := convertCompleteGuideResponse(resp)
+ response.Success(c, data)
+}
+
+// GetOnboardingStatus 获取引导状态
+// @Summary 获取引导状态
+// @Description 获取新手引导状态
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Success 200 {object} response.Response
+// @Router /api/tasks/onboarding/status [get]
+func (ctrl *TaskController) GetOnboardingStatus(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ logger.Logger.Info("GetOnboardingStatus request",
+ zap.Int64("user_id", userID.(int64)),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": "0",
+ })
+
+ resp, err := ctrl.taskMobileService.GetOnboardingStatus(ctx, &pbTask.GetOnboardingStatusRequest{})
+
+ if err != nil {
+ logger.Logger.Error("GetOnboardingStatus 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 := convertOnboardingStatusResponse(resp)
+ response.Success(c, data)
+}
+
+// AdvanceStage 进入下一引导阶段
+// @Summary 进入下一引导阶段
+// @Description 进入新手引导的下一阶段
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param request body pbTask.AdvanceStageRequest true "阶段推进请求"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/onboarding/advance-stage [post]
+func (ctrl *TaskController) AdvanceStage(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ var req struct {
+ TargetStage int32 `json:"target_stage"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ response.Error(c, http.StatusBadRequest, "请求参数错误")
+ return
+ }
+
+ logger.Logger.Info("AdvanceStage request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.Int32("target_stage", req.TargetStage),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": "0",
+ })
+
+ resp, err := ctrl.taskMobileService.AdvanceStage(ctx, &pbTask.AdvanceStageRequest{
+ TargetStage: req.TargetStage,
+ })
+
+ if err != nil {
+ logger.Logger.Error("AdvanceStage 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 := convertAdvanceStageResponse(resp)
+ response.Success(c, data)
+}
+
+// ClaimOnboardingReward 领取引导阶段奖励
+// @Summary 领取引导阶段奖励
+// @Description 领取新手引导阶段奖励
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param request body pbTask.ClaimOnboardingRewardRequest true "领取奖励请求"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/onboarding/claim-reward [post]
+func (ctrl *TaskController) ClaimOnboardingReward(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ var req struct {
+ Stage int32 `json:"stage"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ response.Error(c, http.StatusBadRequest, "请求参数错误")
+ return
+ }
+
+ logger.Logger.Info("ClaimOnboardingReward request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.Int32("stage", req.Stage),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": "0",
+ })
+
+ resp, err := ctrl.taskMobileService.ClaimOnboardingReward(ctx, &pbTask.ClaimOnboardingRewardRequest{
+ Stage: req.Stage,
+ })
+
+ if err != nil {
+ logger.Logger.Error("ClaimOnboardingReward 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
+ }
+
+ response.Success(c, map[string]interface{}{
+ "success": resp.Success,
+ })
+}
+
+// GetExhibitionRevenue 获取展示收益
+// @Summary 获取展示收益
+// @Description 获取展馆收益记录
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param star_id query int64 true "粉丝身份ID"
+// @Param status query string false "状态筛选:claimable/claimed"
+// @Param page query int false "页码,默认1"
+// @Param page_size query int false "每页数量,默认10"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/exhibition-revenue [get]
+func (ctrl *TaskController) GetExhibitionRevenue(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ starIDStr := c.Query("star_id")
+ if starIDStr == "" {
+ response.Error(c, http.StatusBadRequest, "star_id 是必填参数")
+ return
+ }
+ starID, err := strconv.ParseInt(starIDStr, 10, 64)
+ if err != nil {
+ response.Error(c, http.StatusBadRequest, "star_id 参数错误")
+ return
+ }
+
+ status := c.Query("status")
+ page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
+ pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
+
+ logger.Logger.Info("GetExhibitionRevenue request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.Int64("star_id", starID),
+ zap.String("status", status),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": strconv.FormatInt(starID, 10),
+ })
+
+ resp, err := ctrl.taskMobileService.GetExhibitionRevenue(ctx, &pbTask.GetExhibitionRevenueRequest{
+ StarId: starID,
+ Status: status,
+ Page: int32(page),
+ PageSize: int32(pageSize),
+ })
+
+ if err != nil {
+ logger.Logger.Error("GetExhibitionRevenue 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 := convertExhibitionRevenueResponse(resp)
+ response.Success(c, data)
+}
+
+// ClaimExhibitionRevenue 领取单条展示收益
+// @Summary 领取单条展示收益
+// @Description 领取单条展馆收益记录
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param request body pbTask.ClaimExhibitionRevenueRequest true "领取请求"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/exhibition-revenue/claim [post]
+func (ctrl *TaskController) ClaimExhibitionRevenue(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ var req struct {
+ RevenueId int64 `json:"revenue_id"`
+ StarId int64 `json:"star_id"`
+ }
+ if err := c.ShouldBindJSON(&req); err != nil {
+ response.Error(c, http.StatusBadRequest, "请求参数错误")
+ return
+ }
+
+ logger.Logger.Info("ClaimExhibitionRevenue request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.Int64("revenue_id", req.RevenueId),
+ zap.Int64("star_id", req.StarId),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": strconv.FormatInt(req.StarId, 10),
+ })
+
+ resp, err := ctrl.taskMobileService.ClaimExhibitionRevenue(ctx, &pbTask.ClaimExhibitionRevenueRequest{
+ RevenueId: req.RevenueId,
+ StarId: req.StarId,
+ })
+
+ if err != nil {
+ logger.Logger.Error("ClaimExhibitionRevenue 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
+ }
+
+ response.Success(c, map[string]interface{}{
+ "success": resp.Success,
+ })
+}
+
+// ClaimAllExhibitionRevenue 一键领取所有展示收益
+// @Summary 一键领取所有展示收益
+// @Description 一键领取所有可领取的展馆收益
+// @Tags tasks
+// @Accept json
+// @Produce json
+// @Security BearerAuth
+// @Param star_id query int64 true "粉丝身份ID"
+// @Success 200 {object} response.Response
+// @Router /api/tasks/exhibition-revenue/claim-all [post]
+func (ctrl *TaskController) ClaimAllExhibitionRevenue(c *gin.Context) {
+ userID, _ := c.Get("user_id")
+
+ starIDStr := c.Query("star_id")
+ if starIDStr == "" {
+ response.Error(c, http.StatusBadRequest, "star_id 是必填参数")
+ return
+ }
+ starID, err := strconv.ParseInt(starIDStr, 10, 64)
+ if err != nil {
+ response.Error(c, http.StatusBadRequest, "star_id 参数错误")
+ return
+ }
+
+ logger.Logger.Info("ClaimAllExhibitionRevenue request",
+ zap.Int64("user_id", userID.(int64)),
+ zap.Int64("star_id", starID),
+ )
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ ctx = context.WithValue(ctx, constant.AttachmentKey, map[string]interface{}{
+ "user_id": strconv.FormatInt(userID.(int64), 10),
+ "star_id": strconv.FormatInt(starID, 10),
+ })
+
+ resp, err := ctrl.taskMobileService.ClaimAllExhibitionRevenue(ctx, &pbTask.ClaimAllExhibitionRevenueRequest{
+ StarId: starID,
+ })
+
+ if err != nil {
+ logger.Logger.Error("ClaimAllExhibitionRevenue 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
+ }
+
+ response.Success(c, map[string]interface{}{
+ "claimed_count": resp.ClaimedCount,
+ })
+}
+
+// ==================== 响应转换函数 ====================
+
+func convertDailyTasksResponse(resp *pbTask.GetDailyTasksResponse) map[string]interface{} {
+ tasks := make([]map[string]interface{}, 0, len(resp.Tasks))
+ for _, task := range resp.Tasks {
+ tasks = append(tasks, map[string]interface{}{
+ "task_key": task.TaskKey,
+ "star_id": task.StarId,
+ "name": task.Name,
+ "description": task.Description,
+ "crystal_reward": task.CrystalReward,
+ "exp_reward": task.ExpReward,
+ "status": task.Status,
+ "can_claim": task.CanClaim,
+ })
+ }
+ return map[string]interface{}{
+ "star_id": resp.StarId,
+ "tasks": tasks,
+ }
+}
+
+func convertOnboardingStatusResponse(resp *pbTask.GetOnboardingStatusResponse) map[string]interface{} {
+ stages := make([]map[string]interface{}, 0, len(resp.Stages))
+ for _, stage := range resp.Stages {
+ stages = append(stages, map[string]interface{}{
+ "stage": stage.Stage,
+ "name": stage.Name,
+ "required_task_keys": stage.RequiredTaskKeys,
+ "crystal_reward": stage.CrystalReward,
+ "exp_reward": stage.ExpReward,
+ "status": stage.Status,
+ "is_current": stage.IsCurrent,
+ })
+ }
+ return map[string]interface{}{
+ "user_id": resp.UserId,
+ "current_stage": resp.CurrentStage,
+ "status": resp.Status,
+ "stages": stages,
+ }
+}
+
+func convertAdvanceStageResponse(resp *pbTask.AdvanceStageResponse) map[string]interface{} {
+ stages := make([]map[string]interface{}, 0, len(resp.Stages))
+ for _, stage := range resp.Stages {
+ stages = append(stages, map[string]interface{}{
+ "stage": stage.Stage,
+ "name": stage.Name,
+ "required_task_keys": stage.RequiredTaskKeys,
+ "crystal_reward": stage.CrystalReward,
+ "exp_reward": stage.ExpReward,
+ "status": stage.Status,
+ "is_current": stage.IsCurrent,
+ })
+ }
+ return map[string]interface{}{
+ "current_stage": resp.CurrentStage,
+ "status": resp.Status,
+ "stages": stages,
+ }
+}
+
+func convertCompleteGuideResponse(resp *pbTask.CompleteGuideResponse) map[string]interface{} {
+ stages := make([]map[string]interface{}, 0, len(resp.Stages))
+ for _, stage := range resp.Stages {
+ stages = append(stages, map[string]interface{}{
+ "stage": stage.Stage,
+ "name": stage.Name,
+ "required_task_keys": stage.RequiredTaskKeys,
+ "crystal_reward": stage.CrystalReward,
+ "exp_reward": stage.ExpReward,
+ "status": stage.Status,
+ "is_current": stage.IsCurrent,
+ })
+ }
+ return map[string]interface{}{
+ "user_id": resp.UserId,
+ "current_stage": resp.CurrentStage,
+ "status": resp.Status,
+ "stages": stages,
+ }
+}
+
+func convertExhibitionRevenueResponse(resp *pbTask.GetExhibitionRevenueResponse) map[string]interface{} {
+ items := make([]map[string]interface{}, 0, len(resp.Items))
+ for _, item := range resp.Items {
+ items = append(items, map[string]interface{}{
+ "id": item.Id,
+ "star_id": item.StarId,
+ "exhibition_id": item.ExhibitionId,
+ "asset_id": item.AssetId,
+ "slot_id": item.SlotId,
+ "slot_type": item.SlotType,
+ "crystal_amount": item.CrystalAmount,
+ "cycle_start_time": item.CycleStartTime,
+ "cycle_end_time": item.CycleEndTime,
+ "status": item.Status,
+ "can_claim": item.CanClaim,
+ })
+ }
+ return map[string]interface{}{
+ "items": items,
+ "total": resp.Total,
+ "page": resp.Page,
+ "page_size": resp.PageSize,
+ }
+}
diff --git a/backend/gateway/dto/response_dto.go b/backend/gateway/dto/response_dto.go
index d456ccd..d7c14e8 100644
--- a/backend/gateway/dto/response_dto.go
+++ b/backend/gateway/dto/response_dto.go
@@ -17,6 +17,7 @@ type CurrentIdentityDTO struct {
IdentityName string `json:"identity_name"` // "王一博"
Tag string `json:"tag"` // "小摩托"
Level int32 `json:"level"`
+ Experience int64 `json:"experience"`
CrystalBalance int64 `json:"crystal_balance"`
}
diff --git a/backend/gateway/dto/user_converter.go b/backend/gateway/dto/user_converter.go
index a055f00..2f8f2a6 100644
--- a/backend/gateway/dto/user_converter.go
+++ b/backend/gateway/dto/user_converter.go
@@ -24,6 +24,7 @@ func ToCurrentIdentityDTO(profile *pb.FanProfile, star *pb.Star) CurrentIdentity
IdentityName: star.Name, // "王一博"
Tag: star.Tag, // "小摩托"
Level: profile.Level,
+ Experience: profile.Experience,
CrystalBalance: profile.CrystalBalance,
}
}
diff --git a/backend/gateway/main.go b/backend/gateway/main.go
index 667de10..5b1e138 100644
--- a/backend/gateway/main.go
+++ b/backend/gateway/main.go
@@ -59,6 +59,7 @@ func main() {
zap.String("asset_service_url", cfg.Dubbo.AssetServiceURL),
zap.String("gallery_service_url", cfg.Dubbo.GalleryServiceURL),
zap.String("activity_service_url", cfg.Dubbo.ActivityServiceURL),
+ zap.String("task_service_url", cfg.Dubbo.TaskServiceURL),
)
// 3. 设置 Gin 模式
@@ -112,9 +113,18 @@ func main() {
}
logger.Logger.Info("Activity Service Dubbo client connected successfully")
+ // 4.6 TaskService Client
+ taskClient, err := client.NewClient(
+ client.WithClientURL(cfg.Dubbo.TaskServiceURL),
+ )
+ if err != nil {
+ logger.Logger.Fatal("Failed to create Task Service Dubbo client", zap.Error(err))
+ }
+ logger.Logger.Info("Task Service Dubbo client connected successfully")
+
// 5. 设置路由
logger.Logger.Info("Setting up routes...")
- r, err := router.SetupRouter(userClient, socialClient, assetClient, galleryClient, activityClient)
+ r, err := router.SetupRouter(userClient, socialClient, assetClient, galleryClient, activityClient, taskClient)
if err != nil {
logger.Logger.Fatal("Failed to setup router", zap.Error(err))
}
diff --git a/backend/gateway/router/router.go b/backend/gateway/router/router.go
index c6c6a8c..1a364c6 100644
--- a/backend/gateway/router/router.go
+++ b/backend/gateway/router/router.go
@@ -11,7 +11,7 @@ import (
)
// SetupRouter 设置路由
-func SetupRouter(userClient *client.Client, socialClient *client.Client, assetClient *client.Client, galleryClient *client.Client, activityClient *client.Client) (*gin.Engine, error) {
+func SetupRouter(userClient *client.Client, socialClient *client.Client, assetClient *client.Client, galleryClient *client.Client, activityClient *client.Client, taskClient *client.Client) (*gin.Engine, error) {
r := gin.Default()
// 全局中间件
@@ -66,6 +66,11 @@ func SetupRouter(userClient *client.Client, socialClient *client.Client, assetCl
return nil, err
}
+ taskCtrl, err := controller.NewTaskController(taskClient)
+ if err != nil {
+ return nil, err
+ }
+
// API v1 路由组
v1 := r.Group("/api/v1")
{
@@ -217,6 +222,23 @@ func SetupRouter(userClient *client.Client, socialClient *client.Client, assetCl
activities.POST("/:id/purchase", activityCtrl.PurchaseItem) // 购买道具
activities.GET("/:id/ranking", activityCtrl.GetContributionRanking) // 获取贡献点排名
}
+
+ // 任务相关路由(需要认证)
+ tasks := v1.Group("/tasks")
+ tasks.Use(middleware.AuthMiddleware())
+ {
+ tasks.GET("/daily", taskCtrl.GetDailyTasks) // 获取每日任务列表
+ tasks.POST("/report-event", taskCtrl.ReportEvent) // 上报任务事件
+ tasks.POST("/daily/claim", taskCtrl.ClaimDailyTask) // 领取单个每日任务
+ tasks.POST("/daily/claim-all", taskCtrl.ClaimAllDailyTasks) // 一键领取所有每日任务
+ tasks.POST("/guide/complete", taskCtrl.CompleteGuide) // 完成引导任务
+ tasks.GET("/onboarding/status", taskCtrl.GetOnboardingStatus) // 获取引导状态
+ tasks.POST("/onboarding/advance-stage", taskCtrl.AdvanceStage) // 进入下一引导阶段
+ tasks.POST("/onboarding/claim-reward", taskCtrl.ClaimOnboardingReward) // 领取引导阶段奖励
+ tasks.GET("/exhibition-revenue", taskCtrl.GetExhibitionRevenue) // 获取展示收益
+ tasks.POST("/exhibition-revenue/claim", taskCtrl.ClaimExhibitionRevenue) // 领取单条展示收益
+ tasks.POST("/exhibition-revenue/claim-all", taskCtrl.ClaimAllExhibitionRevenue) // 一键领取所有展示收益
+ }
}
return r, nil
diff --git a/backend/pkg/proto/task/task.pb.go b/backend/pkg/proto/task/task.pb.go
new file mode 100644
index 0000000..30ecf69
--- /dev/null
+++ b/backend/pkg/proto/task/task.pb.go
@@ -0,0 +1,2142 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.36.11
+// protoc v7.34.0
+// source: task.proto
+
+package task
+
+import (
+ common "github.com/topfans/backend/pkg/proto/common"
+ _ "google.golang.org/genproto/googleapis/api/annotations"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+ unsafe "unsafe"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type DailyTaskItem struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ TaskKey string `protobuf:"bytes,1,opt,name=task_key,json=taskKey,proto3" json:"task_key,omitempty"`
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+ Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
+ CrystalReward int64 `protobuf:"varint,5,opt,name=crystal_reward,json=crystalReward,proto3" json:"crystal_reward,omitempty"`
+ ExpReward int64 `protobuf:"varint,6,opt,name=exp_reward,json=expReward,proto3" json:"exp_reward,omitempty"`
+ Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` // pending/completed/claimed
+ CanClaim bool `protobuf:"varint,8,opt,name=can_claim,json=canClaim,proto3" json:"can_claim,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *DailyTaskItem) Reset() {
+ *x = DailyTaskItem{}
+ mi := &file_task_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *DailyTaskItem) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DailyTaskItem) ProtoMessage() {}
+
+func (x *DailyTaskItem) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[0]
+ 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 DailyTaskItem.ProtoReflect.Descriptor instead.
+func (*DailyTaskItem) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *DailyTaskItem) GetTaskKey() string {
+ if x != nil {
+ return x.TaskKey
+ }
+ return ""
+}
+
+func (x *DailyTaskItem) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+func (x *DailyTaskItem) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *DailyTaskItem) GetDescription() string {
+ if x != nil {
+ return x.Description
+ }
+ return ""
+}
+
+func (x *DailyTaskItem) GetCrystalReward() int64 {
+ if x != nil {
+ return x.CrystalReward
+ }
+ return 0
+}
+
+func (x *DailyTaskItem) GetExpReward() int64 {
+ if x != nil {
+ return x.ExpReward
+ }
+ return 0
+}
+
+func (x *DailyTaskItem) GetStatus() string {
+ if x != nil {
+ return x.Status
+ }
+ return ""
+}
+
+func (x *DailyTaskItem) GetCanClaim() bool {
+ if x != nil {
+ return x.CanClaim
+ }
+ return false
+}
+
+type GetDailyTasksRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ StarId int64 `protobuf:"varint,1,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *GetDailyTasksRequest) Reset() {
+ *x = GetDailyTasksRequest{}
+ mi := &file_task_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *GetDailyTasksRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDailyTasksRequest) ProtoMessage() {}
+
+func (x *GetDailyTasksRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[1]
+ 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 GetDailyTasksRequest.ProtoReflect.Descriptor instead.
+func (*GetDailyTasksRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetDailyTasksRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+type GetDailyTasksResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ Tasks []*DailyTaskItem `protobuf:"bytes,3,rep,name=tasks,proto3" json:"tasks,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *GetDailyTasksResponse) Reset() {
+ *x = GetDailyTasksResponse{}
+ mi := &file_task_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *GetDailyTasksResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetDailyTasksResponse) ProtoMessage() {}
+
+func (x *GetDailyTasksResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[2]
+ 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 GetDailyTasksResponse.ProtoReflect.Descriptor instead.
+func (*GetDailyTasksResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GetDailyTasksResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *GetDailyTasksResponse) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+func (x *GetDailyTasksResponse) GetTasks() []*DailyTaskItem {
+ if x != nil {
+ return x.Tasks
+ }
+ return nil
+}
+
+type ReportEventRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ EventType string `protobuf:"bytes,1,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"` // 如 "daily_browse_asset", "daily_login"
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ReportEventRequest) Reset() {
+ *x = ReportEventRequest{}
+ mi := &file_task_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ReportEventRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReportEventRequest) ProtoMessage() {}
+
+func (x *ReportEventRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[3]
+ 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 ReportEventRequest.ProtoReflect.Descriptor instead.
+func (*ReportEventRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ReportEventRequest) GetEventType() string {
+ if x != nil {
+ return x.EventType
+ }
+ return ""
+}
+
+func (x *ReportEventRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+type ReportEventResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"`
+ TaskKey string `protobuf:"bytes,3,opt,name=task_key,json=taskKey,proto3" json:"task_key,omitempty"`
+ TaskCompleted bool `protobuf:"varint,4,opt,name=task_completed,json=taskCompleted,proto3" json:"task_completed,omitempty"`
+ Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ReportEventResponse) Reset() {
+ *x = ReportEventResponse{}
+ mi := &file_task_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ReportEventResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ReportEventResponse) ProtoMessage() {}
+
+func (x *ReportEventResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[4]
+ 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 ReportEventResponse.ProtoReflect.Descriptor instead.
+func (*ReportEventResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *ReportEventResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *ReportEventResponse) GetSuccess() bool {
+ if x != nil {
+ return x.Success
+ }
+ return false
+}
+
+func (x *ReportEventResponse) GetTaskKey() string {
+ if x != nil {
+ return x.TaskKey
+ }
+ return ""
+}
+
+func (x *ReportEventResponse) GetTaskCompleted() bool {
+ if x != nil {
+ return x.TaskCompleted
+ }
+ return false
+}
+
+func (x *ReportEventResponse) GetMessage() string {
+ if x != nil {
+ return x.Message
+ }
+ return ""
+}
+
+type ClaimDailyTaskRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ TaskKey string `protobuf:"bytes,1,opt,name=task_key,json=taskKey,proto3" json:"task_key,omitempty"`
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimDailyTaskRequest) Reset() {
+ *x = ClaimDailyTaskRequest{}
+ mi := &file_task_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimDailyTaskRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimDailyTaskRequest) ProtoMessage() {}
+
+func (x *ClaimDailyTaskRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[5]
+ 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 ClaimDailyTaskRequest.ProtoReflect.Descriptor instead.
+func (*ClaimDailyTaskRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ClaimDailyTaskRequest) GetTaskKey() string {
+ if x != nil {
+ return x.TaskKey
+ }
+ return ""
+}
+
+func (x *ClaimDailyTaskRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+type ClaimDailyTaskResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"`
+ CrystalBalance int64 `protobuf:"varint,3,opt,name=crystal_balance,json=crystalBalance,proto3" json:"crystal_balance,omitempty"`
+ Experience int64 `protobuf:"varint,4,opt,name=experience,proto3" json:"experience,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimDailyTaskResponse) Reset() {
+ *x = ClaimDailyTaskResponse{}
+ mi := &file_task_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimDailyTaskResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimDailyTaskResponse) ProtoMessage() {}
+
+func (x *ClaimDailyTaskResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[6]
+ 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 ClaimDailyTaskResponse.ProtoReflect.Descriptor instead.
+func (*ClaimDailyTaskResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *ClaimDailyTaskResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *ClaimDailyTaskResponse) GetSuccess() bool {
+ if x != nil {
+ return x.Success
+ }
+ return false
+}
+
+func (x *ClaimDailyTaskResponse) GetCrystalBalance() int64 {
+ if x != nil {
+ return x.CrystalBalance
+ }
+ return 0
+}
+
+func (x *ClaimDailyTaskResponse) GetExperience() int64 {
+ if x != nil {
+ return x.Experience
+ }
+ return 0
+}
+
+type ClaimAllDailyTasksRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ StarId int64 `protobuf:"varint,1,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimAllDailyTasksRequest) Reset() {
+ *x = ClaimAllDailyTasksRequest{}
+ mi := &file_task_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimAllDailyTasksRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimAllDailyTasksRequest) ProtoMessage() {}
+
+func (x *ClaimAllDailyTasksRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[7]
+ 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 ClaimAllDailyTasksRequest.ProtoReflect.Descriptor instead.
+func (*ClaimAllDailyTasksRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *ClaimAllDailyTasksRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+type ClaimAllDailyTasksResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ ClaimedCount int32 `protobuf:"varint,2,opt,name=claimed_count,json=claimedCount,proto3" json:"claimed_count,omitempty"`
+ CrystalBalance int64 `protobuf:"varint,3,opt,name=crystal_balance,json=crystalBalance,proto3" json:"crystal_balance,omitempty"`
+ Experience int64 `protobuf:"varint,4,opt,name=experience,proto3" json:"experience,omitempty"`
+ ClaimedTaskKeys []string `protobuf:"bytes,5,rep,name=claimed_task_keys,json=claimedTaskKeys,proto3" json:"claimed_task_keys,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimAllDailyTasksResponse) Reset() {
+ *x = ClaimAllDailyTasksResponse{}
+ mi := &file_task_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimAllDailyTasksResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimAllDailyTasksResponse) ProtoMessage() {}
+
+func (x *ClaimAllDailyTasksResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[8]
+ 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 ClaimAllDailyTasksResponse.ProtoReflect.Descriptor instead.
+func (*ClaimAllDailyTasksResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *ClaimAllDailyTasksResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *ClaimAllDailyTasksResponse) GetClaimedCount() int32 {
+ if x != nil {
+ return x.ClaimedCount
+ }
+ return 0
+}
+
+func (x *ClaimAllDailyTasksResponse) GetCrystalBalance() int64 {
+ if x != nil {
+ return x.CrystalBalance
+ }
+ return 0
+}
+
+func (x *ClaimAllDailyTasksResponse) GetExperience() int64 {
+ if x != nil {
+ return x.Experience
+ }
+ return 0
+}
+
+func (x *ClaimAllDailyTasksResponse) GetClaimedTaskKeys() []string {
+ if x != nil {
+ return x.ClaimedTaskKeys
+ }
+ return nil
+}
+
+type OnboardingStage struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Stage int32 `protobuf:"varint,1,opt,name=stage,proto3" json:"stage,omitempty"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+ RequiredTaskKeys []string `protobuf:"bytes,3,rep,name=required_task_keys,json=requiredTaskKeys,proto3" json:"required_task_keys,omitempty"`
+ CrystalReward int64 `protobuf:"varint,4,opt,name=crystal_reward,json=crystalReward,proto3" json:"crystal_reward,omitempty"`
+ ExpReward int64 `protobuf:"varint,5,opt,name=exp_reward,json=expReward,proto3" json:"exp_reward,omitempty"`
+ Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` // pending/completed/in_progress
+ IsCurrent bool `protobuf:"varint,7,opt,name=is_current,json=isCurrent,proto3" json:"is_current,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *OnboardingStage) Reset() {
+ *x = OnboardingStage{}
+ mi := &file_task_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *OnboardingStage) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnboardingStage) ProtoMessage() {}
+
+func (x *OnboardingStage) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[9]
+ 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 OnboardingStage.ProtoReflect.Descriptor instead.
+func (*OnboardingStage) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *OnboardingStage) GetStage() int32 {
+ if x != nil {
+ return x.Stage
+ }
+ return 0
+}
+
+func (x *OnboardingStage) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *OnboardingStage) GetRequiredTaskKeys() []string {
+ if x != nil {
+ return x.RequiredTaskKeys
+ }
+ return nil
+}
+
+func (x *OnboardingStage) GetCrystalReward() int64 {
+ if x != nil {
+ return x.CrystalReward
+ }
+ return 0
+}
+
+func (x *OnboardingStage) GetExpReward() int64 {
+ if x != nil {
+ return x.ExpReward
+ }
+ return 0
+}
+
+func (x *OnboardingStage) GetStatus() string {
+ if x != nil {
+ return x.Status
+ }
+ return ""
+}
+
+func (x *OnboardingStage) GetIsCurrent() bool {
+ if x != nil {
+ return x.IsCurrent
+ }
+ return false
+}
+
+type CompleteGuideRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ TaskKey string `protobuf:"bytes,1,opt,name=task_key,json=taskKey,proto3" json:"task_key,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *CompleteGuideRequest) Reset() {
+ *x = CompleteGuideRequest{}
+ mi := &file_task_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *CompleteGuideRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CompleteGuideRequest) ProtoMessage() {}
+
+func (x *CompleteGuideRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[10]
+ 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 CompleteGuideRequest.ProtoReflect.Descriptor instead.
+func (*CompleteGuideRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *CompleteGuideRequest) GetTaskKey() string {
+ if x != nil {
+ return x.TaskKey
+ }
+ return ""
+}
+
+type CompleteGuideResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+ CurrentStage int32 `protobuf:"varint,3,opt,name=current_stage,json=currentStage,proto3" json:"current_stage,omitempty"`
+ Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // pending/in_progress/completed
+ Stages []*OnboardingStage `protobuf:"bytes,5,rep,name=stages,proto3" json:"stages,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *CompleteGuideResponse) Reset() {
+ *x = CompleteGuideResponse{}
+ mi := &file_task_proto_msgTypes[11]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *CompleteGuideResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CompleteGuideResponse) ProtoMessage() {}
+
+func (x *CompleteGuideResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[11]
+ 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 CompleteGuideResponse.ProtoReflect.Descriptor instead.
+func (*CompleteGuideResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *CompleteGuideResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *CompleteGuideResponse) GetUserId() int64 {
+ if x != nil {
+ return x.UserId
+ }
+ return 0
+}
+
+func (x *CompleteGuideResponse) GetCurrentStage() int32 {
+ if x != nil {
+ return x.CurrentStage
+ }
+ return 0
+}
+
+func (x *CompleteGuideResponse) GetStatus() string {
+ if x != nil {
+ return x.Status
+ }
+ return ""
+}
+
+func (x *CompleteGuideResponse) GetStages() []*OnboardingStage {
+ if x != nil {
+ return x.Stages
+ }
+ return nil
+}
+
+type GetOnboardingStatusRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *GetOnboardingStatusRequest) Reset() {
+ *x = GetOnboardingStatusRequest{}
+ mi := &file_task_proto_msgTypes[12]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnboardingStatusRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnboardingStatusRequest) ProtoMessage() {}
+
+func (x *GetOnboardingStatusRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[12]
+ 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 GetOnboardingStatusRequest.ProtoReflect.Descriptor instead.
+func (*GetOnboardingStatusRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{12}
+}
+
+type GetOnboardingStatusResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+ CurrentStage int32 `protobuf:"varint,3,opt,name=current_stage,json=currentStage,proto3" json:"current_stage,omitempty"`
+ Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"`
+ Stages []*OnboardingStage `protobuf:"bytes,5,rep,name=stages,proto3" json:"stages,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *GetOnboardingStatusResponse) Reset() {
+ *x = GetOnboardingStatusResponse{}
+ mi := &file_task_proto_msgTypes[13]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *GetOnboardingStatusResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetOnboardingStatusResponse) ProtoMessage() {}
+
+func (x *GetOnboardingStatusResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[13]
+ 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 GetOnboardingStatusResponse.ProtoReflect.Descriptor instead.
+func (*GetOnboardingStatusResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *GetOnboardingStatusResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *GetOnboardingStatusResponse) GetUserId() int64 {
+ if x != nil {
+ return x.UserId
+ }
+ return 0
+}
+
+func (x *GetOnboardingStatusResponse) GetCurrentStage() int32 {
+ if x != nil {
+ return x.CurrentStage
+ }
+ return 0
+}
+
+func (x *GetOnboardingStatusResponse) GetStatus() string {
+ if x != nil {
+ return x.Status
+ }
+ return ""
+}
+
+func (x *GetOnboardingStatusResponse) GetStages() []*OnboardingStage {
+ if x != nil {
+ return x.Stages
+ }
+ return nil
+}
+
+type AdvanceStageRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ TargetStage int32 `protobuf:"varint,1,opt,name=target_stage,json=targetStage,proto3" json:"target_stage,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *AdvanceStageRequest) Reset() {
+ *x = AdvanceStageRequest{}
+ mi := &file_task_proto_msgTypes[14]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AdvanceStageRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AdvanceStageRequest) ProtoMessage() {}
+
+func (x *AdvanceStageRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[14]
+ 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 AdvanceStageRequest.ProtoReflect.Descriptor instead.
+func (*AdvanceStageRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *AdvanceStageRequest) GetTargetStage() int32 {
+ if x != nil {
+ return x.TargetStage
+ }
+ return 0
+}
+
+type AdvanceStageResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ CurrentStage int32 `protobuf:"varint,2,opt,name=current_stage,json=currentStage,proto3" json:"current_stage,omitempty"`
+ Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+ Stages []*OnboardingStage `protobuf:"bytes,4,rep,name=stages,proto3" json:"stages,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *AdvanceStageResponse) Reset() {
+ *x = AdvanceStageResponse{}
+ mi := &file_task_proto_msgTypes[15]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AdvanceStageResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AdvanceStageResponse) ProtoMessage() {}
+
+func (x *AdvanceStageResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[15]
+ 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 AdvanceStageResponse.ProtoReflect.Descriptor instead.
+func (*AdvanceStageResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *AdvanceStageResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *AdvanceStageResponse) GetCurrentStage() int32 {
+ if x != nil {
+ return x.CurrentStage
+ }
+ return 0
+}
+
+func (x *AdvanceStageResponse) GetStatus() string {
+ if x != nil {
+ return x.Status
+ }
+ return ""
+}
+
+func (x *AdvanceStageResponse) GetStages() []*OnboardingStage {
+ if x != nil {
+ return x.Stages
+ }
+ return nil
+}
+
+type ClaimOnboardingRewardRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Stage int32 `protobuf:"varint,1,opt,name=stage,proto3" json:"stage,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimOnboardingRewardRequest) Reset() {
+ *x = ClaimOnboardingRewardRequest{}
+ mi := &file_task_proto_msgTypes[16]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimOnboardingRewardRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimOnboardingRewardRequest) ProtoMessage() {}
+
+func (x *ClaimOnboardingRewardRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_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 ClaimOnboardingRewardRequest.ProtoReflect.Descriptor instead.
+func (*ClaimOnboardingRewardRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ClaimOnboardingRewardRequest) GetStage() int32 {
+ if x != nil {
+ return x.Stage
+ }
+ return 0
+}
+
+type ClaimOnboardingRewardResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimOnboardingRewardResponse) Reset() {
+ *x = ClaimOnboardingRewardResponse{}
+ mi := &file_task_proto_msgTypes[17]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimOnboardingRewardResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimOnboardingRewardResponse) ProtoMessage() {}
+
+func (x *ClaimOnboardingRewardResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_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 ClaimOnboardingRewardResponse.ProtoReflect.Descriptor instead.
+func (*ClaimOnboardingRewardResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *ClaimOnboardingRewardResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *ClaimOnboardingRewardResponse) GetSuccess() bool {
+ if x != nil {
+ return x.Success
+ }
+ return false
+}
+
+type ExhibitionRevenueItem struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ ExhibitionId int64 `protobuf:"varint,3,opt,name=exhibition_id,json=exhibitionId,proto3" json:"exhibition_id,omitempty"`
+ AssetId int64 `protobuf:"varint,4,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
+ SlotId int64 `protobuf:"varint,5,opt,name=slot_id,json=slotId,proto3" json:"slot_id,omitempty"`
+ SlotType string `protobuf:"bytes,6,opt,name=slot_type,json=slotType,proto3" json:"slot_type,omitempty"` // own/friend
+ CrystalAmount int64 `protobuf:"varint,7,opt,name=crystal_amount,json=crystalAmount,proto3" json:"crystal_amount,omitempty"`
+ CycleStartTime int64 `protobuf:"varint,8,opt,name=cycle_start_time,json=cycleStartTime,proto3" json:"cycle_start_time,omitempty"`
+ CycleEndTime int64 `protobuf:"varint,9,opt,name=cycle_end_time,json=cycleEndTime,proto3" json:"cycle_end_time,omitempty"`
+ Status string `protobuf:"bytes,10,opt,name=status,proto3" json:"status,omitempty"` // claimable/claimed/failed
+ CanClaim bool `protobuf:"varint,11,opt,name=can_claim,json=canClaim,proto3" json:"can_claim,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ExhibitionRevenueItem) Reset() {
+ *x = ExhibitionRevenueItem{}
+ mi := &file_task_proto_msgTypes[18]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ExhibitionRevenueItem) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExhibitionRevenueItem) ProtoMessage() {}
+
+func (x *ExhibitionRevenueItem) ProtoReflect() protoreflect.Message {
+ mi := &file_task_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 ExhibitionRevenueItem.ProtoReflect.Descriptor instead.
+func (*ExhibitionRevenueItem) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *ExhibitionRevenueItem) GetId() int64 {
+ if x != nil {
+ return x.Id
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetExhibitionId() int64 {
+ if x != nil {
+ return x.ExhibitionId
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetAssetId() int64 {
+ if x != nil {
+ return x.AssetId
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetSlotId() int64 {
+ if x != nil {
+ return x.SlotId
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetSlotType() string {
+ if x != nil {
+ return x.SlotType
+ }
+ return ""
+}
+
+func (x *ExhibitionRevenueItem) GetCrystalAmount() int64 {
+ if x != nil {
+ return x.CrystalAmount
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetCycleStartTime() int64 {
+ if x != nil {
+ return x.CycleStartTime
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetCycleEndTime() int64 {
+ if x != nil {
+ return x.CycleEndTime
+ }
+ return 0
+}
+
+func (x *ExhibitionRevenueItem) GetStatus() string {
+ if x != nil {
+ return x.Status
+ }
+ return ""
+}
+
+func (x *ExhibitionRevenueItem) GetCanClaim() bool {
+ if x != nil {
+ return x.CanClaim
+ }
+ return false
+}
+
+type GetExhibitionRevenueRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ StarId int64 `protobuf:"varint,1,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // 可选筛选
+ Page int32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"`
+ PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *GetExhibitionRevenueRequest) Reset() {
+ *x = GetExhibitionRevenueRequest{}
+ mi := &file_task_proto_msgTypes[19]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *GetExhibitionRevenueRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExhibitionRevenueRequest) ProtoMessage() {}
+
+func (x *GetExhibitionRevenueRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[19]
+ 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 GetExhibitionRevenueRequest.ProtoReflect.Descriptor instead.
+func (*GetExhibitionRevenueRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *GetExhibitionRevenueRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+func (x *GetExhibitionRevenueRequest) GetStatus() string {
+ if x != nil {
+ return x.Status
+ }
+ return ""
+}
+
+func (x *GetExhibitionRevenueRequest) GetPage() int32 {
+ if x != nil {
+ return x.Page
+ }
+ return 0
+}
+
+func (x *GetExhibitionRevenueRequest) GetPageSize() int32 {
+ if x != nil {
+ return x.PageSize
+ }
+ return 0
+}
+
+type GetExhibitionRevenueResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ Items []*ExhibitionRevenueItem `protobuf:"bytes,2,rep,name=items,proto3" json:"items,omitempty"`
+ Total int64 `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"`
+ Page int32 `protobuf:"varint,4,opt,name=page,proto3" json:"page,omitempty"`
+ PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *GetExhibitionRevenueResponse) Reset() {
+ *x = GetExhibitionRevenueResponse{}
+ mi := &file_task_proto_msgTypes[20]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *GetExhibitionRevenueResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetExhibitionRevenueResponse) ProtoMessage() {}
+
+func (x *GetExhibitionRevenueResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[20]
+ 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 GetExhibitionRevenueResponse.ProtoReflect.Descriptor instead.
+func (*GetExhibitionRevenueResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *GetExhibitionRevenueResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *GetExhibitionRevenueResponse) GetItems() []*ExhibitionRevenueItem {
+ if x != nil {
+ return x.Items
+ }
+ return nil
+}
+
+func (x *GetExhibitionRevenueResponse) GetTotal() int64 {
+ if x != nil {
+ return x.Total
+ }
+ return 0
+}
+
+func (x *GetExhibitionRevenueResponse) GetPage() int32 {
+ if x != nil {
+ return x.Page
+ }
+ return 0
+}
+
+func (x *GetExhibitionRevenueResponse) GetPageSize() int32 {
+ if x != nil {
+ return x.PageSize
+ }
+ return 0
+}
+
+type ClaimExhibitionRevenueRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ RevenueId int64 `protobuf:"varint,1,opt,name=revenue_id,json=revenueId,proto3" json:"revenue_id,omitempty"`
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimExhibitionRevenueRequest) Reset() {
+ *x = ClaimExhibitionRevenueRequest{}
+ mi := &file_task_proto_msgTypes[21]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimExhibitionRevenueRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimExhibitionRevenueRequest) ProtoMessage() {}
+
+func (x *ClaimExhibitionRevenueRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[21]
+ 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 ClaimExhibitionRevenueRequest.ProtoReflect.Descriptor instead.
+func (*ClaimExhibitionRevenueRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *ClaimExhibitionRevenueRequest) GetRevenueId() int64 {
+ if x != nil {
+ return x.RevenueId
+ }
+ return 0
+}
+
+func (x *ClaimExhibitionRevenueRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+type ClaimExhibitionRevenueResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimExhibitionRevenueResponse) Reset() {
+ *x = ClaimExhibitionRevenueResponse{}
+ mi := &file_task_proto_msgTypes[22]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimExhibitionRevenueResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimExhibitionRevenueResponse) ProtoMessage() {}
+
+func (x *ClaimExhibitionRevenueResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[22]
+ 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 ClaimExhibitionRevenueResponse.ProtoReflect.Descriptor instead.
+func (*ClaimExhibitionRevenueResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *ClaimExhibitionRevenueResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *ClaimExhibitionRevenueResponse) GetSuccess() bool {
+ if x != nil {
+ return x.Success
+ }
+ return false
+}
+
+type ClaimAllExhibitionRevenueRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ StarId int64 `protobuf:"varint,1,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimAllExhibitionRevenueRequest) Reset() {
+ *x = ClaimAllExhibitionRevenueRequest{}
+ mi := &file_task_proto_msgTypes[23]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimAllExhibitionRevenueRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimAllExhibitionRevenueRequest) ProtoMessage() {}
+
+func (x *ClaimAllExhibitionRevenueRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[23]
+ 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 ClaimAllExhibitionRevenueRequest.ProtoReflect.Descriptor instead.
+func (*ClaimAllExhibitionRevenueRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *ClaimAllExhibitionRevenueRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+type ClaimAllExhibitionRevenueResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ ClaimedCount int32 `protobuf:"varint,2,opt,name=claimed_count,json=claimedCount,proto3" json:"claimed_count,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *ClaimAllExhibitionRevenueResponse) Reset() {
+ *x = ClaimAllExhibitionRevenueResponse{}
+ mi := &file_task_proto_msgTypes[24]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *ClaimAllExhibitionRevenueResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClaimAllExhibitionRevenueResponse) ProtoMessage() {}
+
+func (x *ClaimAllExhibitionRevenueResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[24]
+ 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 ClaimAllExhibitionRevenueResponse.ProtoReflect.Descriptor instead.
+func (*ClaimAllExhibitionRevenueResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *ClaimAllExhibitionRevenueResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *ClaimAllExhibitionRevenueResponse) GetClaimedCount() int32 {
+ if x != nil {
+ return x.ClaimedCount
+ }
+ return 0
+}
+
+type InitUserTasksRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *InitUserTasksRequest) Reset() {
+ *x = InitUserTasksRequest{}
+ mi := &file_task_proto_msgTypes[25]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *InitUserTasksRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InitUserTasksRequest) ProtoMessage() {}
+
+func (x *InitUserTasksRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[25]
+ 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 InitUserTasksRequest.ProtoReflect.Descriptor instead.
+func (*InitUserTasksRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *InitUserTasksRequest) GetUserId() int64 {
+ if x != nil {
+ return x.UserId
+ }
+ return 0
+}
+
+func (x *InitUserTasksRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+type InitUserTasksResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *InitUserTasksResponse) Reset() {
+ *x = InitUserTasksResponse{}
+ mi := &file_task_proto_msgTypes[26]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *InitUserTasksResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InitUserTasksResponse) ProtoMessage() {}
+
+func (x *InitUserTasksResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[26]
+ 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 InitUserTasksResponse.ProtoReflect.Descriptor instead.
+func (*InitUserTasksResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *InitUserTasksResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *InitUserTasksResponse) GetSuccess() bool {
+ if x != nil {
+ return x.Success
+ }
+ return false
+}
+
+type OnExhibitionCompletedRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ ExhibitionId int64 `protobuf:"varint,1,opt,name=exhibition_id,json=exhibitionId,proto3" json:"exhibition_id,omitempty"`
+ AssetId int64 `protobuf:"varint,2,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
+ SlotId int64 `protobuf:"varint,3,opt,name=slot_id,json=slotId,proto3" json:"slot_id,omitempty"`
+ OccupierUid int64 `protobuf:"varint,4,opt,name=occupier_uid,json=occupierUid,proto3" json:"occupier_uid,omitempty"`
+ OccupierStarId int64 `protobuf:"varint,5,opt,name=occupier_star_id,json=occupierStarId,proto3" json:"occupier_star_id,omitempty"`
+ SlotOwnerUid int64 `protobuf:"varint,6,opt,name=slot_owner_uid,json=slotOwnerUid,proto3" json:"slot_owner_uid,omitempty"`
+ CrystalAmount int64 `protobuf:"varint,7,opt,name=crystal_amount,json=crystalAmount,proto3" json:"crystal_amount,omitempty"`
+ StartTime int64 `protobuf:"varint,8,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
+ ExpireAt int64 `protobuf:"varint,9,opt,name=expire_at,json=expireAt,proto3" json:"expire_at,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *OnExhibitionCompletedRequest) Reset() {
+ *x = OnExhibitionCompletedRequest{}
+ mi := &file_task_proto_msgTypes[27]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *OnExhibitionCompletedRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnExhibitionCompletedRequest) ProtoMessage() {}
+
+func (x *OnExhibitionCompletedRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[27]
+ 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 OnExhibitionCompletedRequest.ProtoReflect.Descriptor instead.
+func (*OnExhibitionCompletedRequest) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *OnExhibitionCompletedRequest) GetExhibitionId() int64 {
+ if x != nil {
+ return x.ExhibitionId
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetAssetId() int64 {
+ if x != nil {
+ return x.AssetId
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetSlotId() int64 {
+ if x != nil {
+ return x.SlotId
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetOccupierUid() int64 {
+ if x != nil {
+ return x.OccupierUid
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetOccupierStarId() int64 {
+ if x != nil {
+ return x.OccupierStarId
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetSlotOwnerUid() int64 {
+ if x != nil {
+ return x.SlotOwnerUid
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetCrystalAmount() int64 {
+ if x != nil {
+ return x.CrystalAmount
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetStartTime() int64 {
+ if x != nil {
+ return x.StartTime
+ }
+ return 0
+}
+
+func (x *OnExhibitionCompletedRequest) GetExpireAt() int64 {
+ if x != nil {
+ return x.ExpireAt
+ }
+ return 0
+}
+
+type OnExhibitionCompletedResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ RevenueRecordId int64 `protobuf:"varint,2,opt,name=revenue_record_id,json=revenueRecordId,proto3" json:"revenue_record_id,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *OnExhibitionCompletedResponse) Reset() {
+ *x = OnExhibitionCompletedResponse{}
+ mi := &file_task_proto_msgTypes[28]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *OnExhibitionCompletedResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OnExhibitionCompletedResponse) ProtoMessage() {}
+
+func (x *OnExhibitionCompletedResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_task_proto_msgTypes[28]
+ 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 OnExhibitionCompletedResponse.ProtoReflect.Descriptor instead.
+func (*OnExhibitionCompletedResponse) Descriptor() ([]byte, []int) {
+ return file_task_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *OnExhibitionCompletedResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *OnExhibitionCompletedResponse) GetRevenueRecordId() int64 {
+ if x != nil {
+ return x.RevenueRecordId
+ }
+ return 0
+}
+
+var File_task_proto protoreflect.FileDescriptor
+
+const file_task_proto_rawDesc = "" +
+ "\n" +
+ "\n" +
+ "task.proto\x12\ftopfans.task\x1a\x12proto/common.proto\x1a\x1cgoogle/api/annotations.proto\"\xf4\x01\n" +
+ "\rDailyTaskItem\x12\x19\n" +
+ "\btask_key\x18\x01 \x01(\tR\ataskKey\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\x12\x12\n" +
+ "\x04name\x18\x03 \x01(\tR\x04name\x12 \n" +
+ "\vdescription\x18\x04 \x01(\tR\vdescription\x12%\n" +
+ "\x0ecrystal_reward\x18\x05 \x01(\x03R\rcrystalReward\x12\x1d\n" +
+ "\n" +
+ "exp_reward\x18\x06 \x01(\x03R\texpReward\x12\x16\n" +
+ "\x06status\x18\a \x01(\tR\x06status\x12\x1b\n" +
+ "\tcan_claim\x18\b \x01(\bR\bcanClaim\"/\n" +
+ "\x14GetDailyTasksRequest\x12\x17\n" +
+ "\astar_id\x18\x01 \x01(\x03R\x06starId\"\x95\x01\n" +
+ "\x15GetDailyTasksResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\x121\n" +
+ "\x05tasks\x18\x03 \x03(\v2\x1b.topfans.task.DailyTaskItemR\x05tasks\"L\n" +
+ "\x12ReportEventRequest\x12\x1d\n" +
+ "\n" +
+ "event_type\x18\x01 \x01(\tR\teventType\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\"\xbd\x01\n" +
+ "\x13ReportEventResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x18\n" +
+ "\asuccess\x18\x02 \x01(\bR\asuccess\x12\x19\n" +
+ "\btask_key\x18\x03 \x01(\tR\ataskKey\x12%\n" +
+ "\x0etask_completed\x18\x04 \x01(\bR\rtaskCompleted\x12\x18\n" +
+ "\amessage\x18\x05 \x01(\tR\amessage\"K\n" +
+ "\x15ClaimDailyTaskRequest\x12\x19\n" +
+ "\btask_key\x18\x01 \x01(\tR\ataskKey\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\"\xad\x01\n" +
+ "\x16ClaimDailyTaskResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x18\n" +
+ "\asuccess\x18\x02 \x01(\bR\asuccess\x12'\n" +
+ "\x0fcrystal_balance\x18\x03 \x01(\x03R\x0ecrystalBalance\x12\x1e\n" +
+ "\n" +
+ "experience\x18\x04 \x01(\x03R\n" +
+ "experience\"4\n" +
+ "\x19ClaimAllDailyTasksRequest\x12\x17\n" +
+ "\astar_id\x18\x01 \x01(\x03R\x06starId\"\xe8\x01\n" +
+ "\x1aClaimAllDailyTasksResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12#\n" +
+ "\rclaimed_count\x18\x02 \x01(\x05R\fclaimedCount\x12'\n" +
+ "\x0fcrystal_balance\x18\x03 \x01(\x03R\x0ecrystalBalance\x12\x1e\n" +
+ "\n" +
+ "experience\x18\x04 \x01(\x03R\n" +
+ "experience\x12*\n" +
+ "\x11claimed_task_keys\x18\x05 \x03(\tR\x0fclaimedTaskKeys\"\xe6\x01\n" +
+ "\x0fOnboardingStage\x12\x14\n" +
+ "\x05stage\x18\x01 \x01(\x05R\x05stage\x12\x12\n" +
+ "\x04name\x18\x02 \x01(\tR\x04name\x12,\n" +
+ "\x12required_task_keys\x18\x03 \x03(\tR\x10requiredTaskKeys\x12%\n" +
+ "\x0ecrystal_reward\x18\x04 \x01(\x03R\rcrystalReward\x12\x1d\n" +
+ "\n" +
+ "exp_reward\x18\x05 \x01(\x03R\texpReward\x12\x16\n" +
+ "\x06status\x18\x06 \x01(\tR\x06status\x12\x1d\n" +
+ "\n" +
+ "is_current\x18\a \x01(\bR\tisCurrent\"1\n" +
+ "\x14CompleteGuideRequest\x12\x19\n" +
+ "\btask_key\x18\x01 \x01(\tR\ataskKey\"\xd6\x01\n" +
+ "\x15CompleteGuideResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x17\n" +
+ "\auser_id\x18\x02 \x01(\x03R\x06userId\x12#\n" +
+ "\rcurrent_stage\x18\x03 \x01(\x05R\fcurrentStage\x12\x16\n" +
+ "\x06status\x18\x04 \x01(\tR\x06status\x125\n" +
+ "\x06stages\x18\x05 \x03(\v2\x1d.topfans.task.OnboardingStageR\x06stages\"\x1c\n" +
+ "\x1aGetOnboardingStatusRequest\"\xdc\x01\n" +
+ "\x1bGetOnboardingStatusResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x17\n" +
+ "\auser_id\x18\x02 \x01(\x03R\x06userId\x12#\n" +
+ "\rcurrent_stage\x18\x03 \x01(\x05R\fcurrentStage\x12\x16\n" +
+ "\x06status\x18\x04 \x01(\tR\x06status\x125\n" +
+ "\x06stages\x18\x05 \x03(\v2\x1d.topfans.task.OnboardingStageR\x06stages\"8\n" +
+ "\x13AdvanceStageRequest\x12!\n" +
+ "\ftarget_stage\x18\x01 \x01(\x05R\vtargetStage\"\xbc\x01\n" +
+ "\x14AdvanceStageResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12#\n" +
+ "\rcurrent_stage\x18\x02 \x01(\x05R\fcurrentStage\x12\x16\n" +
+ "\x06status\x18\x03 \x01(\tR\x06status\x125\n" +
+ "\x06stages\x18\x04 \x03(\v2\x1d.topfans.task.OnboardingStageR\x06stages\"4\n" +
+ "\x1cClaimOnboardingRewardRequest\x12\x14\n" +
+ "\x05stage\x18\x01 \x01(\x05R\x05stage\"k\n" +
+ "\x1dClaimOnboardingRewardResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x18\n" +
+ "\asuccess\x18\x02 \x01(\bR\asuccess\"\xe2\x02\n" +
+ "\x15ExhibitionRevenueItem\x12\x0e\n" +
+ "\x02id\x18\x01 \x01(\x03R\x02id\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\x12#\n" +
+ "\rexhibition_id\x18\x03 \x01(\x03R\fexhibitionId\x12\x19\n" +
+ "\basset_id\x18\x04 \x01(\x03R\aassetId\x12\x17\n" +
+ "\aslot_id\x18\x05 \x01(\x03R\x06slotId\x12\x1b\n" +
+ "\tslot_type\x18\x06 \x01(\tR\bslotType\x12%\n" +
+ "\x0ecrystal_amount\x18\a \x01(\x03R\rcrystalAmount\x12(\n" +
+ "\x10cycle_start_time\x18\b \x01(\x03R\x0ecycleStartTime\x12$\n" +
+ "\x0ecycle_end_time\x18\t \x01(\x03R\fcycleEndTime\x12\x16\n" +
+ "\x06status\x18\n" +
+ " \x01(\tR\x06status\x12\x1b\n" +
+ "\tcan_claim\x18\v \x01(\bR\bcanClaim\"\x7f\n" +
+ "\x1bGetExhibitionRevenueRequest\x12\x17\n" +
+ "\astar_id\x18\x01 \x01(\x03R\x06starId\x12\x16\n" +
+ "\x06status\x18\x02 \x01(\tR\x06status\x12\x12\n" +
+ "\x04page\x18\x03 \x01(\x05R\x04page\x12\x1b\n" +
+ "\tpage_size\x18\x04 \x01(\x05R\bpageSize\"\xd2\x01\n" +
+ "\x1cGetExhibitionRevenueResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x129\n" +
+ "\x05items\x18\x02 \x03(\v2#.topfans.task.ExhibitionRevenueItemR\x05items\x12\x14\n" +
+ "\x05total\x18\x03 \x01(\x03R\x05total\x12\x12\n" +
+ "\x04page\x18\x04 \x01(\x05R\x04page\x12\x1b\n" +
+ "\tpage_size\x18\x05 \x01(\x05R\bpageSize\"W\n" +
+ "\x1dClaimExhibitionRevenueRequest\x12\x1d\n" +
+ "\n" +
+ "revenue_id\x18\x01 \x01(\x03R\trevenueId\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\"l\n" +
+ "\x1eClaimExhibitionRevenueResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x18\n" +
+ "\asuccess\x18\x02 \x01(\bR\asuccess\";\n" +
+ " ClaimAllExhibitionRevenueRequest\x12\x17\n" +
+ "\astar_id\x18\x01 \x01(\x03R\x06starId\"z\n" +
+ "!ClaimAllExhibitionRevenueResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12#\n" +
+ "\rclaimed_count\x18\x02 \x01(\x05R\fclaimedCount\"H\n" +
+ "\x14InitUserTasksRequest\x12\x17\n" +
+ "\auser_id\x18\x01 \x01(\x03R\x06userId\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\"c\n" +
+ "\x15InitUserTasksResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x18\n" +
+ "\asuccess\x18\x02 \x01(\bR\asuccess\"\xcd\x02\n" +
+ "\x1cOnExhibitionCompletedRequest\x12#\n" +
+ "\rexhibition_id\x18\x01 \x01(\x03R\fexhibitionId\x12\x19\n" +
+ "\basset_id\x18\x02 \x01(\x03R\aassetId\x12\x17\n" +
+ "\aslot_id\x18\x03 \x01(\x03R\x06slotId\x12!\n" +
+ "\foccupier_uid\x18\x04 \x01(\x03R\voccupierUid\x12(\n" +
+ "\x10occupier_star_id\x18\x05 \x01(\x03R\x0eoccupierStarId\x12$\n" +
+ "\x0eslot_owner_uid\x18\x06 \x01(\x03R\fslotOwnerUid\x12%\n" +
+ "\x0ecrystal_amount\x18\a \x01(\x03R\rcrystalAmount\x12\x1d\n" +
+ "\n" +
+ "start_time\x18\b \x01(\x03R\tstartTime\x12\x1b\n" +
+ "\texpire_at\x18\t \x01(\x03R\bexpireAt\"}\n" +
+ "\x1dOnExhibitionCompletedResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12*\n" +
+ "\x11revenue_record_id\x18\x02 \x01(\x03R\x0frevenueRecordId2\xbd\f\n" +
+ "\x11TaskMobileService\x12r\n" +
+ "\rGetDailyTasks\x12\".topfans.task.GetDailyTasksRequest\x1a#.topfans.task.GetDailyTasksResponse\"\x18\x82\xd3\xe4\x93\x02\x12\x12\x10/api/tasks/daily\x12v\n" +
+ "\vReportEvent\x12 .topfans.task.ReportEventRequest\x1a!.topfans.task.ReportEventResponse\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/api/tasks/report-event\x12~\n" +
+ "\x0eClaimDailyTask\x12#.topfans.task.ClaimDailyTaskRequest\x1a$.topfans.task.ClaimDailyTaskResponse\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/api/tasks/daily/claim\x12\x8e\x01\n" +
+ "\x12ClaimAllDailyTasks\x12'.topfans.task.ClaimAllDailyTasksRequest\x1a(.topfans.task.ClaimAllDailyTasksResponse\"%\x82\xd3\xe4\x93\x02\x1f:\x01*\"\x1a/api/tasks/daily/claim-all\x12~\n" +
+ "\rCompleteGuide\x12\".topfans.task.CompleteGuideRequest\x1a#.topfans.task.CompleteGuideResponse\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\"\x19/api/tasks/guide/complete\x12\x90\x01\n" +
+ "\x13GetOnboardingStatus\x12(.topfans.task.GetOnboardingStatusRequest\x1a).topfans.task.GetOnboardingStatusResponse\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/api/tasks/onboarding/status\x12\x85\x01\n" +
+ "\fAdvanceStage\x12!.topfans.task.AdvanceStageRequest\x1a\".topfans.task.AdvanceStageResponse\".\x82\xd3\xe4\x93\x02(:\x01*\"#/api/tasks/onboarding/advance-stage\x12\x9f\x01\n" +
+ "\x15ClaimOnboardingReward\x12*.topfans.task.ClaimOnboardingRewardRequest\x1a+.topfans.task.ClaimOnboardingRewardResponse\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/api/tasks/onboarding/claim-reward\x12\x94\x01\n" +
+ "\x14GetExhibitionRevenue\x12).topfans.task.GetExhibitionRevenueRequest\x1a*.topfans.task.GetExhibitionRevenueResponse\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/api/tasks/exhibition-revenue\x12\xa3\x01\n" +
+ "\x16ClaimExhibitionRevenue\x12+.topfans.task.ClaimExhibitionRevenueRequest\x1a,.topfans.task.ClaimExhibitionRevenueResponse\".\x82\xd3\xe4\x93\x02(:\x01*\"#/api/tasks/exhibition-revenue/claim\x12\xb0\x01\n" +
+ "\x19ClaimAllExhibitionRevenue\x12..topfans.task.ClaimAllExhibitionRevenueRequest\x1a/.topfans.task.ClaimAllExhibitionRevenueResponse\"2\x82\xd3\xe4\x93\x02,:\x01*\"'/api/tasks/exhibition-revenue/claim-all2\xe1\x01\n" +
+ "\x13TaskInternalService\x12X\n" +
+ "\rInitUserTasks\x12\".topfans.task.InitUserTasksRequest\x1a#.topfans.task.InitUserTasksResponse\x12p\n" +
+ "\x15OnExhibitionCompleted\x12*.topfans.task.OnExhibitionCompletedRequest\x1a+.topfans.task.OnExhibitionCompletedResponseB0Z.github.com/topfans/backend/pkg/proto/task;taskb\x06proto3"
+
+var (
+ file_task_proto_rawDescOnce sync.Once
+ file_task_proto_rawDescData []byte
+)
+
+func file_task_proto_rawDescGZIP() []byte {
+ file_task_proto_rawDescOnce.Do(func() {
+ file_task_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_task_proto_rawDesc), len(file_task_proto_rawDesc)))
+ })
+ return file_task_proto_rawDescData
+}
+
+var file_task_proto_msgTypes = make([]protoimpl.MessageInfo, 29)
+var file_task_proto_goTypes = []any{
+ (*DailyTaskItem)(nil), // 0: topfans.task.DailyTaskItem
+ (*GetDailyTasksRequest)(nil), // 1: topfans.task.GetDailyTasksRequest
+ (*GetDailyTasksResponse)(nil), // 2: topfans.task.GetDailyTasksResponse
+ (*ReportEventRequest)(nil), // 3: topfans.task.ReportEventRequest
+ (*ReportEventResponse)(nil), // 4: topfans.task.ReportEventResponse
+ (*ClaimDailyTaskRequest)(nil), // 5: topfans.task.ClaimDailyTaskRequest
+ (*ClaimDailyTaskResponse)(nil), // 6: topfans.task.ClaimDailyTaskResponse
+ (*ClaimAllDailyTasksRequest)(nil), // 7: topfans.task.ClaimAllDailyTasksRequest
+ (*ClaimAllDailyTasksResponse)(nil), // 8: topfans.task.ClaimAllDailyTasksResponse
+ (*OnboardingStage)(nil), // 9: topfans.task.OnboardingStage
+ (*CompleteGuideRequest)(nil), // 10: topfans.task.CompleteGuideRequest
+ (*CompleteGuideResponse)(nil), // 11: topfans.task.CompleteGuideResponse
+ (*GetOnboardingStatusRequest)(nil), // 12: topfans.task.GetOnboardingStatusRequest
+ (*GetOnboardingStatusResponse)(nil), // 13: topfans.task.GetOnboardingStatusResponse
+ (*AdvanceStageRequest)(nil), // 14: topfans.task.AdvanceStageRequest
+ (*AdvanceStageResponse)(nil), // 15: topfans.task.AdvanceStageResponse
+ (*ClaimOnboardingRewardRequest)(nil), // 16: topfans.task.ClaimOnboardingRewardRequest
+ (*ClaimOnboardingRewardResponse)(nil), // 17: topfans.task.ClaimOnboardingRewardResponse
+ (*ExhibitionRevenueItem)(nil), // 18: topfans.task.ExhibitionRevenueItem
+ (*GetExhibitionRevenueRequest)(nil), // 19: topfans.task.GetExhibitionRevenueRequest
+ (*GetExhibitionRevenueResponse)(nil), // 20: topfans.task.GetExhibitionRevenueResponse
+ (*ClaimExhibitionRevenueRequest)(nil), // 21: topfans.task.ClaimExhibitionRevenueRequest
+ (*ClaimExhibitionRevenueResponse)(nil), // 22: topfans.task.ClaimExhibitionRevenueResponse
+ (*ClaimAllExhibitionRevenueRequest)(nil), // 23: topfans.task.ClaimAllExhibitionRevenueRequest
+ (*ClaimAllExhibitionRevenueResponse)(nil), // 24: topfans.task.ClaimAllExhibitionRevenueResponse
+ (*InitUserTasksRequest)(nil), // 25: topfans.task.InitUserTasksRequest
+ (*InitUserTasksResponse)(nil), // 26: topfans.task.InitUserTasksResponse
+ (*OnExhibitionCompletedRequest)(nil), // 27: topfans.task.OnExhibitionCompletedRequest
+ (*OnExhibitionCompletedResponse)(nil), // 28: topfans.task.OnExhibitionCompletedResponse
+ (*common.BaseResponse)(nil), // 29: topfans.common.BaseResponse
+}
+var file_task_proto_depIdxs = []int32{
+ 29, // 0: topfans.task.GetDailyTasksResponse.base:type_name -> topfans.common.BaseResponse
+ 0, // 1: topfans.task.GetDailyTasksResponse.tasks:type_name -> topfans.task.DailyTaskItem
+ 29, // 2: topfans.task.ReportEventResponse.base:type_name -> topfans.common.BaseResponse
+ 29, // 3: topfans.task.ClaimDailyTaskResponse.base:type_name -> topfans.common.BaseResponse
+ 29, // 4: topfans.task.ClaimAllDailyTasksResponse.base:type_name -> topfans.common.BaseResponse
+ 29, // 5: topfans.task.CompleteGuideResponse.base:type_name -> topfans.common.BaseResponse
+ 9, // 6: topfans.task.CompleteGuideResponse.stages:type_name -> topfans.task.OnboardingStage
+ 29, // 7: topfans.task.GetOnboardingStatusResponse.base:type_name -> topfans.common.BaseResponse
+ 9, // 8: topfans.task.GetOnboardingStatusResponse.stages:type_name -> topfans.task.OnboardingStage
+ 29, // 9: topfans.task.AdvanceStageResponse.base:type_name -> topfans.common.BaseResponse
+ 9, // 10: topfans.task.AdvanceStageResponse.stages:type_name -> topfans.task.OnboardingStage
+ 29, // 11: topfans.task.ClaimOnboardingRewardResponse.base:type_name -> topfans.common.BaseResponse
+ 29, // 12: topfans.task.GetExhibitionRevenueResponse.base:type_name -> topfans.common.BaseResponse
+ 18, // 13: topfans.task.GetExhibitionRevenueResponse.items:type_name -> topfans.task.ExhibitionRevenueItem
+ 29, // 14: topfans.task.ClaimExhibitionRevenueResponse.base:type_name -> topfans.common.BaseResponse
+ 29, // 15: topfans.task.ClaimAllExhibitionRevenueResponse.base:type_name -> topfans.common.BaseResponse
+ 29, // 16: topfans.task.InitUserTasksResponse.base:type_name -> topfans.common.BaseResponse
+ 29, // 17: topfans.task.OnExhibitionCompletedResponse.base:type_name -> topfans.common.BaseResponse
+ 1, // 18: topfans.task.TaskMobileService.GetDailyTasks:input_type -> topfans.task.GetDailyTasksRequest
+ 3, // 19: topfans.task.TaskMobileService.ReportEvent:input_type -> topfans.task.ReportEventRequest
+ 5, // 20: topfans.task.TaskMobileService.ClaimDailyTask:input_type -> topfans.task.ClaimDailyTaskRequest
+ 7, // 21: topfans.task.TaskMobileService.ClaimAllDailyTasks:input_type -> topfans.task.ClaimAllDailyTasksRequest
+ 10, // 22: topfans.task.TaskMobileService.CompleteGuide:input_type -> topfans.task.CompleteGuideRequest
+ 12, // 23: topfans.task.TaskMobileService.GetOnboardingStatus:input_type -> topfans.task.GetOnboardingStatusRequest
+ 14, // 24: topfans.task.TaskMobileService.AdvanceStage:input_type -> topfans.task.AdvanceStageRequest
+ 16, // 25: topfans.task.TaskMobileService.ClaimOnboardingReward:input_type -> topfans.task.ClaimOnboardingRewardRequest
+ 19, // 26: topfans.task.TaskMobileService.GetExhibitionRevenue:input_type -> topfans.task.GetExhibitionRevenueRequest
+ 21, // 27: topfans.task.TaskMobileService.ClaimExhibitionRevenue:input_type -> topfans.task.ClaimExhibitionRevenueRequest
+ 23, // 28: topfans.task.TaskMobileService.ClaimAllExhibitionRevenue:input_type -> topfans.task.ClaimAllExhibitionRevenueRequest
+ 25, // 29: topfans.task.TaskInternalService.InitUserTasks:input_type -> topfans.task.InitUserTasksRequest
+ 27, // 30: topfans.task.TaskInternalService.OnExhibitionCompleted:input_type -> topfans.task.OnExhibitionCompletedRequest
+ 2, // 31: topfans.task.TaskMobileService.GetDailyTasks:output_type -> topfans.task.GetDailyTasksResponse
+ 4, // 32: topfans.task.TaskMobileService.ReportEvent:output_type -> topfans.task.ReportEventResponse
+ 6, // 33: topfans.task.TaskMobileService.ClaimDailyTask:output_type -> topfans.task.ClaimDailyTaskResponse
+ 8, // 34: topfans.task.TaskMobileService.ClaimAllDailyTasks:output_type -> topfans.task.ClaimAllDailyTasksResponse
+ 11, // 35: topfans.task.TaskMobileService.CompleteGuide:output_type -> topfans.task.CompleteGuideResponse
+ 13, // 36: topfans.task.TaskMobileService.GetOnboardingStatus:output_type -> topfans.task.GetOnboardingStatusResponse
+ 15, // 37: topfans.task.TaskMobileService.AdvanceStage:output_type -> topfans.task.AdvanceStageResponse
+ 17, // 38: topfans.task.TaskMobileService.ClaimOnboardingReward:output_type -> topfans.task.ClaimOnboardingRewardResponse
+ 20, // 39: topfans.task.TaskMobileService.GetExhibitionRevenue:output_type -> topfans.task.GetExhibitionRevenueResponse
+ 22, // 40: topfans.task.TaskMobileService.ClaimExhibitionRevenue:output_type -> topfans.task.ClaimExhibitionRevenueResponse
+ 24, // 41: topfans.task.TaskMobileService.ClaimAllExhibitionRevenue:output_type -> topfans.task.ClaimAllExhibitionRevenueResponse
+ 26, // 42: topfans.task.TaskInternalService.InitUserTasks:output_type -> topfans.task.InitUserTasksResponse
+ 28, // 43: topfans.task.TaskInternalService.OnExhibitionCompleted:output_type -> topfans.task.OnExhibitionCompletedResponse
+ 31, // [31:44] is the sub-list for method output_type
+ 18, // [18:31] is the sub-list for method input_type
+ 18, // [18:18] is the sub-list for extension type_name
+ 18, // [18:18] is the sub-list for extension extendee
+ 0, // [0:18] is the sub-list for field type_name
+}
+
+func init() { file_task_proto_init() }
+func file_task_proto_init() {
+ if File_task_proto != nil {
+ return
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: unsafe.Slice(unsafe.StringData(file_task_proto_rawDesc), len(file_task_proto_rawDesc)),
+ NumEnums: 0,
+ NumMessages: 29,
+ NumExtensions: 0,
+ NumServices: 2,
+ },
+ GoTypes: file_task_proto_goTypes,
+ DependencyIndexes: file_task_proto_depIdxs,
+ MessageInfos: file_task_proto_msgTypes,
+ }.Build()
+ File_task_proto = out.File
+ file_task_proto_goTypes = nil
+ file_task_proto_depIdxs = nil
+}
diff --git a/backend/pkg/proto/task/task.triple.go b/backend/pkg/proto/task/task.triple.go
new file mode 100644
index 0000000..a9abd83
--- /dev/null
+++ b/backend/pkg/proto/task/task.triple.go
@@ -0,0 +1,512 @@
+// Code generated by protoc-gen-triple. DO NOT EDIT.
+//
+// Source: task.proto
+package task
+
+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 (
+ // TaskMobileServiceName is the fully-qualified name of the TaskMobileService service.
+ TaskMobileServiceName = "topfans.task.TaskMobileService"
+)
+
+// 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 (
+ // TaskMobileServiceGetDailyTasksProcedure is the fully-qualified name of the TaskMobileService's GetDailyTasks RPC.
+ TaskMobileServiceGetDailyTasksProcedure = "/topfans.task.TaskMobileService/GetDailyTasks"
+ // TaskMobileServiceReportEventProcedure is the fully-qualified name of the TaskMobileService's ReportEvent RPC.
+ TaskMobileServiceReportEventProcedure = "/topfans.task.TaskMobileService/ReportEvent"
+ // TaskMobileServiceClaimDailyTaskProcedure is the fully-qualified name of the TaskMobileService's ClaimDailyTask RPC.
+ TaskMobileServiceClaimDailyTaskProcedure = "/topfans.task.TaskMobileService/ClaimDailyTask"
+ // TaskMobileServiceClaimAllDailyTasksProcedure is the fully-qualified name of the TaskMobileService's ClaimAllDailyTasks RPC.
+ TaskMobileServiceClaimAllDailyTasksProcedure = "/topfans.task.TaskMobileService/ClaimAllDailyTasks"
+ // TaskMobileServiceCompleteGuideProcedure is the fully-qualified name of the TaskMobileService's CompleteGuide RPC.
+ TaskMobileServiceCompleteGuideProcedure = "/topfans.task.TaskMobileService/CompleteGuide"
+ // TaskMobileServiceGetOnboardingStatusProcedure is the fully-qualified name of the TaskMobileService's GetOnboardingStatus RPC.
+ TaskMobileServiceGetOnboardingStatusProcedure = "/topfans.task.TaskMobileService/GetOnboardingStatus"
+ // TaskMobileServiceAdvanceStageProcedure is the fully-qualified name of the TaskMobileService's AdvanceStage RPC.
+ TaskMobileServiceAdvanceStageProcedure = "/topfans.task.TaskMobileService/AdvanceStage"
+ // TaskMobileServiceClaimOnboardingRewardProcedure is the fully-qualified name of the TaskMobileService's ClaimOnboardingReward RPC.
+ TaskMobileServiceClaimOnboardingRewardProcedure = "/topfans.task.TaskMobileService/ClaimOnboardingReward"
+ // TaskMobileServiceGetExhibitionRevenueProcedure is the fully-qualified name of the TaskMobileService's GetExhibitionRevenue RPC.
+ TaskMobileServiceGetExhibitionRevenueProcedure = "/topfans.task.TaskMobileService/GetExhibitionRevenue"
+ // TaskMobileServiceClaimExhibitionRevenueProcedure is the fully-qualified name of the TaskMobileService's ClaimExhibitionRevenue RPC.
+ TaskMobileServiceClaimExhibitionRevenueProcedure = "/topfans.task.TaskMobileService/ClaimExhibitionRevenue"
+ // TaskMobileServiceClaimAllExhibitionRevenueProcedure is the fully-qualified name of the TaskMobileService's ClaimAllExhibitionRevenue RPC.
+ TaskMobileServiceClaimAllExhibitionRevenueProcedure = "/topfans.task.TaskMobileService/ClaimAllExhibitionRevenue"
+)
+const (
+ // TaskInternalServiceName is the fully-qualified name of the TaskInternalService service.
+ TaskInternalServiceName = "topfans.task.TaskInternalService"
+)
+
+// 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 (
+ // TaskInternalServiceInitUserTasksProcedure is the fully-qualified name of the TaskInternalService's InitUserTasks RPC.
+ TaskInternalServiceInitUserTasksProcedure = "/topfans.task.TaskInternalService/InitUserTasks"
+ // TaskInternalServiceOnExhibitionCompletedProcedure is the fully-qualified name of the TaskInternalService's OnExhibitionCompleted RPC.
+ TaskInternalServiceOnExhibitionCompletedProcedure = "/topfans.task.TaskInternalService/OnExhibitionCompleted"
+)
+
+var (
+ _ TaskMobileService = (*TaskMobileServiceImpl)(nil)
+
+ _ TaskInternalService = (*TaskInternalServiceImpl)(nil)
+)
+
+// TaskMobileService is a client for the topfans.task.TaskMobileService service.
+type TaskMobileService interface {
+ GetDailyTasks(ctx context.Context, req *GetDailyTasksRequest, opts ...client.CallOption) (*GetDailyTasksResponse, error)
+ ReportEvent(ctx context.Context, req *ReportEventRequest, opts ...client.CallOption) (*ReportEventResponse, error)
+ ClaimDailyTask(ctx context.Context, req *ClaimDailyTaskRequest, opts ...client.CallOption) (*ClaimDailyTaskResponse, error)
+ ClaimAllDailyTasks(ctx context.Context, req *ClaimAllDailyTasksRequest, opts ...client.CallOption) (*ClaimAllDailyTasksResponse, error)
+ CompleteGuide(ctx context.Context, req *CompleteGuideRequest, opts ...client.CallOption) (*CompleteGuideResponse, error)
+ GetOnboardingStatus(ctx context.Context, req *GetOnboardingStatusRequest, opts ...client.CallOption) (*GetOnboardingStatusResponse, error)
+ AdvanceStage(ctx context.Context, req *AdvanceStageRequest, opts ...client.CallOption) (*AdvanceStageResponse, error)
+ ClaimOnboardingReward(ctx context.Context, req *ClaimOnboardingRewardRequest, opts ...client.CallOption) (*ClaimOnboardingRewardResponse, error)
+ GetExhibitionRevenue(ctx context.Context, req *GetExhibitionRevenueRequest, opts ...client.CallOption) (*GetExhibitionRevenueResponse, error)
+ ClaimExhibitionRevenue(ctx context.Context, req *ClaimExhibitionRevenueRequest, opts ...client.CallOption) (*ClaimExhibitionRevenueResponse, error)
+ ClaimAllExhibitionRevenue(ctx context.Context, req *ClaimAllExhibitionRevenueRequest, opts ...client.CallOption) (*ClaimAllExhibitionRevenueResponse, error)
+}
+
+// TaskInternalService is a client for the topfans.task.TaskInternalService service.
+type TaskInternalService interface {
+ InitUserTasks(ctx context.Context, req *InitUserTasksRequest, opts ...client.CallOption) (*InitUserTasksResponse, error)
+ OnExhibitionCompleted(ctx context.Context, req *OnExhibitionCompletedRequest, opts ...client.CallOption) (*OnExhibitionCompletedResponse, error)
+}
+
+// NewTaskMobileService constructs a client for the task.TaskMobileService service.
+func NewTaskMobileService(cli *client.Client, opts ...client.ReferenceOption) (TaskMobileService, error) {
+ conn, err := cli.DialWithInfo("topfans.task.TaskMobileService", &TaskMobileService_ClientInfo, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return &TaskMobileServiceImpl{
+ conn: conn,
+ }, nil
+}
+
+func SetConsumerTaskMobileService(srv common.RPCService) {
+ dubbo.SetConsumerServiceWithInfo(srv, &TaskMobileService_ClientInfo)
+}
+
+// TaskMobileServiceImpl implements TaskMobileService.
+type TaskMobileServiceImpl struct {
+ conn *client.Connection
+}
+
+func (c *TaskMobileServiceImpl) GetDailyTasks(ctx context.Context, req *GetDailyTasksRequest, opts ...client.CallOption) (*GetDailyTasksResponse, error) {
+ resp := new(GetDailyTasksResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetDailyTasks", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) ReportEvent(ctx context.Context, req *ReportEventRequest, opts ...client.CallOption) (*ReportEventResponse, error) {
+ resp := new(ReportEventResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "ReportEvent", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) ClaimDailyTask(ctx context.Context, req *ClaimDailyTaskRequest, opts ...client.CallOption) (*ClaimDailyTaskResponse, error) {
+ resp := new(ClaimDailyTaskResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "ClaimDailyTask", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) ClaimAllDailyTasks(ctx context.Context, req *ClaimAllDailyTasksRequest, opts ...client.CallOption) (*ClaimAllDailyTasksResponse, error) {
+ resp := new(ClaimAllDailyTasksResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "ClaimAllDailyTasks", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) CompleteGuide(ctx context.Context, req *CompleteGuideRequest, opts ...client.CallOption) (*CompleteGuideResponse, error) {
+ resp := new(CompleteGuideResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "CompleteGuide", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) GetOnboardingStatus(ctx context.Context, req *GetOnboardingStatusRequest, opts ...client.CallOption) (*GetOnboardingStatusResponse, error) {
+ resp := new(GetOnboardingStatusResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetOnboardingStatus", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) AdvanceStage(ctx context.Context, req *AdvanceStageRequest, opts ...client.CallOption) (*AdvanceStageResponse, error) {
+ resp := new(AdvanceStageResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "AdvanceStage", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) ClaimOnboardingReward(ctx context.Context, req *ClaimOnboardingRewardRequest, opts ...client.CallOption) (*ClaimOnboardingRewardResponse, error) {
+ resp := new(ClaimOnboardingRewardResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "ClaimOnboardingReward", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) GetExhibitionRevenue(ctx context.Context, req *GetExhibitionRevenueRequest, opts ...client.CallOption) (*GetExhibitionRevenueResponse, error) {
+ resp := new(GetExhibitionRevenueResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "GetExhibitionRevenue", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) ClaimExhibitionRevenue(ctx context.Context, req *ClaimExhibitionRevenueRequest, opts ...client.CallOption) (*ClaimExhibitionRevenueResponse, error) {
+ resp := new(ClaimExhibitionRevenueResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "ClaimExhibitionRevenue", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskMobileServiceImpl) ClaimAllExhibitionRevenue(ctx context.Context, req *ClaimAllExhibitionRevenueRequest, opts ...client.CallOption) (*ClaimAllExhibitionRevenueResponse, error) {
+ resp := new(ClaimAllExhibitionRevenueResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "ClaimAllExhibitionRevenue", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// NewTaskInternalService constructs a client for the task.TaskInternalService service.
+func NewTaskInternalService(cli *client.Client, opts ...client.ReferenceOption) (TaskInternalService, error) {
+ conn, err := cli.DialWithInfo("topfans.task.TaskInternalService", &TaskInternalService_ClientInfo, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return &TaskInternalServiceImpl{
+ conn: conn,
+ }, nil
+}
+
+func SetConsumerTaskInternalService(srv common.RPCService) {
+ dubbo.SetConsumerServiceWithInfo(srv, &TaskInternalService_ClientInfo)
+}
+
+// TaskInternalServiceImpl implements TaskInternalService.
+type TaskInternalServiceImpl struct {
+ conn *client.Connection
+}
+
+func (c *TaskInternalServiceImpl) InitUserTasks(ctx context.Context, req *InitUserTasksRequest, opts ...client.CallOption) (*InitUserTasksResponse, error) {
+ resp := new(InitUserTasksResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "InitUserTasks", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+func (c *TaskInternalServiceImpl) OnExhibitionCompleted(ctx context.Context, req *OnExhibitionCompletedRequest, opts ...client.CallOption) (*OnExhibitionCompletedResponse, error) {
+ resp := new(OnExhibitionCompletedResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "OnExhibitionCompleted", opts...); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+var TaskMobileService_ClientInfo = client.ClientInfo{
+ InterfaceName: "topfans.task.TaskMobileService",
+ MethodNames: []string{"GetDailyTasks", "ReportEvent", "ClaimDailyTask", "ClaimAllDailyTasks", "CompleteGuide", "GetOnboardingStatus", "AdvanceStage", "ClaimOnboardingReward", "GetExhibitionRevenue", "ClaimExhibitionRevenue", "ClaimAllExhibitionRevenue"},
+ ConnectionInjectFunc: func(dubboCliRaw interface{}, conn *client.Connection) {
+ dubboCli := dubboCliRaw.(*TaskMobileServiceImpl)
+ dubboCli.conn = conn
+ },
+}
+var TaskInternalService_ClientInfo = client.ClientInfo{
+ InterfaceName: "topfans.task.TaskInternalService",
+ MethodNames: []string{"InitUserTasks", "OnExhibitionCompleted"},
+ ConnectionInjectFunc: func(dubboCliRaw interface{}, conn *client.Connection) {
+ dubboCli := dubboCliRaw.(*TaskInternalServiceImpl)
+ dubboCli.conn = conn
+ },
+}
+
+// TaskMobileServiceHandler is an implementation of the topfans.task.TaskMobileService service.
+type TaskMobileServiceHandler interface {
+ GetDailyTasks(context.Context, *GetDailyTasksRequest) (*GetDailyTasksResponse, error)
+ ReportEvent(context.Context, *ReportEventRequest) (*ReportEventResponse, error)
+ ClaimDailyTask(context.Context, *ClaimDailyTaskRequest) (*ClaimDailyTaskResponse, error)
+ ClaimAllDailyTasks(context.Context, *ClaimAllDailyTasksRequest) (*ClaimAllDailyTasksResponse, error)
+ CompleteGuide(context.Context, *CompleteGuideRequest) (*CompleteGuideResponse, error)
+ GetOnboardingStatus(context.Context, *GetOnboardingStatusRequest) (*GetOnboardingStatusResponse, error)
+ AdvanceStage(context.Context, *AdvanceStageRequest) (*AdvanceStageResponse, error)
+ ClaimOnboardingReward(context.Context, *ClaimOnboardingRewardRequest) (*ClaimOnboardingRewardResponse, error)
+ GetExhibitionRevenue(context.Context, *GetExhibitionRevenueRequest) (*GetExhibitionRevenueResponse, error)
+ ClaimExhibitionRevenue(context.Context, *ClaimExhibitionRevenueRequest) (*ClaimExhibitionRevenueResponse, error)
+ ClaimAllExhibitionRevenue(context.Context, *ClaimAllExhibitionRevenueRequest) (*ClaimAllExhibitionRevenueResponse, error)
+}
+
+func RegisterTaskMobileServiceHandler(srv *server.Server, hdlr TaskMobileServiceHandler, opts ...server.ServiceOption) error {
+ return srv.Register(hdlr, &TaskMobileService_ServiceInfo, opts...)
+}
+
+func SetProviderTaskMobileService(srv common.RPCService) {
+ dubbo.SetProviderServiceWithInfo(srv, &TaskMobileService_ServiceInfo)
+}
+
+// TaskInternalServiceHandler is an implementation of the topfans.task.TaskInternalService service.
+type TaskInternalServiceHandler interface {
+ InitUserTasks(context.Context, *InitUserTasksRequest) (*InitUserTasksResponse, error)
+ OnExhibitionCompleted(context.Context, *OnExhibitionCompletedRequest) (*OnExhibitionCompletedResponse, error)
+}
+
+func RegisterTaskInternalServiceHandler(srv *server.Server, hdlr TaskInternalServiceHandler, opts ...server.ServiceOption) error {
+ return srv.Register(hdlr, &TaskInternalService_ServiceInfo, opts...)
+}
+
+func SetProviderTaskInternalService(srv common.RPCService) {
+ dubbo.SetProviderServiceWithInfo(srv, &TaskInternalService_ServiceInfo)
+}
+
+var TaskMobileService_ServiceInfo = server.ServiceInfo{
+ InterfaceName: "topfans.task.TaskMobileService",
+ ServiceType: (*TaskMobileServiceHandler)(nil),
+ Methods: []server.MethodInfo{
+ {
+ Name: "GetDailyTasks",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(GetDailyTasksRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*GetDailyTasksRequest)
+ res, err := handler.(TaskMobileServiceHandler).GetDailyTasks(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "ReportEvent",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(ReportEventRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*ReportEventRequest)
+ res, err := handler.(TaskMobileServiceHandler).ReportEvent(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "ClaimDailyTask",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(ClaimDailyTaskRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*ClaimDailyTaskRequest)
+ res, err := handler.(TaskMobileServiceHandler).ClaimDailyTask(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "ClaimAllDailyTasks",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(ClaimAllDailyTasksRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*ClaimAllDailyTasksRequest)
+ res, err := handler.(TaskMobileServiceHandler).ClaimAllDailyTasks(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "CompleteGuide",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(CompleteGuideRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*CompleteGuideRequest)
+ res, err := handler.(TaskMobileServiceHandler).CompleteGuide(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "GetOnboardingStatus",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(GetOnboardingStatusRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*GetOnboardingStatusRequest)
+ res, err := handler.(TaskMobileServiceHandler).GetOnboardingStatus(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "AdvanceStage",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(AdvanceStageRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*AdvanceStageRequest)
+ res, err := handler.(TaskMobileServiceHandler).AdvanceStage(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "ClaimOnboardingReward",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(ClaimOnboardingRewardRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*ClaimOnboardingRewardRequest)
+ res, err := handler.(TaskMobileServiceHandler).ClaimOnboardingReward(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "GetExhibitionRevenue",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(GetExhibitionRevenueRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*GetExhibitionRevenueRequest)
+ res, err := handler.(TaskMobileServiceHandler).GetExhibitionRevenue(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "ClaimExhibitionRevenue",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(ClaimExhibitionRevenueRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*ClaimExhibitionRevenueRequest)
+ res, err := handler.(TaskMobileServiceHandler).ClaimExhibitionRevenue(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "ClaimAllExhibitionRevenue",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(ClaimAllExhibitionRevenueRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*ClaimAllExhibitionRevenueRequest)
+ res, err := handler.(TaskMobileServiceHandler).ClaimAllExhibitionRevenue(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ },
+}
+var TaskInternalService_ServiceInfo = server.ServiceInfo{
+ InterfaceName: "topfans.task.TaskInternalService",
+ ServiceType: (*TaskInternalServiceHandler)(nil),
+ Methods: []server.MethodInfo{
+ {
+ Name: "InitUserTasks",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(InitUserTasksRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*InitUserTasksRequest)
+ res, err := handler.(TaskInternalServiceHandler).InitUserTasks(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ {
+ Name: "OnExhibitionCompleted",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(OnExhibitionCompletedRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*OnExhibitionCompletedRequest)
+ res, err := handler.(TaskInternalServiceHandler).OnExhibitionCompleted(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
+ },
+}
diff --git a/backend/pkg/proto/user/user.pb.go b/backend/pkg/proto/user/user.pb.go
index bbc3d67..ea6fabd 100644
--- a/backend/pkg/proto/user/user.pb.go
+++ b/backend/pkg/proto/user/user.pb.go
@@ -1726,6 +1726,120 @@ func (x *UpdateAssetsCountResponse) GetNewCount() int32 {
return 0
}
+// 增加经验值请求(内部RPC调用,用于taskService增加经验)
+type AddExperienceRequest struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户ID
+ StarId int64 `protobuf:"varint,2,opt,name=star_id,json=starId,proto3" json:"star_id,omitempty"` // 明星ID
+ Delta int64 `protobuf:"varint,3,opt,name=delta,proto3" json:"delta,omitempty"` // 变化量(正数增加,负数减少)
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *AddExperienceRequest) Reset() {
+ *x = AddExperienceRequest{}
+ mi := &file_user_proto_msgTypes[27]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AddExperienceRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddExperienceRequest) ProtoMessage() {}
+
+func (x *AddExperienceRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_user_proto_msgTypes[27]
+ 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 AddExperienceRequest.ProtoReflect.Descriptor instead.
+func (*AddExperienceRequest) Descriptor() ([]byte, []int) {
+ return file_user_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *AddExperienceRequest) GetUserId() int64 {
+ if x != nil {
+ return x.UserId
+ }
+ return 0
+}
+
+func (x *AddExperienceRequest) GetStarId() int64 {
+ if x != nil {
+ return x.StarId
+ }
+ return 0
+}
+
+func (x *AddExperienceRequest) GetDelta() int64 {
+ if x != nil {
+ return x.Delta
+ }
+ return 0
+}
+
+// 增加经验值响应
+type AddExperienceResponse struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ Base *common.BaseResponse `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
+ NewExperience int64 `protobuf:"varint,2,opt,name=new_experience,json=newExperience,proto3" json:"new_experience,omitempty"` // 更新后的经验值
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *AddExperienceResponse) Reset() {
+ *x = AddExperienceResponse{}
+ mi := &file_user_proto_msgTypes[28]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AddExperienceResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddExperienceResponse) ProtoMessage() {}
+
+func (x *AddExperienceResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_user_proto_msgTypes[28]
+ 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 AddExperienceResponse.ProtoReflect.Descriptor instead.
+func (*AddExperienceResponse) Descriptor() ([]byte, []int) {
+ return file_user_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *AddExperienceResponse) GetBase() *common.BaseResponse {
+ if x != nil {
+ return x.Base
+ }
+ return nil
+}
+
+func (x *AddExperienceResponse) GetNewExperience() int64 {
+ if x != nil {
+ return x.NewExperience
+ }
+ return 0
+}
+
// 获取当前登录用户信息请求
type GetCurrentUserRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -1735,7 +1849,7 @@ type GetCurrentUserRequest struct {
func (x *GetCurrentUserRequest) Reset() {
*x = GetCurrentUserRequest{}
- mi := &file_user_proto_msgTypes[27]
+ mi := &file_user_proto_msgTypes[29]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1747,7 +1861,7 @@ func (x *GetCurrentUserRequest) String() string {
func (*GetCurrentUserRequest) ProtoMessage() {}
func (x *GetCurrentUserRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[27]
+ mi := &file_user_proto_msgTypes[29]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1760,7 +1874,7 @@ func (x *GetCurrentUserRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetCurrentUserRequest.ProtoReflect.Descriptor instead.
func (*GetCurrentUserRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{27}
+ return file_user_proto_rawDescGZIP(), []int{29}
}
// 获取当前登录用户信息响应
@@ -1776,7 +1890,7 @@ type GetCurrentUserResponse struct {
func (x *GetCurrentUserResponse) Reset() {
*x = GetCurrentUserResponse{}
- mi := &file_user_proto_msgTypes[28]
+ mi := &file_user_proto_msgTypes[30]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1788,7 +1902,7 @@ func (x *GetCurrentUserResponse) String() string {
func (*GetCurrentUserResponse) ProtoMessage() {}
func (x *GetCurrentUserResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[28]
+ mi := &file_user_proto_msgTypes[30]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1801,7 +1915,7 @@ func (x *GetCurrentUserResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetCurrentUserResponse.ProtoReflect.Descriptor instead.
func (*GetCurrentUserResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{28}
+ return file_user_proto_rawDescGZIP(), []int{30}
}
func (x *GetCurrentUserResponse) GetBase() *common.BaseResponse {
@@ -1841,7 +1955,7 @@ type GetMyProfileRequest struct {
func (x *GetMyProfileRequest) Reset() {
*x = GetMyProfileRequest{}
- mi := &file_user_proto_msgTypes[29]
+ mi := &file_user_proto_msgTypes[31]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1853,7 +1967,7 @@ func (x *GetMyProfileRequest) String() string {
func (*GetMyProfileRequest) ProtoMessage() {}
func (x *GetMyProfileRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[29]
+ mi := &file_user_proto_msgTypes[31]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1866,7 +1980,7 @@ func (x *GetMyProfileRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetMyProfileRequest.ProtoReflect.Descriptor instead.
func (*GetMyProfileRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{29}
+ return file_user_proto_rawDescGZIP(), []int{31}
}
// 获取个人信息页响应
@@ -1882,7 +1996,7 @@ type GetMyProfileResponse struct {
func (x *GetMyProfileResponse) Reset() {
*x = GetMyProfileResponse{}
- mi := &file_user_proto_msgTypes[30]
+ mi := &file_user_proto_msgTypes[32]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1894,7 +2008,7 @@ func (x *GetMyProfileResponse) String() string {
func (*GetMyProfileResponse) ProtoMessage() {}
func (x *GetMyProfileResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[30]
+ mi := &file_user_proto_msgTypes[32]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1907,7 +2021,7 @@ func (x *GetMyProfileResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetMyProfileResponse.ProtoReflect.Descriptor instead.
func (*GetMyProfileResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{30}
+ return file_user_proto_rawDescGZIP(), []int{32}
}
func (x *GetMyProfileResponse) GetBase() *common.BaseResponse {
@@ -1948,7 +2062,7 @@ type UpdateNicknameRequest struct {
func (x *UpdateNicknameRequest) Reset() {
*x = UpdateNicknameRequest{}
- mi := &file_user_proto_msgTypes[31]
+ mi := &file_user_proto_msgTypes[33]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1960,7 +2074,7 @@ func (x *UpdateNicknameRequest) String() string {
func (*UpdateNicknameRequest) ProtoMessage() {}
func (x *UpdateNicknameRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[31]
+ mi := &file_user_proto_msgTypes[33]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1973,7 +2087,7 @@ func (x *UpdateNicknameRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateNicknameRequest.ProtoReflect.Descriptor instead.
func (*UpdateNicknameRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{31}
+ return file_user_proto_rawDescGZIP(), []int{33}
}
func (x *UpdateNicknameRequest) GetNickname() string {
@@ -1994,7 +2108,7 @@ type UpdateNicknameResponse struct {
func (x *UpdateNicknameResponse) Reset() {
*x = UpdateNicknameResponse{}
- mi := &file_user_proto_msgTypes[32]
+ mi := &file_user_proto_msgTypes[34]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2006,7 +2120,7 @@ func (x *UpdateNicknameResponse) String() string {
func (*UpdateNicknameResponse) ProtoMessage() {}
func (x *UpdateNicknameResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[32]
+ mi := &file_user_proto_msgTypes[34]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2019,7 +2133,7 @@ func (x *UpdateNicknameResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateNicknameResponse.ProtoReflect.Descriptor instead.
func (*UpdateNicknameResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{32}
+ return file_user_proto_rawDescGZIP(), []int{34}
}
func (x *UpdateNicknameResponse) GetBase() *common.BaseResponse {
@@ -2047,7 +2161,7 @@ type UpdatePasswordRequest struct {
func (x *UpdatePasswordRequest) Reset() {
*x = UpdatePasswordRequest{}
- mi := &file_user_proto_msgTypes[33]
+ mi := &file_user_proto_msgTypes[35]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2059,7 +2173,7 @@ func (x *UpdatePasswordRequest) String() string {
func (*UpdatePasswordRequest) ProtoMessage() {}
func (x *UpdatePasswordRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[33]
+ mi := &file_user_proto_msgTypes[35]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2072,7 +2186,7 @@ func (x *UpdatePasswordRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdatePasswordRequest.ProtoReflect.Descriptor instead.
func (*UpdatePasswordRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{33}
+ return file_user_proto_rawDescGZIP(), []int{35}
}
func (x *UpdatePasswordRequest) GetOldPassword() string {
@@ -2099,7 +2213,7 @@ type UpdatePasswordResponse struct {
func (x *UpdatePasswordResponse) Reset() {
*x = UpdatePasswordResponse{}
- mi := &file_user_proto_msgTypes[34]
+ mi := &file_user_proto_msgTypes[36]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2111,7 +2225,7 @@ func (x *UpdatePasswordResponse) String() string {
func (*UpdatePasswordResponse) ProtoMessage() {}
func (x *UpdatePasswordResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[34]
+ mi := &file_user_proto_msgTypes[36]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2124,7 +2238,7 @@ func (x *UpdatePasswordResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdatePasswordResponse.ProtoReflect.Descriptor instead.
func (*UpdatePasswordResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{34}
+ return file_user_proto_rawDescGZIP(), []int{36}
}
func (x *UpdatePasswordResponse) GetBase() *common.BaseResponse {
@@ -2144,7 +2258,7 @@ type UpdateAvatarRequest struct {
func (x *UpdateAvatarRequest) Reset() {
*x = UpdateAvatarRequest{}
- mi := &file_user_proto_msgTypes[35]
+ mi := &file_user_proto_msgTypes[37]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2156,7 +2270,7 @@ func (x *UpdateAvatarRequest) String() string {
func (*UpdateAvatarRequest) ProtoMessage() {}
func (x *UpdateAvatarRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[35]
+ mi := &file_user_proto_msgTypes[37]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2169,7 +2283,7 @@ func (x *UpdateAvatarRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateAvatarRequest.ProtoReflect.Descriptor instead.
func (*UpdateAvatarRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{35}
+ return file_user_proto_rawDescGZIP(), []int{37}
}
func (x *UpdateAvatarRequest) GetAvatarUrl() string {
@@ -2190,7 +2304,7 @@ type UpdateAvatarResponse struct {
func (x *UpdateAvatarResponse) Reset() {
*x = UpdateAvatarResponse{}
- mi := &file_user_proto_msgTypes[36]
+ mi := &file_user_proto_msgTypes[38]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2202,7 +2316,7 @@ func (x *UpdateAvatarResponse) String() string {
func (*UpdateAvatarResponse) ProtoMessage() {}
func (x *UpdateAvatarResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[36]
+ mi := &file_user_proto_msgTypes[38]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2215,7 +2329,7 @@ func (x *UpdateAvatarResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateAvatarResponse.ProtoReflect.Descriptor instead.
func (*UpdateAvatarResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{36}
+ return file_user_proto_rawDescGZIP(), []int{38}
}
func (x *UpdateAvatarResponse) GetBase() *common.BaseResponse {
@@ -2242,7 +2356,7 @@ type GetFanIdentitiesRequest struct {
func (x *GetFanIdentitiesRequest) Reset() {
*x = GetFanIdentitiesRequest{}
- mi := &file_user_proto_msgTypes[37]
+ mi := &file_user_proto_msgTypes[39]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2254,7 +2368,7 @@ func (x *GetFanIdentitiesRequest) String() string {
func (*GetFanIdentitiesRequest) ProtoMessage() {}
func (x *GetFanIdentitiesRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[37]
+ mi := &file_user_proto_msgTypes[39]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2267,7 +2381,7 @@ func (x *GetFanIdentitiesRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetFanIdentitiesRequest.ProtoReflect.Descriptor instead.
func (*GetFanIdentitiesRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{37}
+ return file_user_proto_rawDescGZIP(), []int{39}
}
func (x *GetFanIdentitiesRequest) GetKeyword() string {
@@ -2288,7 +2402,7 @@ type GetFanIdentitiesResponse struct {
func (x *GetFanIdentitiesResponse) Reset() {
*x = GetFanIdentitiesResponse{}
- mi := &file_user_proto_msgTypes[38]
+ mi := &file_user_proto_msgTypes[40]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2300,7 +2414,7 @@ func (x *GetFanIdentitiesResponse) String() string {
func (*GetFanIdentitiesResponse) ProtoMessage() {}
func (x *GetFanIdentitiesResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[38]
+ mi := &file_user_proto_msgTypes[40]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2313,7 +2427,7 @@ func (x *GetFanIdentitiesResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetFanIdentitiesResponse.ProtoReflect.Descriptor instead.
func (*GetFanIdentitiesResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{38}
+ return file_user_proto_rawDescGZIP(), []int{40}
}
func (x *GetFanIdentitiesResponse) GetBase() *common.BaseResponse {
@@ -2339,7 +2453,7 @@ type GetMyFanIdentitiesRequest struct {
func (x *GetMyFanIdentitiesRequest) Reset() {
*x = GetMyFanIdentitiesRequest{}
- mi := &file_user_proto_msgTypes[39]
+ mi := &file_user_proto_msgTypes[41]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2351,7 +2465,7 @@ func (x *GetMyFanIdentitiesRequest) String() string {
func (*GetMyFanIdentitiesRequest) ProtoMessage() {}
func (x *GetMyFanIdentitiesRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[39]
+ mi := &file_user_proto_msgTypes[41]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2364,7 +2478,7 @@ func (x *GetMyFanIdentitiesRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetMyFanIdentitiesRequest.ProtoReflect.Descriptor instead.
func (*GetMyFanIdentitiesRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{39}
+ return file_user_proto_rawDescGZIP(), []int{41}
}
// 我的粉丝身份项(包含粉丝档案和明星信息)
@@ -2378,7 +2492,7 @@ type MyFanIdentityItem struct {
func (x *MyFanIdentityItem) Reset() {
*x = MyFanIdentityItem{}
- mi := &file_user_proto_msgTypes[40]
+ mi := &file_user_proto_msgTypes[42]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2390,7 +2504,7 @@ func (x *MyFanIdentityItem) String() string {
func (*MyFanIdentityItem) ProtoMessage() {}
func (x *MyFanIdentityItem) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[40]
+ mi := &file_user_proto_msgTypes[42]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2403,7 +2517,7 @@ func (x *MyFanIdentityItem) ProtoReflect() protoreflect.Message {
// Deprecated: Use MyFanIdentityItem.ProtoReflect.Descriptor instead.
func (*MyFanIdentityItem) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{40}
+ return file_user_proto_rawDescGZIP(), []int{42}
}
func (x *MyFanIdentityItem) GetFanProfile() *FanProfile {
@@ -2432,7 +2546,7 @@ type GetMyFanIdentitiesResponse struct {
func (x *GetMyFanIdentitiesResponse) Reset() {
*x = GetMyFanIdentitiesResponse{}
- mi := &file_user_proto_msgTypes[41]
+ mi := &file_user_proto_msgTypes[43]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2444,7 +2558,7 @@ func (x *GetMyFanIdentitiesResponse) String() string {
func (*GetMyFanIdentitiesResponse) ProtoMessage() {}
func (x *GetMyFanIdentitiesResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[41]
+ mi := &file_user_proto_msgTypes[43]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2457,7 +2571,7 @@ func (x *GetMyFanIdentitiesResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetMyFanIdentitiesResponse.ProtoReflect.Descriptor instead.
func (*GetMyFanIdentitiesResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{41}
+ return file_user_proto_rawDescGZIP(), []int{43}
}
func (x *GetMyFanIdentitiesResponse) GetBase() *common.BaseResponse {
@@ -2492,7 +2606,7 @@ type AddIdentityRequest struct {
func (x *AddIdentityRequest) Reset() {
*x = AddIdentityRequest{}
- mi := &file_user_proto_msgTypes[42]
+ mi := &file_user_proto_msgTypes[44]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2504,7 +2618,7 @@ func (x *AddIdentityRequest) String() string {
func (*AddIdentityRequest) ProtoMessage() {}
func (x *AddIdentityRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[42]
+ mi := &file_user_proto_msgTypes[44]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2517,7 +2631,7 @@ func (x *AddIdentityRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use AddIdentityRequest.ProtoReflect.Descriptor instead.
func (*AddIdentityRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{42}
+ return file_user_proto_rawDescGZIP(), []int{44}
}
func (x *AddIdentityRequest) GetStarId() int64 {
@@ -2545,7 +2659,7 @@ type AddIdentityResponse struct {
func (x *AddIdentityResponse) Reset() {
*x = AddIdentityResponse{}
- mi := &file_user_proto_msgTypes[43]
+ mi := &file_user_proto_msgTypes[45]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2557,7 +2671,7 @@ func (x *AddIdentityResponse) String() string {
func (*AddIdentityResponse) ProtoMessage() {}
func (x *AddIdentityResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[43]
+ mi := &file_user_proto_msgTypes[45]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2570,7 +2684,7 @@ func (x *AddIdentityResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use AddIdentityResponse.ProtoReflect.Descriptor instead.
func (*AddIdentityResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{43}
+ return file_user_proto_rawDescGZIP(), []int{45}
}
func (x *AddIdentityResponse) GetBase() *common.BaseResponse {
@@ -2597,7 +2711,7 @@ type SwitchIdentityRequest struct {
func (x *SwitchIdentityRequest) Reset() {
*x = SwitchIdentityRequest{}
- mi := &file_user_proto_msgTypes[44]
+ mi := &file_user_proto_msgTypes[46]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2609,7 +2723,7 @@ func (x *SwitchIdentityRequest) String() string {
func (*SwitchIdentityRequest) ProtoMessage() {}
func (x *SwitchIdentityRequest) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[44]
+ mi := &file_user_proto_msgTypes[46]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2622,7 +2736,7 @@ func (x *SwitchIdentityRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use SwitchIdentityRequest.ProtoReflect.Descriptor instead.
func (*SwitchIdentityRequest) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{44}
+ return file_user_proto_rawDescGZIP(), []int{46}
}
func (x *SwitchIdentityRequest) GetNewStarId() int64 {
@@ -2645,7 +2759,7 @@ type SwitchIdentityResponse struct {
func (x *SwitchIdentityResponse) Reset() {
*x = SwitchIdentityResponse{}
- mi := &file_user_proto_msgTypes[45]
+ mi := &file_user_proto_msgTypes[47]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -2657,7 +2771,7 @@ func (x *SwitchIdentityResponse) String() string {
func (*SwitchIdentityResponse) ProtoMessage() {}
func (x *SwitchIdentityResponse) ProtoReflect() protoreflect.Message {
- mi := &file_user_proto_msgTypes[45]
+ mi := &file_user_proto_msgTypes[47]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -2670,7 +2784,7 @@ func (x *SwitchIdentityResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use SwitchIdentityResponse.ProtoReflect.Descriptor instead.
func (*SwitchIdentityResponse) Descriptor() ([]byte, []int) {
- return file_user_proto_rawDescGZIP(), []int{45}
+ return file_user_proto_rawDescGZIP(), []int{47}
}
func (x *SwitchIdentityResponse) GetBase() *common.BaseResponse {
@@ -2840,7 +2954,14 @@ const file_user_proto_rawDesc = "" +
"\x05delta\x18\x03 \x01(\x05R\x05delta\"j\n" +
"\x19UpdateAssetsCountResponse\x120\n" +
"\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12\x1b\n" +
- "\tnew_count\x18\x02 \x01(\x05R\bnewCount\"\x17\n" +
+ "\tnew_count\x18\x02 \x01(\x05R\bnewCount\"^\n" +
+ "\x14AddExperienceRequest\x12\x17\n" +
+ "\auser_id\x18\x01 \x01(\x03R\x06userId\x12\x17\n" +
+ "\astar_id\x18\x02 \x01(\x03R\x06starId\x12\x14\n" +
+ "\x05delta\x18\x03 \x01(\x03R\x05delta\"p\n" +
+ "\x15AddExperienceResponse\x120\n" +
+ "\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12%\n" +
+ "\x0enew_experience\x18\x02 \x01(\x03R\rnewExperience\"\x17\n" +
"\x15GetCurrentUserRequest\"\xea\x01\n" +
"\x16GetCurrentUserResponse\x120\n" +
"\x04base\x18\x01 \x01(\v2\x1c.topfans.common.BaseResponseR\x04base\x12&\n" +
@@ -2902,7 +3023,7 @@ const file_user_proto_rawDesc = "" +
"\n" +
"expires_in\x18\x03 \x01(\x03R\texpiresIn\x129\n" +
"\vfan_profile\x18\x04 \x01(\v2\x18.topfans.user.FanProfileR\n" +
- "fanProfile2\xf0\x13\n" +
+ "fanProfile2\xca\x14\n" +
"\x11UserSocialService\x12k\n" +
"\bRegister\x12\x1d.topfans.user.RegisterRequest\x1a\x1e.topfans.user.RegisterResponse\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/api/v1/auth/register\x12_\n" +
"\x05Login\x12\x1a.topfans.user.LoginRequest\x1a\x1b.topfans.user.LoginResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/api/v1/auth/login\x12v\n" +
@@ -2915,7 +3036,8 @@ const file_user_proto_rawDesc = "" +
"\rGetFanProfile\x12\".topfans.user.GetFanProfileRequest\x1a#.topfans.user.GetFanProfileResponse\"6\x82\xd3\xe4\x93\x020\x12./api/v1/users/{user_id}/fan-profiles/{star_id}\x12s\n" +
"\x16UpdateFanProfileSocial\x12+.topfans.user.UpdateFanProfileSocialRequest\x1a,.topfans.user.UpdateFanProfileSocialResponse\x12m\n" +
"\x14UpdateCrystalBalance\x12).topfans.user.UpdateCrystalBalanceRequest\x1a*.topfans.user.UpdateCrystalBalanceResponse\x12d\n" +
- "\x11UpdateAssetsCount\x12&.topfans.user.UpdateAssetsCountRequest\x1a'.topfans.user.UpdateAssetsCountResponse\x12t\n" +
+ "\x11UpdateAssetsCount\x12&.topfans.user.UpdateAssetsCountRequest\x1a'.topfans.user.UpdateAssetsCountResponse\x12X\n" +
+ "\rAddExperience\x12\".topfans.user.AddExperienceRequest\x1a#.topfans.user.AddExperienceResponse\x12t\n" +
"\x0eGetCurrentUser\x12#.topfans.user.GetCurrentUserRequest\x1a$.topfans.user.GetCurrentUserResponse\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/api/v1/auth/me\x12q\n" +
"\fGetMyProfile\x12!.topfans.user.GetMyProfileRequest\x1a\".topfans.user.GetMyProfileResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\x12\x12/api/v1/me/profile\x12z\n" +
"\x0eUpdateNickname\x12#.topfans.user.UpdateNicknameRequest\x1a$.topfans.user.UpdateNicknameResponse\"\x1d\x82\xd3\xe4\x93\x02\x17:\x01*\"\x12/api/v1/me/profile\x12\x80\x01\n" +
@@ -2938,7 +3060,7 @@ func file_user_proto_rawDescGZIP() []byte {
return file_user_proto_rawDescData
}
-var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 46)
+var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 48)
var file_user_proto_goTypes = []any{
(*User)(nil), // 0: topfans.user.User
(*FanProfile)(nil), // 1: topfans.user.FanProfile
@@ -2967,116 +3089,121 @@ var file_user_proto_goTypes = []any{
(*UpdateCrystalBalanceResponse)(nil), // 24: topfans.user.UpdateCrystalBalanceResponse
(*UpdateAssetsCountRequest)(nil), // 25: topfans.user.UpdateAssetsCountRequest
(*UpdateAssetsCountResponse)(nil), // 26: topfans.user.UpdateAssetsCountResponse
- (*GetCurrentUserRequest)(nil), // 27: topfans.user.GetCurrentUserRequest
- (*GetCurrentUserResponse)(nil), // 28: topfans.user.GetCurrentUserResponse
- (*GetMyProfileRequest)(nil), // 29: topfans.user.GetMyProfileRequest
- (*GetMyProfileResponse)(nil), // 30: topfans.user.GetMyProfileResponse
- (*UpdateNicknameRequest)(nil), // 31: topfans.user.UpdateNicknameRequest
- (*UpdateNicknameResponse)(nil), // 32: topfans.user.UpdateNicknameResponse
- (*UpdatePasswordRequest)(nil), // 33: topfans.user.UpdatePasswordRequest
- (*UpdatePasswordResponse)(nil), // 34: topfans.user.UpdatePasswordResponse
- (*UpdateAvatarRequest)(nil), // 35: topfans.user.UpdateAvatarRequest
- (*UpdateAvatarResponse)(nil), // 36: topfans.user.UpdateAvatarResponse
- (*GetFanIdentitiesRequest)(nil), // 37: topfans.user.GetFanIdentitiesRequest
- (*GetFanIdentitiesResponse)(nil), // 38: topfans.user.GetFanIdentitiesResponse
- (*GetMyFanIdentitiesRequest)(nil), // 39: topfans.user.GetMyFanIdentitiesRequest
- (*MyFanIdentityItem)(nil), // 40: topfans.user.MyFanIdentityItem
- (*GetMyFanIdentitiesResponse)(nil), // 41: topfans.user.GetMyFanIdentitiesResponse
- (*AddIdentityRequest)(nil), // 42: topfans.user.AddIdentityRequest
- (*AddIdentityResponse)(nil), // 43: topfans.user.AddIdentityResponse
- (*SwitchIdentityRequest)(nil), // 44: topfans.user.SwitchIdentityRequest
- (*SwitchIdentityResponse)(nil), // 45: topfans.user.SwitchIdentityResponse
- (*common.BaseResponse)(nil), // 46: topfans.common.BaseResponse
+ (*AddExperienceRequest)(nil), // 27: topfans.user.AddExperienceRequest
+ (*AddExperienceResponse)(nil), // 28: topfans.user.AddExperienceResponse
+ (*GetCurrentUserRequest)(nil), // 29: topfans.user.GetCurrentUserRequest
+ (*GetCurrentUserResponse)(nil), // 30: topfans.user.GetCurrentUserResponse
+ (*GetMyProfileRequest)(nil), // 31: topfans.user.GetMyProfileRequest
+ (*GetMyProfileResponse)(nil), // 32: topfans.user.GetMyProfileResponse
+ (*UpdateNicknameRequest)(nil), // 33: topfans.user.UpdateNicknameRequest
+ (*UpdateNicknameResponse)(nil), // 34: topfans.user.UpdateNicknameResponse
+ (*UpdatePasswordRequest)(nil), // 35: topfans.user.UpdatePasswordRequest
+ (*UpdatePasswordResponse)(nil), // 36: topfans.user.UpdatePasswordResponse
+ (*UpdateAvatarRequest)(nil), // 37: topfans.user.UpdateAvatarRequest
+ (*UpdateAvatarResponse)(nil), // 38: topfans.user.UpdateAvatarResponse
+ (*GetFanIdentitiesRequest)(nil), // 39: topfans.user.GetFanIdentitiesRequest
+ (*GetFanIdentitiesResponse)(nil), // 40: topfans.user.GetFanIdentitiesResponse
+ (*GetMyFanIdentitiesRequest)(nil), // 41: topfans.user.GetMyFanIdentitiesRequest
+ (*MyFanIdentityItem)(nil), // 42: topfans.user.MyFanIdentityItem
+ (*GetMyFanIdentitiesResponse)(nil), // 43: topfans.user.GetMyFanIdentitiesResponse
+ (*AddIdentityRequest)(nil), // 44: topfans.user.AddIdentityRequest
+ (*AddIdentityResponse)(nil), // 45: topfans.user.AddIdentityResponse
+ (*SwitchIdentityRequest)(nil), // 46: topfans.user.SwitchIdentityRequest
+ (*SwitchIdentityResponse)(nil), // 47: topfans.user.SwitchIdentityResponse
+ (*common.BaseResponse)(nil), // 48: topfans.common.BaseResponse
}
var file_user_proto_depIdxs = []int32{
- 46, // 0: topfans.user.RegisterResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 0: topfans.user.RegisterResponse.base:type_name -> topfans.common.BaseResponse
0, // 1: topfans.user.RegisterResponse.user:type_name -> topfans.user.User
1, // 2: topfans.user.RegisterResponse.fan_profile:type_name -> topfans.user.FanProfile
- 46, // 3: topfans.user.LoginResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 3: topfans.user.LoginResponse.base:type_name -> topfans.common.BaseResponse
0, // 4: topfans.user.LoginResponse.user:type_name -> topfans.user.User
1, // 5: topfans.user.LoginResponse.fan_profile:type_name -> topfans.user.FanProfile
1, // 6: topfans.user.LoginResponse.fan_profiles:type_name -> topfans.user.FanProfile
- 46, // 7: topfans.user.RefreshTokenResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 8: topfans.user.ValidateTokenResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 9: topfans.user.LogoutResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 10: topfans.user.CheckNicknameResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 11: topfans.user.CheckMobileResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 12: topfans.user.GetUserResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 7: topfans.user.RefreshTokenResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 8: topfans.user.ValidateTokenResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 9: topfans.user.LogoutResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 10: topfans.user.CheckNicknameResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 11: topfans.user.CheckMobileResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 12: topfans.user.GetUserResponse.base:type_name -> topfans.common.BaseResponse
0, // 13: topfans.user.GetUserResponse.user:type_name -> topfans.user.User
- 46, // 14: topfans.user.GetFanProfileResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 14: topfans.user.GetFanProfileResponse.base:type_name -> topfans.common.BaseResponse
1, // 15: topfans.user.GetFanProfileResponse.profile:type_name -> topfans.user.FanProfile
- 46, // 16: topfans.user.UpdateFanProfileSocialResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 17: topfans.user.UpdateCrystalBalanceResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 18: topfans.user.UpdateAssetsCountResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 19: topfans.user.GetCurrentUserResponse.base:type_name -> topfans.common.BaseResponse
- 0, // 20: topfans.user.GetCurrentUserResponse.user:type_name -> topfans.user.User
- 1, // 21: topfans.user.GetCurrentUserResponse.fan_profile:type_name -> topfans.user.FanProfile
- 1, // 22: topfans.user.GetCurrentUserResponse.fan_profiles:type_name -> topfans.user.FanProfile
- 46, // 23: topfans.user.GetMyProfileResponse.base:type_name -> topfans.common.BaseResponse
- 0, // 24: topfans.user.GetMyProfileResponse.user:type_name -> topfans.user.User
- 1, // 25: topfans.user.GetMyProfileResponse.fan_profile:type_name -> topfans.user.FanProfile
- 1, // 26: topfans.user.GetMyProfileResponse.fan_profiles:type_name -> topfans.user.FanProfile
- 46, // 27: topfans.user.UpdateNicknameResponse.base:type_name -> topfans.common.BaseResponse
- 1, // 28: topfans.user.UpdateNicknameResponse.fan_profile:type_name -> topfans.user.FanProfile
- 46, // 29: topfans.user.UpdatePasswordResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 30: topfans.user.UpdateAvatarResponse.base:type_name -> topfans.common.BaseResponse
- 46, // 31: topfans.user.GetFanIdentitiesResponse.base:type_name -> topfans.common.BaseResponse
- 2, // 32: topfans.user.GetFanIdentitiesResponse.stars:type_name -> topfans.user.Star
- 1, // 33: topfans.user.MyFanIdentityItem.fan_profile:type_name -> topfans.user.FanProfile
- 2, // 34: topfans.user.MyFanIdentityItem.star:type_name -> topfans.user.Star
- 46, // 35: topfans.user.GetMyFanIdentitiesResponse.base:type_name -> topfans.common.BaseResponse
- 40, // 36: topfans.user.GetMyFanIdentitiesResponse.items:type_name -> topfans.user.MyFanIdentityItem
- 46, // 37: topfans.user.AddIdentityResponse.base:type_name -> topfans.common.BaseResponse
- 1, // 38: topfans.user.AddIdentityResponse.fan_profile:type_name -> topfans.user.FanProfile
- 46, // 39: topfans.user.SwitchIdentityResponse.base:type_name -> topfans.common.BaseResponse
- 1, // 40: topfans.user.SwitchIdentityResponse.fan_profile:type_name -> topfans.user.FanProfile
- 3, // 41: topfans.user.UserSocialService.Register:input_type -> topfans.user.RegisterRequest
- 5, // 42: topfans.user.UserSocialService.Login:input_type -> topfans.user.LoginRequest
- 7, // 43: topfans.user.UserSocialService.RefreshToken:input_type -> topfans.user.RefreshTokenRequest
- 9, // 44: topfans.user.UserSocialService.ValidateToken:input_type -> topfans.user.ValidateTokenRequest
- 11, // 45: topfans.user.UserSocialService.Logout:input_type -> topfans.user.LogoutRequest
- 13, // 46: topfans.user.UserSocialService.CheckNickname:input_type -> topfans.user.CheckNicknameRequest
- 15, // 47: topfans.user.UserSocialService.CheckMobile:input_type -> topfans.user.CheckMobileRequest
- 17, // 48: topfans.user.UserSocialService.GetUser:input_type -> topfans.user.GetUserRequest
- 19, // 49: topfans.user.UserSocialService.GetFanProfile:input_type -> topfans.user.GetFanProfileRequest
- 21, // 50: topfans.user.UserSocialService.UpdateFanProfileSocial:input_type -> topfans.user.UpdateFanProfileSocialRequest
- 23, // 51: topfans.user.UserSocialService.UpdateCrystalBalance:input_type -> topfans.user.UpdateCrystalBalanceRequest
- 25, // 52: topfans.user.UserSocialService.UpdateAssetsCount:input_type -> topfans.user.UpdateAssetsCountRequest
- 27, // 53: topfans.user.UserSocialService.GetCurrentUser:input_type -> topfans.user.GetCurrentUserRequest
- 29, // 54: topfans.user.UserSocialService.GetMyProfile:input_type -> topfans.user.GetMyProfileRequest
- 31, // 55: topfans.user.UserSocialService.UpdateNickname:input_type -> topfans.user.UpdateNicknameRequest
- 33, // 56: topfans.user.UserSocialService.UpdatePassword:input_type -> topfans.user.UpdatePasswordRequest
- 35, // 57: topfans.user.UserSocialService.UpdateAvatar:input_type -> topfans.user.UpdateAvatarRequest
- 37, // 58: topfans.user.UserSocialService.GetFanIdentities:input_type -> topfans.user.GetFanIdentitiesRequest
- 39, // 59: topfans.user.UserSocialService.GetMyFanIdentities:input_type -> topfans.user.GetMyFanIdentitiesRequest
- 42, // 60: topfans.user.UserSocialService.AddIdentity:input_type -> topfans.user.AddIdentityRequest
- 44, // 61: topfans.user.UserSocialService.SwitchIdentity:input_type -> topfans.user.SwitchIdentityRequest
- 4, // 62: topfans.user.UserSocialService.Register:output_type -> topfans.user.RegisterResponse
- 6, // 63: topfans.user.UserSocialService.Login:output_type -> topfans.user.LoginResponse
- 8, // 64: topfans.user.UserSocialService.RefreshToken:output_type -> topfans.user.RefreshTokenResponse
- 10, // 65: topfans.user.UserSocialService.ValidateToken:output_type -> topfans.user.ValidateTokenResponse
- 12, // 66: topfans.user.UserSocialService.Logout:output_type -> topfans.user.LogoutResponse
- 14, // 67: topfans.user.UserSocialService.CheckNickname:output_type -> topfans.user.CheckNicknameResponse
- 16, // 68: topfans.user.UserSocialService.CheckMobile:output_type -> topfans.user.CheckMobileResponse
- 18, // 69: topfans.user.UserSocialService.GetUser:output_type -> topfans.user.GetUserResponse
- 20, // 70: topfans.user.UserSocialService.GetFanProfile:output_type -> topfans.user.GetFanProfileResponse
- 22, // 71: topfans.user.UserSocialService.UpdateFanProfileSocial:output_type -> topfans.user.UpdateFanProfileSocialResponse
- 24, // 72: topfans.user.UserSocialService.UpdateCrystalBalance:output_type -> topfans.user.UpdateCrystalBalanceResponse
- 26, // 73: topfans.user.UserSocialService.UpdateAssetsCount:output_type -> topfans.user.UpdateAssetsCountResponse
- 28, // 74: topfans.user.UserSocialService.GetCurrentUser:output_type -> topfans.user.GetCurrentUserResponse
- 30, // 75: topfans.user.UserSocialService.GetMyProfile:output_type -> topfans.user.GetMyProfileResponse
- 32, // 76: topfans.user.UserSocialService.UpdateNickname:output_type -> topfans.user.UpdateNicknameResponse
- 34, // 77: topfans.user.UserSocialService.UpdatePassword:output_type -> topfans.user.UpdatePasswordResponse
- 36, // 78: topfans.user.UserSocialService.UpdateAvatar:output_type -> topfans.user.UpdateAvatarResponse
- 38, // 79: topfans.user.UserSocialService.GetFanIdentities:output_type -> topfans.user.GetFanIdentitiesResponse
- 41, // 80: topfans.user.UserSocialService.GetMyFanIdentities:output_type -> topfans.user.GetMyFanIdentitiesResponse
- 43, // 81: topfans.user.UserSocialService.AddIdentity:output_type -> topfans.user.AddIdentityResponse
- 45, // 82: topfans.user.UserSocialService.SwitchIdentity:output_type -> topfans.user.SwitchIdentityResponse
- 62, // [62:83] is the sub-list for method output_type
- 41, // [41:62] is the sub-list for method input_type
- 41, // [41:41] is the sub-list for extension type_name
- 41, // [41:41] is the sub-list for extension extendee
- 0, // [0:41] is the sub-list for field type_name
+ 48, // 16: topfans.user.UpdateFanProfileSocialResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 17: topfans.user.UpdateCrystalBalanceResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 18: topfans.user.UpdateAssetsCountResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 19: topfans.user.AddExperienceResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 20: topfans.user.GetCurrentUserResponse.base:type_name -> topfans.common.BaseResponse
+ 0, // 21: topfans.user.GetCurrentUserResponse.user:type_name -> topfans.user.User
+ 1, // 22: topfans.user.GetCurrentUserResponse.fan_profile:type_name -> topfans.user.FanProfile
+ 1, // 23: topfans.user.GetCurrentUserResponse.fan_profiles:type_name -> topfans.user.FanProfile
+ 48, // 24: topfans.user.GetMyProfileResponse.base:type_name -> topfans.common.BaseResponse
+ 0, // 25: topfans.user.GetMyProfileResponse.user:type_name -> topfans.user.User
+ 1, // 26: topfans.user.GetMyProfileResponse.fan_profile:type_name -> topfans.user.FanProfile
+ 1, // 27: topfans.user.GetMyProfileResponse.fan_profiles:type_name -> topfans.user.FanProfile
+ 48, // 28: topfans.user.UpdateNicknameResponse.base:type_name -> topfans.common.BaseResponse
+ 1, // 29: topfans.user.UpdateNicknameResponse.fan_profile:type_name -> topfans.user.FanProfile
+ 48, // 30: topfans.user.UpdatePasswordResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 31: topfans.user.UpdateAvatarResponse.base:type_name -> topfans.common.BaseResponse
+ 48, // 32: topfans.user.GetFanIdentitiesResponse.base:type_name -> topfans.common.BaseResponse
+ 2, // 33: topfans.user.GetFanIdentitiesResponse.stars:type_name -> topfans.user.Star
+ 1, // 34: topfans.user.MyFanIdentityItem.fan_profile:type_name -> topfans.user.FanProfile
+ 2, // 35: topfans.user.MyFanIdentityItem.star:type_name -> topfans.user.Star
+ 48, // 36: topfans.user.GetMyFanIdentitiesResponse.base:type_name -> topfans.common.BaseResponse
+ 42, // 37: topfans.user.GetMyFanIdentitiesResponse.items:type_name -> topfans.user.MyFanIdentityItem
+ 48, // 38: topfans.user.AddIdentityResponse.base:type_name -> topfans.common.BaseResponse
+ 1, // 39: topfans.user.AddIdentityResponse.fan_profile:type_name -> topfans.user.FanProfile
+ 48, // 40: topfans.user.SwitchIdentityResponse.base:type_name -> topfans.common.BaseResponse
+ 1, // 41: topfans.user.SwitchIdentityResponse.fan_profile:type_name -> topfans.user.FanProfile
+ 3, // 42: topfans.user.UserSocialService.Register:input_type -> topfans.user.RegisterRequest
+ 5, // 43: topfans.user.UserSocialService.Login:input_type -> topfans.user.LoginRequest
+ 7, // 44: topfans.user.UserSocialService.RefreshToken:input_type -> topfans.user.RefreshTokenRequest
+ 9, // 45: topfans.user.UserSocialService.ValidateToken:input_type -> topfans.user.ValidateTokenRequest
+ 11, // 46: topfans.user.UserSocialService.Logout:input_type -> topfans.user.LogoutRequest
+ 13, // 47: topfans.user.UserSocialService.CheckNickname:input_type -> topfans.user.CheckNicknameRequest
+ 15, // 48: topfans.user.UserSocialService.CheckMobile:input_type -> topfans.user.CheckMobileRequest
+ 17, // 49: topfans.user.UserSocialService.GetUser:input_type -> topfans.user.GetUserRequest
+ 19, // 50: topfans.user.UserSocialService.GetFanProfile:input_type -> topfans.user.GetFanProfileRequest
+ 21, // 51: topfans.user.UserSocialService.UpdateFanProfileSocial:input_type -> topfans.user.UpdateFanProfileSocialRequest
+ 23, // 52: topfans.user.UserSocialService.UpdateCrystalBalance:input_type -> topfans.user.UpdateCrystalBalanceRequest
+ 25, // 53: topfans.user.UserSocialService.UpdateAssetsCount:input_type -> topfans.user.UpdateAssetsCountRequest
+ 27, // 54: topfans.user.UserSocialService.AddExperience:input_type -> topfans.user.AddExperienceRequest
+ 29, // 55: topfans.user.UserSocialService.GetCurrentUser:input_type -> topfans.user.GetCurrentUserRequest
+ 31, // 56: topfans.user.UserSocialService.GetMyProfile:input_type -> topfans.user.GetMyProfileRequest
+ 33, // 57: topfans.user.UserSocialService.UpdateNickname:input_type -> topfans.user.UpdateNicknameRequest
+ 35, // 58: topfans.user.UserSocialService.UpdatePassword:input_type -> topfans.user.UpdatePasswordRequest
+ 37, // 59: topfans.user.UserSocialService.UpdateAvatar:input_type -> topfans.user.UpdateAvatarRequest
+ 39, // 60: topfans.user.UserSocialService.GetFanIdentities:input_type -> topfans.user.GetFanIdentitiesRequest
+ 41, // 61: topfans.user.UserSocialService.GetMyFanIdentities:input_type -> topfans.user.GetMyFanIdentitiesRequest
+ 44, // 62: topfans.user.UserSocialService.AddIdentity:input_type -> topfans.user.AddIdentityRequest
+ 46, // 63: topfans.user.UserSocialService.SwitchIdentity:input_type -> topfans.user.SwitchIdentityRequest
+ 4, // 64: topfans.user.UserSocialService.Register:output_type -> topfans.user.RegisterResponse
+ 6, // 65: topfans.user.UserSocialService.Login:output_type -> topfans.user.LoginResponse
+ 8, // 66: topfans.user.UserSocialService.RefreshToken:output_type -> topfans.user.RefreshTokenResponse
+ 10, // 67: topfans.user.UserSocialService.ValidateToken:output_type -> topfans.user.ValidateTokenResponse
+ 12, // 68: topfans.user.UserSocialService.Logout:output_type -> topfans.user.LogoutResponse
+ 14, // 69: topfans.user.UserSocialService.CheckNickname:output_type -> topfans.user.CheckNicknameResponse
+ 16, // 70: topfans.user.UserSocialService.CheckMobile:output_type -> topfans.user.CheckMobileResponse
+ 18, // 71: topfans.user.UserSocialService.GetUser:output_type -> topfans.user.GetUserResponse
+ 20, // 72: topfans.user.UserSocialService.GetFanProfile:output_type -> topfans.user.GetFanProfileResponse
+ 22, // 73: topfans.user.UserSocialService.UpdateFanProfileSocial:output_type -> topfans.user.UpdateFanProfileSocialResponse
+ 24, // 74: topfans.user.UserSocialService.UpdateCrystalBalance:output_type -> topfans.user.UpdateCrystalBalanceResponse
+ 26, // 75: topfans.user.UserSocialService.UpdateAssetsCount:output_type -> topfans.user.UpdateAssetsCountResponse
+ 28, // 76: topfans.user.UserSocialService.AddExperience:output_type -> topfans.user.AddExperienceResponse
+ 30, // 77: topfans.user.UserSocialService.GetCurrentUser:output_type -> topfans.user.GetCurrentUserResponse
+ 32, // 78: topfans.user.UserSocialService.GetMyProfile:output_type -> topfans.user.GetMyProfileResponse
+ 34, // 79: topfans.user.UserSocialService.UpdateNickname:output_type -> topfans.user.UpdateNicknameResponse
+ 36, // 80: topfans.user.UserSocialService.UpdatePassword:output_type -> topfans.user.UpdatePasswordResponse
+ 38, // 81: topfans.user.UserSocialService.UpdateAvatar:output_type -> topfans.user.UpdateAvatarResponse
+ 40, // 82: topfans.user.UserSocialService.GetFanIdentities:output_type -> topfans.user.GetFanIdentitiesResponse
+ 43, // 83: topfans.user.UserSocialService.GetMyFanIdentities:output_type -> topfans.user.GetMyFanIdentitiesResponse
+ 45, // 84: topfans.user.UserSocialService.AddIdentity:output_type -> topfans.user.AddIdentityResponse
+ 47, // 85: topfans.user.UserSocialService.SwitchIdentity:output_type -> topfans.user.SwitchIdentityResponse
+ 64, // [64:86] is the sub-list for method output_type
+ 42, // [42:64] is the sub-list for method input_type
+ 42, // [42:42] is the sub-list for extension type_name
+ 42, // [42:42] is the sub-list for extension extendee
+ 0, // [0:42] is the sub-list for field type_name
}
func init() { file_user_proto_init() }
@@ -3090,7 +3217,7 @@ func file_user_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_user_proto_rawDesc), len(file_user_proto_rawDesc)),
NumEnums: 0,
- NumMessages: 46,
+ NumMessages: 48,
NumExtensions: 0,
NumServices: 1,
},
diff --git a/backend/pkg/proto/user/user.triple.go b/backend/pkg/proto/user/user.triple.go
index 8d42125..57edcab 100644
--- a/backend/pkg/proto/user/user.triple.go
+++ b/backend/pkg/proto/user/user.triple.go
@@ -1,6 +1,6 @@
// Code generated by protoc-gen-triple. DO NOT EDIT.
//
-// Source: proto/user.proto
+// Source: user.proto
package user
import (
@@ -60,6 +60,8 @@ const (
UserSocialServiceUpdateCrystalBalanceProcedure = "/topfans.user.UserSocialService/UpdateCrystalBalance"
// UserSocialServiceUpdateAssetsCountProcedure is the fully-qualified name of the UserSocialService's UpdateAssetsCount RPC.
UserSocialServiceUpdateAssetsCountProcedure = "/topfans.user.UserSocialService/UpdateAssetsCount"
+ // UserSocialServiceAddExperienceProcedure is the fully-qualified name of the UserSocialService's AddExperience RPC.
+ UserSocialServiceAddExperienceProcedure = "/topfans.user.UserSocialService/AddExperience"
// 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.
@@ -98,6 +100,7 @@ type UserSocialService interface {
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)
+ AddExperience(ctx context.Context, req *AddExperienceRequest, opts ...client.CallOption) (*AddExperienceResponse, 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)
@@ -225,6 +228,14 @@ func (c *UserSocialServiceImpl) UpdateAssetsCount(ctx context.Context, req *Upda
return resp, nil
}
+func (c *UserSocialServiceImpl) AddExperience(ctx context.Context, req *AddExperienceRequest, opts ...client.CallOption) (*AddExperienceResponse, error) {
+ resp := new(AddExperienceResponse)
+ if err := c.conn.CallUnary(ctx, []interface{}{req}, resp, "AddExperience", 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 {
@@ -299,7 +310,7 @@ func (c *UserSocialServiceImpl) SwitchIdentity(ctx context.Context, req *SwitchI
var UserSocialService_ClientInfo = client.ClientInfo{
InterfaceName: "topfans.user.UserSocialService",
- MethodNames: []string{"Register", "Login", "RefreshToken", "ValidateToken", "Logout", "CheckNickname", "CheckMobile", "GetUser", "GetFanProfile", "UpdateFanProfileSocial", "UpdateCrystalBalance", "UpdateAssetsCount", "GetCurrentUser", "GetMyProfile", "UpdateNickname", "UpdatePassword", "UpdateAvatar", "GetFanIdentities", "GetMyFanIdentities", "AddIdentity", "SwitchIdentity"},
+ MethodNames: []string{"Register", "Login", "RefreshToken", "ValidateToken", "Logout", "CheckNickname", "CheckMobile", "GetUser", "GetFanProfile", "UpdateFanProfileSocial", "UpdateCrystalBalance", "UpdateAssetsCount", "AddExperience", "GetCurrentUser", "GetMyProfile", "UpdateNickname", "UpdatePassword", "UpdateAvatar", "GetFanIdentities", "GetMyFanIdentities", "AddIdentity", "SwitchIdentity"},
ConnectionInjectFunc: func(dubboCliRaw interface{}, conn *client.Connection) {
dubboCli := dubboCliRaw.(*UserSocialServiceImpl)
dubboCli.conn = conn
@@ -320,6 +331,7 @@ type UserSocialServiceHandler interface {
UpdateFanProfileSocial(context.Context, *UpdateFanProfileSocialRequest) (*UpdateFanProfileSocialResponse, error)
UpdateCrystalBalance(context.Context, *UpdateCrystalBalanceRequest) (*UpdateCrystalBalanceResponse, error)
UpdateAssetsCount(context.Context, *UpdateAssetsCountRequest) (*UpdateAssetsCountResponse, error)
+ AddExperience(context.Context, *AddExperienceRequest) (*AddExperienceResponse, error)
GetCurrentUser(context.Context, *GetCurrentUserRequest) (*GetCurrentUserResponse, error)
GetMyProfile(context.Context, *GetMyProfileRequest) (*GetMyProfileResponse, error)
UpdateNickname(context.Context, *UpdateNicknameRequest) (*UpdateNicknameResponse, error)
@@ -523,6 +535,21 @@ var UserSocialService_ServiceInfo = server.ServiceInfo{
return triple_protocol.NewResponse(res), nil
},
},
+ {
+ Name: "AddExperience",
+ Type: constant.CallUnary,
+ ReqInitFunc: func() interface{} {
+ return new(AddExperienceRequest)
+ },
+ MethodFunc: func(ctx context.Context, args []interface{}, handler interface{}) (interface{}, error) {
+ req := args[0].(*AddExperienceRequest)
+ res, err := handler.(UserSocialServiceHandler).AddExperience(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+ return triple_protocol.NewResponse(res), nil
+ },
+ },
{
Name: "GetCurrentUser",
Type: constant.CallUnary,
diff --git a/backend/proto/task.proto b/backend/proto/task.proto
index 28891ef..6ba5c48 100644
--- a/backend/proto/task.proto
+++ b/backend/proto/task.proto
@@ -51,6 +51,8 @@ message ClaimDailyTaskRequest {
message ClaimDailyTaskResponse {
topfans.common.BaseResponse base = 1;
bool success = 2;
+ int64 crystal_balance = 3;
+ int64 experience = 4;
}
message ClaimAllDailyTasksRequest {
@@ -60,6 +62,9 @@ message ClaimAllDailyTasksRequest {
message ClaimAllDailyTasksResponse {
topfans.common.BaseResponse base = 1;
int32 claimed_count = 2;
+ int64 crystal_balance = 3;
+ int64 experience = 4;
+ repeated string claimed_task_keys = 5;
}
// ==================== 引导任务 ====================
diff --git a/backend/services/taskService/client/user_rpc_client.go b/backend/services/taskService/client/user_rpc_client.go
index 15ed003..43f0303 100644
--- a/backend/services/taskService/client/user_rpc_client.go
+++ b/backend/services/taskService/client/user_rpc_client.go
@@ -2,7 +2,9 @@ package client
import (
"context"
+ "fmt"
"github.com/topfans/backend/pkg/logger"
+ pbCommon "github.com/topfans/backend/pkg/proto/common"
pbUser "github.com/topfans/backend/pkg/proto/user"
"go.uber.org/zap"
)
@@ -10,6 +12,7 @@ import (
type UserServiceClient interface {
UpdateCrystalBalance(ctx context.Context, userID, starID int64, delta int64) (int64, error)
AddExperience(ctx context.Context, userID, starID int64, delta int64) (int64, error)
+ GetFanProfile(ctx context.Context, userID, starID int64) (*pbUser.FanProfile, error)
}
type userServiceClient struct {
@@ -30,9 +33,9 @@ func (c *userServiceClient) UpdateCrystalBalance(ctx context.Context, userID, st
logger.Logger.Error("UserService.UpdateCrystalBalance failed", zap.Error(err))
return 0, err
}
- if resp.Base.Code != 0 {
+ if resp.Base.Code != pbCommon.StatusCode_STATUS_OK {
logger.Logger.Warn("UpdateCrystalBalance non-zero code", zap.Int32("code", int32(resp.Base.Code)))
- return 0, err
+ return 0, fmt.Errorf("UpdateCrystalBalance failed with code: %d", resp.Base.Code)
}
return resp.NewBalance, nil
}
@@ -47,9 +50,27 @@ func (c *userServiceClient) AddExperience(ctx context.Context, userID, starID in
logger.Logger.Error("UserService.AddExperience failed", zap.Error(err))
return 0, err
}
- if resp.Base.Code != 0 {
+ if resp.Base.Code != pbCommon.StatusCode_STATUS_OK {
logger.Logger.Warn("AddExperience non-zero code", zap.Int32("code", int32(resp.Base.Code)))
- return 0, err
+ return 0, fmt.Errorf("AddExperience failed with code: %d", resp.Base.Code)
}
return resp.NewExperience, nil
}
+
+func (c *userServiceClient) GetFanProfile(ctx context.Context, userID, starID int64) (*pbUser.FanProfile, error) {
+ logger.Logger.Debug("Calling UserService.GetFanProfile",
+ zap.Int64("user_id", userID), zap.Int64("star_id", starID))
+ resp, err := c.client.GetFanProfile(ctx, &pbUser.GetFanProfileRequest{
+ UserId: userID,
+ StarId: starID,
+ })
+ if err != nil {
+ logger.Logger.Error("UserService.GetFanProfile failed", zap.Error(err))
+ return nil, err
+ }
+ if resp.Base.Code != pbCommon.StatusCode_STATUS_OK {
+ logger.Logger.Warn("GetFanProfile non-zero code", zap.Int32("code", int32(resp.Base.Code)))
+ return nil, fmt.Errorf("GetFanProfile failed with code: %d", resp.Base.Code)
+ }
+ return resp.Profile, nil
+}
diff --git a/backend/services/taskService/main.go b/backend/services/taskService/main.go
index 4467706..b6dcab5 100644
--- a/backend/services/taskService/main.go
+++ b/backend/services/taskService/main.go
@@ -14,6 +14,7 @@ import (
"github.com/topfans/backend/pkg/database"
"github.com/topfans/backend/pkg/logger"
+ pb "github.com/topfans/backend/pkg/proto/task"
pbUser "github.com/topfans/backend/pkg/proto/user"
"github.com/topfans/backend/services/taskService/client"
"github.com/topfans/backend/services/taskService/config"
@@ -24,11 +25,9 @@ import (
"github.com/topfans/backend/services/taskService/worker"
)
-var port = flag.Int("port", 20005, "Dubbo service port")
+var port = flag.Int("port", 20006, "Dubbo service port")
func main() {
- flag.Parse()
-
// 1. Init logger(必须最前)
env := os.Getenv("ENV")
if env == "" {
@@ -106,7 +105,7 @@ func main() {
internalProvider := provider.NewTaskInternalProvider(onboardingSvc, revenueSvc)
logger.Logger.Info("Providers initialized")
- // 9. Create Dubbo server on port 20005
+ // 9. Create Dubbo server on port 20006
srv, err := server.NewServer(
server.WithServerProtocol(
protocol.WithPort(*port),
@@ -117,13 +116,23 @@ func main() {
logger.Logger.Fatal(fmt.Sprintf("Failed to create server: %v", err))
}
- // 注意:这里需要 TaskMobileService 和 TaskInternalService 的 RegisterHandler
- // 这些会在 proto 编译后生成。在 proto 编译之前,这里会报编译错误。
- // Task 15 完成 proto 编译后,需要将下面的注释替换为实际的注册代码。
+ // 注册 Dubbo 服务
+ if err := pb.RegisterTaskMobileServiceHandler(srv, mobileProvider); err != nil {
+ logger.Logger.Fatal(fmt.Sprintf("Failed to register TaskMobileService: %v", err))
+ }
+ if err := pb.RegisterTaskInternalServiceHandler(srv, internalProvider); err != nil {
+ logger.Logger.Fatal(fmt.Sprintf("Failed to register TaskInternalService: %v", err))
+ }
- logger.Logger.Info(fmt.Sprintf("taskService configured on port %d, awaiting proto registration", *port))
+ // 10. Start server (non-blocking)
+ go func() {
+ if err := srv.Serve(); err != nil {
+ logger.Logger.Fatal(fmt.Sprintf("Failed to serve: %v", err))
+ }
+ }()
+ logger.Logger.Info(fmt.Sprintf("taskService listening on port %d", *port))
- // 10. Graceful shutdown
+ // Graceful shutdown
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
diff --git a/backend/services/taskService/model/task_models.go b/backend/services/taskService/model/task_models.go
index d907b0a..3ff41bd 100644
--- a/backend/services/taskService/model/task_models.go
+++ b/backend/services/taskService/model/task_models.go
@@ -47,17 +47,23 @@ type UserOnboardingProgress struct {
func (UserOnboardingProgress) TableName() string { return "user_onboarding_progress" }
-// UserOnboardingStatus 引导流程状态表(per-user,非 per-star)
+// UserOnboardingStatus 引导流程状态表(per-user per-star)
type UserOnboardingStatus struct {
- UserID int64 `gorm:"primaryKey;column:user_id"`
- CurrentStage int `gorm:"column:current_stage;default:0"`
- Status string `gorm:"column:status;size:20;default:pending"`
- IsFirstLoginBonusClaimed bool `gorm:"column:is_first_login_bonus_claimed;default:false"` // 废弃字段
- HasFriendDisplayBonus bool `gorm:"column:has_friend_display_bonus;default:false"` // 废弃字段
- CompletedAt *int64 `gorm:"column:completed_at"`
- ClaimedAt *int64 `gorm:"column:claimed_at"`
+ ID int64 `gorm:"primaryKey;column:id;autoIncrement"`
+ UserID int64 `gorm:"column:user_id;not null;uniqueIndex:uk_user_star_onboarding"`
+ StarID int64 `gorm:"column:star_id;not null;uniqueIndex:uk_user_star_onboarding"`
+ IsOnboardingCompleted bool `gorm:"column:is_onboarding_completed;default:false"`
+ IsOnboardingClaimed bool `gorm:"column:is_onboarding_claimed;default:false"`
+ HasFriendDisplayBonus bool `gorm:"column:has_friend_display_bonus;default:false"`
+ OnboardingCompletedAt *int64 `gorm:"column:onboarding_completed_at"`
+ OnboardingClaimedAt *int64 `gorm:"column:onboarding_claimed_at"`
CreatedAt int64 `gorm:"column:created_at"`
UpdatedAt int64 `gorm:"column:updated_at"`
+ CurrentStage int64 `gorm:"column:current_stage;default:0"`
+ Status string `gorm:"column:status;size:20;default:pending"`
+ IsFirstLoginBonusClaimed bool `gorm:"column:is_first_login_bonus_claimed;default:false"` // 废弃字段
+ CompletedAt *int64 `gorm:"column:completed_at"` // 废弃字段
+ ClaimedAt *int64 `gorm:"column:claimed_at"` // 废弃字段
}
func (UserOnboardingStatus) TableName() string { return "user_onboarding_status" }
@@ -68,7 +74,7 @@ type OnboardingStageConfig struct {
Stage int `gorm:"column:stage;not null;uniqueIndex"`
Name string `gorm:"column:name;size:100;not null"`
Description string `gorm:"column:description;type:text"`
- RequiredTaskKeys []string `gorm:"column:required_task_keys;text[]"` // PostgreSQL 数组
+ RequiredTaskKeys []string `gorm:"column:required_task_keys;type:text;serializer:json"` // 存储为 JSON 字符串
CrystalReward int64 `gorm:"column:crystal_reward;default:0"`
ExpReward int64 `gorm:"column:exp_reward;default:0"`
SortOrder int `gorm:"column:sort_order;default:0"`
diff --git a/backend/services/taskService/provider/task_mobile_provider.go b/backend/services/taskService/provider/task_mobile_provider.go
index 5601de0..35a5639 100644
--- a/backend/services/taskService/provider/task_mobile_provider.go
+++ b/backend/services/taskService/provider/task_mobile_provider.go
@@ -5,6 +5,7 @@ import (
"fmt"
"strconv"
+ "dubbo.apache.org/dubbo-go/v3/common/constant"
"github.com/topfans/backend/pkg/logger"
pb "github.com/topfans/backend/pkg/proto/task"
"github.com/topfans/backend/services/taskService/service"
@@ -33,11 +34,10 @@ func NewTaskMobileProvider(
// extractUserInfoFromDubboAttachments 从 Dubbo attachments 提取用户信息
func extractUserInfoFromDubboAttachments(ctx context.Context) (int64, int64, error) {
// Dubbo-go 使用 constant.AttachmentKey 获取 attachments
- // 但这里使用通用的 context.Value 方式
- if attachments := ctx.Value("attachments"); attachments != nil {
+ if attachments := ctx.Value(constant.AttachmentKey); attachments != nil {
if attMap, ok := attachments.(map[string]interface{}); ok {
userID, starID := extractUserInfoFromMap(attMap)
- if userID > 0 && starID > 0 {
+ if userID > 0 {
return userID, starID, nil
}
}
@@ -59,6 +59,12 @@ func extractUserInfoFromMap(attMap map[string]interface{}) (int64, int64) {
if parsed, err := strconv.ParseInt(v, 10, 64); err == nil {
userID = parsed
}
+ case []string:
+ if len(v) > 0 {
+ if parsed, err := strconv.ParseInt(v[0], 10, 64); err == nil {
+ userID = parsed
+ }
+ }
}
}
@@ -72,6 +78,12 @@ func extractUserInfoFromMap(attMap map[string]interface{}) (int64, int64) {
if parsed, err := strconv.ParseInt(v, 10, 64); err == nil {
starID = parsed
}
+ case []string:
+ if len(v) > 0 {
+ if parsed, err := strconv.ParseInt(v[0], 10, 64); err == nil {
+ starID = parsed
+ }
+ }
}
}
@@ -155,20 +167,21 @@ func (p *TaskMobileProvider) CompleteGuide(ctx context.Context, req *pb.Complete
}
func (p *TaskMobileProvider) GetOnboardingStatus(ctx context.Context, req *pb.GetOnboardingStatusRequest) (*pb.GetOnboardingStatusResponse, error) {
- userID, _, err := extractUserInfoFromDubboAttachments(ctx)
+ userID, starID, err := extractUserInfoFromDubboAttachments(ctx)
if err != nil {
logger.Logger.Error("GetOnboardingStatus: failed to extract user", zap.Error(err))
return &pb.GetOnboardingStatusResponse{}, nil
}
logger.Logger.Debug("GetOnboardingStatus",
- zap.Int64("user_id", userID))
+ zap.Int64("user_id", userID),
+ zap.Int64("star_id", starID))
- return p.onboardingSvc.GetOnboardingStatus(ctx, userID)
+ return p.onboardingSvc.GetOnboardingStatus(ctx, userID, starID)
}
func (p *TaskMobileProvider) AdvanceStage(ctx context.Context, req *pb.AdvanceStageRequest) (*pb.AdvanceStageResponse, error) {
- userID, _, err := extractUserInfoFromDubboAttachments(ctx)
+ userID, starID, err := extractUserInfoFromDubboAttachments(ctx)
if err != nil {
logger.Logger.Error("AdvanceStage: failed to extract user", zap.Error(err))
return &pb.AdvanceStageResponse{}, nil
@@ -176,13 +189,14 @@ func (p *TaskMobileProvider) AdvanceStage(ctx context.Context, req *pb.AdvanceSt
logger.Logger.Debug("AdvanceStage",
zap.Int64("user_id", userID),
+ zap.Int64("star_id", starID),
zap.Int32("target_stage", req.TargetStage))
- return p.onboardingSvc.AdvanceStage(ctx, userID, req.TargetStage)
+ return p.onboardingSvc.AdvanceStage(ctx, userID, starID, req.TargetStage)
}
func (p *TaskMobileProvider) ClaimOnboardingReward(ctx context.Context, req *pb.ClaimOnboardingRewardRequest) (*pb.ClaimOnboardingRewardResponse, error) {
- userID, _, err := extractUserInfoFromDubboAttachments(ctx)
+ userID, starID, err := extractUserInfoFromDubboAttachments(ctx)
if err != nil {
logger.Logger.Error("ClaimOnboardingReward: failed to extract user", zap.Error(err))
return &pb.ClaimOnboardingRewardResponse{Success: false}, nil
@@ -190,9 +204,10 @@ func (p *TaskMobileProvider) ClaimOnboardingReward(ctx context.Context, req *pb.
logger.Logger.Debug("ClaimOnboardingReward",
zap.Int64("user_id", userID),
+ zap.Int64("star_id", starID),
zap.Int32("stage", req.Stage))
- return p.onboardingSvc.ClaimOnboardingReward(ctx, userID, req.Stage)
+ return p.onboardingSvc.ClaimOnboardingReward(ctx, userID, starID, req.Stage)
}
func (p *TaskMobileProvider) GetExhibitionRevenue(ctx context.Context, req *pb.GetExhibitionRevenueRequest) (*pb.GetExhibitionRevenueResponse, error) {
diff --git a/backend/services/taskService/repository/daily_task_repo.go b/backend/services/taskService/repository/daily_task_repo.go
index 45ea551..085c327 100644
--- a/backend/services/taskService/repository/daily_task_repo.go
+++ b/backend/services/taskService/repository/daily_task_repo.go
@@ -16,6 +16,8 @@ type DailyTaskRepository interface {
GetOrCreateDailyProgress(userID, starID int64, taskKey string, def *model.TaskDefinition) (*model.UserDailyTaskProgress, error)
// ListDailyTasksByUser 获取用户的所有每日任务进度
ListDailyTasksByUser(userID, starID int64) ([]*model.UserDailyTaskProgress, error)
+ // ListCompletedDailyTasks 获取用户已完成但未领取的每日任务进度
+ ListCompletedDailyTasks(userID, starID int64) ([]*model.UserDailyTaskProgress, error)
// ListActiveDailyTaskDefinitions 获取所有活跃的每日任务定义(包括star特定和全局默认)
ListActiveDailyTaskDefinitions(starID int64) ([]*model.TaskDefinition, error)
// UpdateDailyProgress 更新每日任务进度
@@ -96,6 +98,15 @@ func (r *dailyTaskRepository) ListDailyTasksByUser(userID, starID int64) ([]*mod
return progressList, err
}
+// ListCompletedDailyTasks 获取用户已完成但未领取的每日任务进度
+func (r *dailyTaskRepository) ListCompletedDailyTasks(userID, starID int64) ([]*model.UserDailyTaskProgress, error) {
+ var progressList []*model.UserDailyTaskProgress
+ err := r.db.Where("user_id = ? AND star_id = ? AND status = ?", userID, starID, "completed").
+ Order("id ASC").
+ Find(&progressList).Error
+ return progressList, err
+}
+
// ListActiveDailyTaskDefinitions 获取所有活跃的每日任务定义(包括star特定和全局默认)
func (r *dailyTaskRepository) ListActiveDailyTaskDefinitions(starID int64) ([]*model.TaskDefinition, error) {
var definitions []*model.TaskDefinition
diff --git a/backend/services/taskService/repository/onboarding_repo.go b/backend/services/taskService/repository/onboarding_repo.go
index c08cfd9..2893801 100644
--- a/backend/services/taskService/repository/onboarding_repo.go
+++ b/backend/services/taskService/repository/onboarding_repo.go
@@ -1,6 +1,9 @@
package repository
import (
+ "errors"
+ "time"
+
"github.com/topfans/backend/pkg/logger"
"github.com/topfans/backend/services/taskService/model"
"go.uber.org/zap"
@@ -8,14 +11,15 @@ import (
)
type OnboardingRepository interface {
- GetOnboardingStatus(userID int64) (*model.UserOnboardingStatus, error)
- GetOrCreateOnboardingStatus(userID int64) (*model.UserOnboardingStatus, error)
+ GetOnboardingStatus(userID int64, starID int64) (*model.UserOnboardingStatus, error)
+ GetOrCreateOnboardingStatus(userID int64, starID int64) (*model.UserOnboardingStatus, error)
UpdateOnboardingStatus(status *model.UserOnboardingStatus) error
+ UpdateOnboardingProgress(progress *model.UserOnboardingProgress) error
GetUserOnboardingProgress(userID int64, taskKey string) (*model.UserOnboardingProgress, error)
GetOrCreateOnboardingProgress(userID int64, taskKey string) (*model.UserOnboardingProgress, error)
ListActiveStageConfigs() ([]*model.OnboardingStageConfig, error)
ListUserOnboardingProgressByUser(userID int64) ([]*model.UserOnboardingProgress, error)
- GetStageConfig(stage int) (*model.OnboardingStageConfig, error)
+ GetStageConfig(stage int64) (*model.OnboardingStageConfig, error)
}
type onboardingRepository struct {
@@ -26,34 +30,43 @@ func NewOnboardingRepository(db *gorm.DB) OnboardingRepository {
return &onboardingRepository{db: db}
}
-func (r *onboardingRepository) GetOnboardingStatus(userID int64) (*model.UserOnboardingStatus, error) {
+func (r *onboardingRepository) GetOnboardingStatus(userID int64, starID int64) (*model.UserOnboardingStatus, error) {
var status model.UserOnboardingStatus
- err := r.db.Where("user_id = ?", userID).First(&status).Error
+ err := r.db.Where("user_id = ? AND star_id = ?", userID, starID).First(&status).Error
if err != nil {
return nil, err
}
return &status, nil
}
-func (r *onboardingRepository) GetOrCreateOnboardingStatus(userID int64) (*model.UserOnboardingStatus, error) {
+func (r *onboardingRepository) GetOrCreateOnboardingStatus(userID int64, starID int64) (*model.UserOnboardingStatus, error) {
var status model.UserOnboardingStatus
- now := gorm.NowFunc().Unix()
- err := r.db.Where("user_id = ?", userID).FirstOrCreate(&status, &model.UserOnboardingStatus{
- UserID: userID,
+ err := r.db.Where("user_id = ? AND star_id = ?", userID, starID).First(&status).Error
+ if err == nil {
+ return &status, nil
+ }
+ if !errors.Is(err, gorm.ErrRecordNotFound) {
+ logger.Logger.Error("Failed to GetOrCreateOnboardingStatus", zap.Int64("user_id", userID), zap.Int64("star_id", starID), zap.Error(err))
+ return nil, err
+ }
+ now := time.Now().Unix()
+ status = model.UserOnboardingStatus{
+ UserID: userID,
+ StarID: starID,
CurrentStage: 0,
- Status: "pending",
- CreatedAt: now,
- UpdatedAt: now,
- }).Error
- if err != nil {
- logger.Logger.Error("Failed to GetOrCreateOnboardingStatus", zap.Int64("user_id", userID), zap.Error(err))
+ Status: "pending",
+ CreatedAt: now,
+ UpdatedAt: now,
+ }
+ if err := r.db.Create(&status).Error; err != nil {
+ logger.Logger.Error("Failed to Create OnboardingStatus", zap.Int64("user_id", userID), zap.Int64("star_id", starID), zap.Error(err))
return nil, err
}
return &status, nil
}
func (r *onboardingRepository) UpdateOnboardingStatus(status *model.UserOnboardingStatus) error {
- status.UpdatedAt = gorm.NowFunc().Unix()
+ status.UpdatedAt = time.Now().Unix()
if err := r.db.Save(status).Error; err != nil {
logger.Logger.Error("Failed to UpdateOnboardingStatus", zap.Int64("user_id", status.UserID), zap.Error(err))
return err
@@ -61,6 +74,15 @@ func (r *onboardingRepository) UpdateOnboardingStatus(status *model.UserOnboardi
return nil
}
+func (r *onboardingRepository) UpdateOnboardingProgress(progress *model.UserOnboardingProgress) error {
+ progress.UpdatedAt = time.Now().Unix()
+ if err := r.db.Save(progress).Error; err != nil {
+ logger.Logger.Error("Failed to UpdateOnboardingProgress", zap.Int64("user_id", progress.UserID), zap.String("task_key", progress.TaskKey), zap.Error(err))
+ return err
+ }
+ return nil
+}
+
func (r *onboardingRepository) GetUserOnboardingProgress(userID int64, taskKey string) (*model.UserOnboardingProgress, error) {
var progress model.UserOnboardingProgress
err := r.db.Where("user_id = ? AND task_key = ?", userID, taskKey).First(&progress).Error
@@ -72,16 +94,24 @@ func (r *onboardingRepository) GetUserOnboardingProgress(userID int64, taskKey s
func (r *onboardingRepository) GetOrCreateOnboardingProgress(userID int64, taskKey string) (*model.UserOnboardingProgress, error) {
var progress model.UserOnboardingProgress
- now := gorm.NowFunc().Unix()
- err := r.db.Where("user_id = ? AND task_key = ?", userID, taskKey).FirstOrCreate(&progress, &model.UserOnboardingProgress{
+ err := r.db.Where("user_id = ? AND task_key = ?", userID, taskKey).First(&progress).Error
+ if err == nil {
+ return &progress, nil
+ }
+ if !errors.Is(err, gorm.ErrRecordNotFound) {
+ logger.Logger.Error("Failed to GetOrCreateOnboardingProgress", zap.Int64("user_id", userID), zap.String("task_key", taskKey), zap.Error(err))
+ return nil, err
+ }
+ now := time.Now().Unix()
+ progress = model.UserOnboardingProgress{
UserID: userID,
TaskKey: taskKey,
Status: "pending",
CreatedAt: now,
UpdatedAt: now,
- }).Error
- if err != nil {
- logger.Logger.Error("Failed to GetOrCreateOnboardingProgress", zap.Int64("user_id", userID), zap.String("task_key", taskKey), zap.Error(err))
+ }
+ if err := r.db.Create(&progress).Error; err != nil {
+ logger.Logger.Error("Failed to Create OnboardingProgress", zap.Int64("user_id", userID), zap.String("task_key", taskKey), zap.Error(err))
return nil, err
}
return &progress, nil
@@ -107,7 +137,7 @@ func (r *onboardingRepository) ListUserOnboardingProgressByUser(userID int64) ([
return progressList, nil
}
-func (r *onboardingRepository) GetStageConfig(stage int) (*model.OnboardingStageConfig, error) {
+func (r *onboardingRepository) GetStageConfig(stage int64) (*model.OnboardingStageConfig, error) {
var config model.OnboardingStageConfig
err := r.db.Where("stage = ? AND is_active = ?", stage, true).First(&config).Error
if err != nil {
diff --git a/backend/services/taskService/repository/revenue_repo.go b/backend/services/taskService/repository/revenue_repo.go
index d58dad1..a3aeae6 100644
--- a/backend/services/taskService/repository/revenue_repo.go
+++ b/backend/services/taskService/repository/revenue_repo.go
@@ -1,6 +1,8 @@
package repository
import (
+ "time"
+
"github.com/topfans/backend/pkg/logger"
"github.com/topfans/backend/services/taskService/model"
"go.uber.org/zap"
@@ -25,7 +27,7 @@ func NewRevenueRepository(db *gorm.DB) RevenueRepository {
}
func (r *revenueRepository) CreateRevenueRecord(record *model.ExhibitionRevenueRecord) (*model.ExhibitionRevenueRecord, error) {
- record.CreatedAt = gorm.NowFunc().Unix()
+ record.CreatedAt = time.Now().Unix()
if err := r.db.Create(record).Error; err != nil {
logger.Logger.Error("Failed to CreateRevenueRecord", zap.Int64("user_id", record.UserID), zap.Error(err))
return nil, err
@@ -66,7 +68,7 @@ func (r *revenueRepository) ListRevenueByUser(userID, starID int64, status strin
func (r *revenueRepository) ClaimRevenueRecord(id int64, userID int64) (bool, error) {
// 乐观锁:只有在 status='claimable' 时才更新
- now := gorm.NowFunc().Unix()
+ now := time.Now().Unix()
result := r.db.Model(&model.ExhibitionRevenueRecord{}).
Where("id = ? AND user_id = ? AND status = ?", id, userID, "claimable").
Updates(map[string]interface{}{
diff --git a/backend/services/taskService/worker/daily_reset_worker.go b/backend/services/taskService/worker/daily_reset_worker.go
index 0b81255..cfc160a 100644
--- a/backend/services/taskService/worker/daily_reset_worker.go
+++ b/backend/services/taskService/worker/daily_reset_worker.go
@@ -87,9 +87,7 @@ func (w *DailyResetWorker) doResetAndAutoClaim() {
return
}
defer func() {
- if err := w.dailyRepo.ReleaseAdvisoryLock(lockID); err != nil {
- logger.Logger.Error("DailyResetWorker: failed to release advisory lock", zap.Error(err))
- }
+ w.dailyRepo.ReleaseAdvisoryLock(lockID)
}()
// 1. 重置每日任务
diff --git a/backend/services/userService/provider/unified_provider.go b/backend/services/userService/provider/unified_provider.go
index 44fc680..d9699c5 100644
--- a/backend/services/userService/provider/unified_provider.go
+++ b/backend/services/userService/provider/unified_provider.go
@@ -144,3 +144,8 @@ func (p *UnifiedProvider) UpdateCrystalBalance(ctx context.Context, req *pb.Upda
func (p *UnifiedProvider) UpdateAssetsCount(ctx context.Context, req *pb.UpdateAssetsCountRequest) (*pb.UpdateAssetsCountResponse, error) {
return p.userProvider.UpdateAssetsCount(ctx, req)
}
+
+// AddExperience 增加经验值(内部RPC调用)
+func (p *UnifiedProvider) AddExperience(ctx context.Context, req *pb.AddExperienceRequest) (*pb.AddExperienceResponse, error) {
+ return p.userProvider.AddExperience(ctx, req)
+}
diff --git a/backend/services/userService/provider/user_provider.go b/backend/services/userService/provider/user_provider.go
index 09cf54f..a0e1371 100644
--- a/backend/services/userService/provider/user_provider.go
+++ b/backend/services/userService/provider/user_provider.go
@@ -851,3 +851,47 @@ func (p *UserProvider) UpdateAssetsCount(ctx context.Context, req *pb.UpdateAsse
return resp, nil
}
+
+// AddExperience 增加经验值(内部RPC调用)
+func (p *UserProvider) AddExperience(ctx context.Context, req *pb.AddExperienceRequest) (*pb.AddExperienceResponse, error) {
+ logger.Logger.Info("Received AddExperience request",
+ zap.Int64("user_id", req.UserId),
+ zap.Int64("star_id", req.StarId),
+ zap.Int64("delta", req.Delta),
+ )
+
+ // 调用Service层
+ resp, err := p.userService.AddExperience(req)
+ if err != nil {
+ logger.Logger.Error("AddExperience failed",
+ zap.Int64("user_id", req.UserId),
+ zap.Int64("star_id", req.StarId),
+ zap.Int64("delta", req.Delta),
+ zap.Error(err),
+ )
+
+ // 如果响应为空,构建错误响应
+ if resp == nil {
+ resp = &pb.AddExperienceResponse{
+ Base: &pbCommon.BaseResponse{
+ Code: appErrors.ToStatusCode(err),
+ Message: err.Error(),
+ Timestamp: 0,
+ },
+ }
+ }
+
+ return resp, err
+ }
+
+ logger.Logger.Info("AddExperience successful",
+ zap.Int64("user_id", req.UserId),
+ zap.Int64("star_id", req.StarId),
+ zap.Int64("delta", req.Delta),
+ zap.Int64("new_experience", resp.NewExperience),
+ )
+
+ return resp, nil
+}
+
+// UpdateAvatar 更新用户头像
diff --git a/backend/services/userService/repository/fan_profile_repository.go b/backend/services/userService/repository/fan_profile_repository.go
index 68a78a9..25ed663 100644
--- a/backend/services/userService/repository/fan_profile_repository.go
+++ b/backend/services/userService/repository/fan_profile_repository.go
@@ -53,6 +53,9 @@ type FanProfileRepository interface {
// UpdateCrystalBalance 更新水晶余额
UpdateCrystalBalance(userID, starID int64, delta int64) (int64, error)
+ // UpdateExperience 更新经验值
+ UpdateExperience(userID, starID int64, delta int64) (int64, error)
+
// UpdateAvatar 更新头像
UpdateAvatar(userID, starID int64, avatarURL string) error
}
@@ -384,7 +387,57 @@ func (r *fanProfileRepository) UpdateCrystalBalance(userID, starID int64, delta
return 0, err
}
- return newBalance, nil
+return newBalance, nil
+}
+
+// UpdateExperience 更新经验值
+// delta: 变化量,正数表示增加,负数表示减少
+// 返回: 更新后的经验值
+func (r *fanProfileRepository) UpdateExperience(userID, starID int64, delta int64) (int64, error) {
+ if userID <= 0 {
+ return 0, errors.New("user_id must be greater than 0")
+ }
+
+ if starID <= 0 {
+ return 0, errors.New("star_id must be greater than 0")
+ }
+
+ // 使用事务确保原子性
+ var newExperience int64
+ err := r.db.Transaction(func(tx *gorm.DB) error {
+ // 先查询当前的 experience 值
+ var profile models.FanProfile
+ if err := tx.Where("user_id = ? AND star_id = ?", userID, starID).
+ First(&profile).Error; err != nil {
+ if errors.Is(err, gorm.ErrRecordNotFound) {
+ return appErrors.ErrFanProfileNotFound
+ }
+ return err
+ }
+
+ // 计算新值
+ newExperience = profile.Experience + delta
+
+ // 确保不会小于 0
+ if newExperience < 0 {
+ newExperience = 0
+ }
+
+ // 更新 experience 字段
+ if err := tx.Model(&models.FanProfile{}).
+ Where("user_id = ? AND star_id = ?", userID, starID).
+ Update("experience", newExperience).Error; err != nil {
+ return err
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return 0, err
+ }
+
+ return newExperience, nil
}
// UpdateAvatar 更新头像
diff --git a/docs/superpowers/plans/2026-04-14-task-service-remaining-issues.md b/docs/superpowers/plans/2026-04-14-task-service-remaining-issues.md
index f5bacf2..97281a3 100644
--- a/docs/superpowers/plans/2026-04-14-task-service-remaining-issues.md
+++ b/docs/superpowers/plans/2026-04-14-task-service-remaining-issues.md
@@ -171,32 +171,31 @@ if def.ExpReward > 0 {
---
-## 五、待执行的操作清单
+## 五、已完成的修复清单
-| # | 操作 | 优先级 | 依赖 |
-|---|------|--------|------|
-| 1 | 执行 `sh scripts/compile-proto.sh` | P0 | go + protoc 环境 |
-| 2 | 添加 `UpdateOnboardingProgress` 到 onboarding_repo | P0 | 无 |
-| 3 | 添加 `ListCompletedDailyTasks` 到 daily_task_repo | P0 | 无 |
-| 4 | 修复 main.go Dubbo 注册代码 | P0 | #1 |
-| 5 | 修复 guide.vue isTaskCompleted | P1 | 无 |
-| 6 | 删除 onboarding_service.go 死代码 | P2 | 无 |
-| 7 | 修复 ClaimAllDailyTasks 错误处理 | P2 | 无 |
+| # | 修复项 | 文件 | 状态 |
+|---|--------|------|------|
+| 2 | `UpdateOnboardingProgress` 方法 | onboarding_repo.go | ✅ 已完成 |
+| 3 | `ListCompletedDailyTasks` 方法 | daily_task_repo.go | ✅ 已完成 |
+| 5 | guide.vue isTaskCompleted | guide.vue | ✅ 已完成 |
+| 6 | onboarding_service.go 死代码 | service 层重构 | ✅ 已解决(新建服务文件) |
+| 7 | ClaimAllDailyTasks 错误处理 | daily_task_service.go | ✅ 已完成 |
+| 9 | Service 层创建 | service/*.go | ✅ 已完成 |
+| 10 | gorm.NowFunc() 修复 | revenue_repo.go, onboarding_repo.go | ✅ 已完成 |
+| 11 | Proto 编译 | pkg/proto/task/*.go | ✅ 已完成 |
+| 12 | main.go Dubbo 注册代码 | main.go | ✅ 已完成 |
---
-## 六、执行顺序建议
+## 六、已完成的操作清单
-```
-1. 先执行 proto 编译(#1)
- ↓
-2. 修复 onboarding_repo + daily_task_repo(#2, #3)
- ↓
-3. 修复 main.go 注册代码(#4)
- ↓
-4. 编译验证:go build ./...
- ↓
-5. 修复前端 guide.vue(#5)
- ↓
-6. 可选优化(#6, #7)
+所有计划中的任务已完成!TaskService 现已可以成功编译。
+
+---
+
+## 七、编译验证
+
+```bash
+cd backend && go build ./services/taskService/...
+# ✅ BUILD SUCCESS
```
diff --git a/frontend/App.vue b/frontend/App.vue
index 94ab70e..f8776b7 100644
--- a/frontend/App.vue
+++ b/frontend/App.vue
@@ -1,17 +1,15 @@
diff --git a/frontend/pages/components/Header.vue b/frontend/pages/components/Header.vue
index b5e0e51..aed36dc 100644
--- a/frontend/pages/components/Header.vue
+++ b/frontend/pages/components/Header.vue
@@ -80,7 +80,7 @@
-
+
{
uni.$on('avatarUpdated', handleAvatarUpdate);
uni.$on('userInfoUpdated', handleUserInfoUpdate);
uni.$on('balanceUpdated', handleBalanceUpdate);
+
+ // 上报每日首次登录事件(每天首次挂载时)
+ const today = new Date().toISOString().split('T')[0]
+ const dailyLoginKey = `daily_login_completed_${today}`
+ // 先判断是否处于登录状态(是否有 star_id)
+ const starId = uni.getStorageSync('star_id')
+ if (starId && !uni.getStorageSync(dailyLoginKey)) {
+ reportEvent('daily_login', starId).then(() => {
+ // 报告成功后标记今日已完成
+ uni.setStorageSync(dailyLoginKey, true)
+ }).catch(err => {
+ console.error('上报登录事件失败:', err)
+ })
+ }
});
// 组件卸载时移除事件监听
@@ -286,7 +301,9 @@ const handleStarActivityClick = async () => {
// 点击新手引导
const handleGuideClick = () => {
- showGuideListModal.value = true;
+ uni.navigateTo({
+ url: '/pages/tasks/guide'
+ });
};
// 执行引导
diff --git a/frontend/pages/exhibition/exhibition.vue b/frontend/pages/exhibition/exhibition.vue
index 0b96162..6f2bf56 100644
--- a/frontend/pages/exhibition/exhibition.vue
+++ b/frontend/pages/exhibition/exhibition.vue
@@ -264,6 +264,7 @@ export default {
import NftCard from '../components/NftCard.vue';
import { getMyGalleriesApi, placeAssetToGalleryApi, getMyAssetsApi, removeAssetFromGalleryApi, getUserGalleriesApi, getRandomGalleryApi } from '@/utils/api.js';
import { getAssetCoverRealUrl } from '@/utils/assetImageHelper.js';
+ import { reportEvent } from '@/utils/task-api.js';
import GuideOverlay from "@/components/GuideOverlay.vue";
const store = useStore();
@@ -1258,6 +1259,12 @@ export default {
// 加载展馆槽位信息
loadGallerySlots();
+ // 上报每日首次预览事件
+ const starId = uni.getStorageSync('star_id') || 1
+ reportEvent('daily_browse_asset', starId).catch(err => {
+ console.error('上报预览事件失败:', err)
+ })
+
// 启动倒计时定时器(每秒更新一次)
countdownTimer = setInterval(() => {
updateCountdowns();
diff --git a/frontend/pages/tasks/daily-tasks.vue b/frontend/pages/tasks/daily-tasks.vue
index 3863320..2f2d513 100644
--- a/frontend/pages/tasks/daily-tasks.vue
+++ b/frontend/pages/tasks/daily-tasks.vue
@@ -1,84 +1,106 @@
-
-
-
+
+
+
+
+
-
- 每日任务
+
+
+
+
-
-
-
- 加载中...
-
+
+
-
-
- {{ errorMessage }}
-
-
+
+
+ ×
+
-
-
-
-
- 暂无每日任务
-
+
+
+
+ 每日任务
-
-
-
- {{ task.name }}
- {{ task.description }}
-
- 💎
- {{ task.crystal_reward }}
- |
- ⭐
- {{ task.exp_reward }} 经验
-
-
+
+
+
+ 加载中...
+
-
-
-
- {{ getStatusText(task.status) }}
-
+
+
+ {{ errorMessage }}
+
+
-
-
-
-
-
+
+
+
+
+ 暂无每日任务
+
-
-
-
-
+
+
+
+ {{ task.name }}
+ {{ task.description }}
+
+ 💎
+ +{{ task.crystal_reward }}
+ |
+ ⭐
+ +{{ task.exp_reward }}
+
+
-
-
- {{ refreshing ? '刷新中...' : '下拉刷新' }}
-
-
+
+
+
+ {{ getStatusText(task.status) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/pages/tasks/guide.vue b/frontend/pages/tasks/guide.vue
index 1c985d0..741e0bd 100644
--- a/frontend/pages/tasks/guide.vue
+++ b/frontend/pages/tasks/guide.vue
@@ -1,7 +1,12 @@
-
-
+
+
+
+
+
+
+
新手引导
@@ -88,16 +93,28 @@
- {{ refreshing ? '刷新中...' : '下拉刷新' }}
+