完成了页面嵌入适配,列表上方的创建、修改、删除

NewsList和EditNews之间的数据传递
完全是巨大的工程
This commit is contained in:
高子兴 2024-07-05 02:19:53 +08:00
parent 6e725128ea
commit 769254498f
2 changed files with 169 additions and 16 deletions

View File

@ -1,5 +1,5 @@
<script setup> <script setup>
import {onMounted, ref} from 'vue'; import {defineEmits, defineProps, onMounted, ref} from 'vue';
import { import {
ElButton, ElButton,
ElForm, ElForm,
@ -66,6 +66,7 @@ const form = ref({
imagePath: '' imagePath: ''
}); });
const createMode = ref(false); const createMode = ref(false);
const componentMode = ref(false);
const modeTitle = ref(''); const modeTitle = ref('');
const fileList = ref([]); // const fileList = ref([]); //
@ -73,6 +74,22 @@ const basePath = '/api/news'
const uploadUrl = basePath + '/uploadPic'; // const uploadUrl = basePath + '/uploadPic'; //
const dialogImageUrl = ref(''); const dialogImageUrl = ref('');
const dialogVisible = ref(false); // const dialogVisible = ref(false); //
const props = defineProps({
mode: {
type: String,
required: false
},
id: {
type: String,
required: false
}
});
const containerStyle = ref('form-container')
const emit = defineEmits(['setNewsDialogInvisible']);
const setNewsDialogInvisible = (changed) => {
emit('setNewsDialogInvisible', changed);
};
// //
const id = ref(''); const id = ref('');
@ -121,8 +138,7 @@ const handleRemove = (file) => {
const handleCommit = async () => { const handleCommit = async () => {
// formnull // formnull
if (form.value.title === '' || form.value.author === '' || form.value.content === '' || form.value.summary === '' || form.value.tenant === '') if (form.value.title === '' || form.value.author === '' || form.value.content === '' || form.value.summary === '' || form.value.tenant === '') {
{
await ElMessageBox.alert('请填写完整信息!'); await ElMessageBox.alert('请填写完整信息!');
return; return;
} }
@ -135,7 +151,12 @@ const handleCommit = async () => {
try { try {
const response = await axios.post(basePath, form.value); const response = await axios.post(basePath, form.value);
ElMessage.success('添加成功!'); ElMessage.success('添加成功!');
if (componentMode){
setNewsDialogInvisible(true);
}
else{
router.push('/news'); router.push('/news');
}
} catch (e) { } catch (e) {
await ElMessageBox.alert(e.response.data.message); await ElMessageBox.alert(e.response.data.message);
} }
@ -143,7 +164,12 @@ const handleCommit = async () => {
try { try {
const response = await axios.put(`${basePath}/${id.value}`, form.value); const response = await axios.put(`${basePath}/${id.value}`, form.value);
ElMessage.success('修改成功!'); ElMessage.success('修改成功!');
if (componentMode){
setNewsDialogInvisible(true);
}
else{
router.push('/news'); router.push('/news');
}
} catch (e) { } catch (e) {
await ElMessageBox.alert(e.response.data.message); await ElMessageBox.alert(e.response.data.message);
} }
@ -151,6 +177,15 @@ const handleCommit = async () => {
} }
}; };
const handleCancel = () => {
if (componentMode){
setNewsDialogInvisible(false);
}
else{
router.push('/news');
}
};
const isLayoutReady = ref(false); const isLayoutReady = ref(false);
const config = ref(null); // CKEditor needs the DOM tree before calculating the configuration. const config = ref(null); // CKEditor needs the DOM tree before calculating the configuration.
const editor = ClassicEditor; const editor = ClassicEditor;
@ -172,11 +207,24 @@ const fetchNewsDetail = async () => {
onMounted(() => { onMounted(() => {
token.value = store.getters['authentication/token']; token.value = store.getters['authentication/token'];
form.value.token = token.value; form.value.token = token.value;
if (route.query.mode === 'create' || route.params.mode === 'create') { if (props.mode !== undefined){
componentMode.value = true;
containerStyle.value = 'form-container-component'
if (props.mode === 'create'){
createMode.value = true; createMode.value = true;
modeTitle.value = '添加资讯'; modeTitle.value = '添加资讯';
} }
if (route.query.mode === 'edit' || route.params.mode === 'edit') { else if (props.mode === 'edit'){
createMode.value = false;
id.value = props.id;
modeTitle.value = '修改资讯';
fetchNewsDetail();
}
}
else if (route.query.mode === 'create' || route.params.mode === 'create') {
createMode.value = true;
modeTitle.value = '添加资讯';
} else if (route.query.mode === 'edit' || route.params.mode === 'edit') {
id.value = route.params.id === undefined ? route.query.id : route.params.id; id.value = route.params.id === undefined ? route.query.id : route.params.id;
createMode.value = false; createMode.value = false;
modeTitle.value = '修改资讯'; modeTitle.value = '修改资讯';
@ -373,7 +421,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<div class="form-container"> <div :class="containerStyle">
<ElForm :model="form" label-width="120px" @submit.prevent="handleCommit"> <ElForm :model="form" label-width="120px" @submit.prevent="handleCommit">
<h2>{{ modeTitle }}</h2> <h2>{{ modeTitle }}</h2>
<ElFormItem label="新闻标题" required> <ElFormItem label="新闻标题" required>
@ -448,7 +496,7 @@ onMounted(() => {
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem>
<ElButton type="primary" native-type="submit">确定</ElButton> <ElButton type="primary" native-type="submit">确定</ElButton>
<ElButton @click="router.push('/news')">取消</ElButton> <ElButton @click="handleCancel">取消</ElButton>
</ElFormItem> </ElFormItem>
</ElForm> </ElForm>
</div> </div>
@ -524,4 +572,23 @@ onMounted(() => {
max-width: 100%; max-width: 100%;
width: auto; /* 使宽度根据内容调整 */ width: auto; /* 使宽度根据内容调整 */
} }
.form-container-component {
display: flex;
justify-content: center;
align-items: center;
height: auto;
background: white;
overflow-y: auto; /* 使容器在内容溢出时出现滚动条 */
}
.form-container-component .el-form {
background: white;
padding: 2rem;
width: 100%;
height: 100%;
max-height: 90vh; /* 确保表单不会超过视口高度 */
overflow-y: auto; /* 使表单在内容溢出时出现滚动条 */
}
</style> </style>

View File

@ -1,9 +1,20 @@
<script setup> <script setup>
import {onMounted, ref} from 'vue'; import {onMounted, ref} from 'vue';
import {ElButton, ElForm, ElFormItem, ElInput, ElMessage, ElPagination, ElTable, ElTableColumn} from 'element-plus'; import {
ElButton,
ElForm,
ElFormItem,
ElInput,
ElMessage,
ElMessageBox,
ElPagination,
ElTable,
ElTableColumn
} from 'element-plus';
import axios from "axios"; import axios from "axios";
import {useStore} from "vuex"; import {useStore} from "vuex";
import {useRouter} from "vue-router"; import {useRouter} from "vue-router";
import EditNews from "@views/news-management/EditNews.vue";
const router = useRouter(); const router = useRouter();
@ -25,6 +36,10 @@ const newsCount = ref(0);
const firstTimeLoad = ref(true); const firstTimeLoad = ref(true);
const selections = ref([]); const selections = ref([]);
const editNewsDialogVisible = ref(false);
const editNewsDialogMode = ref('create');
const editId = ref("");
const loadNews = async () => { const loadNews = async () => {
if (firstTimeLoad.value || allNewsData.value.length < (currentPage.value * pageSize) && (currentPage.value * pageSize) <= newsCount) { if (firstTimeLoad.value || allNewsData.value.length < (currentPage.value * pageSize) && (currentPage.value * pageSize) <= newsCount) {
// console.error(allNewsData.value.length, currentPage.value, pageSize.value, newsCount.value) // console.error(allNewsData.value.length, currentPage.value, pageSize.value, newsCount.value)
@ -38,6 +53,7 @@ const loadNews = async () => {
const data = response.data const data = response.data
newsCount.value = data.newsCount; newsCount.value = data.newsCount;
allNewsData.value.push(...data.newsList); allNewsData.value.push(...data.newsList);
ElMessage.success('列表已刷新');
} catch (e) { } catch (e) {
console.log(e) console.log(e)
} }
@ -65,7 +81,18 @@ const handleReset = () => {
sortOrder.value = ''; sortOrder.value = '';
}; };
const handleCreateButton = () => {
editNewsDialogMode.value = 'create'
openEditNewsDialog()
};
const handleEditButton = () => { const handleEditButton = () => {
if (selections.value.length === 1) {
editNewsDialogMode.value = 'edit'
editId.value = selections.value[0].id
openEditNewsDialog()
return
}
//selectionid //selectionid
selections.value.forEach(selection => { selections.value.forEach(selection => {
const url = router.resolve({name: 'editNews', query: {mode: 'edit', id: selection.id}}).href; const url = router.resolve({name: 'editNews', query: {mode: 'edit', id: selection.id}}).href;
@ -73,16 +100,48 @@ const handleEditButton = () => {
}); });
}; };
//
const handleDeleteButton = () => { const handleDeleteButton = () => {
// if (selections.value.length === 0) {
ElMessage.warning('请选择要删除的资讯');
return;
}
ElMessageBox.confirm(
`你是否确认要删除<span style="color: red; ">${selections.value.length}</span>条资讯`,
'警告',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}
).then(async () => {
try {
for (const selection of selections.value) {
await axios.delete(`/api/news/${selection.id}`, {params: {token: token}});
}
ElMessage.success('删除成功');
//
await refreshNewsList()
} catch (e) {
ElMessage.error('删除失败');
console.error(e);
}
}).catch(() => {
ElMessage.info('已取消删除');
});
}; };
const handleSelectionChange = (newSelections) => { const handleSelectionChange = (newSelections) => {
selections.value = newSelections selections.value = newSelections
} }
const handleEditInTable = (index) => { const handleEditInTable = async (index) => {
router.push({name: 'editNews', query: {mode: 'edit', id: newsData.value[index].id}}) // router.push({name: 'editNews', query: {mode: 'edit', id: newsData.value[index].id}})
editNewsDialogMode.value = 'edit'
editId.value = newsData.value[index].id
openEditNewsDialog()
}; };
const handleDeleteInTable = async (index) => { const handleDeleteInTable = async (index) => {
@ -96,6 +155,25 @@ const handleDeleteInTable = async (index) => {
console.error(e) console.error(e)
} }
}; };
const refreshNewsList = async () => {
newsData.value = [];
allNewsData.value = [];
newsCount.value = 0;
currentPage.value = 1;
firstTimeLoad.value = true;
await loadNews();
};
const openEditNewsDialog = () => {
editNewsDialogVisible.value = true;
};
const setNewsDialogInvisible = (changed) => {
editNewsDialogVisible.value = false;
if (changed){
refreshNewsList();
}
}
</script> </script>
<template> <template>
@ -127,7 +205,7 @@ const handleDeleteInTable = async (index) => {
</div> </div>
<div class="button-container"> <div class="button-container">
<el-button type="success" @click="router.push('/news/edit?mode=create')">新增</el-button> <el-button type="success" @click="handleCreateButton">新增</el-button>
<el-button type="warning" @click="handleEditButton">修改</el-button> <el-button type="warning" @click="handleEditButton">修改</el-button>
<el-button type="danger" @click="handleDeleteButton">删除</el-button> <el-button type="danger" @click="handleDeleteButton">删除</el-button>
<el-button type="info">导出</el-button> <el-button type="info">导出</el-button>
@ -160,6 +238,14 @@ const handleDeleteInTable = async (index) => {
</el-pagination> </el-pagination>
</div> </div>
</div> </div>
<el-dialog
v-model="editNewsDialogVisible"
width="60%"
top="8vh"
destroy-on-close
>
<EditNews :mode="editNewsDialogMode" :id="editId" @setNewsDialogInvisible="setNewsDialogInvisible"/>
</el-dialog>
</template> </template>
<style scoped> <style scoped>