Browse Source

把草稿箱补上先

dev-V1.0.1
蟑螂恶霸 3 months ago
parent
commit
feaaf87787
  1. 7
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementCarouselBannerServiceImpl.java
  2. 17
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SysNoticeInfoServiceImpl.java
  3. 1
      zdxt-web-client/zdxt-admin-plus-ui/src/api/supervision/carouselBanner.ts
  4. 3
      zdxt-web-client/zdxt-admin-plus-ui/src/api/supervision/noticeInfo.ts
  5. 26
      zdxt-web-client/zdxt-admin-plus-ui/src/router/index.ts
  6. 21
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/add.vue
  7. 350
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/draft.vue
  8. 23
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/edit.vue
  9. 5
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/index.vue
  10. 325
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/noticeInfo/draft.vue
  11. 5
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/noticeInfo/edit.vue
  12. 5
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/noticeInfo/index.vue

7
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementCarouselBannerServiceImpl.java

@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service;
import com.zdxt.enforcementcode.domain.bo.EnforcementCarouselBannerBo;
import com.zdxt.enforcementcode.domain.vo.EnforcementCarouselBannerVo;
@ -153,6 +154,10 @@ public class EnforcementCarouselBannerServiceImpl implements IEnforcementCarouse
lqw.eq(bo.getSort() != null, EnforcementCarouselBanner::getSort, bo.getSort());
lqw.eq(StringUtils.isNotBlank(bo.getContent()), EnforcementCarouselBanner::getContent, bo.getContent());
lqw.eq(bo.getStatus() != null, EnforcementCarouselBanner::getStatus, bo.getStatus());
if (bo.getStatus() == null) {
lqw.in(EnforcementCarouselBanner::getStatus, 2L, 3L);
}
lqw.eq(bo.getCreateBy() != null, EnforcementCarouselBanner::getCreateBy, bo.getCreateBy());
lqw.eq(bo.getType() != null, EnforcementCarouselBanner::getType, bo.getType());
lqw.eq(StringUtils.isNotBlank(bo.getBureauDeptId()), EnforcementCarouselBanner::getBureauDeptId, bo.getBureauDeptId());
lqw.eq(StringUtils.isNotBlank(bo.getOrganId()), EnforcementCarouselBanner::getOrganId, bo.getOrganId());
@ -179,6 +184,8 @@ public class EnforcementCarouselBannerServiceImpl implements IEnforcementCarouse
public Boolean insertByBo(EnforcementCarouselBannerBo bo) {
EnforcementCarouselBanner add = MapstructUtils.convert(bo, EnforcementCarouselBanner.class);
validEntityBeforeSave(add);
add.setCreateBy(LoginHelper.getUserId() != null ? LoginHelper.getUserId() : null);
add.setCreateByName(LoginHelper.getUsername() != null ? LoginHelper.getUsername() : null);
boolean flag = baseMapper.insert(add) > 0;
//fujian

17
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SysNoticeInfoServiceImpl.java

@ -135,17 +135,22 @@ public class SysNoticeInfoServiceImpl implements ISysNoticeInfoService {
lqw.orderByDesc(SysNoticeInfo::getCreateTime);
lqw.like(StringUtils.isNotBlank(bo.getNoticeContent()), SysNoticeInfo::getNoticeContent, bo.getNoticeContent());
// 发布时间根据开始时间和结束时间进行范围过滤
if (bo.getStartTime() != null) {
lqw.ge(SysNoticeInfo::getPublishTime, bo.getStartTime());
}
if (bo.getEndTime() != null) {
lqw.le(SysNoticeInfo::getPublishTime, bo.getEndTime());
// 保存时间/创建时间范围筛选
if (bo.getStartTime() != null && bo.getEndTime() != null) {
lqw.between(SysNoticeInfo::getCreateTime, bo.getStartTime(), bo.getEndTime());
} else if (bo.getStartTime() != null) {
lqw.ge(SysNoticeInfo::getCreateTime, bo.getStartTime());
} else if (bo.getEndTime() != null) {
lqw.le(SysNoticeInfo::getCreateTime, bo.getEndTime());
}
lqw.eq(bo.getDisplayDays() != null, SysNoticeInfo::getDisplayDays, bo.getDisplayDays());
lqw.eq(bo.getTargetPlatform() != null, SysNoticeInfo::getTargetPlatform, bo.getTargetPlatform());
lqw.eq(bo.getStatus() != null, SysNoticeInfo::getStatus, bo.getStatus());
if (bo.getStatus() == null) {
lqw.in(SysNoticeInfo::getStatus, 2, 3);
}
lqw.eq(bo.getCreateBy() != null, SysNoticeInfo::getCreateBy, bo.getCreateBy());
lqw.eq(bo.getEffectiveTime() != null, SysNoticeInfo::getEffectiveTime, bo.getEffectiveTime());
lqw.eq(StringUtils.isNotBlank(bo.getBureauDeptId()), SysNoticeInfo::getBureauDeptId, bo.getBureauDeptId());
lqw.eq(StringUtils.isNotBlank(bo.getOrganId()), SysNoticeInfo::getOrganId, bo.getOrganId());

1
zdxt-web-client/zdxt-admin-plus-ui/src/api/supervision/carouselBanner.ts

@ -6,6 +6,7 @@ export interface CarouselBannerQuery {
title?: string;
targetPlatform?: number;
status?: number;
createBy?: number;
carouselPosition?: number;
startTime?: string;
endTime?: string;

3
zdxt-web-client/zdxt-admin-plus-ui/src/api/supervision/noticeInfo.ts

@ -6,6 +6,7 @@ export interface NoticeInfoQuery {
noticeContent?: string;
targetPlatform?: number;
status?: number;
createBy?: number;
startTime?: string;
endTime?: string;
pageNum?: number;
@ -33,6 +34,8 @@ export interface NoticeInfoVo {
status?: number;
statusLabel?: string;
effectiveTime?: string;
createTime?: string;
updateTime?: string;
}
export function listNoticeInfo(query: NoticeInfoQuery) {

26
zdxt-web-client/zdxt-admin-plus-ui/src/router/index.ts

@ -123,6 +123,19 @@ export const constantRoutes: RouteRecordRaw[] = [
}
]
},
{
path: '/supervision/carouselBanner/draft',
component: Layout,
hidden: true,
children: [
{
path: '',
component: () => import('@/views/supervision/carouselBanner/draft.vue'),
name: 'CarouselBannerDraft',
meta: { title: '轮播图草稿箱', activeMenu: '/supervision/carouselBanner' }
}
]
},
{
path: '/supervision/noticeInfo/add',
component: Layout,
@ -149,6 +162,19 @@ export const constantRoutes: RouteRecordRaw[] = [
}
]
},
{
path: '/supervision/noticeInfo/draft',
component: Layout,
hidden: true,
children: [
{
path: '',
component: () => import('@/views/supervision/noticeInfo/draft.vue'),
name: 'NoticeInfoDraft',
meta: { title: '公告草稿箱', activeMenu: '/supervision/noticeInfo' }
}
]
},
{
path: '/supervision/educationServices/add',
component: Layout,

21
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/add.vue

@ -58,6 +58,7 @@
<el-form-item class="form-actions">
<el-button @click="handleCancel">取消</el-button>
<el-button type="info" :loading="submitting" @click="handleSaveDraft">保存草稿箱</el-button>
<el-button type="success" :loading="submitting" @click="handleSubmit">发布</el-button>
</el-form-item>
</el-form>
@ -160,7 +161,7 @@ const handleCancel = () => {
proxy?.$tab.closePage();
};
const handleSubmit = async () => {
const submitForm = async (status: number, successMessage: string) => {
if (!formRef.value) return;
const isValid = await formRef.value.validate().catch(() => false);
if (!isValid) return;
@ -174,24 +175,32 @@ const handleSubmit = async () => {
displayDays: form.displayDays,
linkUrl: form.linkUrl,
imageUrl: form.imageUrl,
status: 2,
status,
type: 1,
isDelete: 0
});
if (res.code === 200) {
ElMessage.success('发布成功');
ElMessage.success(successMessage);
proxy?.$tab.closePage();
} else {
ElMessage.error(res.msg || '发布失败');
ElMessage.error(res.msg || '操作失败');
}
} catch (error) {
console.error('发布失败:', error);
ElMessage.error('发布失败,请重试');
console.error('提交失败:', error);
ElMessage.error('操作失败,请重试');
} finally {
submitting.value = false;
}
};
const handleSaveDraft = () => {
submitForm(1, '已保存到草稿箱');
};
const handleSubmit = () => {
submitForm(2, '发布成功');
};
const loadDictOptions = async () => {
try {
const platformRes = await getDicts('web_publishing_platform');

350
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/draft.vue

@ -0,0 +1,350 @@
<template>
<div class="carousel-draft-container">
<div class="search-panel">
<el-form :model="searchForm" inline>
<el-form-item label="标题:">
<el-input
v-model="searchForm.title"
placeholder="请输入关键字"
class="search-input"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item label="保存时间:">
<el-date-picker
v-model="searchForm.timeRange"
type="datetimerange"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
class="date-picker publish-time-picker"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item label="内容发布在:">
<el-select v-model="searchForm.targetPlatform" placeholder="请选择" class="search-select" clearable>
<el-option v-for="item in platformOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" :icon="Search" @click="handleSearch" :loading="loading">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button :icon="Refresh" @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="action-bar">
<div class="action-left">
<el-button type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="danger" :icon="Delete" @click="handleBatchDelete" :disabled="selectedRows.length === 0">
删除
</el-button>
<el-button @click="handleBack">返回</el-button>
</div>
</div>
<div class="table-container">
<el-table
v-loading="loading"
:data="tableData"
border
:header-cell-style="{ backgroundColor: '#f5f7fa', fontWeight: 'bold' }"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="title" label="标题" min-width="200" show-overflow-tooltip />
<el-table-column label="保存时间" width="180">
<template #default="scope">
{{ scope.row.createTime || scope.row.updateTime || '-' }}
</template>
</el-table-column>
<el-table-column prop="targetPlatformLabel" label="内容发布在" width="150" show-overflow-tooltip />
<el-table-column label="橱窗" width="120">
<template #default="scope">
{{ formatCarouselPosition(scope.row.carouselPosition) }}
</template>
</el-table-column>
<el-table-column label="操作" width="160" fixed="right">
<template #default="scope">
<el-button size="small" type="text" @click="handleEdit(scope.row)">编辑</el-button>
<el-button size="small" type="text" class="delete-btn" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<span class="total-text"> {{ total }} 条数据</span>
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
:page-sizes="[10, 20, 50, 100]"
layout="prev, pager, next, jumper, ->, total, sizes"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</template>
<script setup lang="ts">
import { getCurrentInstance, onActivated, onMounted, reactive, ref } from 'vue';
import type { ComponentInternalInstance } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import { Plus, Delete, Search, Refresh } from '@element-plus/icons-vue';
import { useRouter } from 'vue-router';
import { listCarouselBanner, removeCarouselBanner, type CarouselBannerVo } from '@/api/supervision/carouselBanner';
import { getDicts } from '@/api/system/dict/data';
import { useUserStore } from '@/store/modules/user';
const router = useRouter();
const userStore = useUserStore();
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const loading = ref(false);
const tableData = ref<CarouselBannerVo[]>([]);
const total = ref(0);
const currentPage = ref(1);
const pageSize = ref(10);
const selectedRows = ref<CarouselBannerVo[]>([]);
const platformOptions = ref<{ label: string; value: number }[]>([]);
const searchForm = reactive({
title: '',
timeRange: [] as string[],
targetPlatform: undefined as number | undefined
});
const formatCarouselPosition = (value?: number) => {
if (value === undefined || value === null) return '-';
return `橱窗${value}`;
};
const getList = async () => {
loading.value = true;
try {
const res: any = await listCarouselBanner({
title: searchForm.title || undefined,
targetPlatform: searchForm.targetPlatform,
status: 1,
createBy: userStore.userId ? Number(userStore.userId) : undefined,
startTime: searchForm.timeRange[0] || undefined,
endTime: searchForm.timeRange[1] || undefined,
pageNum: currentPage.value,
pageSize: pageSize.value
});
if (res.code === 200) {
tableData.value = res.rows || [];
total.value = res.total || 0;
} else {
ElMessage.error(res.msg || '获取数据失败');
}
} catch (error) {
console.error('获取草稿列表失败:', error);
ElMessage.error('获取数据失败,请检查网络连接');
} finally {
loading.value = false;
}
};
const handleSearch = () => {
currentPage.value = 1;
getList();
};
const handleReset = () => {
searchForm.title = '';
searchForm.timeRange = [];
searchForm.targetPlatform = undefined;
currentPage.value = 1;
handleSearch();
};
const handleAdd = () => {
router.push('/supervision/carouselBanner/add');
};
const handleBack = () => {
proxy?.$tab.closePage();
};
const handleBatchDelete = () => {
if (selectedRows.value.length === 0) {
ElMessage.warning('请选择要删除的数据');
return;
}
ElMessageBox.confirm(`确定要删除选中的 ${selectedRows.value.length} 条草稿吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消'
})
.then(async () => {
const ids = selectedRows.value.map((row) => row.id);
const res: any = await removeCarouselBanner(ids);
if (res.code === 200) {
ElMessage.success('批量删除成功');
getList();
} else {
ElMessage.error(res.msg || '批量删除失败');
}
})
.catch(() => undefined);
};
const handleSelectionChange = (selection: CarouselBannerVo[]) => {
selectedRows.value = selection;
};
const handleEdit = (row: CarouselBannerVo) => {
router.push(`/supervision/carouselBanner/edit/${row.id}`);
};
const handleDelete = async (row: CarouselBannerVo) => {
try {
await ElMessageBox.confirm('确定要删除这条草稿吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消'
});
const res: any = await removeCarouselBanner([row.id]);
if (res.code === 200) {
ElMessage.success('删除成功');
getList();
} else {
ElMessage.error(res.msg || '删除失败');
}
} catch (error: any) {
if (error !== 'cancel') {
ElMessage.error('删除失败,请重试');
}
}
};
const handleSizeChange = (val: number) => {
pageSize.value = val;
currentPage.value = 1;
getList();
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
getList();
};
const loadDictOptions = async () => {
try {
const platformRes = await getDicts('web_publishing_platform');
const platformDict = (platformRes.data || [])
.map((item: any) => ({
label: item.dictLabel,
value: Number(item.dictValue)
}))
.filter((item) => !Number.isNaN(item.value) && item.value !== 1);
platformOptions.value = platformDict.length > 0 ? platformDict : [
{ label: '公众端', value: 0 },
{ label: '执法端', value: 2 },
{ label: '企业端', value: 3 }
];
} catch (error) {
console.error('加载字典失败:', error);
}
};
onMounted(() => {
loadDictOptions();
getList();
});
onActivated(() => {
getList();
});
</script>
<style scoped>
.carousel-draft-container {
padding: 20px;
background: #f5f7fa;
min-height: calc(100vh - 100px);
}
.search-panel {
background: #fff;
padding: 16px 20px;
border-radius: 8px;
margin-bottom: 16px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
:deep(.el-form-item__label) {
white-space: nowrap;
margin-right: 8px;
}
.search-input,
.date-picker,
.search-select {
width: 126px;
}
:deep(.publish-time-picker) {
width: 200px;
}
.action-bar {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 12px 20px;
border-radius: 8px;
margin-bottom: 16px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.action-left {
display: flex;
gap: 8px;
}
.table-container {
background: #fff;
border-radius: 8px;
padding: 16px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
margin-bottom: 16px;
}
.pagination-container {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 12px 20px;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.total-text {
color: #909399;
}
:deep(.el-button--text) {
padding: 4px 8px;
}
:deep(.delete-btn) {
color: #f56c6c;
}
:deep(.delete-btn:hover) {
color: #f56c6c;
background: rgba(245, 108, 108, 0.1);
}
</style>

23
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/edit.vue

@ -58,7 +58,8 @@
<el-form-item class="form-actions">
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" :loading="submitting" @click="handleSubmit">保存</el-button>
<el-button type="info" :loading="submitting" @click="handleSaveDraft">保存草稿箱</el-button>
<el-button type="success" :loading="submitting" @click="handleSubmit">发布</el-button>
</el-form-item>
</el-form>
</div>
@ -166,7 +167,7 @@ const handleCancel = () => {
proxy?.$tab.closePage();
};
const handleSubmit = async () => {
const submitForm = async (status: number, successMessage: string) => {
if (!formRef.value) return;
const isValid = await formRef.value.validate().catch(() => false);
if (!isValid) return;
@ -181,24 +182,32 @@ const handleSubmit = async () => {
displayDays: form.displayDays,
linkUrl: form.linkUrl,
imageUrl: form.imageUrl,
status: form.status,
status,
type: form.type,
isDelete: 0
});
if (res.code === 200) {
ElMessage.success('保存成功');
ElMessage.success(successMessage);
proxy?.$tab.closePage();
} else {
ElMessage.error(res.msg || '保存失败');
ElMessage.error(res.msg || '操作失败');
}
} catch (error) {
console.error('保存失败:', error);
ElMessage.error('保存失败,请重试');
console.error('提交失败:', error);
ElMessage.error('操作失败,请重试');
} finally {
submitting.value = false;
}
};
const handleSaveDraft = () => {
submitForm(1, '已保存到草稿箱');
};
const handleSubmit = () => {
submitForm(2, '发布成功');
};
const loadDetail = async () => {
const id = route.params.id as string;
if (!id) {

5
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/carouselBanner/index.vue

@ -51,6 +51,7 @@
<div class="action-bar">
<div class="action-left">
<el-button type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="warning" @click="handleOpenDraft">草稿箱</el-button>
<el-button type="danger" :icon="Delete" @click="handleBatchDelete" :disabled="selectedRows.length === 0">
删除
</el-button>
@ -219,6 +220,10 @@ const handleAdd = () => {
router.push('/supervision/carouselBanner/add');
};
const handleOpenDraft = () => {
router.push('/supervision/carouselBanner/draft');
};
const handleBatchDelete = () => {
if (selectedRows.value.length === 0) {
ElMessage.warning('请选择要删除的数据');

325
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/noticeInfo/draft.vue

@ -0,0 +1,325 @@
<template>
<div class="notice-draft-container">
<div class="search-panel">
<el-form :model="searchForm" inline>
<el-form-item label="公告内容:">
<el-input
v-model="searchForm.noticeContent"
placeholder="请输入关键字"
class="search-input"
clearable
@keyup.enter="handleSearch"
/>
</el-form-item>
<el-form-item label="保存时间:">
<el-date-picker
v-model="searchForm.timeRange"
type="datetimerange"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
class="date-picker publish-time-picker"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item label="内容发布到:">
<el-select v-model="searchForm.targetPlatform" placeholder="请选择" class="search-select" clearable>
<el-option v-for="item in platformOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" :icon="Search" @click="handleSearch" :loading="loading">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button :icon="Refresh" @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="action-bar">
<div class="action-left">
<el-button type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="danger" :icon="Delete" @click="handleBatchDelete" :disabled="selectedRows.length === 0">
删除
</el-button>
<el-button @click="handleBack">返回</el-button>
</div>
</div>
<div class="table-container">
<el-table
v-loading="loading"
:data="tableData"
border
:header-cell-style="{ backgroundColor: '#f5f7fa', fontWeight: 'bold' }"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="noticeContent" label="公告内容" min-width="250" show-overflow-tooltip />
<el-table-column label="保存时间" width="180">
<template #default="scope">
{{ scope.row.createTime || scope.row.updateTime || '-' }}
</template>
</el-table-column>
<el-table-column prop="targetPlatformLabel" label="内容发布到" width="140" show-overflow-tooltip />
<el-table-column label="操作" width="160" fixed="right">
<template #default="scope">
<el-button size="small" type="text" @click="handleEdit(scope.row)">编辑</el-button>
<el-button size="small" type="text" class="delete-btn" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination-container">
<span class="total-text"> {{ total }} 条数据</span>
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
:page-sizes="[10, 20, 50, 100]"
layout="prev, pager, next, jumper, ->, total, sizes"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</template>
<script setup lang="ts">
import { getCurrentInstance, onActivated, onMounted, reactive, ref } from 'vue';
import type { ComponentInternalInstance } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import { Plus, Delete, Search, Refresh } from '@element-plus/icons-vue';
import { useRouter } from 'vue-router';
import { listNoticeInfo, removeNoticeInfo, type NoticeInfoVo } from '@/api/supervision/noticeInfo';
import { useUserStore } from '@/store/modules/user';
const router = useRouter();
const userStore = useUserStore();
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const loading = ref(false);
const tableData = ref<NoticeInfoVo[]>([]);
const total = ref(0);
const currentPage = ref(1);
const pageSize = ref(10);
const selectedRows = ref<NoticeInfoVo[]>([]);
const platformOptions = [
{ label: '企业端+执法端', value: 0 },
{ label: '企业端', value: 1 },
{ label: '执法端', value: 2 },
{ label: '监督端', value: 3 }
];
const searchForm = reactive({
noticeContent: '',
timeRange: [] as string[],
targetPlatform: undefined as number | undefined
});
const getList = async () => {
loading.value = true;
try {
const res: any = await listNoticeInfo({
noticeContent: searchForm.noticeContent || undefined,
targetPlatform: searchForm.targetPlatform,
status: 1,
createBy: userStore.userId ? Number(userStore.userId) : undefined,
startTime: searchForm.timeRange[0] || undefined,
endTime: searchForm.timeRange[1] || undefined,
pageNum: currentPage.value,
pageSize: pageSize.value
});
if (res.code === 200) {
tableData.value = res.rows || [];
total.value = res.total || 0;
} else {
ElMessage.error(res.msg || '获取数据失败');
}
} catch (error) {
console.error('获取草稿列表失败:', error);
ElMessage.error('获取数据失败,请检查网络连接');
} finally {
loading.value = false;
}
};
const handleSearch = () => {
currentPage.value = 1;
getList();
};
const handleReset = () => {
searchForm.noticeContent = '';
searchForm.timeRange = [];
searchForm.targetPlatform = undefined;
currentPage.value = 1;
handleSearch();
};
const handleAdd = () => {
router.push('/supervision/noticeInfo/add');
};
const handleBack = () => {
proxy?.$tab.closePage();
};
const handleBatchDelete = () => {
if (selectedRows.value.length === 0) {
ElMessage.warning('请选择要删除的数据');
return;
}
ElMessageBox.confirm(`确定要删除选中的 ${selectedRows.value.length} 条草稿吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消'
})
.then(async () => {
const ids = selectedRows.value.map((row) => row.id);
const res: any = await removeNoticeInfo(ids);
if (res.code === 200) {
ElMessage.success('批量删除成功');
getList();
} else {
ElMessage.error(res.msg || '批量删除失败');
}
})
.catch(() => undefined);
};
const handleSelectionChange = (selection: NoticeInfoVo[]) => {
selectedRows.value = selection;
};
const handleEdit = (row: NoticeInfoVo) => {
router.push(`/supervision/noticeInfo/edit/${row.id}`);
};
const handleDelete = async (row: NoticeInfoVo) => {
try {
await ElMessageBox.confirm('确定要删除这条草稿吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消'
});
const res: any = await removeNoticeInfo([row.id]);
if (res.code === 200) {
ElMessage.success('删除成功');
getList();
} else {
ElMessage.error(res.msg || '删除失败');
}
} catch (error: any) {
if (error !== 'cancel') {
ElMessage.error('删除失败,请重试');
}
}
};
const handleSizeChange = (val: number) => {
pageSize.value = val;
currentPage.value = 1;
getList();
};
const handleCurrentChange = (val: number) => {
currentPage.value = val;
getList();
};
onMounted(() => {
getList();
});
onActivated(() => {
getList();
});
</script>
<style scoped>
.notice-draft-container {
padding: 20px;
background: #f5f7fa;
min-height: calc(100vh - 100px);
}
.search-panel {
background: #fff;
padding: 16px 20px;
border-radius: 8px;
margin-bottom: 16px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
:deep(.el-form-item__label) {
white-space: nowrap;
margin-right: 8px;
}
.search-input,
.date-picker,
.search-select {
width: 126px;
}
:deep(.publish-time-picker) {
width: 200px;
}
.action-bar {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 12px 20px;
border-radius: 8px;
margin-bottom: 16px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.action-left {
display: flex;
gap: 8px;
}
.table-container {
background: #fff;
border-radius: 8px;
padding: 16px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
margin-bottom: 16px;
}
.pagination-container {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 12px 20px;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.total-text {
color: #909399;
}
:deep(.el-button--text) {
padding: 4px 8px;
}
:deep(.delete-btn) {
color: #f56c6c;
}
:deep(.delete-btn:hover) {
color: #f56c6c;
background: rgba(245, 108, 108, 0.1);
}
</style>

5
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/noticeInfo/edit.vue

@ -38,7 +38,7 @@
<el-form-item class="form-actions">
<el-button @click="handleCancel">取消</el-button>
<el-button type="info" :loading="submitting" @click="handleSaveDraft">保存草稿箱</el-button>
<el-button type="primary" :loading="submitting" @click="handleSubmit">保存</el-button>
<el-button type="success" :loading="submitting" @click="handleSubmit">发布</el-button>
</el-form-item>
</el-form>
</div>
@ -121,8 +121,7 @@ const handleSaveDraft = () => {
};
const handleSubmit = () => {
const status = form.status === 1 ? 2 : form.status;
submitForm(status, '保存成功');
submitForm(2, '发布成功');
};
const loadDetail = async () => {

5
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/noticeInfo/index.vue

@ -51,6 +51,7 @@
<div class="action-bar">
<div class="action-left">
<el-button type="primary" :icon="Plus" @click="handleAdd">新增</el-button>
<el-button type="warning" @click="handleOpenDraft">草稿箱</el-button>
<el-button type="danger" :icon="Delete" @click="handleBatchDelete" :disabled="selectedRows.length === 0">
删除
</el-button>
@ -209,6 +210,10 @@ const handleAdd = () => {
router.push('/supervision/noticeInfo/add');
};
const handleOpenDraft = () => {
router.push('/supervision/noticeInfo/draft');
};
const handleBatchDelete = () => {
if (selectedRows.value.length === 0) {
ElMessage.warning('请选择要删除的数据');

Loading…
Cancel
Save