| | |
| | | color: #FFF; |
| | | opacity: 0.5; |
| | | } |
| | | |
| | | </style> |
| | | </head> |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="tableData" |
| | | style="width: 100%" |
| | | :border="border" |
| | | :show-selection="showSelection" |
| | | :max-height="maxHeight" |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | <el-table-column v-if="showSelection" type="selection" width="55" align="center" /> |
| | | <el-table-column v-if="showIndex" label="åºå·" type="index" width="60" align="center" /> |
| | | <template v-for="col in columns" :key="col.prop"> |
| | | <el-table-column |
| | | v-bind="col" |
| | | :show-overflow-tooltip="col.showOverflowTooltip !== false" |
| | | > |
| | | <template v-if="col.slot" #default> |
| | | <slot></slot> |
| | | </template> |
| | | </el-table-column> |
| | | </template> |
| | | <!-- æä½å --> |
| | | <el-table-column v-if="showOperations" :label="operationsLabel" :width="operationsWidth" fixed="right"> |
| | | <template #default="scope"> |
| | | <slot name="operations" :row="scope.row"> |
| | | <el-button |
| | | v-if="operations.includes('edit')" |
| | | link |
| | | type="primary" |
| | | size="small" |
| | | @click="handleEdit(scope.row)" |
| | | >ç¼è¾</el-button> |
| | | <el-button |
| | | v-if="operations.includes('delete')" |
| | | link |
| | | type="danger" |
| | | size="small" |
| | | @click="handleDelete(scope.row)" |
| | | >å é¤</el-button> |
| | | </slot> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { defineEmits } from 'vue' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | |
| | | const props = defineProps({ |
| | | // é«åº¦ |
| | | maxHeight: { |
| | | type: [String, Number], |
| | | default: 'auto' |
| | | }, |
| | | // å è½½ç¶æ |
| | | loading: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // border |
| | | border: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // è¡¨æ ¼æ°æ® |
| | | tableData: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºéæ©å |
| | | showSelection: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºåºå·å |
| | | showIndex: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // åé
ç½® |
| | | columns: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºæä½å |
| | | showOperations: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // æä½åæ ç¾ |
| | | operationsLabel: { |
| | | type: String, |
| | | default: 'æä½' |
| | | }, |
| | | // æä½å宽度 |
| | | operationsWidth: { |
| | | type: [String, Number], |
| | | default: 160 |
| | | }, |
| | | // æ¾ç¤ºåªäºæä½æé® |
| | | operations: { |
| | | type: Array, |
| | | default: () => ['edit', 'delete', 'export'] |
| | | }, |
| | | // å é¤ç¡®è®¤ä¿¡æ¯ |
| | | deleteConfirmText: { |
| | | type: String, |
| | | default: '确认å é¤è¯¥è®°å½ï¼' |
| | | } |
| | | }) |
| | | const emit = defineEmits(['selection-change', 'edit', 'delete', 'export']) |
| | | const handleSelectionChange = (selection) => { |
| | | emit('selection-change', selection) |
| | | } |
| | | const handleEdit = (row) => { |
| | | emit('edit', row) |
| | | } |
| | | const handleDelete = (row) => { |
| | | ElMessageBox.confirm( |
| | | props.deleteConfirmText, |
| | | 'è¦å', |
| | | { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | } |
| | | ).then(() => { |
| | | emit('delete', row) |
| | | }).catch(() => {}) |
| | | } |
| | | |
| | | const handleExport = (row) => { |
| | | emit('export', row) |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | :deep(.el-table) { |
| | | margin-bottom: 20px; |
| | | overflow-x: auto; |
| | | } |
| | | |
| | | :deep(.el-table th) { |
| | | background-color: #f5f7fa; |
| | | } |
| | | |
| | | /* ååºå¼æ ·å¼ */ |
| | | @media screen and (max-width: 768px) { |
| | | :deep(.el-table) { |
| | | width: 100%; |
| | | overflow-x: auto; |
| | | } |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { reactive } from "vue"; |
| | | import { clone } from "lodash"; |
| | | |
| | | |
| | | export default function useFormData(initData) { |
| | | const form = reactive(clone(initData, true)); |
| | | |
| | | function resetForm() { |
| | | const initData2 = JSON.parse(JSON.stringify(initData)); |
| | | Object.keys(initData).forEach(key => { |
| | | form[key] = initData2[key]; |
| | | }); |
| | | } |
| | | |
| | | return { form, resetForm }; |
| | | } |
| | | |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { ref, reactive, watchEffect, unref } from "vue"; |
| | | import useFormData from "./useFormData.js"; |
| | | // import { message } from "@/utils/message"; |
| | | |
| | | import { clone, isEqual } from "lodash"; |
| | | /** |
| | | * å页api |
| | | * @param api æ¥å£ |
| | | * @param initalFilters åå§åç鿡件 |
| | | * @param sorters |
| | | * @param filterTransformer |
| | | */ |
| | | export function usePaginationApi( |
| | | api, |
| | | initalFilters, |
| | | columns, |
| | | sorters, |
| | | filterTransformer, |
| | | cb |
| | | ) { |
| | | const dataList = ref([]); |
| | | const { form: filters, resetForm } = useFormData(initalFilters); |
| | | let lastFilters = clone(initalFilters); |
| | | const sorter = reactive(sorters || {}); |
| | | const others = ref({}); |
| | | const loading = ref(true); |
| | | const paginationAlign = ref("right"); |
| | | |
| | | /** å页é
ç½® */ |
| | | const pagination = reactive({ |
| | | pageSize: 10, |
| | | currentPage: 1, |
| | | pageSizes: [10, 15, 20], |
| | | total: 0, |
| | | align: "right", |
| | | background: true |
| | | }); |
| | | |
| | | /** å è½½å¨ç»é
ç½® */ |
| | | const loadingConfig = reactive({ |
| | | text: "æ£å¨å 载第ä¸é¡µ...", |
| | | viewBox: "-10, -10, 50, 50", |
| | | spinner: ` |
| | | <path class="path" d=" |
| | | M 30 15 |
| | | L 28 17 |
| | | M 25.61 25.61 |
| | | A 15 15, 0, 0, 1, 15 30 |
| | | A 15 15, 0, 1, 1, 27.99 7.5 |
| | | L 15 15 |
| | | " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/> |
| | | ` |
| | | // svg: "", |
| | | // background: rgba() |
| | | }); |
| | | |
| | | function getFinalParams() { |
| | | const finalFilters = {}; |
| | | const beforeParams = unref(filters); |
| | | if (filterTransformer) { |
| | | Object.keys(beforeParams).forEach(key => { |
| | | if (filterTransformer[key]) { |
| | | Object.assign( |
| | | finalFilters, |
| | | filterTransformer[key](beforeParams[key], beforeParams) |
| | | ); |
| | | } else { |
| | | finalFilters[key] = beforeParams[key]; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return filterTransformer |
| | | ? { ...finalFilters, ...sorter } |
| | | : { ...beforeParams, ...sorter }; |
| | | } |
| | | |
| | | async function getTableData() { |
| | | // å¦æè¿æ¬¡å䏿¬¡çfilterä¸åï¼é£ä¹å°±é置页ç |
| | | if (!isEqual(unref(filters), lastFilters)) { |
| | | pagination.currentPage = 1; |
| | | lastFilters = clone(unref(filters)); |
| | | } |
| | | loading.value = true; |
| | | api({ |
| | | ...getFinalParams(), |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize |
| | | }).then(({ code, data, ...rest }) => { |
| | | if (code == 200) { |
| | | // pagination.currentPage = meta.current_page; |
| | | // pagination.pageSize = meta.per_page; |
| | | pagination.total = data.total; |
| | | others.value = rest; |
| | | dataList.value = data.records; |
| | | cb && cb(data); |
| | | loading.value = false; |
| | | } else { |
| | | loading.value = false; |
| | | // message(data.msg, { type: "error" }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | function onSizeChange(val) { |
| | | pagination.pageSize = val; |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | } |
| | | |
| | | function onCurrentChange(val) { |
| | | loadingConfig.text = `æ£å¨å 载第${val}页...`; |
| | | loading.value = true; |
| | | getTableData(); |
| | | } |
| | | function resetFilters() { |
| | | resetForm(); |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | } |
| | | |
| | | watchEffect(() => { |
| | | pagination.align = paginationAlign.value; |
| | | }); |
| | | |
| | | // onMounted(() => { |
| | | // getTableData(); |
| | | // }); |
| | | |
| | | return { |
| | | loading, |
| | | columns, |
| | | dataList, |
| | | pagination, |
| | | loadingConfig, |
| | | paginationAlign, |
| | | filters, |
| | | sorter, |
| | | others, |
| | | onSizeChange, |
| | | onCurrentChange, |
| | | getTableData, |
| | | resetFilters |
| | | }; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :inline="true" :model="queryParams" class="search-form"> |
| | | <el-form-item label="æç´¢"> |
| | | <el-input |
| | | v-model="queryParams.searchText" |
| | | placeholder="请è¾å
¥å
³é®è¯" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¾åºååç§°"> |
| | | <el-input |
| | | v-model="queryParams.supplierName" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ä¸äººè¯å«å·"> |
| | | <el-input |
| | | v-model="queryParams.identifyNumber" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å"> |
| | | <el-input |
| | | v-model="queryParams.address" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æ¥è¯¢</el-button> |
| | | <el-button @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-card> |
| | | <!-- æ ç¾é¡µ --> |
| | | <el-tabs |
| | | v-model="activeTab" |
| | | class="info-tabs" |
| | | @tab-click="handleTabClick" |
| | | > |
| | | <el-tab-pane |
| | | v-for="tab in tabs" |
| | | :key="tab.name" |
| | | :label="tab.label" |
| | | :name="tab.name" |
| | | /> |
| | | </el-tabs> |
| | | |
| | | <!-- æä½æé®åº --> |
| | | <el-row :gutter="24" class="table-toolbar"> |
| | | <el-button type="primary" :icon="Plus" @click="handleAdd" |
| | | >æ°å»º</el-button |
| | | > |
| | | <el-button type="danger" :icon="Delete" @click="handleDelete">å é¤</el-button> |
| | | <el-button type="info" :icon="Download" @click="handleExport">导åº</el-button> |
| | | </el-row> |
| | | <!-- è¡¨æ ¼ç»ä»¶ --> |
| | | <div> |
| | | <data-table |
| | | :loading="loading" |
| | | :table-data="tableData" |
| | | :columns="columns" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="handleEdit" |
| | | @delete="handleDeleteSuccess" |
| | | :show-selection="true" |
| | | :border="true" |
| | | :maxHeight="440" |
| | | /> |
| | | </div> |
| | | <pagination |
| | | v-if="total>0" |
| | | :page-num="pageNum" |
| | | :page-size="pageSize" |
| | | :total="total" |
| | | @pagination="handleQuery" |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | /> |
| | | <Supplier |
| | | v-if="tabName === 'supplier'" |
| | | v-model:supplierDialogFormVisible="dialogFormVisible" |
| | | :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit" |
| | | @beforeClose="handleBeforeClose" |
| | | @update:dialogFormVisible="handleDialogFormVisible" |
| | | :addOrEdit="addOrEdit" |
| | | /> |
| | | <Customer |
| | | v-if="tabName === 'customer'" |
| | | v-model:customerDialogFormVisible="dialogFormVisible" |
| | | :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit" |
| | | @beforeClose="handleBeforeClose" |
| | | /> |
| | | <Coal |
| | | v-if="tabName === 'coal'" |
| | | v-model:coalDialogFormVisible="dialogFormVisible" |
| | | :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit" |
| | | /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from "vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue"; |
| | | import DataTable from "@/components/Table/ETable.vue"; |
| | | import Pagination from "@/components/Pagination"; |
| | | import Supplier from "./mould/supplier.vue"; |
| | | import Customer from "./mould/customer.vue"; |
| | | import Coal from "./mould/coal.vue"; |
| | | const { proxy } = getCurrentInstance() |
| | | // å¼¹çª |
| | | const customerDialogFormVisible = ref(false); |
| | | const coalDialogFormVisible = ref(false); |
| | | const supplierDialogFormVisible = ref(false); |
| | | const dialogFormVisible = ref(false); |
| | | const form = ref({}); |
| | | const title = ref(""); |
| | | const copyForm = ref({}); |
| | | // å½åæ ç¾ |
| | | const tabName = ref("supplier"); |
| | | // ç¶æåé |
| | | const loading = ref(false); |
| | | const total = ref(200); |
| | | const pageNum = ref(1); |
| | | const pageSize = ref(10); |
| | | const activeTab = ref("supplier"); |
| | | const selectedRows = ref([]); |
| | | // æ¥è¯¢åæ° |
| | | const queryParams = reactive({ |
| | | searchText: "", |
| | | supplierName: "", |
| | | identifyNumber: "", |
| | | address: "", |
| | | }); |
| | | onMounted(() => { |
| | | handleTabClick({ props: { name: "supplier" } }); |
| | | }); |
| | | const columns = ref(); |
| | | // æ ç¾é¡µæ°æ® |
| | | const tabs = reactive([ |
| | | { name: "supplier", label: "ä¾åºåä¿¡æ¯" }, |
| | | { name: "customer", label: "客æ·ä¿¡æ¯" }, |
| | | { name: "coal", label: "ç
¤ç§ä¿¡æ¯" }, |
| | | ]); |
| | | // æ¯å¦ç¼è¾ |
| | | const addOrEdit = ref("add"); |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([]); |
| | | // æ¹æ³å®ä¹ |
| | | const handleQuery = () => { |
| | | loading.value = true; |
| | | setTimeout(() => { |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | // supplier ä¾åºåæ°æ® |
| | | const supplierColumns = reactive([ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minWidth: 200 }, |
| | | { prop: "identifyNumber", label: "ç»ä¸äººè¯å«å·", minWidth: 120 }, |
| | | { prop: "address", label: "ç»è¥å°å", minWidth: 150 }, |
| | | { prop: "bank", label: "弿·è¡", minWidth: 120 }, |
| | | { prop: "bankAccount", label: "é¶è¡è´¦å·", minWidth: 150 }, |
| | | { prop: "contacts", label: "è系人", minWidth: 100 }, |
| | | { prop: "contactAddress", label: "èç³»å°å", minWidth: 150 }, |
| | | { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 100 }, |
| | | { prop: "maintainDate", label: "ç»´æ¤æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | // customer å®¢æ·æ°æ® |
| | | const customerColumns = reactive([ |
| | | { prop: "customerName", label: "客æ·åç§°", minWidth: 200 }, |
| | | { prop: "identifyNumber", label: "ç»ä¸äººè¯å«å·", minWidth: 120 }, |
| | | { prop: "address", label: "ç»è¥å°å", minWidth: 150 }, |
| | | { prop: "bank", label: "弿·è¡", minWidth: 120 }, |
| | | { prop: "bankAccount", label: "é¶è¡è´¦å·", minWidth: 150 }, |
| | | { prop: "contacts", label: "è系人", minWidth: 100 }, |
| | | { prop: "contactAddress", label: "èç³»å°å", minWidth: 150 }, |
| | | { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 100 }, |
| | | { prop: "maintainDate", label: "ç»´æ¤æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | // coal ç
¤ç§æ°æ® |
| | | const coalColumns = reactive([ |
| | | { prop: "coalName", label: "ç
¤ç§åç§°", minWidth: 200 }, |
| | | { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 120 }, |
| | | { prop: "maintenanceDate", label: "ç»´æ¤æ¥æ", minWidth: 150 }, |
| | | ]); |
| | | // æ ç¾é¡µç¹å» |
| | | const handleTabClick = (tab) => { |
| | | form.value = {}; |
| | | getList(); |
| | | addOrEdit.value = "add"; |
| | | loading.value = true; |
| | | tabName.value = tab.props.name; |
| | | tableData.value = []; |
| | | getList(); |
| | | switch (tabName.value) { |
| | | case "supplier": |
| | | columns.value = supplierColumns; |
| | | dialogFormVisible.value = supplierDialogFormVisible.value; |
| | | break; |
| | | case "customer": |
| | | columns.value = customerColumns; |
| | | dialogFormVisible.value = customerDialogFormVisible.value; |
| | | break; |
| | | case "coal": |
| | | columns.value = coalColumns; |
| | | dialogFormVisible.value = coalDialogFormVisible.value; |
| | | break; |
| | | } |
| | | setTimeout(() => { |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | // éç½®æ¥è¯¢ |
| | | const resetQuery = () => { |
| | | Object.keys(queryParams).forEach((key) => { |
| | | if (key !== "pageNum" && key !== "pageSize") { |
| | | queryParams[key] = ""; |
| | | } |
| | | }); |
| | | handleQuery(); |
| | | }; |
| | | // æ°å¢ |
| | | const handleAdd = () => { |
| | | addOrEdit.value = "add"; |
| | | handleAddEdit(tabName.value); |
| | | }; |
| | | // æ°å¢ç¼è¾ |
| | | const handleAddEdit = (tabName) => { |
| | | addOrEdit.value == "add" ? (title.value = "æ°å¢") : (title.value = "ç¼è¾"); |
| | | if (tabName === "supplier") { |
| | | dialogFormVisible.value = true; |
| | | title.value = title.value + "ä¾åºåä¿¡æ¯"; |
| | | openDialog(); |
| | | } else if (tabName === "customer") { |
| | | dialogFormVisible.value = true; |
| | | title.value = title.value + "客æ·ä¿¡æ¯"; |
| | | openDialog(); |
| | | } else if (tabName === "coal") { |
| | | dialogFormVisible.value = true; |
| | | title.value = title.value + "ç
¤ç§ä¿¡æ¯"; |
| | | openDialog(); |
| | | } |
| | | }; |
| | | // æå¼å¼¹çª |
| | | const openDialog = () => { |
| | | if (addOrEdit.value === "edit") { |
| | | copyForm.value = JSON.parse(JSON.stringify(form.value)); |
| | | dialogFormVisible.value = true; |
| | | return; |
| | | } |
| | | form.value = {}; |
| | | dialogFormVisible.value = true; |
| | | }; |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = (val) => { |
| | | // æ¿å°æäº¤æ°æ® |
| | | dialogFormVisible.value = false; |
| | | getList(); |
| | | }; |
| | | const handleDialogFormVisible = (value) => { |
| | | dialogFormVisible.value = value; |
| | | }; |
| | | // éæ©è¡ |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | // ç¼è¾ |
| | | const handleEdit = (row) => { |
| | | form.value = JSON.parse(JSON.stringify(row)); |
| | | addOrEdit.value = "edit"; |
| | | handleAddEdit(tabName.value); |
| | | }; |
| | | // æ¹éå é¤ |
| | | const handleDelete = () => { |
| | | if (selectedRows.value.length === 0) { |
| | | ElMessage.warning("è¯·éæ©è¦å é¤çæ°æ®"); |
| | | return; |
| | | } |
| | | ElMessageBox.confirm("ç¡®å®å é¤éä¸çæ°æ®åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | ElMessage.success("å 餿åï¼å
±å é¤" + selectedRows.value.length + "æ¡æ°æ®"); |
| | | selectedRows.value.forEach((row) => { |
| | | tableData.value = tableData.value.filter( |
| | | (item) => item !== row |
| | | ); |
| | | }); |
| | | total.value = tableData.value.length; |
| | | // æ¸
空éä¸è¡ |
| | | selectedRows.value = []; |
| | | }).catch(() => { |
| | | ElMessage.info("已忶å 餿ä½"); |
| | | }); |
| | | } |
| | | // è¡¨æ ¼å é¤ |
| | | const handleDeleteSuccess = (row) => { |
| | | ElMessage.success("å 餿åï¼" + row.supplierName); |
| | | }; |
| | | // å
³éå¼¹çª |
| | | const handleBeforeClose = () => { |
| | | dialogFormVisible.value = false; |
| | | form.value = {}; |
| | | }; |
| | | const handleExport = (row) => { |
| | | proxy.download("system/post/export", { |
| | | ...queryParams.value |
| | | }, `post_${new Date().getTime()}.xlsx`) |
| | | ElMessage.success("å¯¼åºæ°æ®ï¼" + row.supplierName); |
| | | }; |
| | | const getList = () => { |
| | | loading.value = true; |
| | | setTimeout(() => { |
| | | // ææ¶å¼å
¥æµè¯æ°æ® |
| | | tableData.value = [ |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "123412123123123111", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | contactsPhone: "19345678901", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "123412123123123111", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | contactsPhone: "19345678901", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "123412123123123111", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | contactsPhone: "19345678901", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | ]; |
| | | total.value = tableData.value.length; |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | getList(); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .app-container{ |
| | | box-sizing: border-box; |
| | | } |
| | | .search-form { |
| | | background-color: #fff; |
| | | padding: 20px 20px 0 20px; |
| | | margin-bottom: 20px; |
| | | border-radius: 4px; |
| | | box-shadow: var(--el-box-shadow-light); |
| | | } |
| | | .search-form :deep(.el-form-item) { |
| | | margin-bottom: 16px; |
| | | width: 100%; |
| | | } |
| | | |
| | | /* ååºå¼å¸å± */ |
| | | @media screen and (min-width: 768px) { |
| | | .search-form :deep(.el-form-item) { |
| | | width: 50%; |
| | | } |
| | | } |
| | | @media screen and (min-width: 1200px) { |
| | | .search-form :deep(.el-form-item) { |
| | | width: 18%; |
| | | } |
| | | } |
| | | .info-tabs { |
| | | margin-bottom: 20px; |
| | | } |
| | | .table-toolbar { |
| | | margin-bottom: 20px; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 10px; |
| | | } |
| | | |
| | | /* ååºå¼è¡¨æ ¼ */ |
| | | @media screen and (max-width: 768px) { |
| | | .table-toolbar { |
| | | flex-direction: column; |
| | | } |
| | | .table-toolbar .el-button { |
| | | width: 100%; |
| | | } |
| | | } |
| | | /* è¡¨æ ¼å·¥å
·æ */ |
| | | .table-toolbar, .table-toolbar > * { |
| | | margin: 0 0 0 0 !important; |
| | | } |
| | | .table-toolbar{ |
| | | margin-bottom: 20px !important; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :inline="true" :model="queryParams" class="search-form"> |
| | | <el-form-item label="æç´¢"> |
| | | <el-input |
| | | v-model="queryParams.searchText" |
| | | placeholder="请è¾å
¥å
³é®è¯" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¾åºååç§°"> |
| | | <el-input |
| | | v-model="queryParams.supplierName" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ä¸äººè¯å«å·"> |
| | | <el-input |
| | | v-model="queryParams.identifyNumber" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å"> |
| | | <el-input |
| | | v-model="queryParams.address" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æ¥è¯¢</el-button> |
| | | <el-button @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-card> |
| | | <!-- æ ç¾é¡µ --> |
| | | <el-tabs |
| | | v-model="activeTab" |
| | | class="info-tabs" |
| | | @tab-click="handleTabClick" |
| | | > |
| | | <el-tab-pane |
| | | v-for="tab in tabs" |
| | | :key="tab.name" |
| | | :label="tab.label" |
| | | :name="tab.name" |
| | | /> |
| | | </el-tabs> |
| | | |
| | | <!-- æä½æé®åº --> |
| | | <el-row :gutter="24" class="table-toolbar"> |
| | | <el-button type="primary" :icon="Plus" @click="handleAdd" |
| | | >æ°å»º</el-button |
| | | > |
| | | <el-button type="danger" :icon="Delete">å é¤</el-button> |
| | | <el-button type="info" :icon="Download" @click="handleExport">导åº</el-button> |
| | | </el-row> |
| | | <!-- è¡¨æ ¼ç»ä»¶ --> |
| | | <div> |
| | | <data-table |
| | | :loading="loading" |
| | | :table-data="tableData" |
| | | :columns="columns" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="handleEdit" |
| | | @delete="handleDeleteSuccess" |
| | | :show-selection="true" |
| | | :border="true" |
| | | :maxHeight="440" |
| | | /> |
| | | </div> |
| | | <pagination |
| | | v-if="total>0" |
| | | :page-num="queryParams.pageNum" |
| | | :page-size="queryParams.pageSize" |
| | | :total="total" |
| | | @pagination="handleQuery" |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | /> |
| | | <Supplier |
| | | v-if="tabName === 'supplier'" |
| | | v-model:supplierDialogFormVisible="dialogFormVisible" |
| | | :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit" |
| | | @beforeClose="handleBeforeClose" |
| | | @update:dialogFormVisible="handleDialogFormVisible" |
| | | :addOrEdit="addOrEdit" |
| | | /> |
| | | <Customer |
| | | v-if="tabName === 'customer'" |
| | | v-model:customerDialogFormVisible="dialogFormVisible" |
| | | :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit" |
| | | @beforeClose="handleBeforeClose" |
| | | /> |
| | | <Coal |
| | | v-if="tabName === 'coal'" |
| | | v-model:coalDialogFormVisible="dialogFormVisible" |
| | | :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit" |
| | | /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { usePaginationApi } from "../../../hooks/usePaginationApi"; |
| | | import { ref, reactive, onMounted } from "vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue"; |
| | | import DataTable from "@/components/Table/ETable.vue"; |
| | | import Pagination from "@/components/Pagination"; |
| | | import Supplier from "./mould/supplier.vue"; |
| | | import Customer from "./mould/customer.vue"; |
| | | import Coal from "./mould/coal.vue"; |
| | | const { proxy } = getCurrentInstance() |
| | | |
| | | const { |
| | | columns |
| | | } = usePaginationApi(()=> { |
| | | // å页é»è¾å¯ä»¥å¨è¿éå¤ç |
| | | },{ |
| | | searchText: "", |
| | | supplierName: "", |
| | | identifyNumber: "", |
| | | address: "", |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | },[ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minWidth: 200 }, |
| | | { prop: "identifyNumber", label: "ç»ä¸äººè¯å«å·", minWidth: 120 }, |
| | | { prop: "address", label: "ç»è¥å°å", minWidth: 150 }, |
| | | { prop: "bank", label: "弿·è¡", minWidth: 120 }, |
| | | { prop: "bankAccount", label: "é¶è¡è´¦å·", minWidth: 150 }, |
| | | { prop: "contacts", label: "è系人", minWidth: 100 }, |
| | | { prop: "contactAddress", label: "èç³»å°å", minWidth: 150 }, |
| | | { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 100 }, |
| | | { prop: "maintainDate", label: "ç»´æ¤æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | // å¼¹çª |
| | | const customerDialogFormVisible = ref(false); |
| | | const coalDialogFormVisible = ref(false); |
| | | const supplierDialogFormVisible = ref(false); |
| | | const dialogFormVisible = ref(false); |
| | | const form = ref({}); |
| | | const title = ref(""); |
| | | const copyForm = ref({}); |
| | | // å½åæ ç¾ |
| | | const tabName = ref("supplier"); |
| | | // ç¶æåé |
| | | const loading = ref(false); |
| | | const total = ref(200); |
| | | const activeTab = ref("supplier"); |
| | | const selectedRows = ref([]); |
| | | // æ¥è¯¢åæ° |
| | | const queryParams = reactive({ |
| | | searchText: "", |
| | | supplierName: "", |
| | | identifyNumber: "", |
| | | address: "", |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | }); |
| | | onMounted(() => { |
| | | handleTabClick({ props: { name: "supplier" } }); |
| | | }); |
| | | // æ ç¾é¡µæ°æ® |
| | | const tabs = reactive([ |
| | | { name: "supplier", label: "ä¾åºåä¿¡æ¯" }, |
| | | { name: "customer", label: "客æ·ä¿¡æ¯" }, |
| | | { name: "coal", label: "ç
¤ç§ä¿¡æ¯" }, |
| | | ]); |
| | | // æ¯å¦ç¼è¾ |
| | | const addOrEdit = ref("add"); |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([]); |
| | | // æ¹æ³å®ä¹ |
| | | const handleQuery = () => { |
| | | loading.value = true; |
| | | // è¿éæ·»å å®é
çæ¥è¯¢é»è¾ |
| | | setTimeout(() => { |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | |
| | | /* // supplier ä¾åºåæ°æ® |
| | | const supplierColumns = reactive([ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minWidth: 200 }, |
| | | { prop: "identifyNumber", label: "ç»ä¸äººè¯å«å·", minWidth: 120 }, |
| | | { prop: "address", label: "ç»è¥å°å", minWidth: 150 }, |
| | | { prop: "bank", label: "弿·è¡", minWidth: 120 }, |
| | | { prop: "bankAccount", label: "é¶è¡è´¦å·", minWidth: 150 }, |
| | | { prop: "contacts", label: "è系人", minWidth: 100 }, |
| | | { prop: "contactAddress", label: "èç³»å°å", minWidth: 150 }, |
| | | { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 100 }, |
| | | { prop: "maintainDate", label: "ç»´æ¤æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | // customer å®¢æ·æ°æ® |
| | | const customerColumns = reactive([ |
| | | { prop: "customerName", label: "客æ·åç§°", minWidth: 200 }, |
| | | { prop: "identifyNumber", label: "ç»ä¸äººè¯å«å·", minWidth: 120 }, |
| | | { prop: "address", label: "ç»è¥å°å", minWidth: 150 }, |
| | | { prop: "bank", label: "弿·è¡", minWidth: 120 }, |
| | | { prop: "bankAccount", label: "é¶è¡è´¦å·", minWidth: 150 }, |
| | | { prop: "contacts", label: "è系人", minWidth: 100 }, |
| | | { prop: "contactAddress", label: "èç³»å°å", minWidth: 150 }, |
| | | { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 100 }, |
| | | { prop: "maintainDate", label: "ç»´æ¤æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | // coal ç
¤ç§æ°æ® |
| | | const coalColumns = reactive([ |
| | | { prop: "coalName", label: "ç
¤ç§åç§°", minWidth: 200 }, |
| | | { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 120 }, |
| | | { prop: "maintenanceDate", label: "ç»´æ¤æ¥æ", minWidth: 150 }, |
| | | ]); */ |
| | | |
| | | // æ ç¾é¡µç¹å» |
| | | const handleTabClick = (tab) => { |
| | | loading.value = true; |
| | | tabName.value = tab.props.name; |
| | | tableData.value = []; |
| | | getList(); |
| | | switch (tabName.value) { |
| | | case "supplier": |
| | | dialogFormVisible.value = supplierDialogFormVisible.value; |
| | | break; |
| | | case "customer": |
| | | columns.value = customerColumns; |
| | | dialogFormVisible.value = customerDialogFormVisible.value; |
| | | break; |
| | | case "coal": |
| | | columns.value = coalColumns; |
| | | dialogFormVisible.value = coalDialogFormVisible.value; |
| | | break; |
| | | } |
| | | setTimeout(() => { |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | // éç½®æ¥è¯¢ |
| | | const resetQuery = () => { |
| | | Object.keys(queryParams).forEach((key) => { |
| | | if (key !== "pageNum" && key !== "pageSize") { |
| | | queryParams[key] = ""; |
| | | } |
| | | }); |
| | | handleQuery(); |
| | | }; |
| | | // æ°å¢ |
| | | const handleAdd = () => { |
| | | addOrEdit.value = "add"; |
| | | handleAddEdit(tabName.value); |
| | | }; |
| | | // æ°å¢ç¼è¾ |
| | | const handleAddEdit = (tabName) => { |
| | | addOrEdit.value == "add" ? (title.value = "æ°å¢") : (title.value = "ç¼è¾"); |
| | | if (tabName === "supplier") { |
| | | dialogFormVisible.value = true; |
| | | title.value = title.value + "ä¾åºåä¿¡æ¯"; |
| | | openDialog(); |
| | | } else if (tabName === "customer") { |
| | | dialogFormVisible.value = true; |
| | | title.value = title.value + "客æ·ä¿¡æ¯"; |
| | | openDialog(); |
| | | } else if (tabName === "coal") { |
| | | dialogFormVisible.value = true; |
| | | title.value = title.value + "ç
¤ç§ä¿¡æ¯"; |
| | | openDialog(); |
| | | } |
| | | }; |
| | | // æå¼å¼¹çª |
| | | const openDialog = () => { |
| | | if (addOrEdit.value === "edit") { |
| | | copyForm.value = JSON.parse(JSON.stringify(form.value)); |
| | | dialogFormVisible.value = true; |
| | | return; |
| | | } |
| | | form.value = {}; |
| | | dialogFormVisible.value = true; |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = (val) => { |
| | | // æ¿å°æäº¤æ°æ® |
| | | dialogFormVisible.value = false; |
| | | getList(); |
| | | }; |
| | | const handleDialogFormVisible = (value) => { |
| | | dialogFormVisible.value = value; |
| | | }; |
| | | // éæ©è¡ |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | // ç¼è¾ |
| | | const handleEdit = (row) => { |
| | | if (row.supplierName) { |
| | | form.value = JSON.parse(JSON.stringify(row)); |
| | | addOrEdit.value = "edit"; |
| | | handleAddEdit(tabName.value); |
| | | return; |
| | | } |
| | | if (selectedRows.value.length === 1) { |
| | | form.value = JSON.parse(JSON.stringify(selectedRows.value[0])); |
| | | addOrEdit.value = "edit"; |
| | | handleAddEdit(tabName.value); |
| | | return; |
| | | } else { |
| | | ElMessage.warning("è¯·éæ©ä¸æ¡æ°æ®ä¿®æ¹"); |
| | | } |
| | | }; |
| | | |
| | | const handleDeleteSuccess = (row) => { |
| | | ElMessage.success("å 餿åï¼" + row.supplierName); |
| | | }; |
| | | // å
³éå¼¹çª |
| | | const handleBeforeClose = () => { |
| | | dialogFormVisible.value = false; |
| | | form.value = {}; |
| | | }; |
| | | const handleExport = (row) => { |
| | | proxy.download("system/post/export", { |
| | | ...queryParams.value |
| | | }, `post_${new Date().getTime()}.xlsx`) |
| | | ElMessage.success("å¯¼åºæ°æ®ï¼" + row.supplierName); |
| | | }; |
| | | const getList = () => { |
| | | loading.value = true; |
| | | setTimeout(() => { |
| | | tableData.value = [ |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "123412123123123111", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | contactsPhone: "19345678901", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "123412123123123111", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | contactsPhone: "19345678901", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "123412123123123111", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | contactsPhone: "19345678901", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½å¶éç§å·¥è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "019-65851198", |
| | | address: "山西ç", |
| | | bank: "交éé¶è¡", |
| | | bankAccount: "901234567890123456", |
| | | contacts: "æéªè¹", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "æéªè¹", |
| | | maintainDate: "2022-09-26", |
| | | }, |
| | | { |
| | | supplierName: "交éé¶è¡è¡ä»½æéå
¬å¸", |
| | | identifyNumber: "042-26881314", |
| | | address: "æ±è¥¿ç", |
| | | bank: "å¹³å®é¶è¡", |
| | | bankAccount: "123456789012345678", |
| | | contacts: "å¨ç½ç", |
| | | contactAddress: "XXçXXå¸XXåºXXè·¯", |
| | | maintainer: "å¨ç½ç", |
| | | maintainDate: "2022-08-29", |
| | | }, |
| | | ]; |
| | | total.value = tableData.value.length; |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | getList(); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .app-container{ |
| | | box-sizing: border-box; |
| | | } |
| | | .search-form { |
| | | background-color: #fff; |
| | | padding: 20px 20px 0 20px; |
| | | margin-bottom: 20px; |
| | | border-radius: 4px; |
| | | box-shadow: var(--el-box-shadow-light); |
| | | } |
| | | .search-form :deep(.el-form-item) { |
| | | margin-bottom: 16px; |
| | | width: 100%; |
| | | } |
| | | |
| | | /* ååºå¼å¸å± */ |
| | | @media screen and (min-width: 768px) { |
| | | .search-form :deep(.el-form-item) { |
| | | width: 50%; |
| | | } |
| | | } |
| | | @media screen and (min-width: 1200px) { |
| | | .search-form :deep(.el-form-item) { |
| | | width: 18%; |
| | | } |
| | | } |
| | | .info-tabs { |
| | | margin-bottom: 20px; |
| | | } |
| | | .table-toolbar { |
| | | margin-bottom: 20px; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 10px; |
| | | } |
| | | |
| | | /* ååºå¼è¡¨æ ¼ */ |
| | | @media screen and (max-width: 768px) { |
| | | .table-toolbar { |
| | | flex-direction: column; |
| | | } |
| | | .table-toolbar .el-button { |
| | | width: 100%; |
| | | } |
| | | } |
| | | /* è¡¨æ ¼å·¥å
·æ */ |
| | | .table-toolbar, .table-toolbar > * { |
| | | margin: 0 0 0 0 !important; |
| | | } |
| | | .table-toolbar{ |
| | | margin-bottom: 20px !important; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="800" |
| | | :close-on-click-modal="false" |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | style="max-width: 600px; margin: 0 auto" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | > |
| | | <el-form-item label="å¡è¡" prop="supplierName"> |
| | | <el-input |
| | | v-model="formData.supplierName" |
| | | placeholder="请è¾å
¥ä¾è´§ååç§°" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="纳ç¨äººè¯å«å·" prop="identifyNumber"> |
| | | <el-input |
| | | v-model="formData.identifyNumber" |
| | | placeholder="请è¾å
¥çº³ç¨äººè¯å«å·" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å" prop="address"> |
| | | <el-select v-model="formData.address" placeholder="è¯·éæ©ç»è¥å°å"> |
| | | <el-option label="Zone one" value="shanghai" /> |
| | | <el-option label="Zone two" value="beijing" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="é¶è¡è´¦æ·" prop="bankAccount"> |
| | | <el-input v-model="formData.bankAccount" placeholder="请è¾å
¥é¶è¡è´¦æ·" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="submitForm"> |
| | | ç¡®å® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch ,defineProps } from 'vue' |
| | | |
| | | const props = defineProps({ |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => {} |
| | | }, |
| | | form: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | addOrEdit: { |
| | | type: String, |
| | | default: 'add' |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | }) |
| | | |
| | | const emit = defineEmits(['submit', 'handleBeforeClose','update:coalDialogFormVisible']) |
| | | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(null) |
| | | // è¡¨åæ°æ® |
| | | const formData = ref({ ...props.form }) |
| | | // å¼¹çªå¯è§æ§ |
| | | const dialogVisible = defineModel("coalDialogFormVisible",{required:true,type:Boolean}) |
| | | |
| | | // çå¬å¤é¨ä¼ å
¥çè¡¨åæ°æ®åå |
| | | watch(() => props.form, (newVal) => { |
| | | formData.value = { ...newVal } |
| | | }, { deep: true }) |
| | | |
| | | // çå¬å
é¨å¼¹çªç¶æåå |
| | | watch(() => dialogVisible.value, (newVal) => { |
| | | emit('update:coalDialogFormVisible', newVal) |
| | | }) |
| | | |
| | | // æäº¤è¡¨å |
| | | const submitForm = async () => { |
| | | if (!formRef.value) return |
| | | await formRef.value.validate((valid, fields) => { |
| | | if (valid) { |
| | | emit('submit', formData.value) |
| | | } |
| | | }) |
| | | } |
| | | // åæ¶è¡¨å |
| | | const cancelForm = () => { |
| | | emit('update:coalDialogFormVisible', false) |
| | | formData.value = {} |
| | | } |
| | | // é置表å |
| | | const resetForm = () => { |
| | | if (!formRef.value) return |
| | | formRef.value.resetFields() |
| | | } |
| | | // å
³éå¼¹çª |
| | | const handleClose = () => { |
| | | // 触åç¶ç»ä»¶çå
³é彿° |
| | | emit("handleBeforeClose") |
| | | emit('update:coalDialogFormVisible', false) |
| | | } |
| | | const rules = reactive({ |
| | | supplierName: [ |
| | | { required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur" }, |
| | | ], |
| | | identifyNumber: [ |
| | | { required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | { min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | ], |
| | | address: [ |
| | | { |
| | | required: true, |
| | | message: "è¯·éæ©ç»è¥å°å", |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | bankAccount: [{ required: true, message: "请è¾å
¥é¶è¡è´¦æ·", trigger: "blur" }], |
| | | bank: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contacts: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contactsPhone: [ |
| | | { required: true, message: "请è¾å
¥è系人", trigger: "blur" }, |
| | | { min: 11, max: 11, message: "请è¾å
¥11ä½è系人çµè¯", trigger: "blur" }, |
| | | ], |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="sass" scoped> |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="800" |
| | | :close-on-click-modal="false" |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | style="max-width: 600px; margin: 0 auto" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | > |
| | | <el-form-item label="å¡è¡" prop="supplierName"> |
| | | <el-input |
| | | v-model="formData.supplierName" |
| | | placeholder="请è¾å
¥ä¾è´§ååç§°" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="纳ç¨äººè¯å«å·" prop="identifyNumber"> |
| | | <el-input |
| | | v-model="formData.identifyNumber" |
| | | placeholder="请è¾å
¥çº³ç¨äººè¯å«å·" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å" prop="address"> |
| | | <el-select v-model="formData.address" placeholder="è¯·éæ©ç»è¥å°å"> |
| | | <el-option label="Zone one" value="shanghai" /> |
| | | <el-option label="Zone two" value="beijing" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="é¶è¡è´¦æ·" prop="bankAccount"> |
| | | <el-input v-model="formData.bankAccount" placeholder="请è¾å
¥é¶è¡è´¦æ·" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="submitForm"> |
| | | ç¡®å® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch ,defineProps } from 'vue' |
| | | |
| | | const props = defineProps({ |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => {} |
| | | }, |
| | | form: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | addOrEdit: { |
| | | type: String, |
| | | default: 'add' |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | }) |
| | | |
| | | const emit = defineEmits(['submit', 'handleBeforeClose','update:customerDialogFormVisible']) |
| | | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(null) |
| | | // è¡¨åæ°æ® |
| | | const formData = ref({ ...props.form }) |
| | | // å¼¹çªå¯è§æ§ |
| | | const dialogVisible = defineModel("customerDialogFormVisible",{required:true,type:Boolean}) |
| | | |
| | | // çå¬å¤é¨ä¼ å
¥çè¡¨åæ°æ®åå |
| | | watch(() => props.form, (newVal) => { |
| | | formData.value = { ...newVal } |
| | | }, { deep: true }) |
| | | |
| | | // çå¬å
é¨å¼¹çªç¶æåå |
| | | watch(() => dialogVisible.value, (newVal) => { |
| | | emit('update:customerDialogFormVisible', newVal) |
| | | }) |
| | | |
| | | // æäº¤è¡¨å |
| | | const submitForm = async () => { |
| | | if (!formRef.value) return |
| | | await formRef.value.validate((valid, fields) => { |
| | | if (valid) { |
| | | emit('submit', formData.value) |
| | | } |
| | | }) |
| | | } |
| | | // åæ¶è¡¨å |
| | | const cancelForm = () => { |
| | | emit('update:customerDialogFormVisible', false) |
| | | formData.value = {} |
| | | } |
| | | // é置表å |
| | | const resetForm = () => { |
| | | if (!formRef.value) return |
| | | formRef.value.resetFields() |
| | | } |
| | | // å
³éå¼¹çª |
| | | const handleClose = () => { |
| | | // 触åç¶ç»ä»¶çå
³é彿° |
| | | emit("handleBeforeClose") |
| | | emit('update:customerDialogFormVisible', false) |
| | | } |
| | | const rules = reactive({ |
| | | supplierName: [ |
| | | { required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur" }, |
| | | ], |
| | | identifyNumber: [ |
| | | { required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | { min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | ], |
| | | address: [ |
| | | { |
| | | required: true, |
| | | message: "è¯·éæ©ç»è¥å°å", |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | bankAccount: [{ required: true, message: "请è¾å
¥é¶è¡è´¦æ·", trigger: "blur" }], |
| | | bank: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contacts: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contactsPhone: [ |
| | | { required: true, message: "请è¾å
¥è系人", trigger: "blur" }, |
| | | { min: 11, max: 11, message: "请è¾å
¥11ä½è系人çµè¯", trigger: "blur" }, |
| | | ], |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="sass" scoped> |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="800" |
| | | :close-on-click-modal="false" |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | style="max-width: 600px; margin: 0 auto" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | > |
| | | <el-form-item label="客æ·åç§°" prop="supplierName"> |
| | | <el-input |
| | | v-model="formData.supplierName" |
| | | placeholder="请è¾å
¥ä¾è´§ååç§°" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="纳ç¨äººè¯å«å·" prop="identifyNumber"> |
| | | <el-input |
| | | v-model="formData.identifyNumber" |
| | | placeholder="请è¾å
¥çº³ç¨äººè¯å«å·" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å" prop="address"> |
| | | <el-select v-model="formData.address" placeholder="è¯·éæ©ç»è¥å°å"> |
| | | <el-option label="Zone one" value="shanghai" /> |
| | | <el-option label="Zone two" value="beijing" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="é¶è¡è´¦æ·" prop="bankAccount"> |
| | | <el-input v-model="formData.bankAccount" placeholder="请è¾å
¥é¶è¡è´¦æ·" /> |
| | | </el-form-item> |
| | | <el-form-item label="弿·è¡" prop="bank"> |
| | | <el-input v-model="formData.bank" placeholder="请è¾å
¥å¼æ·è¡" /> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="contacts"> |
| | | <el-input v-model="formData.contacts" placeholder="请è¾å
¥è系人" /> |
| | | </el-form-item> |
| | | <el-form-item label="è系人çµè¯" prop="contactsPhone"> |
| | | <el-input |
| | | v-model="formData.contactsPhone" |
| | | placeholder="请è¾å
¥è系人çµè¯" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="submitForm"> |
| | | ç¡®å® |
| | | </el-button> |
| | | <el-button v-if="addOrEdit === 'edit'" @click="resetForm">éç½®</el-button> |
| | | <el-button v-if="addOrEdit === 'add'" @click="cancelForm">åæ¶</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch, defineProps } from 'vue' |
| | | |
| | | const props = defineProps({ |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => {} |
| | | }, |
| | | form: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | addOrEdit: { |
| | | type: String, |
| | | default: 'add' |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | }) |
| | | |
| | | const emit = defineEmits(['submit', 'handleBeforeClose']) |
| | | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(null) |
| | | // è¡¨åæ°æ® |
| | | const formData = ref({ ...props.form }) |
| | | // å¼¹çªå¯è§æ§ |
| | | const dialogVisible = defineModel("supplierDialogFormVisible",{required:true,type:Boolean}) |
| | | |
| | | // çå¬å¤é¨ä¼ å
¥çè¡¨åæ°æ®åå |
| | | watch(() => props.form, (newVal) => { |
| | | formData.value = { ...newVal } |
| | | }, { deep: true }) |
| | | |
| | | // çå¬å
é¨å¼¹çªç¶æåå |
| | | watch(() => dialogVisible.value, (newVal) => { |
| | | emit('update:supplierDialogFormVisible', newVal) |
| | | }) |
| | | |
| | | // æäº¤è¡¨å |
| | | const submitForm = async () => { |
| | | if (!formRef.value) return |
| | | await formRef.value.validate((valid, fields) => { |
| | | if (valid) { |
| | | emit('submit', formData.value) |
| | | } |
| | | }) |
| | | } |
| | | // åæ¶è¡¨å |
| | | const cancelForm = () => { |
| | | emit('update:supplierDialogFormVisible', false) |
| | | formData.value = {} |
| | | } |
| | | // é置表å |
| | | const resetForm = () => { |
| | | if (!formRef.value) return |
| | | formRef.value.resetFields() |
| | | } |
| | | // å
³éå¼¹çª |
| | | const handleClose = () => { |
| | | // 触åç¶ç»ä»¶çå
³é彿° |
| | | emit("handleBeforeClose") |
| | | emit('update:supplierDialogFormVisible', false) |
| | | } |
| | | const rules = reactive({ |
| | | supplierName: [ |
| | | { required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur" }, |
| | | ], |
| | | identifyNumber: [ |
| | | { required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | { min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | ], |
| | | address: [ |
| | | { |
| | | required: true, |
| | | message: "è¯·éæ©ç»è¥å°å", |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | bankAccount: [{ required: true, message: "请è¾å
¥é¶è¡è´¦æ·", trigger: "blur" }], |
| | | bank: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contacts: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contactsPhone: [ |
| | | { required: true, message: "请è¾å
¥è系人", trigger: "blur" }, |
| | | { min: 11, max: 11, message: "请è¾å
¥11ä½è系人çµè¯", trigger: "blur" }, |
| | | ], |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="sass" scoped> |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :inline="true" :model="queryParams" class="search-form"> |
| | | <el-form-item label="æç´¢"> |
| | | <el-input |
| | | v-model="queryParams.searchText" |
| | | placeholder="请è¾å
¥å
³é®è¯" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¾åºååç§°"> |
| | | <el-input |
| | | v-model="queryParams.supplierName" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ä¸äººè¯å«å·"> |
| | | <el-input |
| | | v-model="queryParams.identifyNumber" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å"> |
| | | <el-input |
| | | v-model="queryParams.address" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | :style="{ width: '100%' }" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æ¥è¯¢</el-button> |
| | | <el-button @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-card> |
| | | <!-- æä½æé®åº --> |
| | | <el-row :gutter="24" class="table-toolbar"> |
| | | <el-button type="primary" :icon="Plus" @click="handleAdd" |
| | | >æ°å»º</el-button |
| | | > |
| | | <el-button type="danger" :icon="Delete" @click="handleDelete">å é¤</el-button> |
| | | <el-button type="info" :icon="Download" @click="handleExport">导åº</el-button> |
| | | </el-row> |
| | | <!-- è¡¨æ ¼ç»ä»¶ --> |
| | | <data-table |
| | | :loading="loading" |
| | | :table-data="tableData" |
| | | :columns="columns" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="handleEdit" |
| | | @delete="handleDeleteSuccess" |
| | | :show-selection="true" |
| | | :border="true" |
| | | :maxHeight="440" |
| | | /> |
| | | <pagination |
| | | v-if="total>0" |
| | | :page-num="pageNum" |
| | | :page-size="pageSize" |
| | | :total="total" |
| | | @pagination="handleQuery" |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | /> |
| | | </el-card> |
| | | <ProductionDialog |
| | | v-if="total>0" |
| | | v-model:dialogFormVisible="dialogFormVisible" |
| | | :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit" |
| | | @success="handleSuccess" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from "vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue"; |
| | | import DataTable from "@/components/Table/ETable.vue"; |
| | | import Pagination from "@/components/Pagination"; |
| | | import ProductionDialog from "./components/ProductionDialog.vue"; |
| | | const { proxy } = getCurrentInstance() |
| | | |
| | | const dialogFormVisible = ref(false); |
| | | const form = ref({}); |
| | | const title = ref(""); |
| | | // ç¶æåé |
| | | const loading = ref(false); |
| | | const total = ref(0); |
| | | const pageNum = ref(1) |
| | | const pageSize = ref(10); |
| | | const selectedRows = ref([]); |
| | | // æ¥è¯¢åæ° |
| | | const queryParams = reactive({ |
| | | searchText: "", |
| | | supplierName: "", |
| | | identifyNumber: "", |
| | | address: "", |
| | | |
| | | }); |
| | | // æ¯å¦ç¼è¾ |
| | | const addOrEdit = ref("add"); |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([]); |
| | | // æ¹æ³å®ä¹ |
| | | const handleQuery = () => { |
| | | loading.value = true; |
| | | // è¿éæ·»å å®é
çæ¥è¯¢é»è¾ |
| | | setTimeout(() => { |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | |
| | | // supplier ä¾åºåæ°æ® |
| | | const columns = ref([ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minWidth: 200 }, |
| | | { prop: "category", label: "ç
¤ç§", minWidth: 120 }, |
| | | { prop: "unit", label: "åä½", minWidth: 150 }, |
| | | { prop: "purchaseAmount", label: "éè´æ°é", minWidth: 120 }, |
| | | { prop: "priceBeforeTax", label: "åä»·(ç¨å)", minWidth: 150 }, |
| | | { prop: "totalBeforeTax", label: "æ»ä»·(ç¨å)", minWidth: 100 }, |
| | | { prop: "calorificValue", label: "çå¼", minWidth: 150 }, |
| | | { prop: "registrant", label: "ç»è®°äºº", minWidth: 100 }, |
| | | { prop: "registrationDate", label: "ç»è®°æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | |
| | | // éç½®æ¥è¯¢ |
| | | const resetQuery = () => { |
| | | Object.keys(queryParams).forEach((key) => { |
| | | if (key !== "pageNum" && key !== "pageSize") { |
| | | queryParams[key] = ""; |
| | | } |
| | | }); |
| | | handleQuery(); |
| | | }; |
| | | // æ°å¢ |
| | | const handleAdd = () => { |
| | | addOrEdit.value = "add"; |
| | | handleAddEdit(); |
| | | }; |
| | | // æ°å¢ç¼è¾ |
| | | const handleAddEdit = () => { |
| | | addOrEdit.value == "add" ? (title.value = "æ°å¢") : (title.value = "ç¼è¾"); |
| | | title.value = title.value + "éè´ä¿¡æ¯"; |
| | | openDialog(); |
| | | }; |
| | | // æå¼å¼¹çª |
| | | const openDialog = () => { |
| | | if (addOrEdit.value === "edit") { |
| | | dialogFormVisible.value = true; |
| | | return; |
| | | } |
| | | form.value = {}; |
| | | dialogFormVisible.value = true; |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = () => { |
| | | // æ¿å°æäº¤æ°æ® |
| | | dialogFormVisible.value = false; |
| | | getList(); |
| | | }; |
| | | // éæ©è¡ |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | // è¡¨æ ¼ç¼è¾æ¹æ³ |
| | | const handleEdit = (row) => { |
| | | form.value = JSON.parse(JSON.stringify(row)); |
| | | addOrEdit.value = "edit"; |
| | | handleAddEdit() |
| | | }; |
| | | const handleDelete = () => { |
| | | if (selectedRows.value.length === 0) { |
| | | ElMessage.warning("è¯·éæ©è¦å é¤çæ°æ®"); |
| | | return; |
| | | } |
| | | ElMessageBox.confirm( |
| | | `确认å é¤éä¸ç ${selectedRows.value.length} æ¡æ°æ®åï¼`, |
| | | "æç¤º", |
| | | { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | } |
| | | ) |
| | | .then(() => { |
| | | // 模æå é¤æä½ |
| | | tableData.value = tableData.value.filter( |
| | | (item) => !selectedRows.value.includes(item) |
| | | ); |
| | | total.value = tableData.value.length; |
| | | ElMessage.success("å 餿å"); |
| | | }) |
| | | .catch(() => { |
| | | ElMessage.info("已忶å é¤"); |
| | | }); |
| | | } |
| | | const handleDeleteSuccess = (row) => { |
| | | ElMessage.success("å 餿åï¼" + row.supplierName); |
| | | }; |
| | | // å¯¼åº |
| | | const handleExport = (row) => { |
| | | proxy.download("system/post/export", { |
| | | ...queryParams.value |
| | | }, `post_${new Date().getTime()}.xlsx`) |
| | | ElMessage.success("å¯¼åºæ°æ®ï¼" + row.supplierName); |
| | | }; |
| | | // æå |
| | | const handleSuccess = (val) => { |
| | | console.log(val); |
| | | tableData.value.push(val); |
| | | // getList(); |
| | | total.value = tableData.value.length; |
| | | ElMessage.success("æä½æå"); |
| | | }; |
| | | const getList = () => { |
| | | loading.value = true; |
| | | setTimeout(() => { |
| | | tableData.value = [ |
| | | { |
| | | supplierName: "ä¸å½ç³æ²¹åå·¥è¡ä»½æéå
¬å¸", |
| | | category: "ç
¤", |
| | | unit: "å¨", |
| | | purchaseAmount: "1000", |
| | | priceBeforeTax: "100", |
| | | totalBeforeTax: "100000", |
| | | calorificValue: "5000", |
| | | registrant: "å¼ ä¸", |
| | | registrationDate: "2025-01-01", |
| | | }, |
| | | { |
| | | supplierName: "ä¸å½ä¸ç³å", |
| | | category: "ç²¾åç
¤", |
| | | unit: "åå
", |
| | | purchaseAmount: "1000", |
| | | priceBeforeTax: "100", |
| | | totalBeforeTax: "100000", |
| | | calorificValue: "5000", |
| | | registrant: "æå", |
| | | registrationDate: "2025-01-01", |
| | | } |
| | | ] |
| | | total.value = tableData.value.length; |
| | | loading.value = false; |
| | | }, 500); |
| | | }; |
| | | getList(); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .app-container{ |
| | | box-sizing: border-box; |
| | | } |
| | | .search-form { |
| | | background-color: #fff; |
| | | padding: 20px 20px 0 20px; |
| | | margin-bottom: 20px; |
| | | border-radius: 4px; |
| | | box-shadow: var(--el-box-shadow-light); |
| | | } |
| | | .search-form :deep(.el-form-item) { |
| | | margin-bottom: 16px; |
| | | width: 100%; |
| | | } |
| | | |
| | | /* ååºå¼å¸å± */ |
| | | @media screen and (min-width: 768px) { |
| | | .search-form :deep(.el-form-item) { |
| | | width: 50%; |
| | | } |
| | | } |
| | | @media screen and (min-width: 1200px) { |
| | | .search-form :deep(.el-form-item) { |
| | | width: 18%; |
| | | } |
| | | } |
| | | .table-toolbar { |
| | | margin-bottom: 20px; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 10px; |
| | | } |
| | | |
| | | /* ååºå¼è¡¨æ ¼ */ |
| | | @media screen and (max-width: 768px) { |
| | | .table-toolbar { |
| | | flex-direction: column; |
| | | } |
| | | .table-toolbar .el-button { |
| | | width: 100%; |
| | | } |
| | | } |
| | | /* è¡¨æ ¼å·¥å
·æ */ |
| | | .table-toolbar, .table-toolbar > * { |
| | | margin: 0 0 0 0 !important; |
| | | } |
| | | .table-toolbar{ |
| | | margin-bottom: 20px !important; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="production-container"> |
| | | <div class="search-bar"> |
| | | <el-input v-model="searchForm.keyword" placeholder="请è¾å
¥å
³é®è¯" clearable /> |
| | | <el-input v-model="searchForm.addUser" placeholder="请è¾å
¥äºº" clearable /> |
| | | <el-button type="primary" @click="handleSearch">æ¥è¯¢</el-button> |
| | | <el-button @click="handleReset">éç½®</el-button> |
| | | </div> |
| | | |
| | | <div class="operation-bar"> |
| | | <el-button type="primary" @click="handleAdd">æ°å¢é
项</el-button> |
| | | <el-button type="success" @click="handleAddBatch">æ°å¢å å·¥</el-button> |
| | | <el-button type="warning">ä¿®æ¹</el-button> |
| | | <el-button type="danger">å é¤</el-button> |
| | | <el-button type="info">导åº</el-button> |
| | | </div> |
| | | |
| | | <el-table :data="tableData" border style="width: 100%" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" /> |
| | | <el-table-column prop="sequence" label="åºå·" width="80" /> |
| | | <el-table-column prop="category" label="ç
¤ç§" width="120" /> |
| | | <el-table-column prop="unit" label="åä½" width="100" /> |
| | | <el-table-column prop="productionVolume" label="ç产æ°é" width="120" /> |
| | | <el-table-column prop="laborCost" label="äººå·¥ææ¬" width="120" /> |
| | | <el-table-column prop="materialCost" label="åæææ¬" width="120" /> |
| | | <el-table-column prop="equipmentCost" label="设å¤è´¹ç¨" width="120" /> |
| | | <el-table-column prop="totalCost" label="æ»ææ¬" width="120" /> |
| | | <el-table-column prop="totalPrice" label="æ»ææ¬" width="120" /> |
| | | <el-table-column prop="profit" label="婿¶¦" width="100" /> |
| | | <el-table-column prop="reviewer" label="å¤è®°äºº" width="120" /> |
| | | <el-table-column prop="date" label="æ¥æ" width="120" /> |
| | | <el-table-column label="æä½" fixed="right" width="220"> |
| | | <template #default="scope"> |
| | | <el-button type="primary" link @click="handleEdit(scope.row)">ç»è®°</el-button> |
| | | <el-button type="success" link @click="handleEdit(scope.row)">ç¼è¾</el-button> |
| | | <el-button type="danger" link @click="handleDelete(scope.row)">å é¤</el-button> |
| | | <el-button type="warning" link @click="handleExport(scope.row)">导åº</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <div class="pagination"> |
| | | <el-pagination |
| | | v-model:current-page="pagination.currentPage" |
| | | v-model:page-size="pagination.pageSize" |
| | | :page-sizes="[10, 20, 30, 50]" |
| | | :total="pagination.total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | |
| | | <!-- å¼¹çªç»ä»¶ --> |
| | | <ProductionDialog-dialog |
| | | v-model:visible="dialogVisible" |
| | | :type="dialogType" |
| | | :row-data="currentRow" |
| | | @success="handleDialogSuccess" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from 'vue' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import { getProductionList, addProduction, updateProduction, deleteProduction, exportProduction } from '@/api/production' |
| | | import ProductionDialog from './components/ProductionDialog.vue' |
| | | |
| | | // æç´¢è¡¨åæ°æ® |
| | | const searchForm = reactive({ |
| | | keyword: '', |
| | | addUser: '' |
| | | }) |
| | | |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([]) |
| | | const loading = ref(false) |
| | | |
| | | // åé¡µæ°æ® |
| | | const pagination = reactive({ |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | total: 0 |
| | | }) |
| | | |
| | | // éä¸çè¡æ°æ® |
| | | const selectedRows = ref([]) |
| | | |
| | | // å¼¹çªç¸å
³ |
| | | const dialogVisible = ref(false) |
| | | const dialogType = ref('add') |
| | | const currentRow = ref(null) |
| | | |
| | | // è·åè¡¨æ ¼æ°æ® |
| | | const getList = async () => { |
| | | loading.value = true |
| | | try { |
| | | const params = { |
| | | ...searchForm, |
| | | pageNum: pagination.currentPage, |
| | | pageSize: pagination.pageSize |
| | | } |
| | | // const res = await getProductionList(params) |
| | | // åæ°æ® |
| | | const res = { |
| | | data: { |
| | | list: [{ |
| | | sequence: 1, |
| | | category: 'ç
¤ç§', |
| | | unit: 'åä½', |
| | | productionVolume: 'ç产æ°é', |
| | | laborCost: 'äººå·¥ææ¬', |
| | | materialCost: 'åæææ¬', |
| | | equipmentCost: '设å¤è´¹ç¨', |
| | | totalCost: 'æ»ææ¬', |
| | | totalPrice: 'æ»ææ¬', |
| | | profit: '婿¶¦', |
| | | reviewer: 'å¤è®°äºº', |
| | | date: 'æ¥æ' |
| | | }], |
| | | total: 0 |
| | | } |
| | | } |
| | | |
| | | |
| | | tableData.value = res.data.list |
| | | pagination.total = res.data.total |
| | | } catch (error) { |
| | | console.error('è·åæ°æ®å¤±è´¥:', error) |
| | | ElMessage.error('è·åæ°æ®å¤±è´¥') |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | | |
| | | // å¤çè¡¨æ ¼éæ©åå |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection |
| | | } |
| | | |
| | | // æç´¢æ¹æ³ |
| | | const handleSearch = () => { |
| | | pagination.currentPage = 1 |
| | | getList() |
| | | } |
| | | |
| | | // éç½®æç´¢ |
| | | const handleReset = () => { |
| | | searchForm.keyword = '' |
| | | searchForm.addUser = '' |
| | | handleSearch() |
| | | } |
| | | |
| | | // æ°å¢é
项 |
| | | const handleAdd = () => { |
| | | dialogType.value = 'add' |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | // æ°å¢å å·¥ |
| | | const handleAddBatch = () => { |
| | | dialogType.value = 'add' |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | // ç¼è¾ |
| | | const handleEdit = (row) => { |
| | | currentRow.value = row |
| | | dialogType.value = 'edit' |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | // å¤çå¼¹çªæäº¤ |
| | | const handleDialogSuccess = async (formData) => { |
| | | try { |
| | | if (dialogType.value === 'add') { |
| | | await addProduction(formData) |
| | | ElMessage.success('æ°å¢æå') |
| | | } else { |
| | | await updateProduction({ |
| | | ...formData, |
| | | id: currentRow.value.id |
| | | }) |
| | | ElMessage.success('æ´æ°æå') |
| | | } |
| | | getList() |
| | | } catch (error) { |
| | | console.error(dialogType.value === 'add' ? 'æ°å¢å¤±è´¥:' : 'æ´æ°å¤±è´¥:', error) |
| | | ElMessage.error(dialogType.value === 'add' ? 'æ°å¢å¤±è´¥' : 'æ´æ°å¤±è´¥') |
| | | } |
| | | } |
| | | |
| | | // å é¤ |
| | | const handleDelete = (row) => { |
| | | ElMessageBox.confirm('确认å é¤è¯¥è®°å½åï¼', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }).then(async () => { |
| | | try { |
| | | await deleteProduction(row.id) |
| | | ElMessage.success('å 餿å') |
| | | getList() |
| | | } catch (error) { |
| | | console.error('å é¤å¤±è´¥:', error) |
| | | ElMessage.error('å é¤å¤±è´¥') |
| | | } |
| | | }).catch(() => { |
| | | ElMessage.info('已忶å é¤') |
| | | }) |
| | | } |
| | | |
| | | // å¯¼åº |
| | | const handleExport = async (row) => { |
| | | try { |
| | | const res = await exportProduction({ id: row.id }) |
| | | const blob = new Blob([res], { type: 'application/vnd.ms-excel' }) |
| | | const fileName = `ç产å 工记å½_${new Date().getTime()}.xlsx` |
| | | if ('download' in document.createElement('a')) { |
| | | const elink = document.createElement('a') |
| | | elink.download = fileName |
| | | elink.style.display = 'none' |
| | | elink.href = URL.createObjectURL(blob) |
| | | document.body.appendChild(elink) |
| | | elink.click() |
| | | URL.revokeObjectURL(elink.href) |
| | | document.body.removeChild(elink) |
| | | } else { |
| | | navigator.msSaveBlob(blob, fileName) |
| | | } |
| | | } catch (error) { |
| | | console.error('导åºå¤±è´¥:', error) |
| | | ElMessage.error('导åºå¤±è´¥') |
| | | } |
| | | } |
| | | |
| | | // å¤çæ¯é¡µæ¾ç¤ºæ°éåå |
| | | const handleSizeChange = (val) => { |
| | | pagination.pageSize = val |
| | | getList() |
| | | } |
| | | |
| | | // å¤ç页ç åå |
| | | const handleCurrentChange = (val) => { |
| | | pagination.currentPage = val |
| | | getList() |
| | | } |
| | | |
| | | // ç»ä»¶æè½½æ¶å è½½æ°æ® |
| | | onMounted(() => { |
| | | getList() |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .production-container { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .search-bar { |
| | | margin-bottom: 20px; |
| | | display: flex; |
| | | gap: 10px; |
| | | } |
| | | |
| | | .operation-bar { |
| | | margin-bottom: 20px; |
| | | display: flex; |
| | | gap: 10px; |
| | | } |
| | | |
| | | .pagination { |
| | | margin-top: 20px; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | </style> |