diff --git a/schoolNewsWeb/src/apis/resource/resource.ts b/schoolNewsWeb/src/apis/resource/resource.ts index 9153496..5c57b4b 100644 --- a/schoolNewsWeb/src/apis/resource/resource.ts +++ b/schoolNewsWeb/src/apis/resource/resource.ts @@ -7,7 +7,7 @@ */ import { api } from '@/apis'; -import type { ResultDomain, Resource, ResourceSearchParams } from '@/types'; +import type { ResultDomain, Resource, ResourceSearchParams, PageParam, ResourceVO } from '@/types'; /** * 资源API服务 @@ -25,13 +25,27 @@ export const resourceApi = { return response.data; }, + /** + * 获取资源分页列表 + * @param filter 筛选条件 + * @param pageParam 分页参数 + * @returns Promise> + */ + async getResourcePage(pageParam: PageParam, filter?: ResourceSearchParams): Promise> { + const response = await api.post('/news/resources/page', { + pageParam, + filter, + }); + return response.data; + }, + /** * 根据ID获取资源详情 * @param resourceID 资源ID * @returns Promise> */ - async getResourceById(resourceID: string): Promise> { - const response = await api.get(`/news/resources/resource/${resourceID}`); + async getResourceById(resourceID: string): Promise> { + const response = await api.get(`/news/resources/resource/${resourceID}`); return response.data; }, @@ -40,18 +54,18 @@ export const resourceApi = { * @param resource 资源信息 * @returns Promise> */ - async createResource(resource: Resource): Promise> { - const response = await api.post('/news/resources/resource', resource); + async createResource(resource: ResourceVO): Promise> { + const response = await api.post('/news/resources/resource', resource); return response.data; }, /** * 更新资源 * @param resource 资源信息 - * @returns Promise> + * @returns Promise> */ - async updateResource(resource: Resource): Promise> { - const response = await api.put('/news/resources/resource', resource); + async updateResource(resource: ResourceVO): Promise> { + const response = await api.put('/news/resources/resource', resource); return response.data; }, diff --git a/schoolNewsWeb/src/types/base/index.ts b/schoolNewsWeb/src/types/base/index.ts index 9024e74..33a8ab6 100644 --- a/schoolNewsWeb/src/types/base/index.ts +++ b/schoolNewsWeb/src/types/base/index.ts @@ -25,9 +25,9 @@ export interface BaseDTO { */ export interface PageParam { /** 当前页码 */ - page?: number; + page: number; /** 每页条数 */ - size?: number; + size: number; /** 排序字段 */ orderBy?: string; /** 排序方向 asc/desc */ @@ -47,7 +47,7 @@ export interface PageDomain { /** 总页数 */ pages: number; /** 数据列表 */ - records: T[]; + dataList?: T[]; } /** diff --git a/schoolNewsWeb/src/types/resource/index.ts b/schoolNewsWeb/src/types/resource/index.ts index 168e812..8b1f448 100644 --- a/schoolNewsWeb/src/types/resource/index.ts +++ b/schoolNewsWeb/src/types/resource/index.ts @@ -127,6 +127,23 @@ export interface Tag extends BaseDTO { status?: number; } +export interface ResourceVO extends BaseDTO{ + resource: Resource; + category: ResourceCategory; + tags: Tag[]; +} +export interface tagVO extends BaseDTO{ + /** 标签ID */ + tagID?: string; + /** 标签名称 */ + tagName?: string; + /** 标签描述 */ + description?: string; + /** 标签颜色 */ + tagColor?: string; + resourceID?: string; +} + /** * 资源推荐实体 */ diff --git a/schoolNewsWeb/src/views/admin/manage/resource/ArticleManagementView.vue b/schoolNewsWeb/src/views/admin/manage/resource/ArticleManagementView.vue index 7bc9e60..47e512c 100644 --- a/schoolNewsWeb/src/views/admin/manage/resource/ArticleManagementView.vue +++ b/schoolNewsWeb/src/views/admin/manage/resource/ArticleManagementView.vue @@ -15,7 +15,7 @@ - + @@ -47,20 +61,47 @@ import { ref, onMounted } from 'vue'; import { ElButton, ElInput, ElTable, ElTableColumn, ElTag, ElPagination, ElMessage } from 'element-plus'; import { useRouter } from 'vue-router'; +import { resourceApi, resourceCategoryApi } from '@/apis/resource' +import type { PageParam, ResourceSearchParams, Resource, ResourceCategory } from '@/types'; +import { ArticleShowView } from '@/views/article'; const router = useRouter(); const searchKeyword = ref(''); -const currentPage = ref(1); -const pageSize = ref(10); -const total = ref(0); -const articles = ref([]); +const pageParam = ref({ + page: 1, + size: 10 +}); +const filter = ref({ + keyword: searchKeyword.value +}); +const total = ref(0); +const articles = ref([]); +const showViewDialog = ref(false); +const currentArticle = ref(null); +const categoryList = ref([]); onMounted(() => { loadArticles(); + loadCategories(); }); -function loadArticles() { - // TODO: 加载文章数据 +async function loadCategories() { + try { + const res = await resourceCategoryApi.getCategoryList(); + if (res.success && res.dataList) { + categoryList.value = res.dataList; + } + } catch (error) { + console.error('加载分类列表失败:', error); + } +} + +async function loadArticles() { + const res = await resourceApi.getResourcePage(pageParam.value, filter.value); + if (res.success) { + articles.value = res.pageDomain?.dataList || []; + total.value = res.pageDomain?.total || 0; + } } function showCreateDialog() { @@ -80,12 +121,40 @@ function handleDataCollection() { ElMessage.info('数据采集功能开发中'); } -function editArticle(row: any) { - // TODO: 编辑文章 +async function viewArticle(row: any) { + try { + const res = await resourceApi.getResourceById(row.resourceID); + if (res.success && res.data) { + // 将 ResourceVO 转换为 ArticleShowView 期望的格式 + const resourceVO = res.data; + currentArticle.value = { + ...resourceVO.resource, + tags: resourceVO.tags || [] + }; + showViewDialog.value = true; + } else { + ElMessage.error('获取文章详情失败'); + } + } catch (error) { + ElMessage.error('获取文章详情失败'); + console.error(error); + } } -function deleteArticle(row: any) { +function editArticle(row: any) { + router.push('/article/add?id=' + row.resourceID); +} + +function handleEditFromView() { + if (currentArticle.value?.resourceID) { + showViewDialog.value = false; + router.push('/article/add?id=' + currentArticle.value.resourceID); + } +} + +function deleteArticle() { // TODO: 删除文章 + ElMessage.info('删除功能开发中'); } function getStatusType(status: string) { @@ -107,12 +176,12 @@ function getStatusText(status: string) { } function handleSizeChange(val: number) { - pageSize.value = val; + pageParam.value.size = val; loadArticles(); } function handleCurrentChange(val: number) { - currentPage.value = val; + pageParam.value.page = val; loadArticles(); } diff --git a/schoolNewsWeb/src/views/article/ArticleAddView.vue b/schoolNewsWeb/src/views/article/ArticleAddView.vue index 27d8ca1..cee5838 100644 --- a/schoolNewsWeb/src/views/article/ArticleAddView.vue +++ b/schoolNewsWeb/src/views/article/ArticleAddView.vue @@ -8,21 +8,21 @@
- - + + - - - + + + @@ -44,7 +44,7 @@ -
- +
+ 删除封面
- - + @@ -69,13 +69,13 @@ - 允许评论 + 允许评论 - 置顶文章 + 置顶文章 - 推荐文章 + 推荐文章 @@ -104,7 +104,7 @@ :as-dialog="true" title="文章预览" width="900px" - :article-data="articleForm" + :article-data="articleForm.resource" :category-list="categoryList" :show-edit-button="false" @close="previewVisible = false" @@ -132,7 +132,8 @@ import { RichTextComponent } from '@/components/text'; import { FileUpload } from '@/components/file'; import { ArticleShowView } from './index'; import { resourceCategoryApi, resourceTagApi, resourceApi } from '@/apis/resource'; -import { Resource, ResourceCategory, Tag } from '@/types/resource'; +import { ResourceVO, ResourceCategory, Tag } from '@/types/resource'; +import { FILE_DOWNLOAD_URL } from '@/config'; const router = useRouter(); const route = useRoute(); @@ -153,30 +154,23 @@ const categoryLoading = ref(false); const tagLoading = ref(false); // 表单数据 -const articleForm = ref({ - title: '', - content: '', - categoryID: '', - author: '', - source: '', - sourceUrl: '', - viewCount: 0, - coverImage: '', - tags: [] as Tag[], - allowComment: true, - isTop: false, +const articleForm = ref({ + resource: { + }, + category: {}, + tags: [], }); // 表单验证规则 const rules = { - title: [ + 'resource.title': [ { required: true, message: '请输入文章标题', trigger: 'blur' }, { min: 5, max: 100, message: '标题长度在 5 到 100 个字符', trigger: 'blur' } ], - categoryID: [ + 'resource.categoryID': [ { required: true, message: '请选择文章分类', trigger: 'change' } ], - content: [ + 'resource.content': [ { required: true, message: '请输入文章内容', trigger: 'blur' } ] }; @@ -234,11 +228,13 @@ async function handlePublish() { // TODO: 调用API发布文章 console.log('发布文章:', articleForm); - - await new Promise(resolve => setTimeout(resolve, 1000)); - - ElMessage.success(isEdit.value ? '修改成功' : '发布成功'); - router.push('/admin/manage/resource/articles'); + resourceApi.createResource(articleForm.value).then(res => { + if (res.success) { + ElMessage.success('发布成功'); + } else { + ElMessage.error(res.message || '发布失败'); + } + }); } catch (error) { console.error('发布失败:', error); } finally { @@ -267,8 +263,8 @@ async function handleSaveDraft() { // 预览 function handlePreview() { - console.log(articleForm.value.content); - if (!articleForm.value.title) { + console.log(articleForm.value.resource.content); + if (!articleForm.value.resource.title) { ElMessage.warning('请先输入文章标题'); return; } @@ -281,14 +277,14 @@ function handleCoverUploadSuccess(files: any[]) { const file = files[0]; // 使用文件下载URL构建完整路径 import('@/config').then(config => { - articleForm.value.coverImage = config.FILE_DOWNLOAD_URL + file.id; + articleForm.value.resource.coverImage = config.FILE_DOWNLOAD_URL + file.id; }); } } // 删除封面 function removeCover() { - articleForm.value.coverImage = ''; + articleForm.value.resource.coverImage = ''; } diff --git a/schoolNewsWeb/src/views/article/ArticleShowView.vue b/schoolNewsWeb/src/views/article/ArticleShowView.vue index adfd903..a11a511 100644 --- a/schoolNewsWeb/src/views/article/ArticleShowView.vue +++ b/schoolNewsWeb/src/views/article/ArticleShowView.vue @@ -30,7 +30,7 @@
- +
@@ -66,7 +66,7 @@
- +
@@ -77,6 +77,8 @@