Skip to content

小程序端灵感板块分阶段优化方案

前置文档: INSPIRATION_MINIPROGRAM_ANALYSIS.md - 现状与问题分析
本文档: 分阶段优化方案详细设计
版本: V1.0
日期: 2025-12-11


第四部分:分阶段优化方案

阶段1:快速优化(1-2周,立竿见影)

目标: 解决最紧急的体验问题,提升核心转化率
资源需求: 1名前端 + 1名后端
风险等级: ✅ 低(不涉及架构变更)


优化1.1:简化Tab结构 🎯 P0

当前问题:

  • 5个Tab(全部/收藏灵感/智能推荐/热点/我的素材)
  • 用户不理解区别,切换频繁但无收获
  • 部分Tab为空(智能推荐/热点未配置时)

优化方案:

vue
<!-- 当前:5个Tab -->
<view class="content-tabs">
  <view class="tab-item" :class="{ active: activeTab === 'all' }">全部</view>
  <view class="tab-item" :class="{ active: activeTab === 'collection' }">收藏灵感</view>
  <view class="tab-item" :class="{ active: activeTab === 'smart' }">智能推荐</view>
  <view class="tab-item" :class="{ active: activeTab === 'trend' }">热点</view>
  <view class="tab-item" :class="{ active: activeTab === 'asset' }">我的素材</view>
</view>

<!-- 优化后:3个Tab -->
<view class="content-tabs-v2">
  <view class="tab-item" :class="{ active: activeTab === 'my' }">
    <text class="tab-icon">📂</text>
    <text class="tab-text">我的收藏</text>
    <view class="tab-count" v-if="stats.myCollection > 0">{{ stats.myCollection }}</view>
  </view>
  <view class="tab-item" :class="{ active: activeTab === 'recommend' }">
    <text class="tab-icon">💡</text>
    <text class="tab-text">推荐灵感</text>
    <view class="tab-count hot" v-if="stats.recommend > 0">{{ stats.recommend }}</view>
  </view>
  <view class="tab-item" :class="{ active: activeTab === 'recent' }">
    <text class="tab-icon">⏰</text>
    <text class="tab-text">最近使用</text>
    <view class="tab-count used" v-if="stats.recentUsed > 0">{{ stats.recentUsed }}</view>
  </view>
</view>

数据映射逻辑:

javascript
// 后端API调整
const loadData = async (tab) => {
  const params = { page, limit: 20 };
  
  switch (tab) {
    case 'my':
      // 合并:用户收藏的灵感 + 用户上传的素材
      params.source = 'user';
      params.content_type = 'all';
      break;
    case 'recommend':
      // 合并:智能推荐 + 热点
      params.source = 'studio';
      params.content_type = 'inspiration';
      params.include_trend = true;
      break;
    case 'recent':
      // 新增:最近引用到任务的灵感
      params.order_by = 'last_used_at';
      params.has_used = true;
      break;
  }
  
  return await inspirationApi.getUnifiedFeed(params);
};

预期效果:

  • 认知成本降低:5个概念 → 3个概念
  • Tab切换次数减少:平均从4次/会话 → 2次/会话
  • 用户留存提升:减少因"找不到内容"而流失

实施步骤:

  1. Day 1-2: 前端修改Tab UI和切换逻辑
  2. Day 3: 后端API增加recent参数支持
  3. Day 4: 数据库增加last_used_at字段记录
  4. Day 5: 测试和灰度发布

优化1.2:强化"一键引用"入口 🎯 P0

当前问题:

  • 转化入口藏在长按菜单中,发现率<30%
  • 即使点击转化,跳转后表单为空,填写成本高
  • 转化率<5%,灵感功能价值未体现

优化方案:

1. 显性化入口

vue
<!-- 卡片底部增加醒目按钮 -->
<view class="inspiration-card">
  <!-- 封面、标题等 -->
  <view class="card-cover">...</view>
  <view class="card-body">
    <text class="card-title">{{ item.title }}</text>
  </view>
  
  <!-- 新增:底部操作栏 -->
  <view class="card-actions">
    <button class="action-btn use-btn" @click.stop="handleUseCreate(item)">
      <text class="btn-icon">⚡</text>
      <text class="btn-text">用这个拍视频</text>
    </button>
    <button class="action-btn more-btn" @click.stop="showMore(item)">
      <text>更多</text>
    </button>
  </view>
</view>

样式设计(Figma草图):

scss
.use-btn {
  flex: 1;
  height: 44px;
  background: linear-gradient(135deg, #7c3aed, #a78bfa);
  border-radius: 12px;
  color: #fff;
  font-weight: 600;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  
  .btn-icon {
    font-size: 20px;
    animation: pulse 2s infinite;
  }
  
  &:active {
    transform: scale(0.98);
    background: linear-gradient(135deg, #6d28d9, #8b5cf6);
  }
}

@keyframes pulse {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.1); }
}

2. 采集后引导

javascript
// 采集成功后立即询问
const handleCollectSuccess = async (inspiration) => {
  uni.showModal({
    title: '采集成功!',
    content: '是否立即基于这条灵感创建拍摄任务?',
    confirmText: '立即创建',
    confirmColor: '#7c3aed',
    cancelText: '稍后再说',
    success: async (res) => {
      if (res.confirm) {
        await convertToTask(inspiration.id);
      } else {
        // 记录用户选择,后续可分析转化漏斗
        analytics.track('inspiration_collected_not_converted', {
          inspiration_id: inspiration.id
        });
      }
    }
  });
};

3. 增强自动填充

javascript
// 后端:增强转化逻辑
async function convertInspiration ToTask(inspirationId, userId) {
  const inspiration = await UserCorpus.findByPk(inspirationId);
  
  // 创建任务
  const task = await CaptureTask.create({
    user_id: userId,
    project_id: inspiration.project_id,
    
    // 基础字段自动填充
    title: inspiration.title,
    description: inspiration.content,
    
    // 新增:智能推断字段
    task_type: inferTaskType(inspiration), // 探店/教程/vlog
    duration: inferDuration(inspiration.content), // 分析文本推测时长
    
    // 参考内容
    reference_content: {
      inspiration_id: inspiration.id,
      source_url: inspiration.source_url,
      cover_image: inspiration.media_urls[0],
      platform: inspiration.source_platform
    },
    
    // 预填充脚本
    script: inspiration.content, // 直接作为口播参考
    
    // 状态
    status: 'ready_to_shoot' // 直接标记为可拍摄
  });
  
  // 更新灵感使用次数
  await inspiration.increment('usage_count');
  
  return task;
}

// 辅助函数:推断任务类型
function inferTaskType(inspiration) {
  const { title, content, source_platform } = inspiration;
  const text = `${title} ${content}`.toLowerCase();
  
  if (text.includes('探店') || text.includes('打卡')) return 'explore_shop';
  if (text.includes('教程') || text.includes('如何')) return 'tutorial';
  if (text.includes('vlog') || text.includes('记录')) return 'vlog';
  if (text.includes('测评') || text.includes('体验')) return 'review';
  
  // 根据平台推测
  if (source_platform === 'xiaohongshu') return 'share'; // 小红书多分享类
  if (source_platform === 'douyin') return 'entertainment'; // 抖音多娱乐类
  
  return 'general';
}

