282 lines
6.9 KiB
Vue
282 lines
6.9 KiB
Vue
<template>
|
|
<div class="container-box">
|
|
<div class="header-bar">
|
|
<h2>特色服务管理</h2>
|
|
<div class="header-actions">
|
|
<el-button type="primary" @click="handleAdd">
|
|
<el-icon>
|
|
<Plus />
|
|
</el-icon>
|
|
添加内容
|
|
</el-button>
|
|
<el-button @click="refresh" :loading="loading">
|
|
<el-icon>
|
|
<Refresh />
|
|
</el-icon>
|
|
刷新
|
|
</el-button>
|
|
</div>
|
|
</div>
|
|
|
|
<el-divider></el-divider>
|
|
|
|
<!-- 搜索栏 -->
|
|
<div class="search-bar">
|
|
<el-input v-model="searchForm.keyword" placeholder="请输入内容搜索" clearable style="width: 200px; margin-right: 10px"
|
|
@keyup.enter="handleSearch" />
|
|
<el-select v-model="searchForm.status" placeholder="状态筛选" clearable style="width: 120px; margin-right: 10px">
|
|
<el-option label="启用" :value="1" />
|
|
<el-option label="禁用" :value="0" />
|
|
</el-select>
|
|
<el-button type="primary" @click="handleSearch">
|
|
<el-icon>
|
|
<Search />
|
|
</el-icon>
|
|
搜索
|
|
</el-button>
|
|
<el-button @click="resetSearch">重置</el-button>
|
|
</div>
|
|
|
|
<!-- 数据表格 -->
|
|
<el-table :data="servicesList" style="width: 100%" v-loading="loading" @selection-change="handleSelectionChange">
|
|
<el-table-column prop="id" label="ID" width="80" align="center" />
|
|
<el-table-column prop="thumb" label="服务图片" min-width="150" align="center" />
|
|
<el-table-column prop="title" label="服务名称" min-width="150" align="center" />
|
|
<el-table-column prop="desc" label="服务描述" min-width="150" align="center" />
|
|
<el-table-column prop="url" label="跳转地址" min-width="150" align="center" />
|
|
<el-table-column prop="sort" label="排序" width="80" align="center" />
|
|
<el-table-column prop="create_time" label="创建时间" width="180" align="center" />
|
|
<el-table-column label="操作" width="200" align="center" fixed="right">
|
|
<template #default="{ row }">
|
|
<el-button type="primary" link @click="handleEdit(row)">
|
|
<el-icon>
|
|
<Edit />
|
|
</el-icon>
|
|
编辑
|
|
</el-button>
|
|
<el-button type="danger" link @click="handleDelete(row)">
|
|
<el-icon>
|
|
<Delete />
|
|
</el-icon>
|
|
删除
|
|
</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<!-- 分页 -->
|
|
<div class="pagination-container">
|
|
<el-pagination v-model:current-page="pagination.page" v-model:page-size="pagination.limit"
|
|
:page-sizes="[10, 20, 50, 100]" :total="pagination.total" layout="total, sizes, prev, pager, next, jumper"
|
|
@size-change="handleSizeChange" @current-change="handlePageChange" />
|
|
</div>
|
|
|
|
<!-- 添加/编辑组件 -->
|
|
<EditDialog v-model="dialogVisible" :title="dialogTitle" :is-edit="isEdit" :row-data="currentRow"
|
|
@success="handleSuccess" />
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref, reactive, onMounted } from 'vue'
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
import { Plus, Refresh, Search, Edit, Delete } from '@element-plus/icons-vue'
|
|
import {
|
|
getServiceList,
|
|
updateService,
|
|
deleteService
|
|
} from '@/api/services'
|
|
import EditDialog from './components/edit.vue'
|
|
|
|
// @ts-ignore
|
|
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;
|
|
|
|
// 获取图片完整URL
|
|
const getImageUrl = (imagePath) => {
|
|
if (!imagePath) return "";
|
|
if (imagePath.startsWith("http")) return imagePath;
|
|
return API_BASE_URL + imagePath;
|
|
};
|
|
|
|
// 加载状态
|
|
const loading = ref(false)
|
|
|
|
// 搜索表单
|
|
const searchForm = reactive({
|
|
keyword: '',
|
|
status: ''
|
|
})
|
|
|
|
// 分页
|
|
const pagination = reactive({
|
|
page: 1,
|
|
limit: 10,
|
|
total: 0
|
|
})
|
|
|
|
// 数据列表
|
|
const servicesList = ref([])
|
|
const selectedIds = ref([])
|
|
|
|
// 对话框
|
|
const dialogVisible = ref(false)
|
|
const dialogTitle = ref('')
|
|
const isEdit = ref(false)
|
|
const currentRow = ref({})
|
|
|
|
// 获取列表
|
|
const fetchList = async () => {
|
|
loading.value = true
|
|
try {
|
|
const res = await getServiceList({
|
|
page: pagination.page,
|
|
limit: pagination.limit,
|
|
keyword: searchForm.keyword,
|
|
status: searchForm.status
|
|
})
|
|
if (res.code === 200) {
|
|
servicesList.value = res.data.list
|
|
pagination.total = res.data.total
|
|
}
|
|
} catch (error) {
|
|
console.error('获取特色服务列表失败:', error)
|
|
ElMessage.error('获取特色服务列表失败')
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
// 搜索
|
|
const handleSearch = () => {
|
|
pagination.page = 1
|
|
fetchList()
|
|
}
|
|
|
|
// 重置搜索
|
|
const resetSearch = () => {
|
|
searchForm.keyword = ''
|
|
searchForm.status = ''
|
|
pagination.page = 1
|
|
fetchList()
|
|
}
|
|
|
|
// 刷新
|
|
const refresh = () => {
|
|
fetchList()
|
|
}
|
|
|
|
// 分页变化
|
|
const handleSizeChange = (val) => {
|
|
pagination.limit = val
|
|
fetchList()
|
|
}
|
|
|
|
const handlePageChange = (val) => {
|
|
pagination.page = val
|
|
fetchList()
|
|
}
|
|
|
|
// 选择变化
|
|
const handleSelectionChange = (selection) => {
|
|
selectedIds.value = selection.map(item => item.id)
|
|
}
|
|
|
|
// 添加
|
|
const handleAdd = () => {
|
|
isEdit.value = false
|
|
dialogTitle.value = '添加特色服务'
|
|
currentRow.value = {}
|
|
dialogVisible.value = true
|
|
}
|
|
|
|
// 编辑
|
|
const handleEdit = (row) => {
|
|
isEdit.value = true
|
|
dialogTitle.value = '编辑特色服务'
|
|
currentRow.value = row
|
|
dialogVisible.value = true
|
|
}
|
|
|
|
// 删除
|
|
const handleDelete = async (row) => {
|
|
try {
|
|
await ElMessageBox.confirm('确定要删除该特色服务吗?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
})
|
|
|
|
const res = await deleteService(row.id)
|
|
if (res.code === 200) {
|
|
ElMessage.success('删除成功')
|
|
fetchList()
|
|
} else {
|
|
ElMessage.error(res.msg || '删除失败')
|
|
}
|
|
} catch (error) {
|
|
if (error !== 'cancel') {
|
|
console.error('删除特色服务失败:', error)
|
|
ElMessage.error('删除特色服务失败')
|
|
}
|
|
}
|
|
}
|
|
|
|
// 状态变化
|
|
const handleStatusChange = async (row, val) => {
|
|
try {
|
|
const res = await updateService(row.id, { status: val })
|
|
if (res.code === 200) {
|
|
ElMessage.success('状态更新成功')
|
|
} else {
|
|
ElMessage.error(res.msg || '状态更新失败')
|
|
row.status = val === 1 ? 0 : 1
|
|
}
|
|
} catch (error) {
|
|
console.error('更新特色服务状态失败:', error)
|
|
ElMessage.error('更新特色服务状态失败')
|
|
row.status = val === 1 ? 0 : 1
|
|
}
|
|
}
|
|
|
|
// 编辑成功回调
|
|
const handleSuccess = () => {
|
|
fetchList()
|
|
}
|
|
|
|
// 初始化
|
|
onMounted(() => {
|
|
fetchList()
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
.container-box {
|
|
padding: 20px;
|
|
}
|
|
|
|
.header-bar {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.header-bar h2 {
|
|
margin: 0;
|
|
font-size: 20px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.search-bar {
|
|
margin-bottom: 20px;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.pagination-container {
|
|
margin-top: 20px;
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
}
|
|
</style>
|