增加活动管理

修改上传控件杨势
This commit is contained in:
jacky 2024-04-29 21:28:08 +08:00
parent 5931f7b116
commit 6e9857ca6e
13 changed files with 683 additions and 182 deletions

97
src/api/activity.js Executable file
View File

@ -0,0 +1,97 @@
import service from '@/utils/request'
// @Tags Activity
// @Summary 创建活动
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body model.Activity true "创建活动"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
// @Router /cms/activity/create [post]
export const createActivity = (data) => {
return service({
url: '/cms/activity/create',
method: 'post',
data
})
}
// @Tags Activity
// @Summary 删除活动
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body model.Activity true "删除活动"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
// @Router /cms/activity/delete [delete]
export const deleteActivity = (params) => {
return service({
url: '/cms/activity/delete',
method: 'delete',
params
})
}
// @Tags Activity
// @Summary 批量删除活动
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body request.IdsReq true "批量删除活动"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
// @Router /cms/activity/deleteByIds [delete]
export const deleteActivityByIds = (params) => {
return service({
url: '/cms/activity/deleteByIds',
method: 'delete',
params
})
}
// @Tags Activity
// @Summary 更新活动
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body model.Activity true "更新活动"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}"
// @Router /cms/activity/update [put]
export const updateActivity = (data) => {
return service({
url: '/cms/activity/update',
method: 'put',
data
})
}
// @Tags Activity
// @Summary 用id查询活动
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data query model.Activity true "用id查询活动"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
// @Router /cms/activity/find [get]
export const findActivity = (params) => {
return service({
url: '/cms/activity/find',
method: 'get',
params
})
}
// @Tags Activity
// @Summary 分页获取活动列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data query request.PageInfo true "分页获取活动列表"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /cms/activity/getList [get]
export const getActivityList = (params) => {
return service({
url: '/cms/activity/getList',
method: 'get',
params
})
}

View File