// 辅助函数:推断时长
function inferDuration(content) {
  const wordCount = content.length;
  
  // 按语速估算(平均每秒4-5个字)
  if (wordCount < 50) return 15; // 15秒
  if (wordCount < 100) return 30;
  if (wordCount < 200) return 60;
  return 90;
}

预期效果:

  • 转化率提升:5% → 20%
  • 用户感知价值:从"收藏夹"升级为"创作工具"
  • 任务创建效率:从3分钟 → 10秒

实施步骤:

  1. Day 1: 设计新的卡片布局(包含use-btn)
  2. Day 2: 前端实现按钮和弹窗逻辑
  3. Day 3: 后端增强convertToTask函数
  4. Day 4-5: 测试和数据埋点

优化1.3:空状态引导优化 🎯 P0

当前问题:

  • 首次进入看到空页面,无任何提示
  • 用户不知道灵感板块的价值和用法
  • 流失率高:首次进入后<30%的用户会采集第一条灵感

优化方案:

1. 空状态UI设计

vue
<view class="empty-state" v-if="feedList.length === 0 && !loading">
  <!-- 视觉元素 -->
  <view class="empty-visual">
    <view class="lightbulb-icon">💡</view>
    <view class="sparkles">
      <text class="sparkle">✨</text>
      <text class="sparkle">✨</text>
      <text class="sparkle">✨</text>
    </view>
  </view>
  
  <!-- 引导文案 -->
  <view class="empty-content">
    <text class="empty-title">开始收集你的第一个灵感</text>
    <text class="empty-desc">看到好的视频、文案或图片,保存下来</text>
    <text class="empty-desc">一键就能变成你的拍摄任务</text>
  </view>
  
  <!-- 快速上手教程 -->
  <view class="quick-guide">
    <view class="guide-step">
      <view class="step-num">1</view>
      <text class="step-text">复制抖音/小红书视频链接</text>
    </view>
    <view class="guide-step">
      <view class="step-num">2</view>
      <text class="step-text">点击上方"粘贴链接"保存</text>
    </view>
    <view class="guide-step">
      <view class="step-num">3</view>
      <text class="step-text">点击"用这个拍视频"开始创作</text>
    </view>
  </view>
  
  <!-- 行动按钮 -->
  <view class="empty-actions">
    <button class="action-btn primary" @click="handlePasteLink">
      <text class="icon">🔗</text>
      <text>粘贴链接试试</text>
    </button>
    <button class="action-btn secondary" @click="viewExamples">
      <text>查看示例灵感</text>
    </button>
  </view>
  
  <!-- 新增:预置示例灵感(针对美业用户) -->
  <view class="example-inspirations" v-if="userIndustry === 'beauty'">
    <text class="section-title">💄 美业案例灵感(点击查看)</text>
    <view class="example-grid">
      <view 
        class="example-card" 
        v-for="example in presetExamples" 
        :key="example.id"
        @click="viewExample(example)"
      >
        <image :src="example.cover" mode="aspectFill" />
        <text class="example-title">{{ example.title }}</text>
      </view>
    </view>
  </view>
</view>

2. 预置示例灵感库

javascript
// 后端:按行业预置10条优质灵感
const presetInspirationsBeauty = [
  {
    id: 'preset_001',
    title: '美甲店探店模板',
    content: '镜头1:店门口全景 → 镜头2:美甲师操作特写 → 镜头3:成品展示 → 口播:价格/地址',
    cover: 'https://example.com/beauty_1.jpg',
    tags: ['探店', '美甲', '本地生活'],
    inspiration_type: 'template'
  },
  {
    id: 'preset_002',
    title: '项目前后对比',
    content: '客户问题痛点展示 → 项目过程 → 效果对比 → CTA引导到店',
    cover: 'https://example.com/beauty_2.jpg',
    tags: ['项目展示', '效果对比'],
    inspiration_type: 'template'
  },
  // ... 共10条
];

// 前端:首次进入时展示预置灵感
const loadInitialData = async () => {
  const myInspirations = await inspirationApi.getUnifiedFeed({ source: 'user' });
  
  if (myInspirations.data.items.length === 0) {
    // 空状态 + 预置示例
    showPresetExamples.value = true;
    presetExamples.value = await inspirationApi.getPresetByIndustry(userIndustry);
  } else {
    feedList.value = myInspirations.data.items;
  }
};

3. 首次采集成功庆祝

javascript
// 首次采集成功后的特殊反馈
const handleFirstInspiration = async () => {
  const isFirstTime = uni.getStorageSync('has_collected_inspiration') !== 'true';
  
  if (isFirstTime) {
    // 记录标记
    uni.setStorageSync('has_collected_inspiration', 'true');
    
    // 庆祝动画 + 引导
    uni.showModal({
      title: '🎉 恭喜你!',
      content: '第一个灵感已保存\n现在点击"用这个拍视频",马上就能开始创作!',
      showCancel: false,
      confirmText: '立即体验',
      success: () => {
        // 高亮显示"用这个拍视频"按钮
        highlightUseButton();
      }
    });
  }
};

预期效果:

  • 首次采集转化率:0% → 40%
  • 用户理解度提升:从"不知道干什么" → "明确采集-使用流程"
  • 留存提升:7日留存 +15%

实施步骤:

  1. Day 1: 设计空状态UI和动画
  2. Day 2: 准备10条预置示例灵感(各行业)
  3. Day 3: 前端实现空状态和引导流程
  4. Day 4: 后端API支持预置灵感接口
  5. Day 5: 测试和灰度发布

阶段2:中期迭代(1-2个月,功能增强)

目标: 提升灵感的价值密度和使用效率
资源需求: 1名前端 + 1名后端 + 1名AI工程师
风险等级: ⚠️ 中(涉及AI服务调用和算法开发)


优化2.1:智能标签系统 🎯 P1

问题分析:

  • 当前:ai_tags字段有数据但未展示,用户无法通过标签筛选
  • 痛点:灵感多了后找不到,搜索也不准确
  • 需求:能按标签快速筛选(如:只看"美甲"相关的灵感)

方案设计:

1. 自动打标签(后端)

javascript
// services/TaggingService.js
class TaggingService {
  async generateTags(inspiration) {
    const { title, content, source_platform } = inspiration;
    
    // 调用GPT-4o进行智能标签生成
    const prompt = `
      分析以下内容,生成3-5个标签。
      标签应该包括:行业、场景、平台特征。
      
      标题:${title}
      内容:${content}
      平台:${source_platform}
      
      输出格式:JSON数组,例如:["美甲", "探店", "本地生活", "抖音"]
    `;
    
    const response = await openai.chat.completions.create({
      model: 'gpt-4o-mini',
      messages: [{ role: 'user', content: prompt }],
      response_format: { type: 'json_object' },
      temperature: 0.3
    });
    
    const tags = JSON.parse(response.choices[0].message.content).tags;
    
    // 标签标准化(映射到预定义分类)
    return this.normalizeTags(tags);
  }
  
