Feature Setting - EDU 教育引导接口文档

概述

EDU (Education) 功能设置模块是 Katana 平台的新用户教育引导系统,用于向 Promoter(推广者)和 Consumer(消费者)展示分步骤的引导流程,帮助用户快速了解平台核心功能。

核心概念

  • FeatureName: 功能名称标识符,每个 EDU 功能对应一个唯一的 FeatureName
  • FeatureScene: 功能场景,定义了在哪些页面/场景下应该展示哪些 EDU 功能
  • PromoterSetting: 推广者个人功能设置,记录用户是否完成某个引导
  • FeatureSetting: 全局功能配置,定义功能的默认配置(如引导文案、图片等)
  • ConsumerSetting: 消费者功能设置,记录消费者对某个推广者的引导状态

功能优先级规则

系统按顺序返回未完成的引导流程。当前一个流程完成后,才会返回下一个流程。

数据库表结构

-- 推广者个人功能设置表
model PromoterSetting {
  id          String   @id @db.Uuid
  promoterId  String   @map("promoter_id") @db.Uuid
  createdAt   DateTime @default(now()) @map("created_at") @db.Timestamptz()
  updatedAt   DateTime @updatedAt @map("updated_at") @db.Timestamptz()
  featureName String   @default("") @map("feature_name")
  settingData Json     @default("{}") @map("setting_data")

  @@unique([promoterId, featureName])
  @@index([promoterId])
}

-- 全局功能配置表
model FeatureSetting {
  id          String   @id @db.Uuid
  createdAt   DateTime @default(now()) @map("created_at") @db.Timestamptz()
  updatedAt   DateTime @updatedAt @map("updated_at") @db.Timestamptz()
  featureName String   @map("feature_name")
  enable      Boolean  @default(true)
  featureData Json     @default("{}") @map("feature_data")

  @@index([featureName])
}

-- 消费者功能设置表
model ConsumerSetting {
  id          String   @id @db.Uuid
  consumerId  String   @map("consumer_id") @db.Uuid
  promoterId  String?  @map("promoter_id") @db.Uuid
  createdAt   DateTime @default(now()) @map("created_at") @db.Timestamptz()
  updatedAt   DateTime @updatedAt @map("updated_at") @db.Timestamptz()
  featureName String   @map("feature_name")
  featureData Json     @default("{}") @map("feature_data")

  @@index([promoterId])
  @@index([consumerId])
}

接口列表