@ -48,27 +48,20 @@
上传</span> 上传</span>
</div> </div>
</div> </div>
<el-drawer v-model="drawer" title="媒体库" size="650px"> <el-drawer v-model="drawer" title="媒体库" size="740px" direction="ltr">
<warning-bar title="点击“文件名/备注”可以编辑文件名或者备注内容。" /> <div class="gva-btn-list" style="width:100%">
<div class="gva-btn-list"> <upload-common :image-common="imageCommon" class="upload-btn-media-library" @on-success="getImageList"
<upload-common :image-common="imageCommon" class="upload-btn-media-library" @on-success="getImageList" /> :category="props.category" />
<upload-image :image-url="imageUrl" :file-size="512" :max-w-h="1080" class="upload-btn-media-library" <upload-image :image-url="imageUrl" :file-size="512" :max-w-h="1080" class="upload-btn-media-library"
@on-success="getImageList" /> :category="props.category" @on-success="getImageList" />
<el-form ref="searchForm" :inline="true" :model="search"> <el-input v-model="search.keyword" class="keyword" placeholder="请输入文件名或备注" clearable style="width: 390px;" />
<el-form-item label=""> <el-button type="primary" icon="search" @click="getImageList">查询</el-button>
<el-input v-model="search.keyword" class="keyword" placeholder="请输入文件名或备注" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="search" @click="getImageList">查询
</el-button>
</el-form-item>
</el-form>
</div> </div>
<warning-bar title="点击“文件名/备注”可以编辑文件名或者备注内容。" style="width: 680px" />
<div class="media"> <div class="media">
<div v-for="(item, key) in picList" :key="key" class="media-box"> <div v-for="(item, key) in picList" :key="key" class="media-box">
<div class="header-img-box-list"> <div class="header-img-box-list">
<el-image :key="key" :src="getUrl(item.url)" fit="cover" style="width: 100%;height: 100%;" <el-image :key="key" :src="getUrl(item.url)" fit="contain" style="width: 100%;height: 100%;"
@click="chooseImg(item.url)"> @click="chooseImg(item.url)">
<template #error> <template #error>
<el-icon v-if="isVideoExt(item.url || '')" :size="32" class="video video-icon"> <el-icon v-if="isVideoExt(item.url || '')" :size="32" class="video video-icon">
@ -115,7 +108,7 @@ const imageCommon = ref('')
const search = ref({}) const search = ref({})
const page = ref(1) const page = ref(1)
const total = ref(0) const total = ref(0)
const pageSize = ref(20) const pageSize = ref(30)
const model = defineModel({ type: [String, Array] }) const model = defineModel({ type: [String, Array] })
@ -131,6 +124,10 @@ const props = defineProps({
maxUpdateCount: { maxUpdateCount: {
type: Number, type: Number,
default: 0 default: 0
},
category: {
type: String,
required: true
} }
}) })
const multipleValue = ref([]) const multipleValue = ref([])
@ -193,7 +190,6 @@ const listObj = {
} }
const chooseImg = (url) => { const chooseImg = (url) => {
console.log(url)
if (props.fileType) { if (props.fileType) {
const typeSuccess = listObj[props.fileType].some(item => { const typeSuccess = listObj[props.fileType].some(item => {
if (url.includes(item)) { if (url.includes(item)) {
@ -265,7 +261,7 @@ const getImageList = async () => {
display: flex; display: flex;
justify-content: center; justify-content: center;
border-radius: 20px; border-radius: 20px;
border: 1px dashed #ccc; border: 1px solid #ccc;
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: cover; background-size: cover;
position: relative; position: relative;
@ -311,17 +307,14 @@ const getImageList = async () => {
} }
} }
.upload-btn-media-library {
margin-left: 20px;
}
.media { .media {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
.media-box { .media-box {
width: 120px; width: 120px;
margin-left: 20px; margin-right: 20px;
margin-bottom: 20px;
.img-title { .img-title {
white-space: nowrap; white-space: nowrap;
@ -335,7 +328,7 @@ const getImageList = async () => {
.header-img-box-list { .header-img-box-list {
width: 120px; width: 120px;
height: 120px; height: 120px;
border: 1px dashed #ccc; border: 1px solid #ccc;
border-radius: 8px; border-radius: 8px;
text-align: center; text-align: center;
line-height: 120px; line-height: 120px;

View File

@ -713,3 +713,35 @@ li {
padding: 6px; padding: 6px;
border-radius: 5px; border-radius: 5px;
} }
.avatar-uploader .avatar {
width: 100%;
height: 100%;
display: block;
}
.avatar-uploader .el-upload {
border: 1px solid var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
text-align: center;
}
.gva-table-expand {
margin: 15px;
line-height: 1.5rem;
}

View File

@ -444,42 +444,11 @@ const uploadFailure = () => {
</script> </script>
<style> <style scoped>
.upload-file-box { .upload-file-box {
display: block; display: block;
width: 100%; width: 100%;
} }
</style>
<style scoped>
.avatar-uploader .avatar {
width: 100%;
height: 100%;
display: block;
}
</style>
<style scope>
.avatar-uploader .el-upload {
border: 1px solid var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
}
.admin-box .el-table td .cell { .admin-box .el-table td .cell {
line-height: 28px; line-height: 28px;

View File

@ -256,35 +256,6 @@ const uploadFailure = () => {
</script> </script>
<style scoped> <style scoped>
.avatar-uploader .avatar {
width: 100%;
height: 100%;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px solid var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
}
.admin-box .el-table td .cell { .admin-box .el-table td .cell {
line-height: 28px; line-height: 28px;
} }

View File

@ -0,0 +1,531 @@
<template>
<div>
<div class="gva-search-box">
<el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule"
@keyup.enter="onSubmit">
<el-form-item label="关键字" prop="keyword">
<el-input v-model="searchInfo.keyword" :clearable="true" />
</el-form-item>
<el-form-item label="创建日期" prop="createdAt">
<template #label>
<span>
创建日期
<el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</span>
</template>
<el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期"
:disabled-date="time => searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
<el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期"
:disabled-date="time => searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
</el-form-item>
<el-form-item label="会议状态" prop="status">
<el-select v-model="searchInfo.status" clearable placeholder="请选择"
@clear="() => { searchInfo.status = undefined }">
<el-option v-for="(item, key) in activityStatusOptions" :key="key" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
<el-button icon="refresh" @click="onReset">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="gva-table-box">
<div class="gva-btn-list">
<el-button type="primary" icon="plus" @click="openDialog">新增</el-button>
<el-button icon="delete" style="margin-left: 10px;" :disabled="!multipleSelection.length"
@click="deleteRows">删除</el-button>
</div>
<el-table ref="multipleTable" style="width: 100%" tooltip-effect="dark" :data="tableData" row-key="ID"
@selection-change="handleSelectionChange">
<el-table-column type="expand">
<template #default="scope">
<div>
<div class="gva-table-expand" style="max-width: 600px;">
<el-text tag="b">简介</el-text>
</div>
<div class="gva-table-expand" style="max-width: 600px;">
{{ scope.row.brief }}
</div>
<div class="gva-table-expand" style="max-width: 600px;">
<el-text tag="b">参与企业</el-text>
</div>
<div class="gva-table-expand" style="max-width: 600px;">
{{ scope.row.companies }}
</div>
<div class="gva-table-expand" style="max-width: 600px;">
<el-text tag="b">参与人员</el-text>
</div>
<div class="gva-table-expand" style="max-width: 600px;">
{{ scope.row.participants }}
</div>
<div class="gva-table-expand" style="max-width: 600px;">
<el-text tag="b">联系方式</el-text>
</div>
<div class="gva-table-expand" style="max-width: 600px;">
{{ scope.row.contact }}
</div>
<div class="gva-table-expand" style="max-width: 600px;">
<el-text tag="b">报名链接</el-text>
</div>
<div class="gva-table-expand" style="max-width: 600px;">
{{ scope.row.signUrl }}
</div>
<div class="gva-table-expand" style="max-width: 600px;">
<el-text tag="b">直播链接</el-text>
</div>
<div class="gva-table-expand" style="max-width: 600px;">
{{ scope.row.liveUrl }}
</div>
</div>
</template>
</el-table-column>
<el-table-column type="selection" width="55" />
<el-table-column label="封面" width="200">
<template #default="scope">
<el-image style="width: 100px; height: 100px" :src="getUrl(scope.row.cover)" fit="cover" />
</template>
</el-table-column>
<el-table-column align="left" label="活动标识" prop="label" width="120" />
<el-table-column align="left" label="标题" prop="title" width="120" />
<el-table-column align="left" label="主办单位" prop="organizer" width="120" />
<el-table-column align="left" label="活动地址" prop="activeAddr" width="120" />
<el-table-column align="left" label="报名链接地址" prop="signUrl" width="120" />
<el-table-column align="left" label="直播链接地址" prop="liveUrl" width="120" />
<el-table-column align="left" label="开始时间" width="180">
<template #default="scope">{{ formatDate(scope.row.startTime) }}</template>
</el-table-column>
<el-table-column align="left" label="结束时间" width="180">
<template #default="scope">{{ formatDate(scope.row.endTime) }}</template>
</el-table-column>
<el-table-column align="left" label="会议状态" prop="status" width="120">
<template #default="scope">
{{ filterDict(scope.row.status, activityStatusOptions) }}
</template>
</el-table-column>
<el-table-column align="left" label="创建日期" width="180">
<template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
</el-table-column>
<el-table-column align="left" label="操作" fixed="right" min-width="240">
<template #default="scope">
<el-button type="primary" link icon="edit" class="table-button" @click="updateRow(scope.row)">修改</el-button>
<el-button type="danger" link icon="delete" @click="deleteRow(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="gva-pagination">
<el-pagination layout="total, sizes, prev, pager, next, jumper" :current-page="page" :page-size="pageSize"
:page-sizes="[10, 30, 50, 100]" :total="total" @current-change="handleCurrentChange"
@size-change="handleSizeChange" />
</div>
</div>
<el-drawer size="920" v-model="dialogFormVisible" :show-close="false" :before-close="closeDialog"
:close-on-click-modal="false" :close-on-press-escape="false">
<template #header>
<div class="flex justify-between items-center">
<span class="text-lg">{{ type === 'create' ? '添加' : '修改' }}</span>
<div>
<el-button type="primary" @click="enterDialog"> </el-button>
<el-button @click="closeDialog"> </el-button>
</div>
</div>
</template>
<el-form :model="formData" label-position="top" ref="elFormRef" :inline="true" :rules="rule" label-width="100px">
<el-form-item label="封面" prop="cover" style="width: 850px">
<!-- <SelectImage v-model="formData.cover" category="activity_imgs" /> -->
<el-upload class="avatar-uploader" :action="`${imgUploadPath}/cms/mediaFile/upload?category=activity_imgs`"
:show-file-list="false" :on-success="uploadSuccess" :on-error="uploadFailure" :before-upload="beforeUpload">
<img v-if="formData.cover" :src="formData.cover" class="avatar"
style="object-fit: cover;max-width: 300px;max-height:200px">
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</el-form-item>
<el-form-item label="活动标识" prop="label" style="width: 400px">
<el-input v-model="formData.label" :clearable="true" placeholder="请输入活动标识,例如:会议的界别等" />
</el-form-item>
<el-form-item label="标题" prop="title" style="width: 400px">
<el-input v-model="formData.title" :clearable="true" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="主办单位" prop="organizer" style="width: 400px">
<el-input v-model="formData.organizer" :clearable="true" placeholder="请输入主办单位" />
</el-form-item>
<el-form-item label="活动地址" prop="activeAddr" style="width: 400px">
<el-input v-model="formData.activeAddr" :clearable="true" placeholder="请输入活动地址" />
</el-form-item>
<el-form-item label="开始时间" prop="startTime" style="width: 400px">
<el-date-picker v-model="formData.startTime" type="datetime" style="width:100%" placeholder="选择日期"
:clearable="true" />
</el-form-item>
<el-form-item label="结束时间" prop="endTime" style="width: 400px">
<el-date-picker v-model="formData.endTime" type="datetime" style="width:100%" placeholder="选择日期"
:clearable="true" />
</el-form-item>
<el-form-item label="参与企业" prop="companies" style="width: 400px">
<el-input type="textarea" rows="4" v-model="formData.companies" :clearable="true" placeholder="请输入参与企业" />
</el-form-item>
<el-form-item label="参与人员" prop="participants" style="width: 400px">
<el-input type="textarea" rows="4" v-model="formData.participants" :clearable="true" placeholder="请输入参与人员" />
</el-form-item>
<el-form-item label="活动简介" prop="brief" style="width: 830px">
<RichEdit v-model="formData.brief" media-category="activity_imgs" style="height: 320px" />
</el-form-item>
<el-form-item label="联系方式" prop="contact" style="width: 830px">
<el-input type="textarea" rows="4" v-model="formData.contact" :clearable="true" placeholder="请输入联系方式" />
</el-form-item>
<el-form-item label="报名链接地址" prop="signUrl" style="width: 400px">
<el-input v-model="formData.signUrl" :clearable="true" placeholder="请输入报名链接地址" />
</el-form-item>
<el-form-item label="直播链接地址" prop="liveUrl" style="width: 400px">
<el-input v-model="formData.liveUrl" :clearable="true" placeholder="请输入直播链接地址" />
</el-form-item>
<el-form-item label="会议状态" prop="status" style="width: 400px">
<el-select v-model="formData.status" placeholder="请选择会议状态" style="width:100%" :clearable="true">
<el-option v-for="(item, key) in activityStatusOptions" :key="key" :label="item.label"
:value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-form>
</el-drawer>
</div>
</template>
<script setup>
import {
createActivity,
deleteActivity,
deleteActivityByIds,
updateActivity,
findActivity,
getActivityList
} from '@/api/activity'
import { isUrl } from '@/utils/validator'
import { getUrl } from '@/utils/image'
import { isImageMime } from '@/utils/image'
//
import SelectImage from '@/components/selectImage/selectImage.vue'
//
import RichEdit from '@/components/richtext/rich-edit.vue'
//
import { getDictFunc, formatDate, formatBoolean, filterDict, ReturnArrImg, onDownloadFile } from '@/utils/format'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ref, reactive } from 'vue'
defineOptions({
name: 'Activity'
})
const imgUploadPath = ref(import.meta.env.VITE_BASE_API)
const beforeUpload = (file) => {
console.log(file)
const isLt500K = file.size / 1024 / 1024 < 0.5 // 500K, @todo
const isImage = isImageMime(file.type)
if (!isImage) {
ElMessage.error('上传图片只能是 jpg,png,svg,webp 格式!')
return false
}
if (!isLt500K && isImage) {
ElMessage.error('未压缩的上传图片大小不能超过 500KB请使用压缩上传')
return false
}
return true
}
const uploadSuccess = (res) => {
const { code, data, msg } = res
if (code !== 0) {
ElMessage({ type: 'error', message: msg })
return
}
if (!data.mediaFile) {
ElMessage({ type: 'error', message: '返回错误,上传失败' })
return
}
formData.value.cover = data.mediaFile.url
}
const uploadFailure = () => {
ElMessage({
type: 'error',
message: '上传失败'
})
}
//
const activityStatusOptions = ref([])
const formData = ref({
cover: "",
label: '',
title: '',
organizer: '',
companies: '',
participants: '',
brief: '',
activeAddr: '',
contact: '',
signUrl: '',
liveUrl: '',
startTime: '',
endTime: '',
status: 1,
})
const isDateEndGtStart = (rule, value, callback) => {
if (value < formData.value.startTime) {
callback(new Error(rule.message))
} else {
callback()
}
}
//
const rule = reactive({
label: [
{ required: true, message: '', trigger: ['input', 'blur'] },
{ whitespace: true, message: '不能只输入空格', trigger: ['input', 'blur'] }
],
title: [
{ required: true, message: '', trigger: ['input', 'blur'] },
{ whitespace: true, message: '不能只输入空格', trigger: ['input', 'blur'] }
],
organizer: [
{ required: true, message: '', trigger: ['input', 'blur'] },
{ whitespace: true, message: '不能只输入空格', trigger: ['input', 'blur'] }
],
activeAddr: [
{ required: true, message: '', trigger: ['input', 'blur'] },
{ whitespace: true, message: '不能只输入空格', trigger: ['input', 'blur'] }
],
startTime: [
{ required: true, message: '', trigger: ['input', 'blur'] },
],
endTime: [
{ required: true, message: '', trigger: ['input', 'blur'] },
{ validator: isDateEndGtStart, message: '有效截止日期必须大于起始日期', trigger: 'blur' }
],
signUrl: [
{ validator: isUrl, message: '请输入正确的URL地址', trigger: 'blur' }
],
liveUrl: [
{ validator: isUrl, message: '请输入正确的URL地址', trigger: 'blur' }
]
})
const searchRule = reactive({
createdAt: [
{
validator: (rule, value, callback) => {
if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
callback(new Error('请填写结束日期'))
} else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
callback(new Error('请填写开始日期'))
} else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
callback(new Error('开始日期应当早于结束日期'))
} else {
callback()
}
}, trigger: 'change'
}
],
})
const elFormRef = ref()
const elSearchFormRef = ref()
// =========== ===========
const page = ref(1)
const total = ref(0)
const pageSize = ref(10)
const tableData = ref([])
const searchInfo = ref({})
//
const onReset = () => {
searchInfo.value = {}
getTableData()
}
//
const onSubmit = () => {
elSearchFormRef.value?.validate(async (valid) => {
if (!valid) return
page.value = 1
pageSize.value = 10
getTableData()
})
}
//
const handleSizeChange = (val) => {
pageSize.value = val
getTableData()
}
//
const handleCurrentChange = (val) => {
page.value = val
getTableData()
}
//
const getTableData = async () => {
const table = await getActivityList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
if (table.code === 0) {
tableData.value = table.data.list
total.value = table.data.total
page.value = table.data.page
pageSize.value = table.data.pageSize
}
}
getTableData()
// ============== ===============
//
const setOptions = async () => {
activityStatusOptions.value = await getDictFunc('activityStatus')
}
//
setOptions()
//
const multipleSelection = ref([])
//
const handleSelectionChange = (val) => {
multipleSelection.value = val
}
//
const deleteRow = (row) => {
ElMessageBox.confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteActivityFunc(row)
})
}
//
const deleteRows = async () => {
ElMessageBox.confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const IDs = []
if (multipleSelection.value.length === 0) {
ElMessage({
type: 'warning',
message: '请选择要删除的数据'
})
return
}
multipleSelection.value &&
multipleSelection.value.map(item => {
IDs.push(item.ID)
})
const res = await deleteActivityByIds({ IDs })
if (res.code === 0) {
ElMessage({
type: 'success',
message: '删除成功'
})
if (tableData.value.length === IDs.length && page.value > 1) {
page.value--
}
getTableData()
}
})
}
//
const type = ref('')
//
const dialogFormVisible = ref(false)
//
const updateRow = async (row) => {
const res = await findActivity({ id: row.ID })
type.value = 'update'
if (res.code === 0) {
formData.value = res.data.item
dialogFormVisible.value = true
}
}
//
const openDialog = () => {
type.value = 'create'
dialogFormVisible.value = true
}
//
const closeDialog = () => {
dialogFormVisible.value = false
formData.value = {
label: '',
title: '',
organizer: '',
companies: '',
participants: '',
activeAddr: '',
signUrl: '',
liveUrl: '',
startTime: new Date(),
endTime: new Date(),
status: 0,
}
}
//
const enterDialog = async () => {
elFormRef.value?.validate(async (valid) => {
if (!valid) return
let res
switch (type.value) {
case 'create':
res = await createActivity(formData.value)
break
case 'update':
res = await updateActivity(formData.value)
break
default:
res = await createActivity(formData.value)
break
}
if (res.code === 0) {
ElMessage({
type: 'success',
message: type.value === 'create' ? '创建成功' : '更改成功'
})
closeDialog()
getTableData()
}
})
}
//
const deleteActivityFunc = async (row) => {
const res = await deleteActivity({ id: row.ID })
if (res.code === 0) {
ElMessage({
type: 'success',
message: '删除成功'
})
if (tableData.value.length === 1 && page.value > 1) {
page.value--
}
getTableData()
}
}
</script>

View File

@ -19,7 +19,7 @@
<template #default="scope"> <template #default="scope">
<el-button type="primary" link icon="plus" @click="clickAdd(scope.row.ID)">添加子类</el-button> <el-button type="primary" link icon="plus" @click="clickAdd(scope.row.ID)">添加子类</el-button>
<el-button type="primary" link icon="edit" @click="clickEdit(scope.row.ID)">编辑</el-button> <el-button type="primary" link icon="edit" @click="clickEdit(scope.row.ID)">编辑</el-button>
<el-button type="primary" link icon="delete" @click="clickDelete(scope.row.ID)">删除</el-button> <el-button type="danger" link icon="delete" @click="clickDelete(scope.row.ID)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -27,7 +27,7 @@
<template #default="scope"> <template #default="scope">
<el-button type="primary" link icon="plus" @click="handleAdd(scope.row.ID)">添加子栏目</el-button> <el-button type="primary" link icon="plus" @click="handleAdd(scope.row.ID)">添加子栏目</el-button>
<el-button type="primary" link icon="edit" @click="handleEdit(scope.row.ID)">编辑</el-button> <el-button type="primary" link icon="edit" @click="handleEdit(scope.row.ID)">编辑</el-button>
<el-button type="primary" link icon="delete" @click="handleDelete(scope.row.ID)">删除</el-button> <el-button type="danger" link icon="delete" @click="handleDelete(scope.row.ID)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -337,35 +337,6 @@ defineExpose({ openPage })
</script> </script>
<style scoped> <style scoped>
.avatar-uploader .avatar {
width: 100%;
height: 100%;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px solid var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 150px;
height: 150px;
text-align: center;
}
.el-form-item__content .el-alert__description { .el-form-item__content .el-alert__description {
line-height: 22px; line-height: 22px;
} }

View File

@ -337,35 +337,6 @@ defineExpose({ openPage })
</script> </script>
<style scoped> <style scoped>
.avatar-uploader .avatar {
width: 100%;
height: 100%;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px solid var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 150px;
height: 150px;
text-align: center;
}
.el-form-item__content .el-alert__description { .el-form-item__content .el-alert__description {
line-height: 22px; line-height: 22px;
} }

View File

@ -440,35 +440,6 @@ const uploadFailure = () => {
</script> </script>
<style scoped> <style scoped>
.avatar-uploader .avatar {
width: 100%;
height: 100%;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px solid var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
}
.admin-box .el-table td .cell { .admin-box .el-table td .cell {
line-height: 28px; line-height: 28px;
} }
@ -476,9 +447,4 @@ const uploadFailure = () => {
.gva-multi-input { .gva-multi-input {
margin-bottom: 15px; margin-bottom: 15px;
} }
.gva-table-expand {
margin: 15px;
line-height: 1.5rem;
}
</style> </style>

View File

@ -39,7 +39,7 @@
<el-table-column align="left" label="操作" width="160"> <el-table-column align="left" label="操作" width="160">
<template #default="scope"> <template #default="scope">
<el-button icon="download" type="primary" link @click="downloadFile(scope.row)">下载</el-button> <el-button icon="download" type="primary" link @click="downloadFile(scope.row)">下载</el-button>
<el-button icon="delete" type="primary" link @click="deleteFileFunc(scope.row)">删除</el-button> <el-button icon="delete" type="danger" link @click="deleteFileFunc(scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -80,7 +80,7 @@
</el-table-column> </el-table-column>
<el-table-column v-auth="btnAuth.delete" align="left" label="操作"> <el-table-column v-auth="btnAuth.delete" align="left" label="操作">
<template #default="scope"> <template #default="scope">
<el-button v-auth="btnAuth.delete" icon="delete" type="primary" link <el-button v-auth="btnAuth.delete" icon="delete" type="danger" link
@click="deleteSysOperationRecordFunc(scope.row)">删除</el-button> @click="deleteSysOperationRecordFunc(scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>