  normalizeTags(rawTags) {
    const industryMap = {
      '美甲': 'beauty_nail',
      '美容': 'beauty_facial',
      '护肤': 'beauty_skincare',
      '美食': 'food',
      '探店': 'local_explore',
      // ... 更多映射
    };
    
    return rawTags.map(tag => ({
      display: tag, // 显示名称
      value: industryMap[tag] || tag, // 标准化值
      category: this.detectCategory(tag) // 一级分类
    }));
  }
  
  detectCategory(tag) {
    const categories = {
      industry: ['美甲', '美容', '美食', '服装'],
      scene: ['探店', '教程', 'vlog', '测评'],
      platform: ['抖音', '小红书', '视频号']
    };
    
    for (const [cat, keywords] of Object.entries(categories)) {
      if (keywords.includes(tag)) return cat;
    }
    return 'other';
  }
}

// 采集灵感时自动打标签
router.post('/collect', authenticateToken, async (req, res) => {
  const inspiration = await UserCorpus.create(req.body);
  
  // 异步生成标签(不阻塞响应)
  TaggingService.generateTags(inspiration).then(tags => {
    inspiration.update({ ai_tags: tags });
  });
  
  res.json({ success: true, data: inspiration });
});

2. 标签云展示(前端)

vue
<view class="tag-filter-section">
  <view class="section-header">
    <text class="section-title">热门标签</text>
    <text class="section-action" @click="showAllTags">查看全部</text>
  </view>
  
  <!-- 标签云 -->
  <view class="tag-cloud">
    <view 
      class="tag-item" 
      :class="{ active: selectedTags.includes(tag.value) }"
      v-for="tag in popularTags" 
      :key="tag.value"
      @click="toggleTag(tag)"
    >
      <text class="tag-icon">{{ tag.icon }}</text>
      <text class="tag-label">{{ tag.display }}</text>
      <text class="tag-count">{{ tag.count }}</text>
    </view>
  </view>
  
  <!-- 已选标签 -->
  <view class="selected-tags" v-if="selectedTags.length > 0">
    <text class="label">已选:</text>
    <view 
      class="selected-tag" 
      v-for="tag in selectedTags" 
      :key="tag"
      @click="removeTag(tag)"
    >
      <text>{{ getTagDisplay(tag) }}</text>
      <text class="close">×</text>
    </view>
    <button class="clear-btn" @click="clearTags">清除</button>
  </view>
</view>

3. 标签智能推荐

javascript
// 基于用户历史行为推荐标签
const getRecommendedTags = computed(() => {
  // 统计用户历史采集的标签频率
  const tagFrequency = {};
  feedList.value.forEach(item => {
    if (item.ai_tags) {
      item.ai_tags.forEach(tag => {
        tagFrequency[tag.value] = (tagFrequency[tag.value] || 0) + 1;
      });
    }
  });
  
  // 排序取Top6
  return Object.entries(tagFrequency)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 6)
    .map(([value, count]) => ({ value, count }));
});

预期效果:

  • 查找效率提升:从"翻页查找"变为"点击标签筛选",平均查找时间从30秒 → 5秒
  • 灵感复用率提升:能快速找到相关灵感,复用率 +30%

优化2.2:灵感使用统计 🎯 P1

问题分析:

  • 当前:usage_count字段有值但未展示
  • 痛点:用户不知道哪些灵感"最有用",无法优先复用高价值灵感

方案设计:

1. 使用次数可视化

vue
<view class="inspiration-card">
  <!-- 使用徽章 -->
  <view class="usage-badge" v-if="item.usage_count > 0">
    <text class="badge-icon">⭐</text>
    <text class="badge-text">已用 {{ item.usage_count }} 次</text>
  </view>
  
  <!-- 高价值标记 -->
  <view class="high-value-tag" v-if="item.usage_count >= 5">
    <text>🏆 高价值灵感</text>
  </view>
</view>

2. 使用历史记录

javascript
// 后端:关联表设计
CREATE TABLE InspirationUsage (
  id UUID PRIMARY KEY,
  inspiration_id UUID REFERENCES UserCorpus(id),
  task_id UUID REFERENCES CaptureTasks(id),
  used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  user_id INTEGER
);

// API:获取使用历史
router.get('/:id/usage-history', authenticateToken, async (req, res) => {
  const history = await InspirationUsage.findAll({
    where: { inspiration_id: req.params.id },
    include: [{
      model: CaptureTask,
      attributes: ['id', 'title', 'created_at', 'status']
    }],
    order: [['used_at', 'DESC']]
  });
  
  res.json({ success: true, data: history });
});

3. 详情页展示使用历史

vue
<view class="usage-history-section" v-if="usageHistory.length > 0">
  <view class="section-header">
    <text class="section-title">使用记录</text>
  </view>
  
  <view class="usage-list">
    <view 
      class="usage-item" 
      v-for="usage in usageHistory" 
      :key="usage.id"
      @click="viewTask(usage.task_id)"
    >
      <view class="task-info">
        <text class="task-title">{{ usage.task.title }}</text>
        <text class="task-date">{{ formatDate(usage.used_at) }}</text>
      </view>
      <view class="task-status" :class="usage.task.status">
        <text>{{ getStatusText(usage.task.status) }}</text>
      </view>
      <view class="arrow">→</view>
    </view>
  </view>
</view>

4. 排序优化(按使用频率)

javascript
// 增加排序选项
const sortOptions = [
  { value: 'created_at', label: '最新采集' },
  { value: 'usage_count', label: '最常使用' }, // 新增
  { value: 'last_used_at', label: '最近使用' } // 新增
];

const loadData = async (sortBy = 'created_at') => {
  const params = {
    page, limit: 20,
    order_by: sortBy,
    order_direction: sortBy === 'created_at' ? 'DESC' : 'DESC'
  };
  const res = await inspirationApi.getUnifiedFeed(params);
  // ...
};

预期效果:

  • 用户价值感知:从"不知道灵感有没有用"到"看到明确的使用数据"
  • 复用率提升:高价值灵感被多次使用,ROI提升

优化2.3:灵感推荐算法 🎯 P1

问题分析:

  • 当前:"推荐灵感"Tab内容来源不明,推荐不精准
  • 痛点:推荐的内容与用户无关(比如美业用户看到餐饮内容)

方案设计:

1. 推荐策略设计

javascript
// services/RecommendationService.js
class RecommendationService {
  async getRecommendations(userId, limit = 20) {
    const strategies = [
      this.collaborativeFiltering(userId),  // 协同过滤
      this.contentBasedFiltering(userId),   // 内容推荐
      this.trendBasedFiltering(userId)      // 热度推荐
    ];
    
    // 多策略融合(权重配置)
    const results = await Promise.all(strategies);
    return this.mergeAndRank(results, {
      collaborative: 0.4,
      content: 0.4,
      trend: 0.2
    });
  }
  
  // 策略1:协同过滤
  async collaborativeFiltering(userId) {
    // 找到相似用户(采集了相似灵感的用户)
    const similarUsers = await this.findSimilarUsers(userId);
    
    // 推荐相似用户采集的灵感
    const recommendations = await UserCorpus.findAll({
      where: {
        user_id: { [Op.in]: similarUsers },
        is_deleted: false
      },
      order: [['usage_count', 'DESC']],
      limit: 20
    });
    
    return recommendations;
  }
  
