2 23.公告栏模块Curd操作
src/api/notice.js
import axios from "~/axios";
export function getNoticeList(page) {
return axios.get(`/admin/notice/${page}`)
}
export function createNotice(data) {
return axios.post("/admin/notice",data)
}
export function updateNotice(id,data) {
return axios.post("/admin/notice/" + id,data)
}
export function deleteNotice(id) {
return axios.post(`/admin/notice/${id}/delete`)
}
src/pages/notice/list.vue
<template>
<el-card shadow="always" class="border-0">
<!-- 新增|刷新 -->
<div class="flex items-center justify-between mb-4">
<el-button type="primary" size="small" @click="handleCreate">
新增
</el-button>
<el-tooltip content="刷新数据" placement="top" effect="dark">
<el-button type="primary" size="small" @click="getData" text>
<el-icon :size="20"><Refresh /></el-icon>
</el-button>
</el-tooltip>
</div>
<!-- 表格 -->
<el-table :data="tableData" style="width: 100%" v-loading="loading">
<el-table-column prop="title" label="公告标题"/>
<el-table-column prop="create_time" label="创建时间" width="380" />
<el-table-column label="操作">
<template #default="scope">
<el-button
size="small"
@click="handleEdit(scope.row)"
> 修改 </el-button>
<el-popconfirm
title="是否要删除该公共"
confirmButtonText="确认"
cancelButtonText="取消"
confirmButtonType="primary"
@confirm="handleDelete(scope.row.id)">
<template #reference>
<el-button size="small" type="danger">删除</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="flex items-center justify-center mt-5">
<el-pagination
layout="prev, pager, next"
:total="total"
background
:current-page="currentPage"
:page-size="limit"
@current-change="getData"
>
</el-pagination>
</div>
<FormDrawer ref="formDrawerRef" :title="drawerTitle" @submit="handleSubmit">
<el-form :model="form" ref="formRef" :rules="rules" label-width="80px">
<el-form-item label="公共标题" prop="title">
<el-input v-model="form.title" placeholder="公共内容"></el-input>
</el-form-item>
<el-form-item label="公共内容" prop="content">
<!-- <textarea name="" id="" cols="30" rows="10" v-model="form.content"></textarea> -->
<el-input v-model="form.content" type="textarea" :rows="5" placeholder="公共内容"></el-input>
</el-form-item>
</el-form>
</FormDrawer>
</el-card>
</template>
<script setup>
import { reactive, ref, computed } from 'vue'
import { getNoticeList,createNotice,updateNotice,deleteNotice } from "~/api/notice"
import FormDrawer from '~/components/FormDrawer.vue';
import { toast } from '~/composables/util'
// 加载动画
const loading = ref(false)
// 分页
const currentPage = ref(1)
const total = ref(0)
const limit = ref(10)
const tableData = ref([])
// 加载列表
function getData(p = null){
if (typeof p == "number"){
currentPage.value = p
}
loading.value = true
getNoticeList(currentPage.value).then(res=>{
tableData.value = res.list
total.value = res.totalCount
}).finally(()=>{
loading.value = false
})
}
getData()
//
const editId = ref(0)
const drawerTitle = computed(()=>editId.value ? "修改" : "新增")
// 重置表单
function resetForm(row=false){
if(formRef.value) formRef.value.clearValidate()
if(row){
for(const key in form){
form[key] = row[key]
}
}
}
// 点击新增触发
const handleCreate = ()=>{
editId.value = 0
resetForm({
title:'',
content: ''
})
formDrawerRef.value.open()
}
// 编辑
const handleEdit = (row)=> {
editId.value = row.id
resetForm(row)
formDrawerRef.value.open()
}
// 删除
const handleDelete = (id)=> {
loading.value = true
deleteNotice(id).then(res=>{
toast('删除成功')
getData()
}).finally(()=>{
loading.value = false
})
}
// 提交
const formDrawerRef = ref(null)
const formRef = ref(null)
const form = reactive({
title:'',
content: ''
})
const rules = {
title: [{
required: true,
message: '公告标题不能为空',
trigger: 'blur',
},],
content: [{
required: true,
message: '公告内容不能为空',
trigger: 'blur',
},]
}
const handleSubmit = () => {
formRef.value.validate((valid)=>{
if(!valid) return
formDrawerRef.value.showLoading()
const fun = editId.value ? updateNotice(editId.value, form) : createNotice(form)
fun.then(res=>{
toast(drawerTitle + '成功')
// 修改刷新当前页,添加刷新第一页
getData(editId.value ? false: 1)
formDrawerRef.value.close()
})
.finally(()=>{
formDrawerRef.value.hideLoading()
})
})
}
</script>
效果图
Last updated