6.8 KiB
6.8 KiB
运营活动功能实现计划
背景
用户希望添加一个运营活动功能:
- 用户可以进入运营活动界面
- 通过水晶购买道具推进活动进程
- 购买道具可获得贡献点
- 后台统计贡献点排名
- 运营活动有时间限制
- 不同阶段展示不同界面效果
现有代码基础:
- 前端已有应援活动页面 (
frontend/pages/support-activity/) - 已有活动配置 (
frontend/utils/activity-config.js) - 已有排行榜服务可作为参考 (
backend/services/assetService/service/ranking_service.go) - 水晶余额在
fan_profiles.crystal_balance中
实现方案
1. 数据库设计
✅ 已确认: 道具配置使用数据库方式
新建表:activities, activity_items, activity_contributions, activity_user_stats
-- 运营活动表
CREATE TABLE IF NOT EXISTS activities (
id BIGSERIAL PRIMARY KEY,
activity_type VARCHAR(50) NOT NULL, -- 活动类型: birthday/concert/bus
title VARCHAR(100) NOT NULL, -- 活动标题
description TEXT, -- 活动描述
star_id BIGINT NOT NULL, -- 所属明星
start_time BIGINT NOT NULL, -- 开始时间
end_time BIGINT NOT NULL, -- 结束时间
target_progress BIGINT NOT NULL DEFAULT 1000, -- 目标进度
current_progress BIGINT NOT NULL DEFAULT 0, -- 当前进度
status VARCHAR(20) NOT NULL DEFAULT 'pending', -- pending/active/completed/expired
stage_configs JSONB, -- 阶段配置 (不同进度的背景图等)
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL
);
-- 活动道具表 (数据库配置,支持运营平台动态调整)
CREATE TABLE IF NOT EXISTS activity_items (
id BIGSERIAL PRIMARY KEY,
activity_id BIGINT NOT NULL,
item_type VARCHAR(50) NOT NULL, -- 道具类型: firework/megaphone/love
item_name VARCHAR(50) NOT NULL, -- 道具名称
icon_url VARCHAR(500), -- 道具图标
crystal_cost INTEGER NOT NULL, -- 水晶消耗
contribution_points INTEGER NOT NULL, -- 贡献点奖励
sort_order INTEGER NOT NULL DEFAULT 0,
is_active BOOLEAN NOT NULL DEFAULT true,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL
);
-- 用户活动贡献记录表
CREATE TABLE IF NOT EXISTS activity_contributions (
id BIGSERIAL PRIMARY KEY,
activity_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
star_id BIGINT NOT NULL,
item_id BIGINT NOT NULL,
item_type VARCHAR(50) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
crystal_spent BIGINT NOT NULL,
contribution_points BIGINT NOT NULL,
created_at BIGINT NOT NULL
);
-- 用户活动贡献汇总表 (用于排行榜)
CREATE TABLE IF NOT EXISTS activity_user_stats (
id BIGSERIAL PRIMARY KEY,
activity_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
star_id BIGINT NOT NULL,
total_contribution BIGINT NOT NULL DEFAULT 0,
total_crystal_spent BIGINT NOT NULL DEFAULT 0,
total_items INTEGER NOT NULL DEFAULT 0,
last_contribute_at BIGINT NOT NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
CONSTRAINT uk_activity_user_star UNIQUE (activity_id, user_id, star_id)
);
2. Proto 定义
新建 backend/proto/activity.proto:
// 活动相关消息定义
message Activity {
int64 id = 1;
string activity_type = 2;
string title = 3;
string description = 4;
int64 star_id = 5;
int64 start_time = 6;
int64 end_time = 7;
int64 target_progress = 8;
int64 current_progress = 9;
string status = 10;
string current_stage = 11; // 当前阶段: early/mid/late/completed
repeated ActivityItem items = 12;
}
message ActivityItem {
int64 id = 1;
string item_type = 2;
string item_name = 3;
string icon_url = 4;
int32 crystal_cost = 5;
int32 contribution_points = 6;
}
// 贡献购买请求
message PurchaseItemRequest {
int64 activity_id = 1;
string item_type = 2;
int32 quantity = 3;
int64 star_id = 4;
}
// 贡献点排名
message ContributionRankingRequest {
int64 activity_id = 1;
int64 star_id = 2;
int32 page = 3;
int32 page_size = 4;
}
message ContributionRankingItem {
int32 rank = 1;
int64 user_id = 2;
string nickname = 3;
string avatar_url = 4;
int64 total_contribution = 5;
int64 total_crystal_spent = 6;
}
message MyContribution {
int32 rank = 1;
int64 total_contribution = 2;
int64 total_crystal_spent = 3;
string status = 4; // ranked/unranked
}
3. 后端服务实现
新建服务: backend/services/activityService/
main.go- 服务入口service/activity_service.go- 业务逻辑repository/activity_repository.go- 数据库操作provider/activity_provider.go- Dubbo provider
API 端点 (通过 gateway):
GET /api/v1/activities/:id- 获取活动详情GET /api/v1/activities/:id/items- 获取活动道具列表POST /api/v1/activities/:id/purchase- 购买道具GET /api/v1/activities/:id/ranking- 贡献点排名GET /api/v1/activities?star_id=:star_id- 获取活动列表
水晶扣减逻辑:
- 检查用户水晶余额是否足够
- 扣减水晶 (
fan_profiles.crystal_balance) - 增加活动进度
- 记录贡献明细
- 更新用户贡献汇总
- 返回结果
4. 前端实现
修改文件:
frontend/utils/activity-config.js- 添加动态阶段配置frontend/pages/support-activity/index.vue- 接入后端 APIfrontend/pages/support-activity/components/ActionBar.vue- 购买道具交互frontend/utils/api.js- 添加活动 API
阶段展示逻辑:
- 0-25%: 初期 (early) - 初始背景
- 26-50%: 中期 (mid) - 中期背景
- 51-75%: 后期 (late) - 后期背景
- 76-100%: 完成 (completed) - 完成背景 + 特效动画
时间限制显示:
- 活动未开始: 显示"距开始还有 X 天"
- 活动进行中: 显示"还剩 X 天 X 小时"
- 活动已结束: 显示"活动已结束"
关键文件路径
| 组件 | 文件路径 |
|---|---|
| 数据库初始化 | backend/scripts/init_database.sql |
| Proto 定义 | backend/proto/activity.proto (新建) |
| 活动服务 | backend/services/activityService/ (新建) |
| Gateway 路由 | backend/gateway/controller/ (新增) |
| 前端活动配置 | frontend/utils/activity-config.js |
| 前端活动页面 | frontend/pages/support-activity/index.vue |
| 前端 API | frontend/utils/api.js |
验证方案
- 数据库: 确认表创建成功,索引正确
- 后端 API:
- 创建活动,验证返回
- 购买道具,验证水晶扣减和贡献点增加
- 获取排名,验证排序正确
- 前端:
- 活动页面加载正常
- 购买道具交互正常
- 不同阶段背景切换正常
- 倒计时显示正常
- 整体流程: 完整流程测试 - 购买道具 -> 贡献点增加 -> 排名更新