  // 策略2:内容推荐
  async contentBasedFiltering(userId) {
    // 获取用户偏好(从历史采集中提取)
    const userPreference = await this.getUserPreference(userId);
    
    // 推荐相似内容
    return await UserCorpus.findAll({
      where: {
        ai_tags: { [Op.overlap]: userPreference.tags },
        inspiration_type: userPreference.types,
        is_deleted: false,
        user_id: { [Op.ne]: userId } // 排除自己的
      },
      order: [['created_at', 'DESC']],
      limit: 20
    });
  }
  
  // 策略3:热度推荐
  async trendBasedFiltering(userId) {
    const userIndustry = await this.getUserIndustry(userId);
    
    // 推荐同行业的热点灵感
    return await UserCorpus.findAll({
      where: {
        inspiration_type: 'trend',
        ai_tags: { [Op.overlap]: [userIndustry] },
        is_deleted: false
      },
      order: [['hot_score', 'DESC']],
      limit: 20
    });
  }
  
  // 辅助:用户偏好提取
  async getUserPreference(userId) {
    const myInspirations = await UserCorpus.findAll({
      where: { user_id: userId, is_deleted: false },
      attributes: ['ai_tags', 'inspiration_type'],
      limit: 50
    });
    
    // 统计标签频率
    const tagFreq = {};
    const typeFreq = {};
    
    myInspirations.forEach(item => {
      if (item.ai_tags) {
        item.ai_tags.forEach(tag => {
          tagFreq[tag] = (tagFreq[tag] || 0) + 1;
        });
      }
      typeFreq[item.inspiration_type] = (typeFreq[item.inspiration_type] || 0) + 1;
    });
    
    return {
      tags: Object.keys(tagFreq).sort((a, b) => tagFreq[b] - tagFreq[a]).slice(0, 5),
      types: Object.keys(typeFreq)
    };
  }
}

2. 时段智能推荐

javascript
// 根据时间段调整推荐策略
const getTimeBasedRecommendations = (hour) => {
  if (hour >= 7 && hour < 12) {
    // 早上:推荐热点话题
    return { strategy: 'trend', weight: 0.6 };
  } else if (hour >= 12 && hour < 18) {
    // 下午:推荐项目相关
    return { strategy: 'content', weight: 0.7 };
  } else {
    // 晚上:推荐教程类
    return { strategy: 'collaborative', weight: 0.6 };
  }
};

预期效果:

  • 推荐点击率:从<10% 提升到 25%+
  • 用户满意度:NPS从6分提升到8分

优化2.4:灵感详情增强 🎯 P1

问题分析:

  • 当前:详情页只展示基础信息(标题、内容、封面)
  • 缺失:缺少深度信息(相似灵感、适用场景、创作建议)

方案设计:

1. 相似灵感推荐

javascript
// 使用向量相似度
const getSimilarInspirations = async (inspirationId) => {
  const current = await UserCorpus.findByPk(inspirationId);
  
  // 方案A:简单版 - 基于标签匹配
  const similar = await UserCorpus.findAll({
    where: {
      id: { [Op.ne]: inspirationId },
      ai_tags: { [Op.overlap]: current.ai_tags },
      is_deleted: false
    },
    limit: 5
  });
  
  // 方案B:高级版 - 基于向量相似度(需要pgvector)
  // const embedding = await getEmbedding(current.content);
  // const similar = await sequelize.query(`
  //   SELECT *, embedding <-> $1 AS distance
  //   FROM UserCorpus
  //   WHERE id != $2
  //   ORDER BY distance
  //   LIMIT 5
  // `, { bind: [embedding, inspirationId] });
  
  return similar;
};

2. 适用场景分析(AI)

javascript
// 调用AI分析灵感适用场景
const analyzeUseCase = async (inspiration) => {
  const prompt = `
    分析以下灵感内容,推荐3-5个适用的拍摄场景。
    
    内容:${inspiration.content}
    行业:${inspiration.ai_tags.find(t => t.category === 'industry')}
    
    输出JSON格式:
    {
      "use_cases": [
        { "scene": "场景名称", "reason": "原因", "difficulty": "简单/中等/困难" }
      ]
    }
  `;
  
  const response = await openai.chat.completions.create({
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: prompt }]
  });
  
  return JSON.parse(response.choices[0].message.content).use_cases;
};

3. 一键生成完整任务

vue
<view class="detail-actions">
  <!-- 基础操作 -->
  <button class="action-btn" @click="convertToTask">
    ⚡ 转为任务
  </button>
  
  <!-- 高级操作 -->
  <button class="action-btn advanced" @click="generateFullTask">
    🤖 AI生成完整任务
  </button>
</view>
javascript
// AI生成完整任务配置
const generateFullTask = async (inspiration) => {
  uni.showLoading({ title: 'AI分析中...' });
  
  try {
    // 调用AI服务生成任务配置
    const taskConfig = await ai.generateTaskFromInspiration({
      inspiration_id: inspiration.id,
      content: inspiration.content,
      industry: userIndustry
    });
    
    // 预览生成结果
    uni.hideLoading();
    uni.showModal({
      title: 'AI已生成任务配置',
      content: `
        任务类型:${taskConfig.type}
        拍摄步骤:${taskConfig.steps.length}个
        预计时长:${taskConfig.duration}秒
        
        是否确认创建?
      `,
      success: async (res) => {
        if (res.confirm) {
          const task = await taskApi.create(taskConfig);
          uni.switchTab({ url: '/pages/index/index' });
        }
      }
    });
  } catch (error) {
    uni.hideLoading();
    uni.showToast({ title: 'AI服务异常', icon: 'none' });
  }
};

预期效果:

  • 从"收藏工具"升级为"创作助手"
  • 任务创建效率提升80%(从手动填写到AI生成)

阶段3:长期战略(3-6个月,架构重构)

目标: 打通灵感→任务→创作全链路,实现社区化
资源需求: 2名前端 + 2名后端 + 1名AI工程师 + 1名产品经理
风险等级: 🔴 高(涉及数据迁移和架构重构)


优化3.1:数据模型重构 🎯 P2

目标: 解决灵感和素材共用表的性能和扩展性问题

方案设计:

1. 新表结构