接口 方法 描述
[[#1 获取推广者功能设置列表]] GET 根据场景获取待展示的 EDU 功能
[[#2 更新推广者功能设置状态]] PATCH 标记 EDU 功能为已完成
[[#3 获取单个推广者功能设置]] GET 获取指定功能的详细配置

1. 获取推广者功能设置列表

根据指定场景获取当前用户待展示的 EDU 功能设置列表。

接口信息

  • 请求地址: /feature-setting/promoter
  • 请求方式: GET
  • 需要认证: 是(JWT Token)

请求头(Header)

字段 类型 必填 说明
authorization string 是 Bearer Token(JWT)
from string 否 来源标识,通常为 client
origin string 否 请求来源域名

请求参数(Query)

字段 类型 必填 说明
scene FeatureSettingScene 是 功能场景标识

FeatureSettingScene 枚举值

枚举值 描述
SCENE_MY_SHOP 我的店铺场景
SCENE_MARKETPLACE 市场场景
SCENE_CURATOR_PDP 推广者商品详情页
SCENE_CONSUMER_SHOP 消费者店铺场景
SCENE_CONSUMER_PDP 消费者商品详情页
SCENE_GUEST_SHOP 访客店铺场景
SCENE_GUEST_PDP 访客商品详情页
SCENE_EXPLORE 探索页场景
SCENE_QUICK_ACCESS 快速访问场景
SCENE_MY_CATALOG 我的目录场景

响应结构

{
  "code": number,           // 状态码,200 表示成功
  "message": string,        // 响应消息
  "request_id": string,     // 请求追踪 ID
  "data": {                 // 功能设置映射表
    "[FeatureName]": {      // 功能名称作为 key
      // 功能配置数据
    }
  }
}

响应字段说明

通用字段

字段 类型 说明
code number 状态码,200 表示成功
message string 响应消息
request_id string 请求追踪 ID
data object 功能设置数据

功能配置字段

字段 类型 说明
completed boolean 是否已完成
enable boolean 是否启用(功能级控制)
pass boolean 是否通过白名单验证
step1~stepN object 分步骤配置(特定功能)
cta string 按钮文本
backCta string 返回按钮文本
title string 标题
description string 描述文本

成功响应示例

{
  "code": 200,
  "message": "success",
  "request_id": "17840261-7252-428b-8a14-1a0babb0168f",
  "data": {
    "EDU_INTRODUCE_SHOP": {
      "step1": {
        "cta": "Next",
        "title": "Customize your shop",
        "description": "Add your cover image, intro, and social, then adjust colors and fonts to make it your own."
      },
      "step2": {
        "cta": "Next",
        "title": "Add new module",
        "backCta": "Back",
        "description": "Add modules to feature your events, products, or content exactly how you want."
      },
      "step3": {
        "cta": "Next",
        "title": "Preview your shop",
        "backCta": "Back",
        "description": "Preview your storefront exactly as your visitors will see it."
      },
      "step4": {
        "cta": "Got it",
        "title": "Introduce content tabs",
        "backCta": "Back",
        "description": "These tabs are your content library. All posts and links live here until deleted. They're hidden by default and best shared via custom modules."
      },
      "completed": false,
      "enable": true
    }
  }
}

业务逻辑

flowchart TD
    A[开始: GET /feature-setting/promoter] --> B[从 JWT 获取 promoterId]
    B --> C{验证用户是否存在}
    C -->|不存在| D[抛出 ResourceNotFound]
    C -->|存在| E{用户是否为 Promoter}
    E -->|否| F[返回空对象 {}]
    E -->|是| G[根据 scene 获取功能名称列表]
    G --> H[查询所有功能的用户设置]
    H --> I[过滤已完成的功能]
    I --> J{scene 是否为 SCENE_CURATOR_PDP}
    J -->|是| K[返回所有未完成功能]
    J -->|否| L[按优先级返回第一个未完成功能]
    L --> M[合并全局功能配置数据]
    M --> N[检查功能启用状态和白名单]
    N --> O[返回结果]

场景与功能映射表

场景 功能列表(按优先级排序)
SCENE_MY_SHOP EDU_NEW_BUSINESS_PARTNER → EDU_INTRODUCE_SHOP → EDU_REARRANGE_MODULES
SCENE_MARKETPLACE EDU_NEW_CURATOR_COUPON
SCENE_QUICK_ACCESS EDU_SELF_LISTING
SCENE_CURATOR_PDP EDU_IMAGE_DOWNLOAD
SCENE_CURATOR_MY_LIST EDU_FOLLOW_POPUP_OFF → EDU_MY_FOLLOWERS
SCENE_CONSUMER_SHOP EDU_NEW_CONSUMER_COUPON → SUBSCRIPTION_POPUP
SCENE_CONSUMER_PDP EDU_NEW_CONSUMER_COUPON → SUBSCRIPTION_POPUP
SCENE_GUEST_SHOP EDU_GUEST_COUPON → SUBSCRIPTION_POPUP
SCENE_GUEST_PDP EDU_GUEST_COUPON → SUBSCRIPTION_POPUP
SCENE_EXPLORE EDU_INTRODUCE_EXPLORE → EDU_FIRST_POST
SCENE_PROMOTER_SHOP EDU_EXPLORE_PAGE → EDU_RESELL_TOOLTIP
SCENE_MY_CATALOG EDU_CATALOG_SETTING_ICON

错误响应示例

401 Unauthorized

{
  "statusCode": 401,
  "message": "Unauthorized"
}

404 Not Found

{
  "statusCode": 404,
  "message": "Resource not found",
  "error": "User not found"
}

注意事项

  1. 认证要求: 接口需要有效的 JWT Token,从 Token 中提取 userId 作为 promoterId
  2. 角色校验: 非 Promoter 角色的用户会返回空对象
  3. 功能优先级: 除 SCENE_CURATOR_PDP 外,其他场景只返回第一个未完成的功能
  4. 白名单验证: 部分功能可能受白名单限制,未通过验证的用户会自动标记为已完成
  5. 自动创建: 首次调用时自动创建用户功能设置记录

2. 更新推广者功能设置状态

将指定的 EDU 功能标记为已完成。

接口信息

  • 请求地址: /feature-setting/promoter/{featureName}
  • 请求方式: PATCH
  • 需要认证: 是(JWT Token)

请求头(Header)

字段 类型 必填 说明
authorization string 是 Bearer Token(JWT)
from string 否 来源标识,通常为 client
origin string 否 请求来源域名
content-type string 是 application/json

路径参数(Path)

字段 类型 必填 说明
featureName FeatureName 是 功能名称标识

请求体(Body)

{
  "completed?: boolean",      // 是否标记为完成(可选)
  "triggerDate?: string",     // 触发日期,ISO 8601 格式(可选)
  "promoterId?: string",      // 推广者 ID(可选,通常从 JWT 获取)
  "id?: string"               // 功能 ID(可选,用于公告类功能)
}

请求体字段说明

字段 类型 必填 说明
completed boolean 否 是否标记为完成,默认 true
triggerDate string 否 触发日期,ISO 8601 格式
promoterId string 否 推广者 ID(通常从 JWT 获取,无需传参)
id string 否 功能 ID,用于公告类功能的标记已读

响应结构

{
  "code": number,           // 状态码,200 表示成功
  "message": string,        // 响应消息
  "request_id": string      // 请求追踪 ID
}

成功响应示例

{
  "code": 200,
  "message": "success",
  "request_id": "989e4eb5-cacb-44aa-b17e-110e3f4c84be"
}

业务逻辑

flowchart TD
    A[开始: PATCH /feature-setting/promoter/{featureName}] --> B[从 JWT 获取 promoterId]
    B --> C{功能名称是否在 FeatureScene 中}
    C -->|否| D[抛出 BadRequestException]
    C -->|是| E[查询用户功能设置]
    E --> F{设置是否存在}
    F -->|否| G[抛出 ResourceNotFound]
    F -->|是| H{功能类型判断}
    H -->|一次性完成类| I[标记 completed = true]
    H -->|显示控制类| J[设置 display = false]
    H -->|公告类| K[更新 dismissed 列表]
    H -->|计数器类| L[更新日期和计数]
    I --> M[保存到数据库]
    J --> M
    K --> M
    L --> M
    M --> N[返回成功响应]

功能类型与处理方式

功能类型 处理方式
CompleteOnce 设置 completed = true
EduDisplay 设置 display = false
DisMiss 将 ID 添加到 dismissed 数组
DateAndCount 更新 date 和 count

错误响应示例

400 Bad Request - 未知功能

{
  "statusCode": 400,
  "message": "Unknown feature-setting type"
}

404 Not Found

{
  "statusCode": 404,
  "message": "Resource not found",
  "error": "PromoterSetting not found"
}

401 Unauthorized

{
  "statusCode": 401,
  "message": "Unauthorized"
}

注意事项

  1. 幂等性: 重复标记已完成的功能不会报错,但会更新数据库记录
  2. 功能验证: 只有在 FeatureScene 中定义的功能才能被更新
  3. 自动完成标记: 调用后会将 completed 字段设置为 true
  4. 公告类功能: 需要传 id 参数来标记具体哪条公告已读

3. 获取单个推广者功能设置

获取指定功能的详细配置,包括全局配置和用户个人设置。

接口信息

  • 请求地址: /feature-setting/promoter/{featureName}
  • 请求方式: GET
  • 需要认证: 是(JWT Token)

请求头(Header)

字段 类型 必填 说明
authorization string 是 Bearer Token(JWT)
from string 否 来源标识,通常为 client
origin string 否 请求来源域名

路径参数(Path)

字段 类型 必填 说明
featureName FeatureName 是 功能名称标识

响应结构

{
  "code": number,
  "message": string,
  "request_id": string,
  "data": {
    // 功能配置数据
  }
}

成功响应示例

EDU_NEW_BUSINESS_PARTNER 响应

{
  "code": 200,
  "message": "success",
  "request_id": "xxx-xxx-xxx",
  "data": {
    "completed": false,
    "enable": true,
    "pass": true,
    // 其他功能特定配置...
  }
}

EDU_INTRODUCE_SHOP 响应

{
  "code": 200,
  "message": "success",
  "request_id": "xxx-xxx-xxx",
  "data": {
    "step1": {
      "cta": "Next",
      "title": "Customize your shop",
      "description": "Add your cover image, intro, and social..."
    },
    "step2": { /* ... */ },
    "step3": { /* ... */ },
    "step4": { /* ... */ },
    "completed": false,
    "enable": true
  }
}

业务逻辑

flowchart TD
    A[开始: GET /feature-setting/promoter/{featureName}] --> B[从 JWT 获取 promoterId]
    B --> C{用户角色是否为 CONSUMER}
    C -->|是| D[返回 { completed: true }]
    C -->|否| E[查询用户功能设置]
    E --> F{功能类型特殊处理}
    F -->|EDU_NEW_BUSINESS_PARTNER| G[检查用户是否为 Business Partner]
    F -->|EDU_SETUP_SHOP| H[检查 shopProfileUpdated 状态]
    F -->|EDU_NEW_CURATOR_COUPON| I[检查注册时间是否过期]
    F -->|其他| J[使用默认处理]
    G --> K{是否满足条件}
    H --> K
    I --> K
    J --> L[返回配置数据]
    K -->|不满足| M[返回 { completed: true }]
    K -->|满足| L
    L --> N[合并全局配置和用户设置]
    N --> O[检查功能启用状态]
    O --> P[返回最终数据]

特殊功能逻辑

EDU_NEW_BUSINESS_PARTNER

  • 显示条件: 用户必须是 BUSINESS_PARTNER 角色
  • 自动完成: 非 Business Partner 自动标记为已完成
  • 实现代码位置: src/feature-setting/onboarding/promoter-onboarding.service.ts:232-246

EDU_INTRODUCE_SHOP

  • 功能类型: CompleteOnce(一次性完成)
  • 步骤配置: 4 个步骤,每个步骤包含 cta、title、description 字段
  • 场景: SCENE_MY_SHOP

EDU_REARRANGE_MODULES

  • 显示条件: 用户的 StoreFront 模块数量必须 > 1
  • 自动完成: 模块数量 ≤ 1 时自动标记为已完成
  • 实现代码位置: src/feature-setting/onboarding/promoter-onboarding.service.ts:475-492

错误响应示例

400 Bad Request - 未知功能

{
  "statusCode": 400,
  "message": "EDU_UNKNOWN_FEATURE: Unknown feature name"
}

404 Not Found

{
  "statusCode": 404,
  "message": "Resource not found",
  "error": "FeatureSetting not found"
}

注意事项

  1. 消费者角色: CONSUMER 角色的用户请求时会直接返回 { completed: true }
  2. 自动创建: 首次获取时自动创建用户功能设置记录
  3. 条件验证: 部分功能会根据用户属性动态判断是否应该显示

FeatureName 枚举说明

EDU - 新用户引导类

FeatureName 描述 场景
EDU_NEW_BUSINESS_PARTNER 新 Business Partner 引导 SCENE_MY_SHOP
EDU_INTRODUCE_SHOP 店铺介绍引导(4 步骤) SCENE_MY_SHOP
EDU_REARRANGE_MODULES 重新排列模块引导 SCENE_MY_SHOP
EDU_REARRANGE_MODULES 重新排列模块引导 SCENE_MY_SHOP
EDU_NEW_CURATOR_COUPON 新推广者优惠券引导 SCENE_MARKETPLACE
EDU_NEW_CONSUMER_COUPON 新消费者优惠券引导 SCENE_CONSUMER_SHOP/PDP
EDU_GUEST_COUPON 访客优惠券引导 SCENE_GUEST_SHOP/PDP
EDU_IMAGE_DOWNLOAD 图片下载引导 SCENE_CURATOR_PDP
EDU_SELF_LISTING 自助上架引导 SCENE_QUICK_ACCESS
EDU_SETUP_SHOP 店铺设置引导 -
EDU_FOLLOW_POPUP_OFF 关注弹窗关闭引导 SCENE_CURATOR_MY_LIST
EDU_MY_FOLLOWERS 我的粉丝引导 SCENE_CURATOR_MY_LIST
EDU_EXPLORE_PAGE 探索页引导 SCENE_PROMOTER_SHOP
EDU_CREATE_FIRST_POST 创建首篇帖子引导 SCENE_EXPLORE
EDU_RESELL_FIRST_POST 转发首篇帖子引导 EDU_RESELL_FIRST_POST
EDU_CATALOG_SETTING_ICON 目录设置图标引导 SCENE_MY_CATALOG
EDU_RESELL_TOOLTIP 转发工具提示引导 SCENE_PROMOTER_SHOP
EDU_RESELL_POST 转发帖子引导 EDU_RESELL_POST
EDU_SHARE_TO_EARN 分享赚佣金引导 EDU_RESELL_POST
EDU_CHANGE_PRODUCT_STATUS 更改商品状态引导 EDU_CHANGE_PRODUCT_STATUS
EDU_CHANGE_FOLLOW_EXTERNAL_STATUS 更改外部关注状态引导 EDU_CHANGE_FOLLOW_EXTERNAL_STATUS
EDU_POST_AFFILIATE_LINKS 帖子联盟链接引导 EDU_POST_AFFILIATE_LINKS
EDU_CREATE_POST 创建帖子引导 EDU_CREATE_POST
EDU_POST_ADDING_PRODUCT 帖子添加商品引导 EDU_POST_ADDING_PRODUCT
EDU_POST_PUBLISHING 帖子发布引导 EDU_POST_PUBLISHING
EDU_PERSONALIZE_POST 个性化帖子引导 EDU_PERSONALIZE_POST
EDU_FIRST_POST 首篇帖子引导 EDU_FIRST_POST
EDU_INTRODUCE_EXPLORE 探索页介绍引导 SCENE_EXPLORE
EDU_STOREFRONT_THEME 店铺主题引导 EDU_STOREFRONT_THEME
EDU_POST_RESALE_SETTINGS 帖子转发设置引导 -
EDU_ACCOUNT_MENU 账户菜单引导 EDU_ACCOUNT_MENU

订阅类

FeatureName 描述 场景
SUBSCRIPTION 订阅功能 -
SUBSCRIPTION_POPUP 订阅弹窗 SCENE_CONSUMER_SHOP/PDP
CURATOR_SUBSCRIPTION 推广者订阅 -

公告类

FeatureName 描述
PEAR_ANNOUNCEMENTS Pear 平台公告
PROMOTER_ANNOUNCEMENTS 推广者公告
PARTNER_ANNOUNCEMENTS 合作伙伴公告
CONSUMER_ANNOUNCEMENTS 消费者公告

注册类

FeatureName 描述
CONSUMER_SIGNUP 消费者注册配置
PROMOTER_SIGNUP 推广者注册配置
MERCHANT_SIGNUP 商户注册配置
CURATOR_SIGNUP 推广者注册配置(旧)
SELF_LISTING_SIGNUP 自助上架注册配置

其他

FeatureName 描述
CONFIGURABLE_FEATURE 可配置功能

数据结构定义

CompleteOnce(一次性完成)

{
  completed: boolean;  // 是否已完成
}

DateAndCount(日期计数)

{
  completed: boolean;  // 是否已完成
  count: number;       // 计数器
  date: Date;          // 日期
}

EduDisplay(显示控制)

{
  display: boolean;    // 是否显示
}

DisMiss(可关闭)

{
  completed: boolean;   // 是否已完成
  dismissed: string[];  // 已关闭的项目 ID 列表
}

PromoterDefaultSetting(推广者默认设置)

联合类型,可能是以下类型之一:

  • CompleteOnce
  • DateAndCount
  • EduDisplay
  • DisMiss

白名单与功能开关

功能开关验证流程

flowchart TD
    A[开始功能检查] --> B{查询 FeatureSetting}
    B --> C{enable 是否为 true}
    C -->|否| D[返回 false - 功能禁用]
    C -->|是| E{isWhiteListOn 是否为 true}
    E -->|否| F[返回 true - 功能启用]
    E -->|是| G{检查 FeatureFlag 白名单}
    G -->|用户在白名单| F
    G -->|用户不在白名单| D

配置示例

{
  "featureName": "EDU_INTRODUCE_SHOP",
  "enable": true,
  "featureData": {
    "isWhiteListOn": false,
    "step1": {
      "cta": "Next",
      "title": "Customize your shop"
    }
  }
}

使用场景示例

场景 1:新 Business Partner 首次进入我的店铺

# 1. 前端请求待展示的功能
curl -X GET 'https://katana-api.1m.app/feature-setting/promoter?scene=SCENE_MY_SHOP' \
  -H 'authorization: Bearer {JWT_TOKEN}'

# 2. 返回 EDU_NEW_BUSINESS_PARTNER 功能配置
# 前端展示引导弹窗

# 3. 用户点击"我知道了",标记完成
curl -X PATCH 'https://katana-api.1m.app/feature-setting/promoter/EDU_NEW_BUSINESS_PARTNER' \
  -H 'authorization: Bearer {JWT_TOKEN}' \
  -H 'content-type: application/json' \
  -d '{}'

# 4. 下次请求时,会返回下一个未完成的功能 EDU_INTRODUCE_SHOP

场景 2:完成 EDU_INTRODUCE_SHOP 的 4 步引导

# 获取功能配置
curl -X GET 'https://katana-api.1m.app/feature-setting/promoter/EDU_INTRODUCE_SHOP' \
  -H 'authorization: Bearer {JWT_TOKEN}'

# 返回包含 4 个步骤的配置
# 前端根据 step1, step2, step3, step4 展示分步引导

# 用户完成所有步骤后,标记功能完成
curl -X PATCH 'https://katana-api.1m.app/feature-setting/promoter/EDU_INTRODUCE_SHOP' \
  -H 'authorization: Bearer {JWT_TOKEN}' \
  -H 'content-type: application/json' \
  -d '{"completed": true}'

场景 3:处理公告类功能

# 获取待显示的公告
curl -X GET 'https://katana-api.1m.app/feature-setting/promoter?scene=SCENE_MY_SHOP' \
  -H 'authorization: Bearer {JWT_TOKEN}'

# 假设返回 PEAR_ANNOUNCEMENTS,包含多条公告
# 用户关闭某条公告时,传递公告 ID
curl -X PATCH 'https://katana-api.1m.app/feature-setting/promoter/PEAR_ANNOUNCEMENTS' \
  -H 'authorization: Bearer {JWT_TOKEN}' \
  -H 'content-type: application/json' \
  -d '{"id": "announcement-123"}'

常见问题

Q1: 为什么有些功能没有返回?

A: 可能的原因:

  1. 功能已完成(completed = true)
  2. 功能未启用(enable = false)
  3. 用户不在白名单中(pass = false)
  4. 功能的显示条件不满足(如 EDU_NEW_BUSINESS_PARTNER 要求用户是 Business Partner)

Q2: 如何判断是否应该显示引导弹窗?

A: 判断逻辑:

  1. 检查 completed 是否为 false
  2. 检查 enable 是否为 true
  3. 检查 pass 是否为 true(如果存在)
  4. 所有条件满足时应该显示弹窗

Q3: 同一场景多个功能的优先级如何确定?

A: 按 FeatureScene 中定义的数组顺序,数组前面的优先级更高。只有当前一个功能完成后,才会返回下一个功能。

Q4: PATCH 请求需要传什么参数?

A:

  • 大多数情况:传空对象 {} 即可,系统自动标记为完成
  • 公告类功能:传 { "id": "announcement-id" } 标记具体公告已读
  • 如需延迟完成:传 { "completed": false }(但不推荐)

Q5: Consumer 角色用户会返回什么?

A: 返回空对象 {} 或 { completed: true },不会显示任何引导内容。


相关文件

文件路径 说明
src/feature-setting/feature-setting.controller.ts 控制器,定义 API 端点
src/feature-setting/feature-setting.service.ts 服务层,核心业务逻辑
src/feature-setting/onboarding/promoter-onboarding.service.ts 推广者引导功能处理
src/feature-setting/consumer/consumer-feature.service.ts 消费者引导功能处理
src/feature-setting/feature-setting.repo.ts 数据库访问层
src/feature-setting/feature.setting.interface.ts 接口和枚举定义
src/database/schema.prisma 数据库模型定义

更新日志

日期 版本 更新内容
2026-03-03 v1.0 初始版本,EDU 功能设置接口文档

results matching ""

    No results matching ""