From 9cf9fac10941e66a528790ef0eac5494382de1fd Mon Sep 17 00:00:00 2001 From: liangxu Date: Fri, 17 Apr 2026 13:51:39 +0800 Subject: [PATCH] feat(kol): admin-web API client + router entries for KOL --- apps/admin-web/package.json | 1 + apps/admin-web/src/lib/api.ts | 90 +++++++++++++++++++ apps/admin-web/src/lib/kol-variable-id.ts | 5 ++ .../src/router/future-kol-views.d.ts | 34 +++++++ apps/admin-web/src/router/index.ts | 51 +++++++++++ apps/admin-web/src/router/meta.d.ts | 1 + packages/shared-types/src/index.ts | 12 +++ pnpm-lock.yaml | 3 + 8 files changed, 197 insertions(+) create mode 100644 apps/admin-web/src/lib/kol-variable-id.ts create mode 100644 apps/admin-web/src/router/future-kol-views.d.ts diff --git a/apps/admin-web/package.json b/apps/admin-web/package.json index 07dfbdf..0586684 100644 --- a/apps/admin-web/package.json +++ b/apps/admin-web/package.json @@ -18,6 +18,7 @@ "@milkdown/kit": "^7.20.0", "@milkdown/theme-nord": "^7.20.0", "@milkdown/vue": "^7.20.0", + "nanoid": "^5.1.7", "@tanstack/vue-query": "^5.96.0", "@vueuse/core": "^14.2.1", "ant-design-vue": "^4.2.6", diff --git a/apps/admin-web/src/lib/api.ts b/apps/admin-web/src/lib/api.ts index a14be1e..96dac48 100644 --- a/apps/admin-web/src/lib/api.ts +++ b/apps/admin-web/src/lib/api.ts @@ -28,6 +28,14 @@ import type { KnowledgeItemDetail, KnowledgeTextItemRequest, KnowledgeURLItemRequest, + KolAssistRequest, + KolAssistSubmitResponse, + KolAssistTask, + KolPackageSummary, + KolProfile, + KolPromptDetail, + KolPromptRevision, + KolSaveDraftRequest, Keyword, KeywordRequest, LoginRequest, @@ -82,6 +90,10 @@ import type { ImageUpdateRequest, UpdateQuestionRequest, UpdateArticleRequest, + CreateKolPackageRequest, + CreateKolPromptRequest, + UpdateKolPackageRequest, + UpdateKolPromptRequest, UserInfo, WorkspaceOverview, } from "@geo/shared-types"; @@ -243,6 +255,84 @@ export const templatesApi = { }, }; +export const kolManageApi = { + profile() { + return apiClient.get("/api/tenant/kol/manage/profile"); + }, + listPackages() { + return apiClient.get("/api/tenant/kol/manage/packages"); + }, + createPackage(body: CreateKolPackageRequest) { + return apiClient.post( + "/api/tenant/kol/manage/packages", + body, + ); + }, + updatePackage(id: number, body: UpdateKolPackageRequest) { + return apiClient.put( + `/api/tenant/kol/manage/packages/${id}`, + body, + ); + }, + publishPackage(id: number) { + return apiClient.put>( + `/api/tenant/kol/manage/packages/${id}/publish`, + {}, + ); + }, + archivePackage(id: number) { + return apiClient.put>( + `/api/tenant/kol/manage/packages/${id}/archive`, + {}, + ); + }, + deletePackage(id: number) { + return apiClient.remove(`/api/tenant/kol/manage/packages/${id}`); + }, + listPrompts(packageId: number) { + return apiClient.get(`/api/tenant/kol/manage/packages/${packageId}/prompts`); + }, + createPrompt(packageId: number, body: CreateKolPromptRequest) { + return apiClient.post( + `/api/tenant/kol/manage/packages/${packageId}/prompts`, + body, + ); + }, + getPrompt(id: number) { + return apiClient.get(`/api/tenant/kol/manage/prompts/${id}`); + }, + updatePromptMetadata(id: number, body: UpdateKolPromptRequest) { + return apiClient.put( + `/api/tenant/kol/manage/prompts/${id}`, + body, + ); + }, + deletePrompt(id: number) { + return apiClient.remove(`/api/tenant/kol/manage/prompts/${id}`); + }, + saveDraft(promptId: number, body: KolSaveDraftRequest) { + return apiClient.post( + `/api/tenant/kol/manage/prompts/${promptId}/draft`, + body, + ); + }, + publishPrompt(promptId: number) { + return apiClient.post<{ ok: boolean }, Record>( + `/api/tenant/kol/manage/prompts/${promptId}/publish`, + {}, + ); + }, + submitAssist(body: KolAssistRequest) { + return apiClient.post( + "/api/tenant/kol/manage/assist", + body, + ); + }, + getAssist(id: string) { + return apiClient.get(`/api/tenant/kol/manage/assist/${id}`); + }, +}; + export const articlesApi = { list(params: ArticleListParams) { return apiClient.get("/api/tenant/articles", { params }); diff --git a/apps/admin-web/src/lib/kol-variable-id.ts b/apps/admin-web/src/lib/kol-variable-id.ts new file mode 100644 index 0000000..1b81939 --- /dev/null +++ b/apps/admin-web/src/lib/kol-variable-id.ts @@ -0,0 +1,5 @@ +import { nanoid } from "nanoid"; + +export function newVariableId(): string { + return `var_${nanoid(8)}`; +} diff --git a/apps/admin-web/src/router/future-kol-views.d.ts b/apps/admin-web/src/router/future-kol-views.d.ts new file mode 100644 index 0000000..b03ebf3 --- /dev/null +++ b/apps/admin-web/src/router/future-kol-views.d.ts @@ -0,0 +1,34 @@ +declare module "@/views/KolManageView.vue" { + import type { DefineComponent } from "vue"; + + const component: DefineComponent, Record, any>; + export default component; +} + +declare module "@/views/KolDashboardView.vue" { + import type { DefineComponent } from "vue"; + + const component: DefineComponent, Record, any>; + export default component; +} + +declare module "@/views/KolMarketplaceView.vue" { + import type { DefineComponent } from "vue"; + + const component: DefineComponent, Record, any>; + export default component; +} + +declare module "@/views/KolPackageDetailView.vue" { + import type { DefineComponent } from "vue"; + + const component: DefineComponent, Record, any>; + export default component; +} + +declare module "@/views/KolGenerateView.vue" { + import type { DefineComponent } from "vue"; + + const component: DefineComponent, Record, any>; + export default component; +} diff --git a/apps/admin-web/src/router/index.ts b/apps/admin-web/src/router/index.ts index dea9f4e..f7f92b1 100644 --- a/apps/admin-web/src/router/index.ts +++ b/apps/admin-web/src/router/index.ts @@ -146,6 +146,53 @@ const router = createRouter({ navKey: "/images", }, }, + { + path: "kol/manage", + name: "kol-manage", + component: () => import("@/views/KolManageView.vue"), + meta: { + titleKey: "kol.manage.title", + navKey: "/kol/manage", + requiresKol: true, + }, + }, + { + path: "kol/dashboard", + name: "kol-dashboard", + component: () => import("@/views/KolDashboardView.vue"), + meta: { + titleKey: "kol.dashboard.title", + navKey: "/kol/dashboard", + requiresKol: true, + }, + }, + { + path: "kol/marketplace", + name: "kol-marketplace", + component: () => import("@/views/KolMarketplaceView.vue"), + meta: { + titleKey: "kol.marketplace.title", + navKey: "/kol/marketplace", + }, + }, + { + path: "kol/packages/:id", + name: "kol-package-detail", + component: () => import("@/views/KolPackageDetailView.vue"), + meta: { + titleKey: "kol.marketplace.title", + navKey: "/kol/marketplace", + }, + }, + { + path: "kol/generate/:subscriptionPromptId", + name: "kol-generate", + component: () => import("@/views/KolGenerateView.vue"), + meta: { + titleKey: "kol.generate.title", + navKey: "/kol/marketplace", + }, + }, ], }, ], @@ -166,6 +213,10 @@ router.beforeEach(async (to) => { }; } + if (to.meta.requiresKol && !authStore.isActiveKol) { + return { name: "workspace" }; + } + if (to.name === "login" && authStore.isAuthenticated) { return { name: "workspace" }; } diff --git a/apps/admin-web/src/router/meta.d.ts b/apps/admin-web/src/router/meta.d.ts index 3365351..61165bd 100644 --- a/apps/admin-web/src/router/meta.d.ts +++ b/apps/admin-web/src/router/meta.d.ts @@ -7,6 +7,7 @@ declare module "vue-router" { titleKey?: string; descriptionKey?: string; requiresAuth?: boolean; + requiresKol?: boolean; navKey?: string | null; } } diff --git a/packages/shared-types/src/index.ts b/packages/shared-types/src/index.ts index db95728..2b40a54 100644 --- a/packages/shared-types/src/index.ts +++ b/packages/shared-types/src/index.ts @@ -1292,6 +1292,11 @@ export interface KolAssistRequest { description?: string; current_content?: string; prompt_id?: number; + schema?: KolSchemaJson; +} + +export interface KolAssistSubmitResponse { + task_id: string; } export interface KolAssistTask { @@ -1350,3 +1355,10 @@ export interface KolSaveDraftRequest { schema: KolSchemaJson; card_config: Record; } + +export interface KolPromptRevision { + id: number; + prompt_id: number; + revision_no: number; + created_at: string; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab5cadb..27415a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,6 +34,9 @@ importers: '@milkdown/vue': specifier: ^7.20.0 version: 7.20.0(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.40.0)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.7)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)) + nanoid: + specifier: ^5.1.7 + version: 5.1.7 '@tanstack/vue-query': specifier: ^5.96.0 version: 5.96.0(vue@3.5.31(typescript@5.9.3))