You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

187 lines
5.0 KiB

<template>
<div class="asset-category-page">
<!-- 顶部筛选区 -->
<el-card class="table-card">
<el-form :inline="true" :model="filters" size="small" class="filter-form">
<el-form-item label="关键词">
<el-input v-model="filters.keyword" placeholder="请输入分类名称" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="fetchList">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="success" @click="openAddDialog">新增分类</el-button>
</el-form-item>
</el-form>
<el-table
:data="tableData"
border
style="width: 100%;"
>
<el-table-column prop="markTypeId" label="分类ID" min-width="80" />
<el-table-column prop="markTypeName" label="分类名称" min-width="160" />
<el-table-column label="操作" min-width="180">
<template #default="{ row }">
<el-button size="small" type="warning" @click.stop="openEditDialog(row)">编辑</el-button>
<el-button size="small" type="danger" @click.stop="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
style="margin: 16px 0 0; text-align: right"
background
layout="total, sizes, prev, pager, next, jumper"
:total="total"
:page-size="pageSize"
:current-page="currentPage"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:page-sizes="[10, 20, 50, 100]"
/>
</el-card>
<!-- 新增/编辑弹窗 -->
<el-dialog v-model="showDialog" :title="dialogType==='add'?'新增分类':'编辑分类'" width="400px">
<el-form :model="form" label-width="100px">
<el-form-item label="分类名称" required>
<el-input v-model="form.markTypeName" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showDialog=false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import rpc from '../utils/rpc'
const tableData = ref<any[]>([])
const showDialog = ref(false)
const dialogType = ref<'add'|'edit'>('add')
const form = reactive<any>({})
const filters = reactive({ keyword: '' })
const total = ref(0)
const pageSize = ref(20)
const currentPage = ref(1)
const allData = ref<any[]>([])
const fetchList = async () => {
const params: any = {
page: currentPage.value,
limit: pageSize.value,
orderby: [{ mark_type_id: 'desc' }]
}
if (filters.keyword) {
params.like = { mark_type_name: ['%' + filters.keyword + '%'] }
}
const res = await rpc.post('/markType/list', params)
const rows = res?.rows || []
total.value = res?.count || rows.length
tableData.value = rows
}
const openAddDialog = () => {
dialogType.value = 'add'
showDialog.value = true
Object.assign(form, { markTypeName: '' })
}
const openEditDialog = (row: any) => {
dialogType.value = 'edit'
showDialog.value = true
Object.assign(form, { ...row })
}
const handleDelete = (row: any) => {
ElMessageBox.confirm('确定删除该分类吗?', '提示', { type: 'warning' })
.then(async () => {
await rpc.post('/markType/delete', { markTypeId: row.markTypeId })
ElMessage.success('删除成功')
fetchList()
})
.catch(() => {})
}
const submitForm = async () => {
if (!form.markTypeName) {
ElMessage.error('请输入分类名称')
return
}
if (dialogType.value === 'add') {
await rpc.post('/markType/create', { markTypeName: form.markTypeName })
ElMessage.success('新增成功')
} else {
await rpc.post('/markType/update', { markTypeId: form.markTypeId, markTypeName: form.markTypeName })
ElMessage.success('编辑成功')
}
showDialog.value = false
fetchList()
}
const handleSizeChange = (size: number) => {
pageSize.value = size
fetchList()
}
const handleCurrentChange = (page: number) => {
currentPage.value = page
fetchList()
}
onMounted(() => {
fetchList()
})
</script>
<style scoped>
.asset-category-page {
width: 100%;
height: 100%;
background: linear-gradient(180deg, #041236 0%, #02081A 100%);
display: flex;
flex-direction: column;
padding: 20px;
box-sizing: border-box;
}
.filter-card {
background: transparent;
border: none;
box-shadow: none;
margin-bottom: 16px;
padding: 0;
}
.filter-form {
padding: 0 0 8px 0;
}
.table-card {
flex: 1;
display: flex;
flex-direction: column;
background: rgba(4, 26, 71, 0.7);
border-radius: 8px;
box-shadow: 0 0 20px #0003;
padding: 0 0 16px 0;
}
.el-table {
background: transparent;
color: #e6f7ff;
}
.el-table th {
background: #002140;
color: #6eeaff;
font-weight: bold;
font-size: 15px;
}
.el-table .el-button {
box-shadow: 0 0 8px #00c3ff88;
border-radius: 4px;
}
.el-pagination {
margin-top: 16px;
}
</style>