{"skill":{"slug":"config-pull-template","displayName":"配置拉取代码生成","summary":"生成配置拉取代码模板。用于在 Android 项目中接入配置中心、白名单、单独接口或推拉结合的配置。 触发条件：用户想要创建配置拉取功能，需要生成对应的 Kotlin/Java 代码模板。","description":"---\nname: config-pull-template\ndescription: |\n  生成配置拉取代码模板。用于在 Android 项目中接入配置中心、白名单、单独接口或推拉结合的配置。\n  触发条件：用户想要创建配置拉取功能，需要生成对应的 Kotlin/Java 代码模板。\n---\n\n# 配置拉取代码生成\n\n根据用户提供的配置信息，生成对应的代码模板。\n\n## 交互流程\n\n### 第一步：询问配置作用\n\n向用户确认：这个配置的作用是什么？\n例如：ANR 监控配置、服务费配置、活动配置等。\n\n### 第二步：确认接入方式\n\n让用户选择接入方式：\n\n1. **配置中心** - 需要提供：\n   - 配置中心组件 Key（如 `com.youzan.retailHD.anr`）\n   - 字段 Key（如 `config`）\n   - 模板 Value（JSON 字符串，可选）\n\n2. **白名单** - 需要提供：\n   - 白名单 Key（如 `anr_feature`）\n\n3. **单独接口** - 需要提供：\n   - 接口 URL（如 `youzan.retail.trade.misc.shopsetting.query/1.0.0`）\n\n4. **推拉结合** - 需要提供：\n   - 推送 Key\n   - 拉取接口 URL\n\n### 第三步：确认所属模块\n\n让用户选择配置所属模块：\n- 商品模块（module_goods）\n- 营销模块（module_marketing）\n- 其他模块\n\n## 代码生成规则\n\n### 通用规则\n\n- 代码优先使用 Kotlin 编写\n- 数据模型如果跟网络相关需要添加 `@Keep` 注解\n- **生成代码后，必须写入到 workspace 对应文件，并展示给用户看**\n\n### 白名单接入\n\n**生成 WhiteListManager**（如果已存在则复用）：\n\n```kotlin\nobject WhiteListManager {\n\n    fun is{Feature}Enabled() {\n        WhiteListTask.isInWhiteList(\"{key}\").subscribe({ result ->\n            // TODO 待实现\n        }, { error ->\n            // TODO 待实现\n        })\n    }\n}\n```\n\n**生成 Plugin 钩子**（方法名必须与注解名一致！）\n\n在对应模块的 PluginModule 中添加三个方法：\n\n```kotlin\n// 文件位置：/modules/module_xxx/src/common/java/com/youzan/retail/xxx/PluginModule.kt\n\n@ShopSwitched\nfun onShopSwitched() {\n    WhiteListManager.is{Feature}Enabled()\n}\n\n@AppStart\nfun onAppStart() {\n    WhiteListManager.is{Feature}Enabled()\n}\n\n@ConfigFetch\nfun onConfigFetch() {\n    WhiteListManager.is{Feature}Enabled()\n}\n```\n\n### 配置中心\n\n参考 [config-center-template.md](config-center-template.md)\n\n根据模块 + 作用，在对应模块的 common 下创建 `XXXConfigManager` 类：\n- 路径：`/modules/module_xxx/src/common/java/com/youzan/retail/xxx/`\n- `CONFIG_KEY_CONFIG_VERSION` 固定为 `1.0.0`\n- 如果提供了模板 JSON，需要生成对应的配置类（使用 `@Keep` 注解）\n\n**同时生成 Plugin 钩子**（方法名必须与注解名一致！）：\n\n```kotlin\n@ShopSwitched\nfun onShopSwitched() {\n    {Name}ConfigManager.init()\n}\n\n@AppStart\nfun onAppStart() {\n    {Name}ConfigManager.init()\n}\n\n@ConfigFetch\nfun onConfigFetch() {\n    {Name}ConfigManager.init()\n}\n```\n\n### 单独接口\n\n参考 [api-template.md](api-template.md)\n\n在对应模块的 common 下创建：\n- `XXXConfigManager` - 业务逻辑\n- `XXXTask` - Task 层\n- `XXXService` - Service 接口（包含 @POST 注解和 URL）\n\n**同时生成 Plugin 钩子**（方法名必须与注解名一致！）：\n\n```kotlin\n@ShopSwitched\nfun onShopSwitched() {\n    {Name}ConfigManager.query{Name}Config()\n}\n\n@AppStart\nfun onAppStart() {\n    {Name}ConfigManager.query{Name}Config()\n}\n\n@ConfigFetch\nfun onConfigFetch() {\n    {Name}ConfigManager.query{Name}Config()\n}\n```\n\n### 推拉结合\n\n参考 [push-pull-template.md](push-pull-template.md)\n\n在对应模块的 common 下创建 `XXXRefreshUtils` 类，内部实现 `IConfigDataNotification` 接口注册推送通知。\n\n**同时生成 Plugin 钩子**（方法名必须与注解名一致！）：\n\n```kotlin\n@ShopSwitched\nfun onShopSwitched() {\n    {Name}RefreshUtils.register{Name}Notification()\n    {Name}ConfigManager.query{Name}Config()\n}\n\n@AppStart\nfun onAppStart() {\n    {Name}RefreshUtils.register{Name}Notification()\n    {Name}ConfigManager.query{Name}Config()\n}\n\n@ConfigFetch\nfun onConfigFetch() {\n    {Name}ConfigManager.query{Name}Config()\n}\n```\n\n## Plugin 钩子说明\n\n配置拉取的调用时机通过 Plugin 实现。不同模块的 Plugin 位置：\n\n- 商品模块：`modules/module_goods/src/common/java/com/youzan/retail/goods/PluginModule.kt`\n- 营销模块：`modules/module_marketing/src/common/java/com/youzan/retail/marketing/PluginModule.kt`\n\n可用的注解：\n- `@ShopSwitched` - 店铺切换时调用\n- `@AppStart` - 应用启动时调用\n- `@ConfigFetch` - 配置同步时调用\n\n**重要规则**：\n1. 每次生成配置时，必须同时生成这三个 Plugin 钩子方法！\n2. **方法名必须与注解名一致**：`@ShopSwitched` → `onShopSwitched()`，`@AppStart` → `onAppStart()`，`@ConfigFetch` → `onConfigFetch()`\n3. 生成代码后，必须写入到 workspace 对应文件\n","tags":{"latest":"1.0.2"},"stats":{"comments":0,"downloads":497,"installsAllTime":19,"installsCurrent":0,"stars":0,"versions":3},"createdAt":1773643240358,"updatedAt":1778491940346},"latestVersion":{"version":"1.0.2","createdAt":1773644032298,"changelog":"修正 Plugin 方法名与注解名一致","license":"MIT-0"},"metadata":null,"owner":{"handle":"hefuwei-95","userId":"s170g4ar44f68kkz98xav5kmh583phms","displayName":"hefuwei-95","image":"https://avatars.githubusercontent.com/u/81024917?v=4"},"moderation":null}