daoyou_manage_web/src/views/manage/articleManage/index.vue

284 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="标题" prop="title">
<el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="用户ID" prop="userId">
<el-input v-model="queryParams.userId" placeholder="请输入用户ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="标签id以逗号分隔" prop="tagId">
<el-input v-model="queryParams.tagId" placeholder="请输入标签id以逗号分隔" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="喜欢数" prop="agreeCount">
<el-input v-model="queryParams.agreeCount" placeholder="请输入喜欢数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="评论数" prop="commentCount">
<el-input v-model="queryParams.commentCount" placeholder="请输入评论数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:article:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:article:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['manage:article:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:article:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="articleList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true" />
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="内容" align="center" prop="content" />
<el-table-column label="用户ID" align="center" prop="userId" />
<el-table-column label="标签id以逗号分隔" align="center" prop="tagId" />
<el-table-column label="喜欢数" align="center" prop="agreeCount" />
<el-table-column label="评论数" align="center" prop="commentCount" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="更新者" align="center" prop="updateBy" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:article:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:article:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改文章对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="articleFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="内容">
<editor v-model="form.content" :min-height="192"/>
</el-form-item>
<el-form-item label="用户ID" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户ID" />
</el-form-item>
<el-form-item label="标签id以逗号分隔" prop="tagId">
<el-input v-model="form.tagId" placeholder="请输入标签id以逗号分隔" />
</el-form-item>
<el-form-item label="喜欢数" prop="agreeCount">
<el-input v-model="form.agreeCount" placeholder="请输入喜欢数" />
</el-form-item>
<el-form-item label="评论数" prop="commentCount">
<el-input v-model="form.commentCount" placeholder="请输入评论数" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Article" lang="ts">
import { listArticle, getArticle, delArticle, addArticle, updateArticle } from '@/api/manage/article';
import { ArticleVO, ArticleQuery, ArticleForm } from '@/api/manage/article/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const articleList = ref<ArticleVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const articleFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ArticleForm = {
id: undefined,
title: undefined,
content: undefined,
userId: undefined,
tagId: undefined,
agreeCount: undefined,
commentCount: undefined,
status: undefined,
}
const data = reactive<PageData<ArticleForm, ArticleQuery>>({
form: {...initFormData},
queryParams: {
pageNum: 1,
pageSize: 10,
title: undefined,
content: undefined,
userId: undefined,
tagId: undefined,
agreeCount: undefined,
commentCount: undefined,
status: undefined,
params: {
}
},
rules: {
id: [
{ required: true, message: "ID不能为空", trigger: "blur" }
],
title: [
{ required: true, message: "标题不能为空", trigger: "blur" }
],
content: [
{ required: true, message: "内容不能为空", trigger: "blur" }
],
userId: [
{ required: true, message: "用户ID不能为空", trigger: "blur" }
],
tagId: [
{ required: true, message: "标签id以逗号分隔不能为空", trigger: "blur" }
],
agreeCount: [
{ required: true, message: "喜欢数不能为空", trigger: "blur" }
],
commentCount: [
{ required: true, message: "评论数不能为空", trigger: "blur" }
],
status: [
{ required: true, message: "状态不能为空", trigger: "change" }
],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询文章列表 */
const getList = async () => {
loading.value = true;
const res = await listArticle(queryParams.value);
articleList.value = res.rows;
total.value = res.total;
loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
form.value = {...initFormData};
articleFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: ArticleVO[]) => {
ids.value = selection.map(item => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = "添加文章";
}
/** 修改按钮操作 */
const handleUpdate = async (row?: ArticleVO) => {
reset();
const _id = row?.id || ids.value[0]
const res = await getArticle(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = "修改文章";
}
/** 提交按钮 */
const submitForm = () => {
articleFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateArticle(form.value).finally(() => buttonLoading.value = false);
} else {
await addArticle(form.value).finally(() => buttonLoading.value = false);
}
proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false;
await getList();
}
});
}
/** 删除按钮操作 */
const handleDelete = async (row?: ArticleVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除文章编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
await delArticle(_ids);
proxy?.$modal.msgSuccess("删除成功");
await getList();
}
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download('manage/article/export', {
...queryParams.value
}, `article_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
getList();
});
</script>