From 2f1835bdbf40dfb1d28598b2d7ac3272b0113717 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Mon, 20 Oct 2025 11:25:34 +0800 Subject: [PATCH] =?UTF-8?q?web-=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E3=80=81=E5=AF=8C=E6=96=87=E6=9C=AC=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- schoolNewsWeb/src/apis/resource/index.ts | 9 + schoolNewsWeb/src/apis/resource/resource.ts | 206 ++++++++++ .../src/apis/resource/resourceCategory.ts | 98 +++++ .../src/apis/resource/resourceTag.ts | 143 +++++++ .../src/components/file/FileUpload.vue | 385 +++++++++++++++++- .../src/components/text/RichTextComponent.vue | 126 +++++- .../src/components/text/RichTextExample.vue | 161 -------- schoolNewsWeb/src/types/resource/index.ts | 9 + schoolNewsWeb/src/utils/quill-resize.ts | 217 ++++++---- .../src/views/article/ArticleAddView.vue | 315 +++++++------- .../src/views/article/ArticleShowView.vue | 382 +++++++++++++++++ schoolNewsWeb/src/views/article/index.ts | 2 + 12 files changed, 1608 insertions(+), 445 deletions(-) create mode 100644 schoolNewsWeb/src/apis/resource/index.ts create mode 100644 schoolNewsWeb/src/apis/resource/resource.ts create mode 100644 schoolNewsWeb/src/apis/resource/resourceCategory.ts create mode 100644 schoolNewsWeb/src/apis/resource/resourceTag.ts delete mode 100644 schoolNewsWeb/src/components/text/RichTextExample.vue create mode 100644 schoolNewsWeb/src/views/article/ArticleShowView.vue create mode 100644 schoolNewsWeb/src/views/article/index.ts diff --git a/schoolNewsWeb/src/apis/resource/index.ts b/schoolNewsWeb/src/apis/resource/index.ts new file mode 100644 index 0000000..67509e5 --- /dev/null +++ b/schoolNewsWeb/src/apis/resource/index.ts @@ -0,0 +1,9 @@ +/** + * @description 资源相关API接口导出 + * @author yslg + * @since 2025-10-15 + */ + +export * from './resourceCategory'; +export * from './resourceTag'; +export * from './resource'; \ No newline at end of file diff --git a/schoolNewsWeb/src/apis/resource/resource.ts b/schoolNewsWeb/src/apis/resource/resource.ts new file mode 100644 index 0000000..9153496 --- /dev/null +++ b/schoolNewsWeb/src/apis/resource/resource.ts @@ -0,0 +1,206 @@ +/** + * @description 资源API接口 + * @filename resource.ts + * @author yslg + * @copyright xyzh + * @since 2025-10-15 + */ + +import { api } from '@/apis'; +import type { ResultDomain, Resource, ResourceSearchParams } from '@/types'; + +/** + * 资源API服务 + */ +export const resourceApi = { + // ==================== 资源基础操作 ==================== + + /** + * 获取资源列表 + * @param filter 筛选条件 + * @returns Promise> + */ + async getResourceList(filter?: ResourceSearchParams): Promise> { + const response = await api.get('/news/resources/list', filter); + return response.data; + }, + + /** + * 根据ID获取资源详情 + * @param resourceID 资源ID + * @returns Promise> + */ + async getResourceById(resourceID: string): Promise> { + const response = await api.get(`/news/resources/resource/${resourceID}`); + return response.data; + }, + + /** + * 创建资源 + * @param resource 资源信息 + * @returns Promise> + */ + async createResource(resource: Resource): Promise> { + const response = await api.post('/news/resources/resource', resource); + return response.data; + }, + + /** + * 更新资源 + * @param resource 资源信息 + * @returns Promise> + */ + async updateResource(resource: Resource): Promise> { + const response = await api.put('/news/resources/resource', resource); + return response.data; + }, + + /** + * 删除资源 + * @param resourceID 资源ID + * @returns Promise> + */ + async deleteResource(resourceID: string): Promise> { + const response = await api.delete(`/news/resources/resource/${resourceID}`); + return response.data; + }, + + // ==================== 资源状态操作 ==================== + + /** + * 更新资源状态 + * @param resourceID 资源ID + * @param status 状态值(0草稿 1已发布 2下架) + * @returns Promise> + */ + async updateResourceStatus(resourceID: string, status: number): Promise> { + const response = await api.put(`/news/resources/resource/${resourceID}/status`, null, { + params: { status } + }); + return response.data; + }, + + /** + * 发布资源 + * @param resourceID 资源ID + * @returns Promise> + */ + async publishResource(resourceID: string): Promise> { + const response = await api.post(`/news/resources/resource/${resourceID}/publish`); + return response.data; + }, + + /** + * 下架资源 + * @param resourceID 资源ID + * @returns Promise> + */ + async unpublishResource(resourceID: string): Promise> { + const response = await api.post(`/news/resources/resource/${resourceID}/unpublish`); + return response.data; + }, + + // ==================== 资源统计操作 ==================== + + /** + * 增加浏览次数 + * @param resourceID 资源ID + * @returns Promise> + */ + async incrementViewCount(resourceID: string): Promise> { + const response = await api.post(`/news/resources/resource/${resourceID}/view`); + return response.data; + }, + + /** + * 增加点赞次数 + * @param resourceID 资源ID + * @returns Promise> + */ + async incrementLikeCount(resourceID: string): Promise> { + const response = await api.post(`/news/resources/resource/${resourceID}/like`); + return response.data; + }, + + /** + * 增加收藏次数 + * @param resourceID 资源ID + * @returns Promise> + */ + async incrementCollectCount(resourceID: string): Promise> { + const response = await api.post(`/news/resources/resource/${resourceID}/collect`); + return response.data; + }, + + // ==================== 资源推荐和轮播操作 ==================== + + /** + * 设置资源推荐 + * @param resourceID 资源ID + * @param isRecommend 是否推荐 + * @returns Promise> + */ + async setResourceRecommend(resourceID: string, isRecommend: boolean): Promise> { + const response = await api.put(`/news/resources/resource/${resourceID}/recommend`, null, { + params: { isRecommend } + }); + return response.data; + }, + + /** + * 设置资源轮播 + * @param resourceID 资源ID + * @param isBanner 是否轮播 + * @returns Promise> + */ + async setResourceBanner(resourceID: string, isBanner: boolean): Promise> { + const response = await api.put(`/news/resources/resource/${resourceID}/banner`, null, { + params: { isBanner } + }); + return response.data; + }, + + // ==================== 资源查询操作 ==================== + + /** + * 获取推荐资源列表 + * @param limit 限制数量 + * @returns Promise> + */ + async getRecommendResources(limit?: number): Promise> { + const response = await api.get('/news/resources/recommend', { limit }); + return response.data; + }, + + /** + * 获取轮播资源列表 + * @param limit 限制数量 + * @returns Promise> + */ + async getBannerResources(limit?: number): Promise> { + const response = await api.get('/news/resources/banner', { limit }); + return response.data; + }, + + /** + * 搜索资源 + * @param keyword 搜索关键词 + * @param categoryID 分类ID(可选) + * @param status 状态(可选) + * @returns Promise> + */ + async searchResources( + keyword: string, + categoryID?: string, + status?: number + ): Promise> { + const params: any = { keyword }; + if (categoryID) params.categoryID = categoryID; + if (status !== undefined) params.status = status; + + const response = await api.get('/news/resources/search', params); + return response.data; + } +}; + +export default resourceApi; diff --git a/schoolNewsWeb/src/apis/resource/resourceCategory.ts b/schoolNewsWeb/src/apis/resource/resourceCategory.ts new file mode 100644 index 0000000..1c80b2a --- /dev/null +++ b/schoolNewsWeb/src/apis/resource/resourceCategory.ts @@ -0,0 +1,98 @@ +/** + * @description 资源分类API接口 + * @filename resourceCategory.ts + * @author yslg + * @copyright xyzh + * @since 2025-10-15 + */ + +import { api } from '@/apis'; +import type { ResultDomain, ResourceCategory } from '@/types'; + +/** + * 资源分类API服务 + */ +export const resourceCategoryApi = { + /** + * 获取分类列表 + * @returns Promise> + */ + async getCategoryList(): Promise> { + const response = await api.get('/news/categorys/list'); + return response.data; + }, + + /** + * 根据ID获取分类详情 + * @param categoryID 分类ID + * @returns Promise> + */ + async getCategoryById(categoryID: string): Promise> { + const response = await api.get(`/news/categorys/category/${categoryID}`); + return response.data; + }, + + /** + * 创建分类 + * @param category 分类信息 + * @returns Promise> + */ + async createCategory(category: ResourceCategory): Promise> { + const response = await api.post('/news/categorys/category', category); + return response.data; + }, + + /** + * 更新分类 + * @param category 分类信息 + * @returns Promise> + */ + async updateCategory(category: ResourceCategory): Promise> { + const response = await api.put('/news/categorys/category', category); + return response.data; + }, + + /** + * 删除分类 + * @param categoryID 分类ID + * @returns Promise> + */ + async deleteCategory(categoryID: string): Promise> { + const response = await api.delete(`/news/categorys/category/${categoryID}`); + return response.data; + }, + + /** + * 更新分类状态 + * @param categoryID 分类ID + * @param status 状态值 + * @returns Promise> + */ + async updateCategoryStatus(categoryID: string, status: number): Promise> { + const response = await api.put(`/news/categorys/category/${categoryID}/status`, null, { + params: { status } + }); + return response.data; + }, + + /** + * 获取分类树 + * @returns Promise> + */ + async getCategoryTree(): Promise> { + const response = await api.get('/news/categorys/tree'); + return response.data; + }, + + /** + * 获取子分类 + * @param parentID 父分类ID + * @returns Promise> + */ + async getChildCategories(parentID: string): Promise> { + const response = await api.get(`/news/categorys/category/${parentID}/children`); + return response.data; + } +}; + +export default resourceCategoryApi; diff --git a/schoolNewsWeb/src/apis/resource/resourceTag.ts b/schoolNewsWeb/src/apis/resource/resourceTag.ts new file mode 100644 index 0000000..f22ac5f --- /dev/null +++ b/schoolNewsWeb/src/apis/resource/resourceTag.ts @@ -0,0 +1,143 @@ +/** + * @description 标签API接口 + * @filename resourceTag.ts + * @author yslg + * @copyright xyzh + * @since 2025-10-15 + */ + +import { api } from '@/apis'; +import type { ResultDomain, Tag, ResourceTag } from '@/types'; + +/** + * 标签API服务 + */ +export const resourceTagApi = { + // ==================== 标签基础操作 ==================== + + /** + * 获取标签列表 + * @returns Promise> + */ + async getTagList(): Promise> { + const response = await api.get('/news/tags/list'); + return response.data; + }, + + /** + * 根据ID获取标签详情 + * @param tagID 标签ID + * @returns Promise> + */ + async getTagById(tagID: string): Promise> { + const response = await api.get(`/news/tags/tag/${tagID}`); + return response.data; + }, + + /** + * 创建标签 + * @param tag 标签信息 + * @returns Promise> + */ + async createTag(tag: Tag): Promise> { + const response = await api.post('/news/tags/tag', tag); + return response.data; + }, + + /** + * 更新标签 + * @param tag 标签信息 + * @returns Promise> + */ + async updateTag(tag: Tag): Promise> { + const response = await api.put('/news/tags/tag', tag); + return response.data; + }, + + /** + * 删除标签 + * @param tagID 标签ID + * @returns Promise> + */ + async deleteTag(tagID: string): Promise> { + const response = await api.delete(`/news/tags/tag/${tagID}`); + return response.data; + }, + + /** + * 搜索标签 + * @param keyword 搜索关键词 + * @returns Promise> + */ + async searchTags(keyword: string): Promise> { + const response = await api.get('/news/tags/search', { keyword }); + return response.data; + }, + + // ==================== 资源标签关联操作 ==================== + + /** + * 获取资源的标签列表 + * @param resourceID 资源ID + * @returns Promise> + */ + async getResourceTags(resourceID: string): Promise> { + const response = await api.get(`/news/tags/resource/${resourceID}`); + return response.data; + }, + + /** + * 为资源添加单个标签 + * @param resourceID 资源ID + * @param tagID 标签ID + * @returns Promise> + */ + async addResourceTag(resourceID: string, tagID: string): Promise> { + const response = await api.post(`/news/tags/resource/${resourceID}/tag/${tagID}`); + return response.data; + }, + + /** + * 批量为资源添加标签 + * @param resourceID 资源ID + * @param tagIDs 标签ID列表 + * @returns Promise> + */ + async batchAddResourceTags(resourceID: string, tagIDs: string): Promise> { + const response = await api.post(`/news/tags/resource/${resourceID}/tags`, tagIDs); + return response.data; + }, + + /** + * 移除资源的标签 + * @param resourceID 资源ID + * @param tagID 标签ID + * @returns Promise> + */ + async removeResourceTag(resourceID: string, tagID: string): Promise> { + const response = await api.delete(`/news/tags/resource/${resourceID}/tag/${tagID}`); + return response.data; + }, + + /** + * 清空资源的所有标签 + * @param resourceID 资源ID + * @returns Promise> + */ + async clearResourceTags(resourceID: string): Promise> { + const response = await api.delete(`/news/tags/resource/${resourceID}/tags`); + return response.data; + }, + + /** + * 根据标签获取资源列表 + * @param tagID 标签ID + * @returns Promise> + */ + async getResourcesByTag(tagID: string): Promise> { + const response = await api.get(`/news/tags/tag/${tagID}/resources`); + return response.data; + } +}; + +export default resourceTagApi; diff --git a/schoolNewsWeb/src/components/file/FileUpload.vue b/schoolNewsWeb/src/components/file/FileUpload.vue index 5d2ee83..55fcf7e 100644 --- a/schoolNewsWeb/src/components/file/FileUpload.vue +++ b/schoolNewsWeb/src/components/file/FileUpload.vue @@ -1,5 +1,91 @@ + + + +
+ +
+
+ + + +
+
+ +
+
+
{{ previewTextContent }}
+
+
+
+ {{ currentPreviewFile ? getFileTypeIcon(currentPreviewFile) : '📄' }} +
+

该文件类型不支持预览

+

文件名:{{ currentPreviewFile?.name }}

+

文件大小:{{ currentPreviewFile ? formatFileSize(currentPreviewFile.size) : '' }}

+
+
+
- - - diff --git a/schoolNewsWeb/src/types/resource/index.ts b/schoolNewsWeb/src/types/resource/index.ts index c3bdf34..168e812 100644 --- a/schoolNewsWeb/src/types/resource/index.ts +++ b/schoolNewsWeb/src/types/resource/index.ts @@ -44,6 +44,13 @@ export interface Resource extends BaseDTO { creator?: string; /** 更新者 */ updater?: string; + + /** 标签列表 */ + tags?: Tag[]; + /** 是否允许评论 */ + allowComment?: boolean; + /** 是否置顶 */ + isTop?: boolean; } /** @@ -106,6 +113,8 @@ export interface ResourceTag extends BaseDTO { * 标签实体 */ export interface Tag extends BaseDTO { + /** 标签ID */ + tagID?: string; /** 标签名称 */ name?: string; /** 标签描述 */ diff --git a/schoolNewsWeb/src/utils/quill-resize.ts b/schoolNewsWeb/src/utils/quill-resize.ts index e73235b..b23dab9 100644 --- a/schoolNewsWeb/src/utils/quill-resize.ts +++ b/schoolNewsWeb/src/utils/quill-resize.ts @@ -8,14 +8,24 @@ import Quill from 'quill'; interface ResizeOptions { modules?: string[]; + onResizeEnd?: (element: HTMLElement) => void; // 拉伸结束回调 +} + +interface ResizeState { + startX: number; + startY: number; + startWidth: number; + startHeight: number; + aspectRatio: number; + position: string; } export class ImageResize { quill: any; options: ResizeOptions; overlay: HTMLElement | null = null; - img: HTMLImageElement | HTMLVideoElement | null = null; - handle: HTMLElement | null = null; + element: HTMLImageElement | HTMLVideoElement | null = null; + resizeState: ResizeState | null = null; constructor(quill: any, options: ResizeOptions = {}) { this.quill = quill; @@ -25,23 +35,26 @@ export class ImageResize { // 等待编辑器完全初始化 setTimeout(() => { - // 监听编辑器点击事件 - this.quill.root.addEventListener('click', this.handleClick.bind(this)); - - // 点击编辑器外部时隐藏 resize 控件 - document.addEventListener('click', this.handleDocumentClick.bind(this)); - + this.initEventListeners(); console.log('✅ ImageResize 事件监听器已添加'); }, 100); } + private initEventListeners() { + // 监听编辑器点击事件 + this.quill.root.addEventListener('click', this.handleClick.bind(this)); + + // 点击编辑器外部时隐藏 resize 控件 + document.addEventListener('click', this.handleDocumentClick.bind(this)); + } + handleClick(e: MouseEvent) { const target = e.target as HTMLElement; console.log('🖱️ 点击事件:', target.tagName, target); // 检查是否点击了图片或视频 - if (target.tagName === 'IMG' || target.tagName === 'VIDEO') { + if (this.isResizableElement(target)) { console.log('📷 检测到图片/视频点击,显示缩放控件'); this.showResizer(target as HTMLImageElement | HTMLVideoElement); } else if (!this.overlay || !this.overlay.contains(target)) { @@ -50,6 +63,10 @@ export class ImageResize { } } + private isResizableElement(element: HTMLElement): boolean { + return element.tagName === 'IMG' || element.tagName === 'VIDEO'; + } + handleDocumentClick(e: MouseEvent) { const target = e.target as HTMLElement; @@ -60,7 +77,7 @@ export class ImageResize { } showResizer(element: HTMLImageElement | HTMLVideoElement) { - this.img = element; + this.element = element; console.log('🎯 显示缩放控件,元素:', element); @@ -72,6 +89,14 @@ export class ImageResize { if (!this.overlay) return; // 更新遮罩层位置和大小 + this.updateOverlayPosition(element); + + console.log('✅ 缩放控件已显示'); + } + + private updateOverlayPosition(element: HTMLImageElement | HTMLVideoElement) { + if (!this.overlay) return; + const rect = element.getBoundingClientRect(); const containerRect = this.quill.root.getBoundingClientRect(); @@ -87,15 +112,14 @@ export class ImageResize { this.overlay.style.top = `${rect.top - containerRect.top + this.quill.root.scrollTop}px`; this.overlay.style.width = `${rect.width}px`; this.overlay.style.height = `${rect.height}px`; - - console.log('✅ 缩放控件已显示'); } hideResizer() { if (this.overlay) { this.overlay.style.display = 'none'; } - this.img = null; + this.element = null; + this.resizeState = null; } createOverlay() { @@ -199,87 +223,124 @@ export class ImageResize { e.preventDefault(); e.stopPropagation(); - if (!this.img || !this.overlay) return; + if (!this.element || !this.overlay) return; - const startX = e.clientX; - const startY = e.clientY; - const startWidth = this.img.offsetWidth; - const startHeight = this.img.offsetHeight; - const aspectRatio = startWidth / startHeight; + // 初始化拉伸状态 + this.resizeState = { + startX: e.clientX, + startY: e.clientY, + startWidth: this.element.offsetWidth, + startHeight: this.element.offsetHeight, + aspectRatio: this.element.offsetWidth / this.element.offsetHeight, + position + }; const handleMouseMove = (moveEvent: MouseEvent) => { - if (!this.img || !this.overlay) return; + if (!this.element || !this.overlay || !this.resizeState) return; - const deltaX = moveEvent.clientX - startX; - const deltaY = moveEvent.clientY - startY; - - let newWidth = startWidth; - let newHeight = startHeight; - - // 根据拉伸方向计算新尺寸 - if (position.includes('e')) { - newWidth = startWidth + deltaX; - } else if (position.includes('w')) { - newWidth = startWidth - deltaX; - } - - if (position.includes('s')) { - newHeight = startHeight + deltaY; - } else if (position.includes('n')) { - newHeight = startHeight - deltaY; - } - - // 保持纵横比(对于对角拉伸) - if (position.length === 2) { - newHeight = newWidth / aspectRatio; - } - - // 限制最小尺寸 - if (newWidth < 50) newWidth = 50; - if (newHeight < 50) newHeight = 50; - - // 应用新尺寸(同时设置 style 和属性) - this.img.style.width = `${newWidth}px`; - this.img.style.height = `${newHeight}px`; - this.img.setAttribute('width', `${newWidth}`); - this.img.setAttribute('height', `${newHeight}`); - - - // 更新遮罩层 - this.overlay.style.width = `${newWidth}px`; - this.overlay.style.height = `${newHeight}px`; + this.updateElementSize(moveEvent); }; const handleMouseUp = () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); - // 强制触发 Quill 的 text-change 事件 - // 使用 Quill 的内部方法 - console.log('🔄 尝试触发 text-change 事件'); - if (this.quill.emitter) { - this.quill.emitter.emit('text-change', { - oldRange: null, - range: null, - source: 'user' - }); - console.log('✅ text-change 事件已触发'); - } else { - console.log('❌ quill.emitter 不存在'); - } - - // 备用方案:直接触发 DOM 事件 - console.log('🔄 尝试触发 input 事件'); - const event = new Event('input', { bubbles: true }); - this.quill.root.dispatchEvent(event); - console.log('✅ input 事件已触发'); - + // 拉伸结束,触发更新 + this.onResizeEnd(); }; document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); } + private updateElementSize(moveEvent: MouseEvent) { + if (!this.element || !this.overlay || !this.resizeState) return; + + const deltaX = moveEvent.clientX - this.resizeState.startX; + const deltaY = moveEvent.clientY - this.resizeState.startY; + + let newWidth = this.resizeState.startWidth; + let newHeight = this.resizeState.startHeight; + + // 根据拉伸方向计算新尺寸 + if (this.resizeState.position.includes('e')) { + newWidth = this.resizeState.startWidth + deltaX; + } else if (this.resizeState.position.includes('w')) { + newWidth = this.resizeState.startWidth - deltaX; + } + + if (this.resizeState.position.includes('s')) { + newHeight = this.resizeState.startHeight + deltaY; + } else if (this.resizeState.position.includes('n')) { + newHeight = this.resizeState.startHeight - deltaY; + } + + // 保持纵横比(对于对角拉伸) + if (this.resizeState.position.length === 2) { + newHeight = newWidth / this.resizeState.aspectRatio; + } + + // 限制最小尺寸 + if (newWidth < 50) newWidth = 50; + if (newHeight < 50) newHeight = 50; + + // 应用新尺寸 + this.applyElementSize(newWidth, newHeight); + + // 更新遮罩层 + this.overlay.style.width = `${newWidth}px`; + this.overlay.style.height = `${newHeight}px`; + } + + private applyElementSize(width: number, height: number) { + if (!this.element) return; + + // 同时设置 style 和属性 + this.element.style.width = `${width}px`; + this.element.style.height = `${height}px`; + this.element.setAttribute('width', `${width}`); + this.element.setAttribute('height', `${height}`); + } + + private onResizeEnd() { + if (!this.element) return; + + console.log('🔄 拉伸结束,触发HTML更新'); + + // 调用自定义回调 + if (this.options.onResizeEnd) { + this.options.onResizeEnd(this.element); + } + + // 强制触发 Quill 的内容更新 + this.triggerQuillUpdate(); + } + + private triggerQuillUpdate() { + // 方案1: 使用 Quill 的内部方法 + if (this.quill.emitter) { + this.quill.emitter.emit('text-change', { + oldRange: null, + range: null, + source: 'user' + }); + console.log('✅ Quill text-change 事件已触发'); + } + + // 方案2: 触发 DOM 事件 + const inputEvent = new Event('input', { bubbles: true }); + this.quill.root.dispatchEvent(inputEvent); + console.log('✅ DOM input 事件已触发'); + + // 方案3: 强制更新 Quill 内容 + setTimeout(() => { + if (this.quill.update) { + this.quill.update(); + console.log('✅ Quill 内容已更新'); + } + }, 0); + } + destroy() { if (this.overlay) { this.overlay.remove(); diff --git a/schoolNewsWeb/src/views/article/ArticleAddView.vue b/schoolNewsWeb/src/views/article/ArticleAddView.vue index a7db7c6..27d8ca1 100644 --- a/schoolNewsWeb/src/views/article/ArticleAddView.vue +++ b/schoolNewsWeb/src/views/article/ArticleAddView.vue @@ -15,43 +15,48 @@ - - - - - - + + + - - - - - + + - - - - - - - - - - - -
建议尺寸:800x450px,支持jpg、png格式
+ + + +
+ + 删除封面 +
@@ -93,28 +98,22 @@ - - -
-

{{ articleForm.title }}

-
- 分类:{{ getCategoryLabel(articleForm.category) }} - - 标签:{{ articleForm.tags.join(', ') }} - -
-
- {{ articleForm.summary }} -
- -
-
-
+ + diff --git a/schoolNewsWeb/src/views/article/ArticleShowView.vue b/schoolNewsWeb/src/views/article/ArticleShowView.vue new file mode 100644 index 0000000..adfd903 --- /dev/null +++ b/schoolNewsWeb/src/views/article/ArticleShowView.vue @@ -0,0 +1,382 @@ + + + + + diff --git a/schoolNewsWeb/src/views/article/index.ts b/schoolNewsWeb/src/views/article/index.ts new file mode 100644 index 0000000..0106271 --- /dev/null +++ b/schoolNewsWeb/src/views/article/index.ts @@ -0,0 +1,2 @@ +export { default as ArticleAddView } from './ArticleAddView.vue'; +export { default as ArticleShowView } from './ArticleShowView.vue'; \ No newline at end of file