diff --git a/src/api/kb/favorite.ts b/src/api/kb/favorite.ts new file mode 100644 index 0000000..3f6dfd5 --- /dev/null +++ b/src/api/kb/favorite.ts @@ -0,0 +1,86 @@ +import { request } from '@/api/request'; + +/** 资源类型 */ +export type ResourceType = 'document' | 'faq'; + +/** 收藏记录接口 */ +export interface Favorite { + id: number; + created_at: string; + resource_type: ResourceType; + resource_id: number; + resource_name: string; + remarks: string; + is_deleted: boolean; + resource_data?: any; +} + +/** 收藏列表响应 */ +export interface FavoriteListResponse { + total: number; + page: number; + page_size: number; + data: Favorite[]; +} + +/** 获取收藏列表参数 */ +export interface FetchFavoriteListParams { + page?: number; + page_size?: number; + resource_type?: ResourceType; +} + +/** 收藏请求参数 */ +export interface CollectParams { + resource_type: ResourceType; + resource_id: number; + remarks?: string; +} + +/** 取消收藏参数 */ +export interface UncollectParams { + resource_type: ResourceType; + resource_id: number; +} + +/** API响应包装类型 */ +export interface ApiResponse { + code: number; + message: string; + data: T; +} + +/** + * 获取收藏列表 + */ +export async function fetchFavoriteList( + params: FetchFavoriteListParams = {} +): Promise> { + return request.get>('/Kb/v1/favorite/list', { + params, + }); +} + +/** + * 收藏资源 + */ +export async function collectResource( + data: CollectParams +): Promise> { + return request.post>('/Kb/v1/favorite/collect', data); +} + +/** + * 取消收藏 + */ +export async function uncollectResource( + data: UncollectParams +): Promise> { + return request.post>('/Kb/v1/favorite/uncollect', data); +} + +/** 资源类型选项 */ +export const resourceTypeOptions = [ + { label: '文档', value: 'document' }, + { label: 'FAQ', value: 'faq' }, +]; \ No newline at end of file diff --git a/src/api/kb/review.ts b/src/api/kb/review.ts index 3cc025a..fd4ef9c 100644 --- a/src/api/kb/review.ts +++ b/src/api/kb/review.ts @@ -12,6 +12,162 @@ export interface ReviewStatsPayload { need_my_review_unreviewed_total?: number; } +/** 文档资源类型 */ +export interface DocumentResource { + id: number; + created_at: string; + updated_at: string; + doc_no: string; + title: string; + description: string; + content: string; + type: string; + status: string; + category_id: number; + sub_category: string; + author_id: number; + author_name: string; + reviewer_id: number; + reviewer_name: string; + reviewed_at: string | null; + published_at: string | null; + publisher_id: number; + view_count: number; + like_count: number; + comment_count: number; + download_count: number; + version: string; + version_notes: string; + tags: string; + attachments: string | null; + related_docs: string | null; + metadata: string | null; + keywords: string; + remarks: string; +} + +/** FAQ资源类型 */ +export interface FaqResource { + id: number; + created_at: string; + updated_at: string; + faq_no: string; + question: string; + answer: string; + status: string; + priority: string; + 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 | null; + related_docs: string | null; + related_links: string | null; + attachments: string | null; + keywords: string; + applicable_scope: string; + remarks: string; +} + +/** 审核列表项(resource_type 为 all 时) */ +export interface ReviewListItem { + type: "document" | "faq"; + resource: DocumentResource | FaqResource; +} + +/** 分页响应类型 */ +export interface PaginatedResponse { + total: number; + page: number; + page_size: number; + data: T[]; +} + +/** API响应包装类型 */ +export interface ApiResponse { + code: number; + message: string; + data: T; +} + +/** 获取审核列表参数 */ +export interface FetchReviewListParams { + page?: number; + page_size?: number; + resource_type?: ReviewStatsResourceType; +} + +/** 审核通过参数 */ +export interface ApproveParams { + resource_type: "document" | "faq"; + id: number; +} + +/** 审核拒绝参数 */ +export interface RejectParams { + resource_type: "document" | "faq"; + id: number; + reason?: string; +} + /** 按当前登录用户统计需要本人审核的数量(不含本人为作者的稿件) */ export const fetchReviewStats = (params?: { resource_type?: ReviewStatsResourceType }) => request.get("/Kb/v1/review/stats", params ? { params } : undefined); + +/** 获取待审核列表 */ +export const fetchReviewList = (params?: FetchReviewListParams) => + request.get>>("/Kb/v1/review/list", { params }); + +/** 审核通过 */ +export const approveReview = (data: ApproveParams) => + request.post>("/Kb/v1/review/approve", data); + +/** 审核拒绝 */ +export const rejectReview = (data: RejectParams) => + request.post>("/Kb/v1/review/reject", data); + +/** 获取文档详情 */ +export const fetchDocumentDetail = (id: number) => + request.get>(`/Kb/v1/document/${id}`); + +/** 获取FAQ详情 */ +export const fetchFaqDetail = (id: number) => + request.get>(`/Kb/v1/faq/${id}`); + +/** 资源类型选项 */ +export const resourceTypeOptions = [ + { label: '全部', value: 'all' }, + { label: '文档', value: 'document' }, + { label: 'FAQ', value: 'faq' }, +]; + +/** 获取资源类型文本 */ +export const getResourceTypeText = (type: string): string => { + const typeMap: Record = { + document: '文档', + faq: 'FAQ', + }; + return typeMap[type] || type; +}; + +/** 获取资源类型颜色 */ +export const getResourceTypeColor = (type: string): string => { + const colorMap: Record = { + document: 'arcoblue', + faq: 'green', + }; + return colorMap[type] || 'gray'; +}; diff --git a/src/router/routes/modules/ops.ts b/src/router/routes/modules/ops.ts index 09e4eae..ab434ca 100644 --- a/src/router/routes/modules/ops.ts +++ b/src/router/routes/modules/ops.ts @@ -133,6 +133,16 @@ const OPS: AppRouteRecordRaw = { roles: ['*'], }, }, + { + path: 'favorite', + name: 'Favorite', + component: () => import('@/views/ops/pages/favorite/index.vue'), + meta: { + locale: '收藏管理', + requiresAuth: true, + roles: ['*'], + }, + }, ], } diff --git a/src/views/ops/pages/kb/favorite/index.vue b/src/views/ops/pages/kb/favorite/index.vue new file mode 100644 index 0000000..496df61 --- /dev/null +++ b/src/views/ops/pages/kb/favorite/index.vue @@ -0,0 +1,440 @@ + + + + + + + \ No newline at end of file diff --git a/src/views/ops/pages/kb/items/index.vue b/src/views/ops/pages/kb/items/index.vue index b33646d..11a347c 100644 --- a/src/views/ops/pages/kb/items/index.vue +++ b/src/views/ops/pages/kb/items/index.vue @@ -90,14 +90,14 @@