| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="filters" :inline="true"> |
| | | <el-form-item label="é¨ç¦åç§°"> |
| | | <el-input |
| | | v-model="filters.name" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥é¨ç¦åç§°" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | @change="getTableData" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="é¨ç¦ç¶æ"> |
| | | <el-select |
| | | v-model="filters.status" |
| | | style="width: 240px" |
| | | placeholder="è¯·éæ©é¨ç¦ç¶æ" |
| | | clearable |
| | | @change="getTableData" |
| | | > |
| | | <el-option label="æ£å¸¸" value="1"></el-option> |
| | | <el-option label="å¼å¸¸" value="0"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åºå"> |
| | | <el-input |
| | | v-model="filters.area" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥åºå" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | @change="getTableData" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getTableData">æç´¢</el-button> |
| | | <el-button @click="resetFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <div></div> |
| | | <div> |
| | | <el-button type="primary" @click="add" icon="Plus"> æ°å¢ </el-button> |
| | | <el-button type="danger" icon="Delete" :disabled="multipleList.length <= 0" @click="batchDelete">æ¹éå é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <PIMTable |
| | | rowKey="id" |
| | | isSelection |
| | | :column="columns" |
| | | :tableData="dataList" |
| | | :page="{ |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize, |
| | | total: pagination.total, |
| | | }" |
| | | @selection-change="handleSelectionChange" |
| | | @pagination="changePage" |
| | | > |
| | | </PIMTable> |
| | | </div> |
| | | <!-- æ°å¢ç¼è¾å¼¹çª --> |
| | | <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px"> |
| | | <el-form :model="formData" label-width="100px"> |
| | | <el-form-item label="é¨ç¦åç§°" required> |
| | | <el-input v-model="formData.name" placeholder="请è¾å
¥é¨ç¦åç§°"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="åºå" required> |
| | | <el-input v-model="formData.area" placeholder="请è¾å
¥åºå"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ä½ç½®" required> |
| | | <el-input v-model="formData.location" placeholder="请è¾å
¥å
·ä½ä½ç½®"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" required> |
| | | <el-select v-model="formData.status" placeholder="è¯·éæ©ç¶æ"> |
| | | <el-option label="æ£å¸¸" value="1"></el-option> |
| | | <el-option label="å¼å¸¸" value="0"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æè¿°"> |
| | | <el-input v-model="formData.description" type="textarea" rows="3" placeholder="请è¾å
¥æè¿°ä¿¡æ¯"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="dialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="saveData">ç¡®å®</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, computed, onMounted } from 'vue'; |
| | | import { Search, Plus, Delete } from '@element-plus/icons-vue'; |
| | | import { ElMessage, ElMessageBox } from 'element-plus'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | // å®ä¹åæ°æ® |
| | | const mockData = [ |
| | | { id: 1, name: 'ä¸é¨é¨ç¦', area: 'ç产åº', location: 'ä¸é¨å
¥å£', status: '1', lastUpdate: '2025-12-30 08:30:00', description: '主è¦ç¨äºåå·¥ä¸ä¸çéè¡' }, |
| | | { id: 2, name: '西é¨é¨ç¦', area: 'ä»å¨åº', location: '西é¨å
¥å£', status: '1', lastUpdate: '2025-12-30 09:15:00', description: '主è¦ç¨äºç©æµè½¦è¾éè¡' }, |
| | | { id: 3, name: 'åé¨é¨ç¦', area: 'åå
¬åº', location: 'åé¨å
¥å£', status: '0', lastUpdate: '2025-12-30 10:20:00', description: '主è¦ç¨äºè®¿å®¢éè¡ï¼å½åæ
é' }, |
| | | { id: 4, name: 'åé¨é¨ç¦', area: 'ç产åº', location: 'åé¨å
¥å£', status: '1', lastUpdate: '2025-12-30 11:45:00', description: '主è¦ç¨äºåææè¿è¾è½¦è¾éè¡' }, |
| | | { id: 5, name: '䏿§å®¤é¨ç¦', area: '䏿§åº', location: '䏿§å®¤é¨å£', status: '1', lastUpdate: '2025-12-30 13:20:00', description: 'ä»
éææäººåè¿å
¥' }, |
| | | ]; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const filters = reactive({ |
| | | name: '', |
| | | status: '', |
| | | area: '' |
| | | }); |
| | | |
| | | const dataList = ref([]); |
| | | const pagination = reactive({ |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | total: 0 |
| | | }); |
| | | |
| | | const multipleList = ref([]); |
| | | const dialogVisible = ref(false); |
| | | const dialogTitle = ref('æ°å¢é¨ç¦'); |
| | | const formData = reactive({ |
| | | id: '', |
| | | name: '', |
| | | area: '', |
| | | location: '', |
| | | status: '1', |
| | | description: '' |
| | | }); |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const columns = [ |
| | | { |
| | | label: 'é¨ç¦åç§°', |
| | | align: 'center', |
| | | prop: 'name', |
| | | }, |
| | | { |
| | | label: 'åºå', |
| | | align: 'center', |
| | | prop: 'area', |
| | | }, |
| | | { |
| | | label: 'ä½ç½®', |
| | | align: 'center', |
| | | prop: 'location', |
| | | }, |
| | | { |
| | | label: 'ç¶æ', |
| | | align: 'center', |
| | | prop: 'status', |
| | | formatter: (row) => { |
| | | return row.status === '1' ? '<el-tag type="success">æ£å¸¸</el-tag>' : '<el-tag type="danger">å¼å¸¸</el-tag>'; |
| | | } |
| | | }, |
| | | { |
| | | label: 'æåæ´æ°', |
| | | align: 'center', |
| | | prop: 'lastUpdate', |
| | | }, |
| | | { |
| | | label: 'æè¿°', |
| | | align: 'center', |
| | | prop: 'description', |
| | | }, |
| | | { |
| | | dataType: 'action', |
| | | label: 'æä½', |
| | | align: 'center', |
| | | fixed: 'right', |
| | | width: 140, |
| | | operation: [ |
| | | { |
| | | name: 'ç¼è¾', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | edit(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: 'å é¤', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | deleteRow(row.id); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ]; |
| | | |
| | | // è¿æ»¤åçæ°æ® |
| | | const filteredData = computed(() => { |
| | | return mockData.filter(item => { |
| | | const nameMatch = !filters.name || item.name.includes(filters.name); |
| | | const statusMatch = !filters.status || item.status === filters.status; |
| | | const areaMatch = !filters.area || item.area.includes(filters.area); |
| | | return nameMatch && statusMatch && areaMatch; |
| | | }); |
| | | }); |
| | | |
| | | // è·åè¡¨æ ¼æ°æ® |
| | | const getTableData = () => { |
| | | pagination.total = filteredData.value.length; |
| | | const start = (pagination.currentPage - 1) * pagination.pageSize; |
| | | const end = start + pagination.pageSize; |
| | | dataList.value = filteredData.value.slice(start, end); |
| | | }; |
| | | |
| | | // éç½®è¿æ»¤å¨ |
| | | const resetFilters = () => { |
| | | filters.name = ''; |
| | | filters.status = ''; |
| | | filters.area = ''; |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å页åå |
| | | const changePage = ({ page, limit }) => { |
| | | pagination.currentPage = page; |
| | | pagination.pageSize = limit; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å¤éå¤ç |
| | | const handleSelectionChange = (selectionList) => { |
| | | multipleList.value = selectionList; |
| | | }; |
| | | |
| | | // æ°å¢ |
| | | const add = () => { |
| | | dialogTitle.value = 'æ°å¢é¨ç¦'; |
| | | formData.id = ''; |
| | | formData.name = ''; |
| | | formData.area = ''; |
| | | formData.location = ''; |
| | | formData.status = '1'; |
| | | formData.description = ''; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ç¼è¾ |
| | | const edit = (row) => { |
| | | dialogTitle.value = 'ç¼è¾é¨ç¦'; |
| | | formData.id = row.id; |
| | | formData.name = row.name; |
| | | formData.area = row.area; |
| | | formData.location = row.location; |
| | | formData.status = row.status; |
| | | formData.description = row.description; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ä¿åæ°æ® |
| | | const saveData = () => { |
| | | if (!formData.name || !formData.area || !formData.location) { |
| | | ElMessage.warning('请填åå¿
å¡«åæ®µ'); |
| | | return; |
| | | } |
| | | |
| | | const currentTime = dayjs().format('YYYY-MM-DD HH:mm:ss'); |
| | | if (formData.id) { |
| | | // ç¼è¾ |
| | | const index = mockData.findIndex(item => item.id === formData.id); |
| | | if (index !== -1) { |
| | | mockData[index] = { |
| | | ...formData, |
| | | lastUpdate: currentTime |
| | | }; |
| | | ElMessage.success('ç¼è¾æå'); |
| | | } |
| | | } else { |
| | | // æ°å¢ |
| | | const newId = Math.max(...mockData.map(item => item.id), 0) + 1; |
| | | mockData.unshift({ |
| | | ...formData, |
| | | id: newId, |
| | | lastUpdate: currentTime |
| | | }); |
| | | ElMessage.success('æ°å¢æå'); |
| | | } |
| | | dialogVisible.value = false; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å é¤ |
| | | const deleteRow = (id) => { |
| | | ElMessageBox.confirm('æ¤æä½å°æ°¸ä¹
å é¤è¯¥é¨ç¦è®°å½, æ¯å¦ç»§ç»?', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | }).then(() => { |
| | | const index = mockData.findIndex(item => item.id === id); |
| | | if (index !== -1) { |
| | | mockData.splice(index, 1); |
| | | ElMessage.success('å 餿å'); |
| | | getTableData(); |
| | | } |
| | | }).catch(() => {}); |
| | | }; |
| | | |
| | | // æ¹éå é¤ |
| | | const batchDelete = () => { |
| | | if (multipleList.value.length === 0) { |
| | | ElMessage.warning('è¯·éæ©è¦å é¤çæ°æ®'); |
| | | return; |
| | | } |
| | | |
| | | ElMessageBox.confirm('æ¤æä½å°æ°¸ä¹
å 餿éé¨ç¦è®°å½, æ¯å¦ç»§ç»?', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | }).then(() => { |
| | | const ids = multipleList.value.map(item => item.id); |
| | | mockData.forEach((item, index) => { |
| | | if (ids.includes(item.id)) { |
| | | mockData.splice(index, 1); |
| | | } |
| | | }); |
| | | ElMessage.success('å 餿å'); |
| | | getTableData(); |
| | | multipleList.value = []; |
| | | }).catch(() => {}); |
| | | }; |
| | | |
| | | // åå§åæ°æ® |
| | | onMounted(() => { |
| | | getTableData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .table_list { |
| | | margin-top: unset; |
| | | } |
| | | .actions { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 10px; |
| | | } |
| | | </style> |