Commit 5b4d9245 by lijiabin

【需求 17679】 wip: 继续完善页面等

parent 797a579b
...@@ -175,10 +175,7 @@ export const deleteArticle = (id: number) => { ...@@ -175,10 +175,7 @@ export const deleteArticle = (id: number) => {
*/ */
export const deleteComment = (commentId: number) => { export const deleteComment = (commentId: number) => {
return service.request({ return service.request({
url: `/api/cultureComment/deleteComment`, url: `/api/cultureComment/deleteComment?commentId=${commentId}`,
method: 'POST', method: 'POST',
data: {
commentId,
},
}) })
} }
...@@ -8,18 +8,7 @@ import type { BackendServicePageResult } from '@/utils/request/types' ...@@ -8,18 +8,7 @@ import type { BackendServicePageResult } from '@/utils/request/types'
*/ */
export const getCaseList = (data: PageSearchParams) => { export const getCaseList = (data: PageSearchParams) => {
return service.request<BackendServicePageResult<BackendTagListItemDto>>({ return service.request<BackendServicePageResult<BackendTagListItemDto>>({
url: '/api/cultureCase/caseAuditByPage', url: '/api/cultureCase/caseListByPage',
method: 'POST',
data,
})
}
/**
* 添加轮播图
*/
export const addCarousel = (data: AddOrUpdateCarouselDto) => {
return service.request({
url: '/api/cultureCarousel/addCarousel',
method: 'POST', method: 'POST',
data, data,
}) })
......
...@@ -4,12 +4,54 @@ import type { BackendServicePageResult } from '@/utils/request/types' ...@@ -4,12 +4,54 @@ import type { BackendServicePageResult } from '@/utils/request/types'
// 后台管理 积分商城相关接口 // 后台管理 积分商城相关接口
/** /**
* 商品领用列表 * 商品配置列表
*/ */
export const getExchangeList = (params: BackendTagSearchParams) => { export const getShopItemList = (params: BackendTagSearchParams) => {
return service.request<BackendServicePageResult<BackendTagListItemDto>>({ return service.request<BackendServicePageResult<BackendTagListItemDto>>({
url: '/api/culture/shop/order/exchangeList', url: '/api/culture/shop/item/productList',
method: 'POST', method: 'POST',
data: params, data: params,
}) })
} }
/**
* 新增/编辑商品
*/
export const addOrUpdateShopItem = (data: AddOrUpdateTagDto) => {
return service.request<BackendServicePageResult<BackendTagListItemDto>>({
url: '/api/culture/shop/item/addOrUpdate',
method: 'POST',
data,
})
}
/*
* 删除商品
*/
export const deleteShopItem = (id: number) => {
return service.request({
url: `/api/culture/shop/item/deleteProduct?id=${id}`,
method: 'POST',
})
}
/**
* 后台商品领用列表
*/
export const getBackendExchangeList = (data: BackendTagSearchParams) => {
return service.request<BackendServicePageResult<BackendTagListItemDto>>({
url: '/api/culture/shop/order/background/productList',
method: 'POST',
data,
})
}
/**
* 发放 取消发放
*/
export const issueProduct = (data) => {
return service.request({
url: `/api/culture/shop/order/issueProduct`,
method: 'POST',
data,
})
}
...@@ -8,6 +8,7 @@ import type { ...@@ -8,6 +8,7 @@ import type {
YaBiData, YaBiData,
ExchangeYabiRecordItemDto, ExchangeYabiRecordItemDto,
ExchangeGoodsRecordSearchParams, ExchangeGoodsRecordSearchParams,
BackendShopItemDto,
} from './types' } from './types'
/** /**
* 获取用户亚币相关数据 * 获取用户亚币相关数据
...@@ -24,7 +25,7 @@ export const getYaBiData = () => { ...@@ -24,7 +25,7 @@ export const getYaBiData = () => {
* 积分商城商品列表 * 积分商城商品列表
*/ */
export const getShopItemList = (data: ShopSearchParams) => { export const getShopItemList = (data: ShopSearchParams) => {
return service.request<BackendServicePageResult<ShopItemDto>>({ return service.request<BackendServicePageResult<BackendShopItemDto>>({
url: '/api/culture/shop/item/pageList', url: '/api/culture/shop/item/pageList',
method: 'POST', method: 'POST',
data, data,
......
...@@ -12,18 +12,19 @@ export interface ShopSearchParams extends PageSearchParams { ...@@ -12,18 +12,19 @@ export interface ShopSearchParams extends PageSearchParams {
/** /**
* 积分商城商品类型 * 积分商城商品类型
*/ */
export interface ShopItemDto { export interface BackendShopItemDto {
id: number createTime: number
description: string description: string
enable: number enable: BooleanFlag
id: number
imageUrl: string imageUrl: string
itemType: number itemType: ShopGoodsTypeEnum
itemTypeName: string itemTypeName: string
name: string name: string
price: number price: number
region: string region: string
soldOut: boolean soldOut: boolean
sotrOrder: number sortOrder: number
stock: number stock: number
} }
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<div class="flex-1"> <div class="flex-1">
<div ref="commentInputRef"> <div ref="commentInputRef">
<el-input <el-input
v-model="comment" v-model="myComment"
type="textarea" type="textarea"
placeholder="写下你的评论..." placeholder="写下你的评论..."
:rows="3" :rows="3"
...@@ -68,8 +68,8 @@ ...@@ -68,8 +68,8 @@
</div> </div>
<button <button
class="cursor-pointer disabled:opacity-50 px-6 py-2 bg-gradient-to-r from-blue-500 to-purple-500 text-white rounded-full text-sm hover:shadow-lg transition-all" class="cursor-pointer disabled:opacity-50 px-6 py-2 bg-gradient-to-r from-blue-500 to-purple-500 text-white rounded-full text-sm hover:shadow-lg transition-all"
:disabled="!comment.trim() || loading" :disabled="!myComment.trim() || loading"
@click="handleComment()" @click="handleMyComment()"
> >
发表 发表
</button> </button>
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
<!-- 评论列表 --> <!-- 评论列表 -->
<div v-loading="loading" class="divide-y divide-gray-100" v-if="list.length"> <div v-loading="loading" class="divide-y divide-gray-100" v-if="list.length">
<div v-for="item in list" :key="item.id"> <div v-for="item in list" :key="item.id">
<div class="p-4 hover:bg-gray-50/50 transition-colors"> <div class="p-4 transition-colors">
<div class="flex gap-3"> <div class="flex gap-3">
<img :src="item.avatar" alt="" class="w-10 h-10 rounded-full object-cover" /> <img :src="item.avatar" alt="" class="w-10 h-10 rounded-full object-cover" />
<div class="flex-1"> <div class="flex-1">
...@@ -134,9 +134,6 @@ ...@@ -134,9 +134,6 @@
<div class="flex-1"> <div class="flex-1">
<div class="flex items-center gap-2 mb-1"> <div class="flex items-center gap-2 mb-1">
<span class="font-medium text-sm text-gray-800">{{ child.replyUser }}</span> <span class="font-medium text-sm text-gray-800">{{ child.replyUser }}</span>
<span class="text-xs text-gray-500">{{
dayjs(child.createTime * 1000).format('YYYY-MM-DD HH:mm:ss')
}}</span>
</div> </div>
<p class="text-sm text-gray-700"> <p class="text-sm text-gray-700">
{{ child.content }} {{ child.content }}
...@@ -169,13 +166,13 @@ ...@@ -169,13 +166,13 @@
</div> </div>
</div> </div>
</div> </div>
<div v-show="showCommentBox(item)" class="flex gap-3"> <div v-show="showCommentBox(item)" class="flex gap-3 mt-4">
<img :src="userInfo?.avatar" alt="" class="w-10 h-10 rounded-full object-cover" /> <img :src="userInfo?.avatar" alt="" class="w-10 h-10 rounded-full object-cover" />
<div class="flex-1"> <div class="flex-1">
<el-input <el-input
v-model="comment" v-model="comment"
type="textarea" type="textarea"
placeholder="写下你的评论..." :placeholder="replyPlaceholder"
:rows="3" :rows="3"
></el-input> ></el-input>
<div class="flex justify-between items-center mt-3"> <div class="flex justify-between items-center mt-3">
...@@ -190,7 +187,7 @@ ...@@ -190,7 +187,7 @@
<button <button
class="cursor-pointer disabled:opacity-50 px-6 py-2 bg-gradient-to-r from-blue-500 to-purple-500 text-white rounded-full text-sm hover:shadow-lg transition-all" class="cursor-pointer disabled:opacity-50 px-6 py-2 bg-gradient-to-r from-blue-500 to-purple-500 text-white rounded-full text-sm hover:shadow-lg transition-all"
:disabled="!comment.trim()" :disabled="!comment.trim()"
@click="handleComment(item.id)" @click="handleComment"
> >
发表 发表
</button> </button>
...@@ -235,6 +232,8 @@ const { id } = defineProps<{ ...@@ -235,6 +232,8 @@ const { id } = defineProps<{
id: number | string id: number | string
}>() }>()
const total = defineModel<number>('total', { required: true, default: 0 })
const userStore = useUserStore() const userStore = useUserStore()
const { userInfo } = storeToRefs(userStore) const { userInfo } = storeToRefs(userStore)
...@@ -247,7 +246,7 @@ const { triggerAnimation } = useHintAnimation(commentInputRef, { ...@@ -247,7 +246,7 @@ const { triggerAnimation } = useHintAnimation(commentInputRef, {
classes: ['scale-bounce', 'highlight', 'shake-x'], classes: ['scale-bounce', 'highlight', 'shake-x'],
}) })
const { list, searchParams, goToPage, total, loading, changePageSize, refresh } = usePageSearch( const { list, searchParams, goToPage, loading, changePageSize, refresh } = usePageSearch(
getCommentList, getCommentList,
{ {
defaultParams: { defaultParams: {
...@@ -263,7 +262,16 @@ const handleCurrentChange = async (e: number) => { ...@@ -263,7 +262,16 @@ const handleCurrentChange = async (e: number) => {
triggerAnimation() triggerAnimation()
}, 500) }, 500)
} }
// 自己发出的评论
const myComment = ref('')
// 回复别人的
const comment = ref('') const comment = ref('')
// 回复别人placeholder
const replyPlaceholder = ref('回复@')
const currentCommentId = ref(-1)
const handleLickComment = async (item: CommentItemDto) => { const handleLickComment = async (item: CommentItemDto) => {
await addOrCancelCommentLike(item.id) await addOrCancelCommentLike(item.id)
...@@ -278,66 +286,40 @@ const handleLickComment = async (item: CommentItemDto) => { ...@@ -278,66 +286,40 @@ const handleLickComment = async (item: CommentItemDto) => {
} }
} }
const currentParentCommentId = ref(0)
const currentSonCommentId = ref(0)
const handleReply = (item: CommentItemDto) => { const handleReply = (item: CommentItemDto) => {
if (item.pid) { console.log(item)
// 点击的是子评论 replyPlaceholder.value = `回复@${item.replyUser}:`
if (currentSonCommentId.value) {
// 置为空
if (currentSonCommentId.value !== item.id) {
currentSonCommentId.value = item.id
currentParentCommentId.value = item.pid
} else {
currentSonCommentId.value = 0
currentParentCommentId.value = 0
}
} else {
currentSonCommentId.value = item.id
currentParentCommentId.value = item.pid
}
} else {
// 点击的是父评论
if (currentParentCommentId.value) {
// 置为空
if (currentParentCommentId.value !== item.id) {
currentParentCommentId.value = item.id
} else {
currentParentCommentId.value = 0
}
} else {
currentParentCommentId.value = item.id
currentSonCommentId.value = 0
}
}
comment.value = '' comment.value = ''
console.log('parent', currentParentCommentId.value, 'son', currentSonCommentId.value) currentCommentId.value = item.id
} }
const showCommentBox = (item: CommentItemDto) => { const showCommentBox = (item: CommentItemDto) => {
if (currentParentCommentId.value && currentSonCommentId.value) {
// 说明在评论子评论
return ( return (
item.id === currentParentCommentId.value && currentCommentId.value === item.id || item.children.some((i) => i.id === currentCommentId.value)
item.children?.some((i) => i.id === currentSonCommentId.value)
) )
} else if (currentParentCommentId.value) {
// 说明在评论父评论
return item.id === currentParentCommentId.value
}
} }
const handleComment = async (pid?: number) => { const handleMyComment = async () => {
await addComment({
articleId: id,
content: myComment.value,
})
ElMessage.success('发表评论成功')
refresh()
myComment.value = ''
total.value++
}
const handleComment = async () => {
console.log(comment.value) console.log(comment.value)
const res = await addComment({ const res = await addComment({
articleId: id, articleId: id,
content: comment.value, content: comment.value,
...(pid ? { pid } : {}), ...(currentCommentId.value ? { pid: currentCommentId.value } : {}),
}) })
console.log(res) console.log(res)
ElMessage.success('发表评论成功') ElMessage.success('发表评论成功')
refresh() refresh()
comment.value = '' comment.value = ''
total.value++
} }
defineExpose({ defineExpose({
......
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
:on-remove="handleRemove" :on-remove="handleRemove"
:on-change="handleChange" :on-change="handleChange"
:before-remove="handleBeforeRemove" :before-remove="handleBeforeRemove"
:on-exceed="handleExceed"
:multiple="multiple" :multiple="multiple"
:limit="limit" :limit="limit"
:disabled="hasReachedLimit && !multiple"
class="custom-upload" class="custom-upload"
> >
<el-icon><Plus /></el-icon> <el-icon><Plus /></el-icon>
...@@ -30,7 +30,7 @@ import type { UploadFileProps } from './types' ...@@ -30,7 +30,7 @@ import type { UploadFileProps } from './types'
const props = withDefaults(defineProps<UploadFileProps>(), { const props = withDefaults(defineProps<UploadFileProps>(), {
limit: 2, limit: 2,
multiple: true, multiple: false,
}) })
const modelValue = defineModel<T>({ const modelValue = defineModel<T>({
...@@ -44,8 +44,11 @@ const dialogVisible = ref(false) ...@@ -44,8 +44,11 @@ const dialogVisible = ref(false)
const isArrayType = computed(() => Array.isArray(modelValue.value)) const isArrayType = computed(() => Array.isArray(modelValue.value))
const hasReachedLimit = computed(() => fileList.value.length >= props.limit) const hasReachedLimit = computed(() => fileList.value.length >= props.limit)
const showUploadBtn = computed(() => (hasReachedLimit.value ? 'none' : 'flex'))
const isInternalUpdate = ref(false) const isInternalUpdate = ref(false)
const uploadProgress = ref(0)
const parseModelValueToUrls = (value: T): string[] => { const parseModelValueToUrls = (value: T): string[] => {
if (!value) return [] if (!value) return []
return Array.isArray(value) ? value.filter(Boolean) : (value as string).split(',').filter(Boolean) return Array.isArray(value) ? value.filter(Boolean) : (value as string).split(',').filter(Boolean)
...@@ -98,8 +101,18 @@ watch( ...@@ -98,8 +101,18 @@ watch(
{ deep: true }, { deep: true },
) )
const handleExceed: UploadProps['onExceed'] = (uploadFiles) => {
console.log('uploadFiles', uploadFiles)
if (uploadFiles.length > props.limit) {
ElMessage.error(`最多上传 ${props.limit} 个文件`)
return
}
}
const handleChange: UploadProps['onChange'] = async (uploadFile, uploadFiles) => { const handleChange: UploadProps['onChange'] = async (uploadFile, uploadFiles) => {
console.log('uploadFiles', uploadFiles)
if (uploadFiles.length > props.limit) { if (uploadFiles.length > props.limit) {
debugger
ElMessage.error(`最多上传 ${props.limit} 个文件`) ElMessage.error(`最多上传 ${props.limit} 个文件`)
const index = fileList.value.findIndex((file) => file.uid === uploadFile.uid) const index = fileList.value.findIndex((file) => file.uid === uploadFile.uid)
if (index !== -1) { if (index !== -1) {
...@@ -117,7 +130,9 @@ const handleChange: UploadProps['onChange'] = async (uploadFile, uploadFiles) => ...@@ -117,7 +130,9 @@ const handleChange: UploadProps['onChange'] = async (uploadFile, uploadFiles) =>
fileList.value[fileIndex].status = 'uploading' fileList.value[fileIndex].status = 'uploading'
} }
const { data } = await uploadFileApi(uploadFile.raw) const { data } = await uploadFileApi(uploadFile.raw, (progress) => {
console.log('progress', progress)
})
console.log('data', data) console.log('data', data)
const url = data.fileUrl || data.data[0].filePath const url = data.fileUrl || data.data[0].filePath
const name = data.fileName || data.data[0].finalName const name = data.fileName || data.data[0].finalName
...@@ -181,6 +196,9 @@ defineExpose({ ...@@ -181,6 +196,9 @@ defineExpose({
</script> </script>
<style scoped> <style scoped>
.custom-upload :deep(.el-upload--picture-card) {
display: v-bind(showUploadBtn);
}
/* 方案1: 适中尺寸(推荐) */ /* 方案1: 适中尺寸(推荐) */
.custom-upload :deep(.el-upload--picture-card) { .custom-upload :deep(.el-upload--picture-card) {
width: 100px; width: 100px;
......
...@@ -88,6 +88,10 @@ const { maxSize = 500, acceptFormats = ['mp4', 'avi', 'mov', 'wmv', 'flv'] } = ...@@ -88,6 +88,10 @@ const { maxSize = 500, acceptFormats = ['mp4', 'avi', 'mov', 'wmv', 'flv'] } =
const modelValue = defineModel<string>('modelValue', { required: true }) const modelValue = defineModel<string>('modelValue', { required: true })
const videoInfo = defineModel<VideoInfo | null>('videoInfo', { required: false, default: null }) const videoInfo = defineModel<VideoInfo | null>('videoInfo', { required: false, default: null })
const emit = defineEmits<{
uploadSuccess: [{ file: File; url: string; videoDuration: string }]
}>()
// 响应式数据 // 响应式数据
const uploadRef = ref() const uploadRef = ref()
const uploading = ref(false) const uploading = ref(false)
...@@ -180,6 +184,7 @@ const startUpload = async () => { ...@@ -180,6 +184,7 @@ const startUpload = async () => {
// 根据你的 API 返回结构调整 // 根据你的 API 返回结构调整
const videoData: VideoInfo = { const videoData: VideoInfo = {
// url: data.fileUrl, // url: data.fileUrl,
// 暂时写死
url: 'https://soundasia.oss-cn-shenzhen.aliyuncs.com/OA/readName/mp4/2025/11/12/Common/1762918987602.mp4', url: 'https://soundasia.oss-cn-shenzhen.aliyuncs.com/OA/readName/mp4/2025/11/12/Common/1762918987602.mp4',
name: currentFile.value.name, name: currentFile.value.name,
size: currentFile.value.size, size: currentFile.value.size,
...@@ -194,6 +199,12 @@ const startUpload = async () => { ...@@ -194,6 +199,12 @@ const startUpload = async () => {
// 设置url // 设置url
modelValue.value = videoData.url modelValue.value = videoData.url
// 把 二进制源文件传出来
emit('uploadSuccess', {
file: currentFile.value,
url: videoData.url,
videoDuration: videoData.duration,
})
ElMessage.success('视频上传成功!') ElMessage.success('视频上传成功!')
} catch (error) { } catch (error) {
uploading.value = false uploading.value = false
......
...@@ -117,7 +117,7 @@ export default defineComponent((_, { expose }) => { ...@@ -117,7 +117,7 @@ export default defineComponent((_, { expose }) => {
<el-form-item label="专栏栏目选择" prop="relateColumnId"> <el-form-item label="专栏栏目选择" prop="relateColumnId">
<el-select v-model={form.value.relateColumnId} placeholder="请选择专栏栏目"> <el-select v-model={form.value.relateColumnId} placeholder="请选择专栏栏目">
{columnList.value.map((item) => ( {columnList.value.map((item) => (
<el-option value={item.id}>{item.title}</el-option> <el-option value={item.id} label={item.title}></el-option>
))} ))}
</el-select> </el-select>
</el-form-item> </el-form-item>
......
<template> <template>
<div class="layout-culture pb-11 h-full bg-[linear-gradient(to_bottom,#F0FBFD_0%,#ECEFFF_100%)]"> <div class="layout-culture pb-11 h-full bg-[linear-gradient(to_bottom,#F0FBFD_0%,#ECEFFF_100%)]">
<div <div
class="header flex px-40 items-center justify-between bg-white mb-1 shadow-sm fixed top-0 left-0 right-0 z-10 w-100vw" class="header flex px-40 items-center justify-between bg-white mb-1 shadow-sm fixed top-0 left-0 right-0 z-100 w-100vw"
> >
<!-- Logo区域 --> <!-- Logo区域 -->
<div @click="router.push('/')" class="flex items-center flex-shrink-0 min-w-0 cursor-pointer"> <div @click="router.push('/')" class="flex items-center flex-shrink-0 min-w-0 cursor-pointer">
...@@ -80,7 +80,9 @@ ...@@ -80,7 +80,9 @@
</div> </div>
</div> </div>
<div class="flex-1 w-full flex items-center justify-center"> <div class="flex-1 w-full flex items-center justify-center">
<div class="container max-h-none px-20 lg:px-20 2xl:px-30 transition-all duration-300"> <div
class="container max-h-none px-20 lg:px-20 2xl:px-30 transition-all duration-300 min-h-[calc(100vh-96px)]"
>
<router-view v-slot="{ Component, route }"> <router-view v-slot="{ Component, route }">
<transition name="fade" mode="out-in"> <transition name="fade" mode="out-in">
<!-- 注释不能放到keep-alive下面 route是最终的路由信息 Component是当前n级路由的组件 二级路由 homePage videoDetail --> <!-- 注释不能放到keep-alive下面 route是最终的路由信息 Component是当前n级路由的组件 二级路由 homePage videoDetail -->
......
...@@ -9,6 +9,14 @@ export const useUserStore = defineStore('user', () => { ...@@ -9,6 +9,14 @@ export const useUserStore = defineStore('user', () => {
const token = ref(localStorage.getItem('token') || '') const token = ref(localStorage.getItem('token') || '')
// 获取用户信息 // 获取用户信息
const fetchUserInfo = async () => { const fetchUserInfo = async () => {
// {
// email: 'lijiabin@yswg.com.cn',
// password: 'Lijiabin123.',
// }
// {
// email: 'wangshouyong@yswg.com.cn',
// password: 'Wsy123456!',
// }
const { data } = await loginByEmail({ const { data } = await loginByEmail({
email: 'lijiabin@yswg.com.cn', email: 'lijiabin@yswg.com.cn',
password: 'Lijiabin123.', password: 'Lijiabin123.',
......
...@@ -82,45 +82,4 @@ export default class DhRequest { ...@@ -82,45 +82,4 @@ export default class DhRequest {
return Promise.reject(error as BackendServiceResult<T>) return Promise.reject(error as BackendServiceResult<T>)
} }
} }
// async get<T>(
// url: string,
// config: AxiosRequestConfig,
// ): Promise<AxiosResponse<BackendServiceResult<T>>> {
// return this.request<T>({
// url,
// method: 'GET',
// ...config,
// })
// }
// async post<T>(
// url: string,
// config: AxiosRequestConfig,
// ): Promise<AxiosResponse<BackendServiceResult<T>>> {
// return this.request<T>({
// url,
// method: 'POST',
// ...config,
// })
// }
// async put<T>(
// url: string,
// config: AxiosRequestConfig,
// ): Promise<AxiosResponse<BackendServiceResult<T>>> {
// return this.request<T>({
// url,
// method: 'PUT',
// ...config,
// })
// }
// async delete<T>(
// url: string,
// config: AxiosRequestConfig,
// ): Promise<AxiosResponse<BackendServiceResult<T>>> {
// return this.request<T>({
// url,
// method: 'DELETE',
// ...config,
// })
// }
} }
...@@ -45,20 +45,36 @@ ...@@ -45,20 +45,36 @@
> >
<el-table-column type="selection" width="55"></el-table-column> <el-table-column type="selection" width="55"></el-table-column>
<el-table-column prop="period" label="案例编号" width="100"></el-table-column> <el-table-column prop="number" label="案例编号" width="100"></el-table-column>
<el-table-column prop="approvalRegion" label="案例标题" width="180"></el-table-column> <el-table-column prop="title" label="案例标题" width="180"></el-table-column>
<el-table-column prop="approvalType" label="案例文本内容" width="120"></el-table-column> <el-table-column prop="content" label="案例文本内容" width="120"></el-table-column>
<el-table-column label="文化关键词" align="center"> <el-table-column label="文化关键词" align="center">
<el-table-column prop="receivableAmount" label="主关键词" width="100"></el-table-column> <el-table-column prop="cultureKeywordMain" label="主关键词" width="120">
<el-table-column prop="receivedAmount" label="次关键词1" width="100"></el-table-column> <template #default="{ row }">
<el-table-column prop="overdueAmount" label="次关键词2" width="100"></el-table-column> <el-tag type="primary"> {{ row.cultureKeywordMain }}</el-tag>
<el-table-column prop="overdueAmount" label="次关键词3" width="100"></el-table-column> </template>
</el-table-column>
<el-table-column prop="cultureKeywordSecond" label="次关键词1" width="100">
<template #default="{ row }">
<el-tag type="primary"> {{ row.cultureKeywordSecond[0] || '' }} </el-tag>
</template>
</el-table-column>
<el-table-column prop="cultureKeywordSecond" label="次关键词2" width="120">
<template #default="{ row }">
<el-tag type="primary"> {{ row.cultureKeywordSecond[1] || '' }} </el-tag>
</template>
</el-table-column>
<el-table-column prop="cultureKeywordSecond" label="次关键词3" width="100">
<template #default="{ row }">
<el-tag type="primary"> {{ row.cultureKeywordSecond[2] || '' }} </el-tag>
</template>
</el-table-column>
</el-table-column> </el-table-column>
<el-table-column label="年度主推关键词(玄天)" align="center"> <el-table-column label="年度主推关键词(选填)" align="center">
<el-table-column prop="annualReceivable" label="主关键词" width="100"></el-table-column> <el-table-column prop="annualReceivable" label="主关键词" width="100"></el-table-column>
<el-table-column prop="annualOverdue" label="次关键词" width="100"></el-table-column> <el-table-column prop="annualOverdue" label="次关键词" width="100"></el-table-column>
</el-table-column> </el-table-column>
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
<div class="search-section"> <div class="search-section">
<div class="flex-1 flex gap-2"> <div class="flex-1 flex gap-2">
<el-input <el-input
v-model="searchParams.title" v-model="searchParams.itemName"
placeholder="请输入栏目标题" placeholder="请输入商品名称"
class="w-200px" class="w-200px"
></el-input> ></el-input>
...@@ -15,21 +15,23 @@ ...@@ -15,21 +15,23 @@
class="search-select" class="search-select"
clearable clearable
> >
<el-option label="发布" :value="1" /> <el-option label="待发货" :value="0" />
<el-option label="隐藏" :value="0" /> <el-option label="已发货" :value="1" />
<el-option label="已取消" :value="2" />
</el-select>
<el-select
v-model="searchParams.source"
placeholder="请选择来源"
class="search-select"
clearable
>
<el-option label="商城" :value="1" />
<el-option label="大转盘" :value="2" />
<el-option label="每日抽奖" :value="3" />
</el-select> </el-select>
<el-button type="primary" :icon="Search" @click="refresh">搜索</el-button> <el-button type="primary" :icon="Search" @click="refresh">搜索</el-button>
<el-button @click="reset">重置</el-button> <el-button @click="reset">重置</el-button>
</div> </div>
<div class="flex justify-end">
<el-button type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon>
新增
</el-button>
<el-button type="primary" @click="handleBatchPublish"> 批量发布/隐藏 </el-button>
<el-button type="danger" @click="handleBatchDelete"> 批量删除 </el-button>
</div>
</div> </div>
<!-- 表格区域 --> <!-- 表格区域 -->
...@@ -43,40 +45,58 @@ ...@@ -43,40 +45,58 @@
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="55"> </el-table-column> <el-table-column type="selection" width="55"> </el-table-column>
<el-table-column prop="title" label="产品编号" min-width="200" /> <el-table-column prop="itemName" label="商品名称" min-width="200" />
<el-table-column prop="content" label="商品名称" min-width="200" /> <el-table-column prop="imageUrl" label="图片" width="300">
<el-table-column prop="faceUrl" label="图片" width="300">
<template #default="{ row }"> <template #default="{ row }">
<el-image <el-image
:preview-teleported="true" :preview-teleported="true"
:src="row.faceUrl" :src="row.imageUrl"
class="w-20 h-20 object-cover" class="w-20 h-20 object-cover"
:preview-src-list="[row.faceUrl]" :preview-src-list="[row.imageUrl]"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="videoUrl" label="来源" min-width="200"> </el-table-column> <el-table-column prop="source" label="来源" min-width="200">
<el-table-column prop="releaseStatus" label="兑换数量" min-width="200"> </el-table-column> <template #default="{ row }">
{{ row.source === 1 ? '商城' : row.source === 2 ? '大转盘' : '每日抽奖' }}
</template>
</el-table-column>
<el-table-column prop="num" label="兑换数量" min-width="200"> </el-table-column>
<el-table-column prop="createTime" label="兑换时间" min-width="200"> <el-table-column prop="createTime" label="兑换时间" min-width="200">
<template #default="{ row }"> <template #default="{ row }">
{{ dayjs(row.createTime * 1000).format('YYYY-MM-DD HH:mm:ss') }} {{ dayjs(row.createTime * 1000).format('YYYY-MM-DD HH:mm:ss') }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="showName" label="兑换人" min-width="200" /> <el-table-column prop="userName" label="兑换人" min-width="200" />
<el-table-column prop="showName" label="发放人" min-width="200" /> <el-table-column prop="issuerName" label="发放人" min-width="200" />
<el-table-column prop="memo" label="发放备注" min-width="200" />
<el-table-column prop="createTime" label="发放时间" min-width="200"> <el-table-column prop="issueTime" label="发放时间" min-width="200">
<template #default="{ row }"> <template #default="{ row }">
{{ dayjs(row.createTime * 1000).format('YYYY-MM-DD HH:mm:ss') }} {{ dayjs(row.createTime * 1000).format('YYYY-MM-DD HH:mm:ss') }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="showName" label="发放状态" min-width="200" /> <el-table-column prop="status" label="发放状态" min-width="200">
<template #default="{ row }">
{{ row.status === 0 ? '待发货' : row.status === 1 ? '已发货' : '已取消' }}
</template>
</el-table-column>
<el-table-column prop="showName" label="发放人备注" min-width="200" /> <el-table-column prop="showName" label="发放人备注" min-width="200" />
<el-table-column label="操作" width="150" fixed="right"> <el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button> <el-button v-if="row.status === 0" type="primary" link @click="handleIssue(row)">
<el-button type="danger" link @click="handleDelete(row)">删除</el-button> 发放
</el-button>
<el-button
v-if="row.status === 1"
type="warning"
link
@click="handleCancelIssue(row)"
>
取消发放
</el-button>
<!-- <el-button type="danger" link @click="handleDelete(row)">删除</el-button> -->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -131,15 +151,23 @@ ...@@ -131,15 +151,23 @@
<script setup lang="ts"> <script setup lang="ts">
import { Search, Plus, Upload } from '@element-plus/icons-vue' import { Search, Plus, Upload } from '@element-plus/icons-vue'
import { usePageSearch, useResetData } from '@/hooks' import { usePageSearch, useResetData } from '@/hooks'
import { addOrUpdateColumn, deleteColumn, hideColumn, getExchangeList } from '@/api/backend' import {
addOrUpdateColumn,
deleteColumn,
hideColumn,
getExchangeList,
getBackendExchangeList,
issueProduct,
} from '@/api/backend'
import { updateArticleRecommend } from '@/api' import { updateArticleRecommend } from '@/api'
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import type { BackendColumnListItemDto, AddOrUpdateColumnDto } from '@/api/backend' import type { BackendColumnListItemDto, AddOrUpdateColumnDto } from '@/api/backend'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { ArticleTypeEnum } from '@/constants' import { ArticleTypeEnum } from '@/constants'
import { sortByOriginalOrder } from 'element-plus/es/components/cascader-panel/src/utils.mjs'
const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } = const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } =
usePageSearch(getExchangeList, { usePageSearch(getBackendExchangeList, {
defaultParams: { defaultParams: {
type: ArticleTypeEnum.VIDEO, type: ArticleTypeEnum.VIDEO,
}, },
...@@ -192,24 +220,34 @@ const handleIsRecommendChange = async (row: ArticleItemDto) => { ...@@ -192,24 +220,34 @@ const handleIsRecommendChange = async (row: ArticleItemDto) => {
refresh() refresh()
} }
// 删除 // 取消发放
const handleDelete = async (row: BackendColumnListItemDto) => { const handleCancelIssue = async (row: BackendColumnListItemDto) => {
try { await ElMessageBox.confirm('确定要取消发放吗?', '提示', {
await ElMessageBox.confirm(`确定要删除标签"${row.title}"吗?`, '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning',
}) })
await issueProduct({
id: row.id,
status: 0,
})
ElMessage.success('取消发放成功')
refresh()
}
await deleteColumn([row.id]) // 发放
const handleIssue = async (row: BackendColumnListItemDto) => {
ElMessage.success('删除成功') // 弹出message输入框 填写发放备注
const memo = await ElMessageBox.prompt('请输入发放备注', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
})
await issueProduct({
id: row.id,
memo: memo.value,
status: 1,
})
ElMessage.success('发放成功')
refresh() refresh()
} catch (error) {
if (error !== 'cancel') {
ElMessage.error('删除失败')
}
}
} }
// 提交表单 // 提交表单
......
...@@ -23,13 +23,14 @@ ...@@ -23,13 +23,14 @@
</div> </div>
</div> </div>
</div> </div>
<div v-loading="loading"> <div v-if="list.length" v-loading="loading">
<!-- 第一页的特殊布局 --> <!-- 第一页的特殊布局 -->
<div v-show="searchParams.current === 1"> <div v-show="searchParams.current === 1">
<!-- 前三个特殊布局 --> <!-- 前三个特殊布局 -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8"> <div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8">
<!-- 第一个视频 - 占据两列 --> <!-- 第一个视频 - 占据两列 -->
<div <div
v-show="list.length >= 1"
@click="router.push(`/videoDetail/${list[0]?.id}`)" @click="router.push(`/videoDetail/${list[0]?.id}`)"
class="lg:col-span-2 group relative rounded-lg overflow-hidden bg-white shadow-sm hover:shadow-xl transition-all duration-500 cursor-pointer" class="lg:col-span-2 group relative rounded-lg overflow-hidden bg-white shadow-sm hover:shadow-xl transition-all duration-500 cursor-pointer"
> >
...@@ -121,9 +122,9 @@ ...@@ -121,9 +122,9 @@
<!-- 右侧两个视频 --> <!-- 右侧两个视频 -->
<div class="flex flex-col gap-6"> <div class="flex flex-col gap-6">
<div <div
v-for="(item, index) in [list[1], list[2]]" v-for="(item, index) in list.slice(1, 3)"
:key="index" :key="index"
class="group relative rounded-lg overflow-hidden bg-white shadow-sm hover:shadow-lg transition-all duration-300 cursor-pointer flex-1" class="group relative rounded-lg overflow-hidden bg-white shadow-sm hover:shadow-lg transition-all duration-300 cursor-pointer"
@click="router.push(`/videoDetail/${item?.id}`)" @click="router.push(`/videoDetail/${item?.id}`)"
> >
<div class="relative overflow-hidden"> <div class="relative overflow-hidden">
...@@ -132,13 +133,6 @@ ...@@ -132,13 +133,6 @@
class="w-full h-44 object-cover group-hover:scale-105 transition-transform duration-500" class="w-full h-44 object-cover group-hover:scale-105 transition-transform duration-500"
/> />
<div class="absolute inset-0 bg-gradient-to-t from-black/40 to-transparent"></div> <div class="absolute inset-0 bg-gradient-to-t from-black/40 to-transparent"></div>
<!-- 标签 -->
<!-- <div
class="absolute top-3 left-3 bg-gradient-to-r from-indigo-500 to-purple-500 text-white px-2.5 py-1 rounded-full text-xs font-semibold"
>
{{ item.tagNameList[0] }}
</div> -->
<div <div
v-if="item?.isRecommend" v-if="item?.isRecommend"
class="absolute top-0 left-0 w-15 h-7 z-1000 bg-#FFF9B9 flex items-center justify-center border-2px border-solid border-#f4f0eb rounded-tl-lg rounded-br-lg" class="absolute top-0 left-0 w-15 h-7 z-1000 bg-#FFF9B9 flex items-center justify-center border-2px border-solid border-#f4f0eb rounded-tl-lg rounded-br-lg"
...@@ -208,7 +202,7 @@ ...@@ -208,7 +202,7 @@
</div> </div>
<!-- 剩余视频 - 标准网格 --> <!-- 剩余视频 - 标准网格 -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6"> <div v-show="list.length > 3" class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
<div <div
@click="router.push(`/videoDetail/${item.id}`)" @click="router.push(`/videoDetail/${item.id}`)"
v-for="item in list.slice(3)" v-for="item in list.slice(3)"
...@@ -416,6 +410,11 @@ ...@@ -416,6 +410,11 @@
</div> </div>
</div> </div>
</div> </div>
<template v-else>
<div class="flex items-center justify-center h-full">
<el-empty description="暂无数据" />
</div>
</template>
</div> </div>
</template> </template>
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
import { ShopGoodsTypeEnum, regionListOptions } from '@/constants' import { ShopGoodsTypeEnum, regionListOptions } from '@/constants'
import type { ExchangeGoodsParams, ShopItemDto } from '@/api' import type { ExchangeGoodsParams, ShopItemDto } from '@/api'
import type { SetupContext } from 'vue' import type { SetupContext } from 'vue'
import ask from '@/assets/img/culture/ask.png'
type ExchangeContentProps = { type ExchangeContentProps = {
item: ShopItemDto item: ShopItemDto
...@@ -25,11 +24,11 @@ export default function ExchangeContent( ...@@ -25,11 +24,11 @@ export default function ExchangeContent(
<div class="relative"> <div class="relative">
<div class="w-32 h-32 bg-gradient-to-br from-orange-100 to-pink-100 rounded-3xl flex items-center justify-center shadow-lg"> <div class="w-32 h-32 bg-gradient-to-br from-orange-100 to-pink-100 rounded-3xl flex items-center justify-center shadow-lg">
<div class="w-20 h-20 bg-white rounded-lg flex items-center justify-center shadow-sm"> <div class="w-20 h-20 bg-white rounded-lg flex items-center justify-center shadow-sm">
<img src={ask} alt={item.name} class="w-16 h-16 object-contain" /> <img src={item.imageUrl} alt={item.name} class="w-16 h-16 object-contain" />
</div> </div>
</div> </div>
<div class="absolute -top-2 -right-2 w-7 h-7 bg-blue-500 rounded-full flex items-center justify-center shadow-md"> <div class="absolute -top-2 -right-2 w-7 h-7 bg-blue-500 rounded-full flex items-center justify-center shadow-md">
<span class="text-white text-sm font-medium">6</span> <span class="text-white text-sm font-medium">{item.stock}</span>
</div> </div>
</div> </div>
</div> </div>
...@@ -74,6 +73,7 @@ export default function ExchangeContent( ...@@ -74,6 +73,7 @@ export default function ExchangeContent(
<label class="text-gray-700 text-sm font-medium mb-2 block">选择数量</label> <label class="text-gray-700 text-sm font-medium mb-2 block">选择数量</label>
<el-input-number <el-input-number
min={1} min={1}
max={item.stock}
modelValue={modelValue.num} modelValue={modelValue.num}
onUpdate:modelValue={(value: number) => onUpdate:modelValue={(value: number) =>
context.emit('update:modelValue', { ...modelValue, num: value }) context.emit('update:modelValue', { ...modelValue, num: value })
......
...@@ -42,13 +42,13 @@ ...@@ -42,13 +42,13 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="price" label="商品单价" width="100" align="center" /> <!-- <el-table-column prop="price" label="商品单价" width="100" align="center" /> -->
<el-table-column prop="num" label="兑换数量" width="100" align="center" /> <el-table-column prop="num" label="兑换数量" width="100" align="center" />
<el-table-column label="扣除YA币" width="110" align="center"> <el-table-column label="扣除YA币" width="110" align="center">
<template #default="scope"> <template #default="scope">
<span class="text-red-500 font-semibold"> -{{ scope.row.price * scope.row.num }} </span> <span class="text-red-500 font-semibold"> -{{ scope.row.price }} </span>
</template> </template>
</el-table-column> </el-table-column>
......
...@@ -45,9 +45,9 @@ ...@@ -45,9 +45,9 @@
> >
<div class="w-24 h-24 mb-3 flex items-center justify-center"> <div class="w-24 h-24 mb-3 flex items-center justify-center">
<img <img
src="@/assets/img/culture/ask.png" :src="item.imageUrl"
alt="" alt=""
class="w-full h-full object-contain group-hover:scale-110 transition-transform duration-300" class="rounded-lg w-full h-full object-contain group-hover:scale-110 transition-transform duration-300"
/> />
</div> </div>
<div <div
...@@ -116,9 +116,9 @@ ...@@ -116,9 +116,9 @@
> >
<div class="w-24 h-24 mb-3 flex items-center justify-center"> <div class="w-24 h-24 mb-3 flex items-center justify-center">
<img <img
src="@/assets/img/culture/ask.png" :src="item.imageUrl"
alt="" alt=""
class="w-full h-full object-contain group-hover:scale-110 transition-transform duration-300" class="rounded-lg w-full h-full object-contain group-hover:scale-110 transition-transform duration-300"
/> />
</div> </div>
<div <div
......
<template> <template>
<div <div
class="fixed right-50 top-70% -translate-y-50% flex flex-col items-center content-center gap-5" class="fixed 2xl:right-50 lg:right-20 right-10 top-70% -translate-y-50% flex flex-col items-center content-center gap-5"
> >
<div class="flex flex-col bg-white rounded-8px shadow-md overflow-hidden"> <div class="flex flex-col bg-white rounded-8px shadow-md overflow-hidden">
<div <div
......
...@@ -57,9 +57,13 @@ ...@@ -57,9 +57,13 @@
<div class="flex gap-4"> <div class="flex gap-4">
<el-button @click="handleCancel"> 取消 </el-button> <el-button @click="handleCancel"> 取消 </el-button>
<!-- <el-button @click="handlePreview"> 预览 </el-button> --> <!-- <el-button @click="handlePreview"> 预览 </el-button> -->
<el-button type="info" plain @click="handleSubmit"> 存草稿 </el-button> <el-button type="info" plain @click="handleSubmit(ReleaseStatusTypeEnum.DRAFT)">
存草稿
</el-button>
</div> </div>
<el-button type="primary" @click="handleSubmit"> 提交 </el-button> <el-button type="primary" @click="handleSubmit(ReleaseStatusTypeEnum.PUBLISH)">
提交
</el-button>
</div> </div>
</el-form> </el-form>
</div> </div>
...@@ -80,11 +84,6 @@ const router = useRouter() ...@@ -80,11 +84,6 @@ const router = useRouter()
const formRef = useTemplateRef<FormInstance>('formRef') const formRef = useTemplateRef<FormInstance>('formRef')
type FormData = Omit<AddOrUpdateCaseDto, 'tagRelationDtoList'> & {
mainTagId: string
subTagIds: number[]
}
const rules = { const rules = {
title: [{ required: true, message: '请输入标题', trigger: 'blur' }], title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
content: [{ required: true, message: '请输入内容', trigger: 'blur' }], content: [{ required: true, message: '请输入内容', trigger: 'blur' }],
...@@ -98,7 +97,7 @@ const [form, resetForm] = useResetData({ ...@@ -98,7 +97,7 @@ const [form, resetForm] = useResetData({
mainTagId: '', mainTagId: '',
subTagIds: [], subTagIds: [],
isSync: BooleanFlag.NO, isSync: BooleanFlag.NO,
releaseStatus: ReleaseStatusTypeEnum.DRAFT, releaseStatus: ReleaseStatusTypeEnum.PUBLISH,
}) })
// 取消 // 取消
...@@ -115,10 +114,11 @@ const handleCancel = () => { ...@@ -115,10 +114,11 @@ const handleCancel = () => {
// 保存草稿 // 保存草稿
const transformData = (formData: FormData): AddOrUpdateCaseDto => { const transformData = (releaseStatus: ReleaseStatusTypeEnum): AddOrUpdateCaseDto => {
const { mainTagId, subTagIds, ...rest } = formData const { mainTagId, subTagIds, ...rest } = form.value
const obj: AddOrUpdateCaseDto = { const obj: AddOrUpdateCaseDto = {
...rest, ...rest,
releaseStatus,
tagRelationDtoList: [], tagRelationDtoList: [],
} }
// 添加标签内容 // 添加标签内容
...@@ -138,9 +138,9 @@ const transformData = (formData: FormData): AddOrUpdateCaseDto => { ...@@ -138,9 +138,9 @@ const transformData = (formData: FormData): AddOrUpdateCaseDto => {
} }
// 提交 // 提交
const handleSubmit = async () => { const handleSubmit = async (releaseStatus: ReleaseStatusTypeEnum) => {
await formRef.value?.validate() await formRef.value?.validate()
const res = await addOrUpdateCase(transformData(form.value)) const res = await addOrUpdateCase({ ...transformData(releaseStatus) })
if (res) { if (res) {
ElMessage.success('提交成功') ElMessage.success('提交成功')
resetForm() resetForm()
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
<el-icon class="text-2xl text-gray-300"><Document /></el-icon> <el-icon class="text-2xl text-gray-300"><Document /></el-icon>
</div> </div>
<div class="text-gray-500 text-lg mb-2">暂无内容</div> <div class="text-gray-500 text-lg mb-2">暂无内容</div>
<div class="text-gray-400 text-sm">{{ getEmptyText() }}</div>
</div> </div>
<div v-else class="space-y-4"> <div v-else class="space-y-4">
...@@ -42,7 +41,7 @@ ...@@ -42,7 +41,7 @@
<!-- Meta Info --> <!-- Meta Info -->
<div class="flex items-center text-gray-400 text-sm ml-4"> <div class="flex items-center text-gray-400 text-sm ml-4">
<el-button type="primary" link>编辑</el-button> <el-button type="primary" link>编辑</el-button>
<el-button type="danger" link>删除</el-button> <el-button type="danger" link @click="handleDelete(item.id)">删除</el-button>
</div> </div>
</div> </div>
</div> </div>
...@@ -70,8 +69,7 @@ ...@@ -70,8 +69,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Document } from '@element-plus/icons-vue' import { Document } from '@element-plus/icons-vue'
import { getSelfCommentList, deleteComment } from '@/api'
import { getSelfCommentList } from '@/api'
import { usePageSearch } from '@/hooks' import { usePageSearch } from '@/hooks'
import { commentTypeListOptions } from '@/constants/options' import { commentTypeListOptions } from '@/constants/options'
import dayjs from 'dayjs' import dayjs from 'dayjs'
...@@ -82,7 +80,6 @@ const toggleTab = (key: number) => { ...@@ -82,7 +80,6 @@ const toggleTab = (key: number) => {
refresh() refresh()
} }
// State
const { list, loading, searchParams, total, refresh, goToPage, changePageSize } = usePageSearch( const { list, loading, searchParams, total, refresh, goToPage, changePageSize } = usePageSearch(
getSelfCommentList, getSelfCommentList,
{ {
...@@ -92,22 +89,14 @@ const { list, loading, searchParams, total, refresh, goToPage, changePageSize } ...@@ -92,22 +89,14 @@ const { list, loading, searchParams, total, refresh, goToPage, changePageSize }
}, },
) )
// Computed const handleDelete = async (id: number) => {
const paginatedList = computed(() => { await ElMessageBox.confirm('确定删除该评论吗?', '提示', {
const start = (searchParams.value.current - 1) * searchParams.value.size confirmButtonText: '确定',
const end = start + searchParams.value.size cancelButtonText: '取消',
return list.value.slice(start, end) type: 'warning',
}) })
await deleteComment(id)
const getEmptyText = () => { ElMessage.success('删除成功')
const emptyTexts: Record<string, string> = { refresh()
posts: '还没有发布任何帖子',
videos: '还没有上传任何视频',
questions: '还没有提出任何问题',
articles: '还没有发表任何专栏文章',
practice: '还没有分享任何实践经验',
interviews: '还没有参与任何专访',
}
return emptyTexts[searchParams.type] || '暂无数据'
} }
</script> </script>
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<div class="flex items-center text-gray-400 text-sm ml-4"> <div class="flex items-center text-gray-400 text-sm ml-4">
<el-button type="primary" link @click="handleView(item)">查看</el-button> <el-button type="primary" link @click="handleView(item)">查看</el-button>
<el-button type="danger" link>删除</el-button> <el-button type="danger" link @click="handleDelete(item.id)">删除</el-button>
</div> </div>
</div> </div>
</div> </div>
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Document } from '@element-plus/icons-vue' import { Document } from '@element-plus/icons-vue'
import { getSelfPublishList } from '@/api' import { getSelfPublishList, deleteArticle } from '@/api'
import { usePageSearch } from '@/hooks' import { usePageSearch } from '@/hooks'
import { articleTypeListOptions } from '@/constants/options' import { articleTypeListOptions } from '@/constants/options'
import dayjs from 'dayjs' import dayjs from 'dayjs'
...@@ -96,4 +96,14 @@ const handleView = (item: SelfPublishDetailDto) => { ...@@ -96,4 +96,14 @@ const handleView = (item: SelfPublishDetailDto) => {
router.push(`/postDetail/${item.id}`) router.push(`/postDetail/${item.id}`)
} }
} }
const handleDelete = async (articleId: number) => {
await ElMessageBox.confirm('确定删除该吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
await deleteArticle(articleId)
refresh()
ElMessage.success('删除成功')
}
</script> </script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment