From f2f4390ac2e95fc8d9d1460eb7dc89d5f25208c2 Mon Sep 17 00:00:00 2001 From: zxr <271055687@qq.com> Date: Wed, 22 Jul 2026 02:30:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=20FAQ=20=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/kb/faq.ts | 154 ++++ .../kb/faq/components/FaqDetailDrawer.vue | 229 ++++++ .../pages/kb/faq/components/FaqFormDrawer.vue | 252 +++++++ src/views/ops/pages/kb/faq/index.vue | 674 ++++++++++++++++++ 4 files changed, 1309 insertions(+) create mode 100644 src/api/kb/faq.ts create mode 100644 src/views/ops/pages/kb/faq/components/FaqDetailDrawer.vue create mode 100644 src/views/ops/pages/kb/faq/components/FaqFormDrawer.vue create mode 100644 src/views/ops/pages/kb/faq/index.vue diff --git a/src/api/kb/faq.ts b/src/api/kb/faq.ts new file mode 100644 index 0000000..32a132e --- /dev/null +++ b/src/api/kb/faq.ts @@ -0,0 +1,154 @@ +import { request } from '@/api/request' + +export type FaqStatus = 'draft' | 'published' | 'reviewed' | 'rejected' +export type FaqPriority = 'low' | 'medium' | 'high' +export type FaqScope = 'my' | 'all' + +export interface KbReply { + code: number + message: string + details: T + timeseq: number +} + +export interface Faq { + id: number + created_at: string + updated_at: string + faq_no: string + question: string + answer: string + status: FaqStatus + priority: FaqPriority + category_id: number + sub_category: string + problem_type: string + solution: string + process_steps: string + prerequisites: string + author_id: number + author_name: string + reviewer_id: number + reviewer_name: string + reviewed_at: string | null + published_at: string | null + view_count: number + use_count: number + helpful_count: number + useless_count: number + tags: string + related_faqs: string + related_docs: string + related_links: string + detection_point_ids: string + attachments: string + keywords: string + applicable_scope: string + remarks: string + is_favorited: boolean +} + +export interface FaqPage { + total: number + page: number + page_size: number + data: Faq[] +} + +export interface FaqListParams { + page?: number + page_size?: number + scope?: FaqScope + keyword?: string + category_id?: number + status?: FaqStatus + priority?: FaqPriority + problem_type?: string +} + +export interface FaqFormData { + question: string + answer: string + priority: FaqPriority + category_id: number + sub_category: string + problem_type: string + solution: string + process_steps: string + prerequisites: string + keywords: string + tags: string + detection_point_ids: string + applicable_scope: string + remarks: string +} + +export interface UpdateFaqData extends FaqFormData { + id: number +} + +export interface CategoryTreeNode { + id: number + name: string + description: string + type: 'general' + icon: string + color: string + parent_id: number + level: number + path: string + sort_order: number + status: 'active' | 'inactive' + doc_count: number + faq_count: number + children: CategoryTreeNode[] +} + +export const faqStatusOptions: Array<{ label: string; value: FaqStatus }> = [ + { label: '草稿', value: 'draft' }, + { label: '待审核', value: 'published' }, + { label: '已审核', value: 'reviewed' }, + { label: '已拒绝', value: 'rejected' }, +] + +export const faqPriorityOptions: Array<{ label: string; value: FaqPriority }> = [ + { label: '低', value: 'low' }, + { label: '中', value: 'medium' }, + { label: '高', value: 'high' }, +] + +export const faqProblemTypeOptions = [ + { label: '故障', value: '故障' }, + { label: '咨询', value: '咨询' }, + { label: '请求', value: '请求' }, + { label: '其他', value: '其他' }, +] + +export const fetchFaqList = (params: FaqListParams) => + request.get>('/Kb/v1/faq/list', { + params, + }) + +export const fetchFaqDetail = (id: number) => request.get>(`/Kb/v1/faq/${id}`) + +export const createFaq = (data: FaqFormData) => request.post>('/Kb/v1/faq/create', data) + +export const updateFaq = (data: UpdateFaqData) => request.post>('/Kb/v1/faq/update', data) + +export const publishFaq = (id: number) => request.post>('/Kb/v1/faq/publish', { id }) + +export const deleteFaq = (id: number) => request.delete>(`/Kb/v1/faq/${id}`) + +export const favoriteFaq = (id: number) => + request.post>('/Kb/v1/favorite/collect', { + resource_type: 'faq', + resource_id: id, + }) + +export const unfavoriteFaq = (id: number) => + request.post>('/Kb/v1/favorite/uncollect', { + resource_type: 'faq', + resource_id: id, + }) + +export const fetchGeneralCategoryTree = () => request.get>('/Kb/v1/category/tree') diff --git a/src/views/ops/pages/kb/faq/components/FaqDetailDrawer.vue b/src/views/ops/pages/kb/faq/components/FaqDetailDrawer.vue new file mode 100644 index 0000000..2629626 --- /dev/null +++ b/src/views/ops/pages/kb/faq/components/FaqDetailDrawer.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/src/views/ops/pages/kb/faq/components/FaqFormDrawer.vue b/src/views/ops/pages/kb/faq/components/FaqFormDrawer.vue new file mode 100644 index 0000000..a9241f5 --- /dev/null +++ b/src/views/ops/pages/kb/faq/components/FaqFormDrawer.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/src/views/ops/pages/kb/faq/index.vue b/src/views/ops/pages/kb/faq/index.vue new file mode 100644 index 0000000..0cf2207 --- /dev/null +++ b/src/views/ops/pages/kb/faq/index.vue @@ -0,0 +1,674 @@ + + + + + + +