sql
-- 灵感表(外部采集)
CREATE TABLE Inspirations (
  id UUID PRIMARY KEY,
  user_id INTEGER REFERENCES Users(id),
  project_id UUID REFERENCES Projects(id),
  
  -- 基础信息
  title VARCHAR(500),
  content TEXT,
  
  -- 来源信息
  source_type ENUM('link', 'text', 'voice'),
  source_platform VARCHAR(50), -- douyin/xiaohongshu/etc
  source_url TEXT,
  
  -- AI处理
  ai_summary TEXT,
  ai_tags JSONB, -- 使用JSONB以支持GIN索引
  
  -- 媒体
  cover_url TEXT,
  media_urls JSONB,
  
  -- 分类
  type ENUM('collection', 'trend'),
  
  -- 统计
  view_count INTEGER DEFAULT 0,
  usage_count INTEGER DEFAULT 0,
  last_used_at TIMESTAMP,
  
  -- 状态
  status ENUM('active', 'archived', 'deleted') DEFAULT 'active',
  
  -- 时间
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 素材表(用户上传)
CREATE TABLE Assets (
  id UUID PRIMARY KEY,
  user_id INTEGER REFERENCES Users(id),
  project_id UUID REFERENCES Projects(id),
  
  -- 文件信息
  file_type ENUM('image', 'video', 'audio'),
  file_url TEXT NOT NULL,
  thumbnail_url TEXT,
  file_size BIGINT,
  duration INTEGER, -- 视频/音频时长(秒)
  resolution VARCHAR(20), -- 如"1080x1920"
  
  -- 元数据
  title VARCHAR(200),
  description TEXT,
  tags JSONB,
  
  -- 来源
  uploaded_from VARCHAR(20), -- 'mobile' / 'desktop' / 'import'
  
  -- 分析结果(AI识别)
  ai_analysis JSONB, -- 场景、物体、情感等
  
  -- 统计
  usage_count INTEGER DEFAULT 0,
  last_used_at TIMESTAMP,
  
  -- 状态
  status ENUM('processing', 'ready', 'failed', 'deleted') DEFAULT 'processing',
  
  -- 时间
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 使用记录表
CREATE TABLE InspirationUsage (
  id UUID PRIMARY KEY,
  inspiration_id UUID REFERENCES Inspirations(id),
  task_id UUID REFERENCES CaptureTasks(id),
  user_id INTEGER REFERENCES Users(id),
  used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  
  -- 使用上下文
  context JSONB -- 记录如何使用的(如:作为参考/作为模板/作为文案源)
);

-- 索引优化
CREATE INDEX idx_inspirations_user_type ON Inspirations(user_id, type, status);
CREATE INDEX idx_inspirations_tags ON Inspirations USING GIN(ai_tags);
CREATE INDEX idx_inspirations_usage ON Inspirations(usage_count DESC, last_used_at DESC);

CREATE INDEX idx_assets_user_type ON Assets(user_id, file_type, status);
CREATE INDEX idx_assets_project ON Assets(project_id, created_at DESC);

2. 数据迁移策略

javascript
// migrations/20250112000000-split-corpus-table.js
async function migrate() {
  const existingData = await UserCorpus.findAll({
    where: { is_deleted: false }
  });
  
  for (const item of existingData) {
    // 判断是灵感还是素材
    if (item.content_type === 'asset') {
      // 迁移到Assets表
      await Asset.create({
        id: item.id,
        user_id: item.user_id,
        project_id: item.project_id,
        file_type: inferFileType(item),
        file_url: item.media_urls[0],
        title: item.title,
        uploaded_from: item.meta?.source || 'unknown',
        created_at: item.created_at
      });
    } else {
      // 迁移到Inspirations表
      await Inspiration.create({
        id: item.id,
        user_id: item.user_id,
        project_id: item.project_id,
        title: item.title,
        content: item.content,
        source_platform: item.source_platform,
        source_url: item.source_url,
        ai_summary: item.ai_summary,
        ai_tags: item.ai_tags,
        cover_url: item.media_urls[0],
        type: item.inspiration_type,
        usage_count: item.usage_count || 0,
        created_at: item.created_at
      });
    }
  }
  
  console.log(`Migrated ${existingData.length} records`);
}

3. API兼容层

javascript
// 保持旧API兼容
router.get('/unified-feed', authenticateToken, async (req, res) => {
  const { content_type } = req.query;
  
  let results;
  if (content_type === 'asset') {
    results = await Asset.findAll({ where: { user_id: req.user.id } });
  } else if (content_type === 'inspiration') {
    results = await Inspiration.findAll({ where: { user_id: req.user.id } });
  } else {
    // all:合并两个表
    const inspirations = await Inspiration.findAll({ where: { user_id: req.user.id } });
    const assets = await Asset.findAll({ where: { user_id: req.user.id } });
    results = [...inspirations, ...assets].sort((a, b) => 
      new Date(b.created_at) - new Date(a.created_at)
    );
  }
  
  res.json({ success: true, data: { items: results } });
});

预期效果:

  • 查询性能提升:70%(通过专用索引)
  • 代码可维护性提升:清晰的表结构,减少复杂WHERE条件
  • 功能扩展性提升:可以独立为Inspirations和Assets添加新字段

优化3.2:灵感工作流深度集成 🎯 P2

目标: 灵感不再是独立模块,而是任务创建的前置步骤

方案设计:

1. 任务创建流程重构

当前流程:
任务列表 → 点击"新建任务" → 手动填写表单 → 创建

新流程:
任务列表 → 点击"新建任务" → 
  选择方式:
    - 从灵感创建 (80%用户选择)
    - 从模板创建
    - 从空白创建

2. 灵感详情页集成任务生成器

vue
<!-- 灵感详情页底部 -->
<view class="detail-footer">
  <!-- 第一步:选择项目 -->
  <view class="create-task-panel">
    <view class="panel-step">
      <text class="step-num">1</text>
      <text class="step-label">选择项目</text>
    </view>
    <view class="project-selector">
      <picker 
        :range="projects" 
        range-key="name"
        @change="selectProject"
      >
        <view class="picker-display">
          {{ selectedProject?.name || '选择项目' }}
        </view>
      </picker>
    </view>
  </view>
  
  <!-- 第二步:AI生成任务配置 -->
  <view class="create-task-panel">
    <view class="panel-step">
      <text class="step-num">2</text>
      <text class="step-label">生成任务配置</text>
    </view>
    <button 
      class="generate-btn" 
      @click="generateTaskConfig"
      :loading="isGenerating"
    >
      <text class="icon">🤖</text>
      <text>AI智能生成</text>
    </button>
  </view>
  
  <!-- 第三步:预览和调整 -->
  <view class="task-preview" v-if="taskConfig">
    <view class="preview-section">
      <text class="section-title">拍摄步骤 ({{taskConfig.steps.length}}个)</text>
      <view class="steps-list">
        <view class="step-item" v-for="(step, i) in taskConfig.steps" :key="i">
          <text class="step-index">{{ i + 1 }}</text>
          <text class="step-instruction">{{ step.instruction }}</text>
          <text class="step-duration">{{ step.duration }}s</text>
        </view>
      </view>
    </view>
    
    <view class="preview-section">
      <text class="section-title">口播文案</text>
      <textarea 
        v-model="taskConfig.script" 
        class="script-input"
        placeholder="AI生成的文案,可修改"
      />
    </view>
    
    <view class="preview-section">
      <text class="section-title">推荐BGM</text>
      <view class="bgm-suggestion">
        <text class="bgm-name">{{ taskConfig.bgm.name }}</text>
        <button class="play-btn" @click="playBGM">试听</button>
      </view>
    </view>
  </view>
  
  <!-- 第四步:创建任务 -->
  <button 
    class="create-task-btn" 
    @click="createTask"
    v-if="taskConfig"
  >
    <text>创建任务并开始拍摄</text>
  </button>
</view>

3. AI工作流集成

javascript
// services/InspirationToTaskWorkflow.js
class InspirationToTaskWorkflow {
  async execute(inspirationId, projectId, userId) {
    // Step 1: 获取灵感详情
    const inspiration = await Inspiration.findByPk(inspirationId);
    
    // Step 2: 调用CreativeAssistantService分析
    const analysis = await CreativeAssistantService.analyzeContent({
      content: inspiration.content,
      platform: inspiration.source_platform,
      industry: await this.getUserIndustry(userId)
    });
    
    // Step 3: 生成拍摄步骤
    const steps = await this.generateShootingSteps(inspiration, analysis);
    
    // Step 4: 改写口播文案
    const script = await this.rewriteScript(inspiration.content, analysis);
    
    // Step 5: 推荐BGM
    const bgm = await this.suggestBGM(analysis.emotion);
    
    // Step 6: 组装任务配置
    return {
      title: inspiration.title,
      description: `基于灵感「${inspiration.title}」创建`,
      task_type: analysis.task_type,
      duration: steps.reduce((sum, s) => sum + s.duration, 0),
      steps,
      script,
      bgm,
      reference_content: {
        inspiration_id: inspirationId,
        source_url: inspiration.source_url,
        cover_image: inspiration.cover_url
      }
    };
  }
  
  async generateShootingSteps(inspiration, analysis) {
    const prompt = `
      基于以下灵感内容,生成详细的拍摄步骤。
      
      灵感内容:${inspiration.content}
      内容分析:${JSON.stringify(analysis)}
      
      要求:
      1. 每个步骤包含:镜头类型、拍摄指导、建议时长
      2. 适合小白用户,指导要具体
      3. 总时长控制在60秒内
      
      输出JSON格式:
      {
        "steps": [
          { "step": 1, "shot_type": "全景", "instruction": "拍摄店门口,展示招牌", "duration": 3 }
        ]
      }
    `;
    
    const response = await openai.chat.completions.create({
      model: 'gpt-4o',
      messages: [{ role: 'user', content: prompt }]
    });
    
    return JSON.parse(response.choices[0].message.content).steps;
  }
  
  async rewriteScript(originalContent, analysis) {
    const prompt = `
      改写以下内容为适合口播的文案。
      
      原内容:${originalContent}
      
      要求:
      1. 保留核心信息
      2. 口语化,自然流畅
      3. 60秒内能读完
      4. 符合${analysis.platform}平台风格
    `;
    
    const response = await openai.chat.completions.create({
      model: 'gpt-4o',
      messages: [{ role: 'user', content: prompt }]
    });
    
    return response.choices[0].message.content;
  }
  
  async suggestBGM(emotion) {
    // 根据情感标签推荐BGM
    const bgmLibrary = {
      'energetic': { name: '活力节拍', file: 'bgm_energetic.mp3' },
      'calm': { name: '舒缓音乐', file: 'bgm_calm.mp3' },
      'exciting': { name: '激动人心', file: 'bgm_exciting.mp3' }
    };
    
    return bgmLibrary[emotion] || bgmLibrary['energetic'];
  }
}

预期效果:

  • 任务创建效率:从3-5分钟 → 30秒
  • 灵感→任务转化率:从20% → 60%+
  • 用户体验:从"工具"升级为"助手"

优化3.3:去中心化外部服务依赖 🎯 P2

目标: 降低部署门槛,提升功能可用性

方案选择:

方案A:轻量级内置(推荐)

javascript
// 使用轻量级库代替MediaCrawler
const cheerio = require('cheerio');
const axios = require('axios');

async function parseLink_builtin(url) {
  // 1. 检测平台
  const platform = detectPlatform(url);
  
  // 2. 根据平台调用不同策略
  switch (platform) {
    case 'douyin':
      return await parseDouyin(url);
    case 'xiaohongshu':
      return await parseXiaohongshu(url);
    default:
      return await parseGeneric(url);
  }
}

async function parseGeneric(url) {
  try {
    const response = await axios.get(url, {
      headers: { 'User-Agent': 'Mozilla/5.0...' }
    });
    const $ = cheerio.load(response.data);
    
    // 提取OpenGraph元数据
    return {
      title: $('meta[property="og:title"]').attr('content') || $('title').text(),
      description: $('meta[property="og:description"]').attr('content'),
      cover: $('meta[property="og:image"]').attr('content'),
      platform: detectPlatform(url)
    };
  } catch (error) {
    // 降级:返回基础信息
    return {
      title: url,
      description: '点击查看原链接',
      cover: null,
      platform: 'external'
    };
  }
}

async function parseDouyin(url) {
  // 抖音链接特殊处理(通过分享ID获取)
  const shareId = extractShareId(url);
  
  try {
    // 调用抖音开放平台API(如果有)
    const response = await axios.get(`https://open.douyin.com/share/video/${shareId}`);
    return {
      title: response.data.title,
      cover: response.data.cover,
      platform: 'douyin'
    };
  } catch (error) {
    // 降级到通用解析
    return await parseGeneric(url);
  }
}

方案B:云端SaaS服务

javascript
// KKmusic云端API
const CLOUD_API = 'https://api.kkmusic.cloud/v1';

async function parseLink_cloud(url, userApiKey) {
  const response = await axios.post(`${CLOUD_API}/parse-link`, {
    url,
    options: {
      extract_video: false, // 不下载视频(节省成本)
      extract_meta: true
    }
  }, {
    headers: {
      'Authorization': `Bearer ${userApiKey}`,
      'X-User-Id': req.user.id
    }
  });
  
  // 云端返回统一格式
  return response.data;
}

// 用户注册时赠送免费额度
async function onUserRegister(userId) {
  await ApiQuota.create({
    user_id: userId,
    service: 'link_parse',
    quota: 100, // 免费100次
    used: 0
  });
}

方案C:混合策略(最优)

javascript
async function parseLink_hybrid(url) {
  // 1. 优先使用内置解析
  try {
    const result = await parseLink_builtin(url);
    if (result.title && result.cover) {
      return result;
    }
  } catch (error) {
    console.warn('[Inspiration] 内置解析失败,尝试云端');
  }
  
  // 2. 内置失败,尝试云端
  if (process.env.KKMUSIC_CLOUD_API_KEY) {
    try {
      return await parseLink_cloud(url, process.env.KKMUSIC_CLOUD_API_KEY);
    } catch (error) {
      console.warn('[Inspiration] 云端解析失败');
    }
  }
  
  // 3. 都失败,返回基础信息
  return {
    title: '外部链接',
    description: url,
    cover: null,
    source_url: url
  };
}

热点推送轻量化:

javascript
// 不再依赖TrendRadar,直接调用公开API
async function fetchTrends() {
  const sources = [
    fetchWeiboHot(),
    fetchDouyinTrends(),
    fetchBaiduHot()
  ];
  
  const results = await Promise.all(sources);
  const merged = results.flat();
  
  // 按用户行业筛选
  const filtered = merged.filter(item => 
    item.tags.includes(user.industry)
  );
  
  // 存入数据库
  await Inspiration.bulkCreate(filtered.map(item => ({
    title: item.title,
    content: item.description,
    type: 'trend',
    source_platform: item.source,
    ai_tags: item.tags,
    hot_score: item.rank
  })));
}

async function fetchWeiboHot() {
  const response = await axios.get('https://weibo.com/ajax/side/hotSearch');
  return response.data.realtime.map(item => ({
    title: item.word,
    rank: item.rank,
    source: 'weibo',
    tags: item.category ? [item.category] : ['通用']
  }));
}

预期效果:

  • 部署成功率:从50% → 95%
  • 功能可用性:即使不配置外部服务,核心功能仍可用
  • 用户满意度:减少因"功能不可用"导致的差评

优化3.4:社区化灵感共享 🎯 P2

目标: 从个人工具升级为创作者社区

方案设计:

1. 灵感广场

vue
<view class="inspiration-square">
  <view class="square-header">
    <text class="square-title">灵感广场</text>
    <text class="square-desc">发现其他创作者的优质灵感</text>
  </view>
  
  <!-- 筛选器 -->
  <view class="square-filters">
    <view class="filter-tabs">
      <view 
        class="filter-tab" 
        :class="{ active: filterCategory === 'all' }"
        @click="filterCategory = 'all'"
      >
        全部
      </view>
      <view 
        class="filter-tab" 
        :class="{ active: filterCategory === 'beauty' }"
        @click="filterCategory = 'beauty'"
      >
        美业
      </view>
      <view 
        class="filter-tab" 
        :class="{ active: filterCategory === 'food' }"
        @click="filterCategory = 'food'"
      >
        餐饮
      </view>
      <view 
        class="filter-tab" 
        :class="{ active: filterCategory === 'knowledge' }"
        @click="filterCategory = 'knowledge'"
      >
        知识IP
      </view>
    </view>
    
    <view class="sort-selector">
      <picker :range="['最新', '最热', '最多收藏']" @change="handleSortChange">
        <text>{{ currentSort }}</text>
      </picker>
    </view>
  </view>
  
  <!-- 灵感列表 -->
  <view class="square-content">
    <view 
      class="square-card" 
      v-for="item in squareList" 
      :key="item.id"
      @click="viewSquareDetail(item)"
    >
      <image class="card-cover" :src="item.cover" mode="aspectFill" />
      
      <view class="card-body">
        <text class="card-title">{{ item.title }}</text>
        <view class="card-stats">
          <view class="stat-item">
            <text class="icon">👁️</text>
            <text>{{ item.view_count }}</text>
          </view>
          <view class="stat-item">
            <text class="icon">❤️</text>
            <text>{{ item.like_count }}</text>
          </view>
          <view class="stat-item">
            <text class="icon">⭐</text>
            <text>{{ item.collect_count }}</text>
          </view>
        </view>
      </view>
      
      <!-- 作者信息 -->
      <view class="card-author">
        <image class="author-avatar" :src="item.author.avatar" />
        <text class="author-name">{{ item.author.name }}</text>
        <view class="author-badge" v-if="item.author.is_verified">
          <text>✓ 认证</text>
        </view>
      </view>
    </view>
  </view>
</view>

2. 分享机制

javascript
// 用户可选择是否分享灵感到广场
const shareToSquare = async (inspirationId) => {
  // 1. 检查是否符合分享条件
  const inspiration = await Inspiration.findByPk(inspirationId);
  
  if (inspiration.usage_count < 1) {
    uni.showToast({
      title: '至少使用过一次才能分享哦',
      icon: 'none'
    });
    return;
  }
  
  // 2. 创建分享记录
  await InspirationsSquare.create({
    inspiration_id: inspirationId,
    user_id: req.user.id,
    category: detectCategory(inspiration.ai_tags),
    status: 'pending_review' // 需要审核
  });
  
  // 3. 奖励积分
  await UserPoints.increment({ user_id: req.user.id, points: 10 });
  
  uni.showToast({
    title: '已提交,审核通过后将在广场展示',
    icon: 'success'
  });
};

3. 社区互动

javascript
// 点赞
router.post('/square/:id/like', authenticateToken, async (req, res) => {
  await InspirationsSquare.increment('like_count', {
    where: { id: req.params.id }
  });
  
  await SquareLike.create({
    square_id: req.params.id,
    user_id: req.user.id
  });
  
  res.json({ success: true });
});

// 收藏到我的灵感库
router.post('/square/:id/collect', authenticateToken, async (req, res) => {
  const squareItem = await InspirationsSquare.findByPk(req.params.id, {
    include: [Inspiration]
  });
  
  // 创建副本到用户自己的灵感库
  const myInspiration = await Inspiration.create({
    ...squareItem.Inspiration.toJSON(),
    id: undefined, // 生成新ID
    user_id: req.user.id,
    source_type: 'community',
    original_author_id: squareItem.user_id
  });
  
  res.json({ success: true, inspiration_id: myInspiration.id });
});

4. 激励机制

javascript
// 积分系统
const POINT_RULES = {
  share_inspiration: 10,
  inspiration_liked: 2,
  inspiration_collected: 5,
  high_quality_inspiration: 50 // 被收藏超过100次
};

// 排行榜
router.get('/square/leaderboard', async (req, res) => {
  const topUsers = await sequelize.query(`
    SELECT 
      u.id, u.name, u.avatar,
      COUNT(DISTINCT is.id) AS inspiration_count,
      SUM(is.like_count) AS total_likes,
      SUM(is.collect_count) AS total_collects
    FROM Users u
    JOIN InspirationsSquare is ON u.id = is.user_id
    WHERE is.status = 'approved'
    GROUP BY u.id
    ORDER BY total_collects DESC
    LIMIT 20
  `);
  
  res.json({ success: true, data: topUsers });
});

预期效果:

  • 内容生态:UGC内容增加,降低运营成本
  • 用户黏性:DAU/MAU比例从20% → 35%
  • 商业价值:社区氛围形成后,可开展付费会员、广告等变现

第五部分:实施路线图

5.1 时间线规划

mermaid
gantt
    title 灵感板块优化实施路线图
    dateFormat  YYYY-MM-DD
    
    section 阶段1-快速优化
    简化Tab结构           :a1, 2025-01-15, 3d
    强化一键引用入口        :a2, after a1, 2d
    空状态引导优化          :a3, after a2, 2d
    测试和发布             :a4, after a3, 3d
    
    section 阶段2-中期迭代
    智能标签系统            :b1, 2025-02-01, 14d
    灵感使用统计            :b2, 2025-02-05, 7d
    推荐算法开发            :b3, 2025-02-15, 14d
    详情页增强              :b4, 2025-02-20, 7d
    测试和发布              :b5, 2025-03-01, 7d
    
    section 阶段3-长期战略
    数据模型重构            :c1, 2025-04-01, 28d
    工作流深度集成          :c2, 2025-04-15, 28d
    外部服务优化            :c3, 2025-05-01, 14d
    社区化功能              :c4, 2025-05-15, 28d
    全面测试和上线          :c5, 2025-06-10, 14d

5.2 资源分配

阶段前端后端AI工程师测试总人天
阶段15天3天02天10天
阶段220天20天10天8天58天
阶段340天50天20天20天130天

团队配置建议:

  • 前端工程师:1名(全程参与)
  • 后端工程师:2名(阶段2-3各1名)
  • AI工程师:1名(阶段2-3兼职)
  • 测试工程师:1名(兼职)
  • 产品经理:1名(阶段3全程参与)

5.3 里程碑与验收标准

里程碑1:阶段1完成(Week 2)

验收标准:

  • ✅ Tab从5个减少到3个
  • ✅ 每个卡片底部有"用这个拍视频"按钮
  • ✅ 空状态显示引导文案和示例灵感
  • ✅ 灵感→任务转化率达到15%以上
  • ✅ 用户反馈NPS > 7

里程碑2:阶段2完成(Week 8)

验收标准:

  • ✅ 所有灵感自动打上AI标签
  • ✅ 标签筛选功能可用,点击率>20%
  • ✅ 卡片上显示使用次数
  • ✅ 推荐Tab内容与用户相关度>70%
  • ✅ 详情页有"相似灵感"和"适用场景"
  • ✅ 灵感使用率提升30%

里程碑3:阶段3完成(Week 24)

验收标准:

  • ✅ 数据迁移完成,无数据丢失
  • ✅ 查询性能提升50%以上
  • ✅ 灵感详情页可直接生成完整任务
  • ✅ 内置解析成功率>80%(无需MediaCrawler)
  • ✅ 灵感广场上线,UGC内容>100条
  • ✅ 社区日活>100人

第六部分:成功指标体系

6.1 短期指标(1个月)

指标名称当前基线目标值数据采集方式
灵感采集量10条/用户/月13条/用户/月 (+30%)数据库统计
采集成功率60%85%后端日志分析
灵感→任务转化率5%15%埋点统计
首次采集转化率0%40%新用户漏斗分析
用户7日留存45%50% (+10%)Cohort分析
NPS评分67.5问卷调查

数据采集实现:

javascript
// 埋点示例
analytics.track('inspiration_collected', {
  user_id: req.user.id,
  inspiration_id: inspiration.id,
  source_type: inspiration.source_type,
  success: true,
  elapsed_time: Date.now() - startTime
});

analytics.track('inspiration_converted_to_task', {
  user_id: req.user.id,
  inspiration_id: inspiration.id,
  task_id: task.id
});

6.2 中期指标(3个月)

指标名称目标值计算公式数据源
灵感平均使用次数2次/条SUM(usage_count) / COUNT(inspirations)Inspirations表
高价值灵感占比20%COUNT(usage_count>=5) / COUNT(all)统计查询
推荐点击率25%推荐Tab点击数 / 推荐Tab展示数埋点统计
标签筛选使用率30%使用标签筛选的会话数 / 总会话数行为日志
灵感查找效率5秒平均查找时间(从进入到点击)前端计时
用户满意度NPS > 8(推荐者% - 贬损者%)问卷调查

6.3 长期指标(6个月)

指标名称目标值说明
社区UGC占比30%来自社区的灵感占总灵感的比例
社区活跃度DAU/MAU > 30%日活跃用户 / 月活跃用户
用户分享率10%至少分享过1条灵感的用户比例
灵感广场GMV¥50万/月通过广场带来的商业价值(会员、广告)
付费转化率5%免费用户 → 付费会员的转化率
平台NPS> 50整体用户推荐度

6.4 数据看板设计

javascript
// Grafana Dashboard配置示例
{
  "dashboard": {
    "title": "灵感板块核心指标",
    "panels": [
      {
        "title": "灵感采集趋势",
        "targets": [
          {
            "query": "SELECT DATE(created_at), COUNT(*) FROM Inspirations GROUP BY DATE(created_at)"
          }
        ],
        "type": "graph"
      },
      {
        "title": "转化漏斗",
        "targets": [
          {
            "query": `
              SELECT 
                '采集' AS stage, COUNT(DISTINCT user_id) AS users FROM Inspirations
              UNION ALL
              SELECT 
                '查看' AS stage, COUNT(DISTINCT user_id) FROM InspirationViews
              UNION ALL
              SELECT 
                '转化' AS stage, COUNT(DISTINCT user_id) FROM InspirationUsage
            `
          }
        ],
        "type": "funnel"
      },
      {
        "title": "Top10 高价值灵感",
        "targets": [
          {
            "query": "SELECT title, usage_count FROM Inspirations ORDER BY usage_count DESC LIMIT 10"
          }
        ],
        "type": "table"
      }
    ]
  }
}

第七部分:风险管理

7.1 技术风险

风险概率影响应对措施
数据迁移失败1) 充分测试 2) 双写机制 3) 回滚方案
AI服务不稳定1) 降级方案 2) 缓存机制 3) 备用模型
性能下降1) 压力测试 2) 索引优化 3) CDN加速
外部API限流1) 请求队列 2) 备用API 3) 本地缓存

