优质号主
+开通后可发布到极品专区,并在该专区享受优质号主专享保险服务费率。
+-
+
-
+
发布商品到极品专区 +
+ -
+
专享更低的无忧租号保险费率 +
+ -
+
个人中心及商品页展示优质号主标识 +
+
diff --git a/backend/internal/modules/pointsmall/dto.go b/backend/internal/modules/pointsmall/dto.go
index 7711ae5..b9edab4 100644
--- a/backend/internal/modules/pointsmall/dto.go
+++ b/backend/internal/modules/pointsmall/dto.go
@@ -17,12 +17,23 @@ var (
)
type SummaryDTO struct {
- AvailablePoints int64 `json:"available_points"`
- LifetimePoints int64 `json:"lifetime_points"`
- LevelCode string `json:"level_code"`
- LevelName string `json:"level_name"`
- PointsPerYuan int64 `json:"points_per_yuan"`
- PointsMultiplierBps int `json:"points_multiplier_bps"`
+ AvailablePoints int64 `json:"available_points"`
+ LifetimePoints int64 `json:"lifetime_points"`
+ LevelCode string `json:"level_code"`
+ LevelName string `json:"level_name"`
+ PointsPerYuan int64 `json:"points_per_yuan"`
+ PointsMultiplierBps int `json:"points_multiplier_bps"`
+ GrowthEnabled bool `json:"growth_enabled"`
+ Levels []GrowthLevelDTO `json:"levels"`
+}
+
+type GrowthLevelDTO struct {
+ Code string `json:"code"`
+ Name string `json:"name"`
+ MinPoints int64 `json:"min_points"`
+ PointsMultiplierBps int `json:"points_multiplier_bps"`
+ DiscountBps int `json:"discount_bps"`
+ DepositFreeQuotaCent int64 `json:"deposit_free_quota_cent"`
}
type ProductDTO struct {
diff --git a/backend/internal/modules/pointsmall/repository.go b/backend/internal/modules/pointsmall/repository.go
index 6f577c1..1b02558 100644
--- a/backend/internal/modules/pointsmall/repository.go
+++ b/backend/internal/modules/pointsmall/repository.go
@@ -35,6 +35,17 @@ func (r *Repository) Summary(ctx context.Context, userID uint64) (*SummaryDTO, e
return nil, err
}
level := rentergrowth.LevelForPoints(cfg, user.RenterGrowthPoints)
+ levels := make([]GrowthLevelDTO, 0, len(cfg.Levels))
+ for _, item := range cfg.Levels {
+ levels = append(levels, GrowthLevelDTO{
+ Code: item.Code,
+ Name: item.Name,
+ MinPoints: item.MinPoints,
+ PointsMultiplierBps: item.PointsMultiplierBps,
+ DiscountBps: item.DiscountBps,
+ DepositFreeQuotaCent: item.DepositFreeQuotaCent,
+ })
+ }
return &SummaryDTO{
AvailablePoints: user.PointsAvailable,
LifetimePoints: user.RenterGrowthPoints,
@@ -42,6 +53,8 @@ func (r *Repository) Summary(ctx context.Context, userID uint64) (*SummaryDTO, e
LevelName: level.Name,
PointsPerYuan: cfg.PointsPerYuan,
PointsMultiplierBps: level.PointsMultiplierBps,
+ GrowthEnabled: cfg.Enabled,
+ Levels: levels,
}, nil
}
diff --git a/backend/internal/modules/pointsmall/repository_test.go b/backend/internal/modules/pointsmall/repository_test.go
index bc0a062..48a23a7 100644
--- a/backend/internal/modules/pointsmall/repository_test.go
+++ b/backend/internal/modules/pointsmall/repository_test.go
@@ -76,3 +76,33 @@ func TestRedeemDeductsAvailablePointsAndStock(t *testing.T) {
t.Fatalf("redemption status = %s, want completed", completed.Status)
}
}
+
+func TestSummaryIncludesGrowthLevelRules(t *testing.T) {
+ db := database.NewTestDB()
+ user := model.User{
+ Phone: "13900009602",
+ RenterGrowthPoints: 1000,
+ PointsAvailable: 432,
+ }
+ if err := db.Create(&user).Error; err != nil {
+ t.Fatalf("create user failed: %v", err)
+ }
+
+ summary, err := NewRepository(db).Summary(t.Context(), user.ID)
+ if err != nil {
+ t.Fatalf("summary failed: %v", err)
+ }
+ if !summary.GrowthEnabled || len(summary.Levels) != 4 {
+ t.Fatalf("growth config = enabled %v levels %d", summary.GrowthEnabled, len(summary.Levels))
+ }
+ if summary.LevelCode != "diamond" || summary.PointsMultiplierBps != 15_000 {
+ t.Fatalf(
+ "current level = %s multiplier %d, want diamond/15000",
+ summary.LevelCode,
+ summary.PointsMultiplierBps,
+ )
+ }
+ if summary.Levels[2].DiscountBps != 9800 || summary.Levels[2].DepositFreeQuotaCent != 100_000 {
+ t.Fatalf("diamond rules = %+v", summary.Levels[2])
+ }
+}
diff --git a/frontend/src/features/benefits/views/BenefitsCenterView.vue b/frontend/src/features/benefits/views/BenefitsCenterView.vue
new file mode 100644
index 0000000..1f7931f
--- /dev/null
+++ b/frontend/src/features/benefits/views/BenefitsCenterView.vue
@@ -0,0 +1,994 @@
+
+
+
+ VIP 成长、优质号主和积分商城权益集中查看。 {{ errorMessage }} 权益信息加载中... 积分等级权益当前暂未启用。
+ 再获得 {{ pointsToNextLevel }} 积分升级为
+ {{ nextLevel.name }}
+ 你已达到当前最高等级,继续消费积分仍可用于商城兑换。 开通后可发布到极品专区,并在该专区享受优质号主专享保险服务费率。 租客按实际租金支出、卖家按实际租金收入获得积分,兑换虚拟权益与优惠商品。权益中心
+ {{ summary.level_name }}会员
+ 成长等级权益
+ 优质号主
+
+
+
+ 积分商城
+
+
+
+