7.2 产品风险

风险概率影响应对措施
用户不接受Tab调整灰度发布 + A/B测试 + 用户反馈快速迭代
推荐算法效果差准备3套推荐策略,AB测试选最优
社区内容质量低审核机制 + 激励优质内容 + 降权低质

7.3 资源风险

风险概率影响应对措施
人力不足降低阶段3优先级,聚焦阶段1-2
AI成本超预算使用GPT-4o-mini,限制调用频率
时间延期砍掉次要功能,保证核心体验

第八部分:总结与建议

8.1 核心要点

  1. 问题根源:灵感板块当前最大问题是"定位模糊"和"转化断层"
  2. 优化重点:优先解决转化路径(一键引用),其次提升查找效率(标签/推荐)
  3. 长期方向:从收藏工具 → 创作助手 → 创作者社区

8.2 快速落地建议

如果只有1周时间,做这3件事:

  1. 简化Tab结构(3个Tab)
  2. 卡片底部增加"用这个拍视频"按钮
  3. 空状态增加引导文案

预期收益: 转化率 +10%,用户留存 +5%

如果有1个月时间,再做这3件事: 4. AI自动打标签 5. 标签筛选功能 6. 使用次数可视化

预期收益: 查找效率 +50%,灵感复用率 +30%

如果有3个月时间,再做这2件事: 7. 灵感→任务工作流集成(AI生成完整任务) 8. 去除MediaCrawler依赖(内置轻量级解析)

预期收益: 任务创建效率 +80%,部署成功率 +45%

8.3 下一步行动

  1. 立即:与产品团队review本方案,确定阶段1范围
  2. 本周:启动阶段1开发(3天完成)
  3. 下周:灰度发布阶段1,收集用户反馈
  4. 下月:根据数据决定是否进入阶段2

附录

A. 参考资料

  • INSPIRATION_MINIPROGRAM_ANALYSIS.md - 现状分析报告
  • INSPIRATION_SETUP.md - 当前灵感库部署文档
  • INSPIRATION_OPTIMIZATION_SUMMARY.md - Web端优化总结

B. 联系方式

有任何疑问,请联系:

  • 产品负责人:[姓名]
  • 技术负责人:[姓名]
  • 项目管理:[姓名]

文档结束

© 2024-2025 趣美丽 QuMeiLi · Powered by 刻流星引擎 KeLiuXing