From 3d9d458e631d8d6a070d579b2e3e260aea45ac58 Mon Sep 17 00:00:00 2001
From: zhang_12370 <z2864490065@outlook.com>
Date: 星期二, 24 六月 2025 13:54:51 +0800
Subject: [PATCH] 优化文档管理 优化采购管理渲染数据匹配接口字段 上传第一版主页
---
src/views/index.vue | 1605 ++++++++----------------
src/views/production/components/ProductionDetailsTable.vue | 163 +-
src/views/production/components/useDialog.js | 90
src/views/production/index.vue | 91
src/views/archiveManagement/index.vue | 207 +-
src/views/basicInformation/mould/supplier.vue | 74
src/views/production/components/useTableData.js | 236 +-
src/views/basicInformation/mould/customer.vue | 94
src/views/production/components/ProductionDialog.vue | 213 +-
src/views/basicInformation/index.vue | 205 +-
src/views/procureMent/index.vue | 69
src/views/basicInformation/mould/coalMeiZhiZiDuanWeiHu.vue | 56
src/views/archiveManagement/mould/archiveDialog.vue | 77
src/views/procureMent/components/ProductionDialog.vue | 160 +-
src/views/basicInformation/mould/coal.vue | 253 ++-
package.json | 2
src/components/FileUpload/index.vue | 3
src/views/production/components/useCoalData.js | 152 +-
src/views/basicInformation/mould/coalQualityMaintenance.vue | 49
19 files changed, 1,657 insertions(+), 2,142 deletions(-)
diff --git a/package.json b/package.json
index d69c048..822f0f8 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
"axios": "0.28.1",
"clipboard": "2.0.11",
"default-passive-events": "^4.0.0",
- "echarts": "5.5.1",
+ "echarts": "^5.6.0",
"element-china-area-data": "^6.1.0",
"element-plus": "2.7.6",
"file-saver": "2.0.5",
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
index 6801d90..735fc22 100644
--- a/src/components/FileUpload/index.vue
+++ b/src/components/FileUpload/index.vue
@@ -231,10 +231,11 @@
}
// 妗岄潰绔笅杞�
const link = document.createElement("a");
- link.href = url;
+ link.href = file.downloadUrl;
link.download = file.bucketFilename || file.key;
link.click();
};
+
// 涓婁紶鍓嶆牎楠�
const handleBeforeUpload = (file) => {
// 鏍¢獙鏂囦欢鍚嶇壒娈婂瓧绗�
diff --git a/src/views/archiveManagement/index.vue b/src/views/archiveManagement/index.vue
index 7e7c65d..28a4d06 100644
--- a/src/views/archiveManagement/index.vue
+++ b/src/views/archiveManagement/index.vue
@@ -4,84 +4,87 @@
<div class="left-content">
<div class="tree-header">
<h3>鏂囨。绠$悊</h3>
- <el-button type="primary" size="small" @click="append('')" icon="Plus"
- >鏂板</el-button
+ <el-button icon="Plus" size="small" type="primary" @click="append('')"
+ >鏂板
+ </el-button
>
</div>
<!-- 鎼滅储妗� -->
<div class="search-box">
<el-input
- v-model="filterText"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- size="small"
- clearable
- @input="handleFilter"
+ v-model="filterText"
+ clearable
+ placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
+ size="small"
+ @input="handleFilter"
>
<template #prefix>
- <el-icon><Search /></el-icon>
+ <el-icon>
+ <Search/>
+ </el-icon>
</template>
</el-input>
</div>
<div class="tree-container">
<el-tree
- ref="treeRef"
- :data="treeData"
- :props="props"
- :filter-node-method="filterNode"
- :expand-on-click-node="false"
- :default-expand-all="false"
- node-key="id"
- @node-click="handleNodeClick"
- class="custom-tree"
+ ref="treeRef"
+ :data="treeData"
+ :default-expand-all="false"
+ :expand-on-click-node="false"
+ :filter-node-method="filterNode"
+ :props="props"
+ class="custom-tree"
+ node-key="id"
+ @node-click="handleNodeClick"
>
<template #default="{ node, data }">
<div class="tree-node-content" @dblclick="headerDbClick(data)">
<div class="node-icon">
<el-icon
- v-if="!node.isLeaf"
- :class="{ expanded: node.expanded }"
+ v-if="!node.isLeaf"
+ :class="{ expanded: node.expanded }"
>
- <Folder />
+ <Folder/>
</el-icon>
<el-icon v-else>
- <Document />
+ <Document/>
</el-icon>
</div>
<div class="node-label">
<span v-if="!data.isEdit" class="label-text">{{
- node.label
- }}</span>
+ node.label
+ }}</span>
<el-input
- v-else
- :ref="(el) => setInputRef(el, data)"
- placeholder="璇疯緭鍏ヨ妭鐐瑰悕绉�"
- v-model="newName"
- @blur="($event) => handleInputBlur($event, data, node)"
- @keyup.enter="
- ($event) => handleInputBlur($event, data, node)
+ v-else
+ :ref="(el) => setInputRef(el, data)"
+ v-model="newName"
+ autofocus
+ class="tree-input"
+ placeholder="璇疯緭鍏ヨ妭鐐瑰悕绉�"
+ size="small"
+ @blur="(event) => handleInputBlur(event, data, node)"
+ @keyup.enter="
+ (event) => handleInputBlur(event, data, node)
"
- size="small"
- class="tree-input"
- autofocus
/>
</div>
- <div class="node-actions" v-show="!data.isEdit">
+ <div v-show="!data.isEdit" class="node-actions">
<el-button
- link
- size="small"
- @click.stop="append(data)"
- icon="Plus"
- title="鏂板瀛愯妭鐐�"
+ icon="Plus"
+ link
+ size="small"
+ title="鏂板瀛愯妭鐐�"
+ @click.stop="append(data)"
></el-button>
<el-button
- link
- size="small"
- @click.stop="remove(node, data)"
- icon="Delete"
- title="鍒犻櫎"
+ icon="Delete"
+ link
+ size="small"
+ title="鍒犻櫎"
+ @click.stop="remove(node, data)"
></el-button>
</div>
</div>
@@ -92,71 +95,64 @@
</div>
<div class="right">
<el-row :gutter="24">
- <el-col :span="2" :offset="20"
- ><el-button :icon="Delete" type="danger" @click="delHandler">鍒犻櫎</el-button></el-col
+ <el-col :offset="20" :span="2"
+ >
+ <el-button :icon="Delete" type="danger" @click="delHandler">鍒犻櫎</el-button>
+ </el-col
>
<el-col :span="2"
- ><el-button
- :icon="Plus"
- type="primary"
- @click="add"
- :disabled="!tableData.length"
- >鏂板</el-button
- ></el-col
+ >
+ <el-button
+ :disabled="!tableSwitch"
+ :icon="Plus"
+ type="primary"
+ @click="add"
+ >鏂板
+ </el-button
+ >
+ </el-col
>
</el-row>
<ETable
- :maxHeight="1200"
- :loading="loading"
- :table-data="tableData"
- :columns="columns"
- @selection-change="handleSelectionChange"
- @edit="handleEdit"
- :show-selection="true"
- :border="true"
+ :border="true"
+ :columns="columns"
+ :loading="loading"
+ :maxHeight="1200"
+ :show-selection="true"
+ :table-data="tableData"
+ @edit="handleEdit"
+ @selection-change="handleSelectionChange"
>
</ETable>
<Pagination
- :total="total"
- :page="queryParams.current"
- :limit="queryParams.pageSize"
- :show-total="true"
- @pagination="handlePageChange"
- :layout="'total, prev, pager, next, jumper'"
+ :layout="'total, prev, pager, next, jumper'"
+ :limit="queryParams.pageSize"
+ :page="queryParams.current"
+ :show-total="true"
+ :total="total"
+ @pagination="handlePageChange"
></Pagination>
</div>
<archiveDialog
- v-model:centerDialogVisible="dialogVisible"
- @centerDialogVisible="centerDialogVisible"
- :row="row"
- @submitForm="submitForm"
- ref="archiveDialogs"
+ ref="archiveDialogs"
+ v-model:centerDialogVisible="dialogVisible"
+ :row="row"
+ @centerDialogVisible="centerDialogVisible"
+ @submitForm="submitForm"
>
</archiveDialog>
</el-card>
</template>
<script setup>
-import { onMounted, ref, nextTick, reactive } from "vue";
+import {nextTick, onMounted, reactive, ref} from "vue";
import ETable from "@/components/Table/ETable.vue";
-import { ElButton, ElInput, ElIcon, ElMessage } from "element-plus";
+import {ElButton, ElIcon, ElInput, ElMessage} from "element-plus";
import archiveDialog from "./mould/archiveDialog.vue";
import Pagination from "@/components/Pagination/index.vue";
-import {
- Plus,
- Search,
- Folder,
- Document,
- Delete,
-} from "@element-plus/icons-vue";
-import {
- getTree,
- addOrEditTree,
- delTree,
- getArchiveList,
- addOrEditArchive,
- delArchive,
-} from "@/api/archiveManagement";
+import {Delete, Document, Folder, Plus, Search,} from "@element-plus/icons-vue";
+import {addOrEditTree, delArchive, delTree, getArchiveList, getTree,} from "@/api/archiveManagement";
+
const dialogVisible = ref(false); // 鎺у埗褰掓。瀵硅瘽妗嗘樉绀�
const loading = ref(false);
const tableData = ref([]);
@@ -167,9 +163,9 @@
const treeRef = ref(); // 鏍戠粍浠跺紩鐢�
const total = ref(0); // 鎬昏褰曟暟
const columns = [
- { prop: "name", label: "鍚嶇О", minWidth: 180 },
- { prop: "type", label: "绫诲瀷", minWidth: 120 },
- { prop: "status", label: "鐘舵��", minWidth: 100 },
+ {prop: "name", label: "鍚嶇О", minWidth: 180},
+ {prop: "type", label: "绫诲瀷", minWidth: 120},
+ {prop: "status", label: "鐘舵��", minWidth: 100},
];
const selectedRows = reactive([]); // 瀛樺偍閫変腑琛屾暟鎹�
const handleSelectionChange = (selection) => {
@@ -192,7 +188,6 @@
};
const submitForm = async (res) => {
if (res && res.code === 200) {
- ElMessage.success("鎿嶄綔鎴愬姛");
// 鍒锋柊鍒楄〃鏁版嵁
await getArchiveListData();
} else {
@@ -201,8 +196,10 @@
}
const centerDialogVisible = (val) => {
};
+const tableSwitch = ref(false);
// 澶勭悊鑺傜偣鐐瑰嚮
-const handleNodeClick = async (data) => {
+const handleNodeClick = (data) => {
+ tableSwitch.value = true;
// 鍒囨崲鑺傜偣鏃堕噸缃埌绗竴椤�
queryParams.current = 1;
queryParams.treeId = data.id;
@@ -217,7 +214,7 @@
archiveDialogs.value.initForm(); // 閲嶇疆琛ㄥ崟
};
// 澶勭悊鍒嗛〉鍙樺寲
-const handlePageChange = ({ page }) => {
+const handlePageChange = ({page}) => {
queryParams.current = page;
// pageSize 鍥哄畾涓�20锛屼笉鍐嶄粠鍙傛暟涓幏鍙�
getArchiveListData();
@@ -238,7 +235,6 @@
total.value = 0;
return;
}
-
tableData.value = res.data?.records || res.data || [];
total.value = res.data?.total || 0;
// 纭繚鍒嗛〉鍙傛暟姝g‘鏇存柊
@@ -262,7 +258,7 @@
}
try {
const ids = selectedRows.map((row) => row.id);
- const { code, msg } = await delArchive(ids);
+ const {code, msg} = await delArchive(ids);
if (code !== 200) {
ElMessage.warning("鍒犻櫎澶辫触: " + msg);
} else {
@@ -303,6 +299,7 @@
// 澶勭悊杈撳叆妗嗗け鐒�
const handleInputBlur = async (event, comeTreeData, node) => {
if (!comeTreeData.isEdit) return; // 濡傛灉涓嶆槸缂栬緫鐘舵�侊紝鐩存帴杩斿洖
+ console.log("handleInputBlur", event, comeTreeData, node);
if (event.relatedTarget && event.relatedTarget.tagName === "BUTTON") {
return;
}
@@ -344,7 +341,7 @@
if (!data || !data.id) {
return;
}
- let { code, msg } = await delTree([data.id]);
+ let {code, msg} = await delTree([data.id]);
if (code !== 200) {
ElMessage.warning("鍒犻櫎澶辫触, " + msg);
} else {
@@ -378,9 +375,9 @@
const isExpanded = node?.expanded; // 濡傛灉鏈夊瓙绾т笖鏈睍寮�锛屽厛灞曞紑鑺傜偣
if (hasChildren && !isExpanded) {
if (
- treeRef.value &&
- treeRef.value.store &&
- treeRef.value.store.nodesMap[nodeKey]
+ treeRef.value &&
+ treeRef.value.store &&
+ treeRef.value.store.nodesMap[nodeKey]
) {
treeRef.value.store.nodesMap[nodeKey].expanded = true;
}
@@ -439,7 +436,7 @@
}
};
</script>
-<style scoped lang="scss">
+<style lang="scss" scoped>
.custom-tree-node {
flex: 1;
display: flex;
@@ -630,11 +627,13 @@
}
}
}
+
.el-card {
width: calc(100% - 40px);
height: calc(100vh - 130px);
margin: 20px;
box-sizing: border-box;
+
.left {
width: 30%;
height: calc(100vh - 160px);
@@ -651,13 +650,15 @@
flex-direction: column;
}
}
+
.right {
width: 70%;
height: calc(100vh - 160px);
- padding: 0px 10px;
+ padding: 0 10px;
float: left;
}
}
+
.archive-management-card {
margin: 0;
}
diff --git a/src/views/archiveManagement/mould/archiveDialog.vue b/src/views/archiveManagement/mould/archiveDialog.vue
index 793d222..55c359c 100644
--- a/src/views/archiveManagement/mould/archiveDialog.vue
+++ b/src/views/archiveManagement/mould/archiveDialog.vue
@@ -1,28 +1,28 @@
<template>
<el-dialog v-model="centerDialogVisible" title="鏂囨。绠$悊" width="500" center>
<el-form
- ref="ruleFormRef"
- style="max-width: 600px"
- :model="ruleForm"
- :rules="rules"
- label-width="auto"
+ ref="ruleFormRef"
+ style="max-width: 600px"
+ :model="ruleForm"
+ :rules="rules"
+ label-width="auto"
>
<el-form-item label="鍚嶇О" prop="name">
- <el-input v-model="ruleForm.name" placeholder="璇疯緭鍏ユ枃妗e悕绉�" />
+ <el-input v-model="ruleForm.name" placeholder="璇疯緭鍏ユ枃妗e悕绉�"/>
</el-form-item>
<el-form-item label="璇疯緭鍏ユ枃妗g被鍨�" prop="type">
<el-select v-model="ruleForm.type" placeholder="璇疯緭鍏ユ枃妗g被鍨�">
- <el-option label="鍚堝悓" value="鍚堝悓" />
- <el-option label="鎶ュ憡" value="鎶ュ憡" />
+ <el-option label="鍚堝悓" value="鍚堝悓"/>
+ <el-option label="鎶ュ憡" value="鎶ュ憡"/>
</el-select>
</el-form-item>
<el-form-item label="璇疯緭鍏ユ枃妗g姸鎬�" prop="status">
<el-select v-model="ruleForm.status" placeholder="璇疯緭鍏ユ枃妗g姸鎬�">
<el-option
- v-for="option in options"
- :key="option.value"
- :label="option.label"
- :value="option.value"
+ v-for="option in options"
+ :key="option.value"
+ :label="option.label"
+ :value="option.value"
/>
</el-select>
</el-form-item>
@@ -31,26 +31,26 @@
<el-row>
<el-col :span="24" style="text-align: right">
<el-button @click="centerDialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="submit"> 纭� 瀹� </el-button>
+ <el-button type="primary" @click="submit"> 纭� 瀹�</el-button>
</el-col>
</el-row>
</template>
<fileUpload
- ref="fileUploadRef"
- :fileSize="1024"
- :fileType="['pdf', 'docx', 'txt', 'xlsx', 'pptx....']"
- :limit="10"
- :drag="false"
- v-model:modelValue="modelValue"
+ ref="fileUploadRef"
+ :fileSize="1024"
+ :fileType="['pdf', 'docx', 'txt', 'xlsx', 'pptx....']"
+ :limit="10"
+ :drag="false"
+ v-model:modelValue="modelValue"
/>
</el-dialog>
</template>
<script setup>
-import { ref, watch } from "vue";
-import { addOrEditArchive } from "@/api/archiveManagement";
+import {ref, watch, nextTick} from "vue";
+import {addOrEditArchive} from "@/api/archiveManagement";
import fileUpload from "@/components/FileUpload/index.vue";
-import { ElMessage } from "element-plus";
+import {ElMessage} from "element-plus";
const centerDialogVisible = defineModel("centerDialogVisible", {
type: Boolean,
@@ -85,22 +85,24 @@
const copyForm = ref();
// 鐩戝惉 row 鐨勫彉鍖栵紝鏇存柊 ruleForm
watch(
- () => props.row,
- (newRow) => {
- copyForm.value = initFormData(newRow);
- ruleForm.value = JSON.parse(JSON.stringify(copyForm.value));
- },
- { deep: true }
+ () => props.row,
+ (newRow) => {
+ copyForm.value = initFormData(newRow);
+ ruleForm.value = JSON.parse(JSON.stringify(copyForm.value));
+ },
+ {deep: true}
);
const rules = {
- name: [{ required: true, message: "璇疯緭鍏ユ枃妗e悕绉�", trigger: "blur" }],
- type: [{ required: true, message: "璇烽�夋嫨鏂囨。绫诲瀷", trigger: "blur" }],
- status: [{ required: true, message: "璇烽�夋嫨鏂囨。鐘舵��", trigger: "blur" }],
+ name: [{required: true, message: "璇疯緭鍏ユ枃妗e悕绉�", trigger: "blur"}],
+ type: [{required: true, message: "璇烽�夋嫨鏂囨。绫诲瀷", trigger: "blur"}],
+ status: [{required: true, message: "璇烽�夋嫨鏂囨。鐘舵��", trigger: "blur"}],
};
const fileUploadRef = ref(null);
const initForm = () => {
ruleForm.value = {};
- fileUploadRef.value.init();
+ nextTick(() => {
+ fileUploadRef.value.init();
+ });
};
const editForm = (val) => {
ruleForm.value = copyForm.value;
@@ -113,9 +115,9 @@
editForm,
});
const options = [
- { value: "鏈夋晥", label: "鏈夋晥" },
- { value: "鏃犳晥", label: "鏃犳晥" },
- { value: "浣滃簾", label: "浣滃簾" },
+ {value: "鏈夋晥", label: "鏈夋晥"},
+ {value: "鏃犳晥", label: "鏃犳晥"},
+ {value: "浣滃簾", label: "浣滃簾"},
];
const emit = defineEmits(["submitForm", "update:modelValue"]);
const modelValue = ref([]);
@@ -132,10 +134,6 @@
// 璋冪敤 API
try {
const res = await addOrEditArchive(ruleForm.value);
- ElMessage({
- type: "success",
- message: res.msg || "鎿嶄綔鎴愬姛",
- });
emit("submitForm", res);
} catch (error) {
ElMessage({
@@ -147,6 +145,7 @@
// 鍙戦�� emit 浜嬩欢
// 鍏抽棴瀵硅瘽妗�
+ ElMessage.success("鎿嶄綔鎴愬姛");
centerDialogVisible.value = false;
} catch (error) {
ElMessage({
diff --git a/src/views/basicInformation/index.vue b/src/views/basicInformation/index.vue
index fda5d65..21558f7 100644
--- a/src/views/basicInformation/index.vue
+++ b/src/views/basicInformation/index.vue
@@ -1,7 +1,8 @@
<template>
- <div> <el-form :inline="true" :model="queryParams" class="search-form">
- <el-form-item label="鎼滅储" v-if="shouldShowSearch">
- <el-input v-model="queryParams.searchAll" :placeholder="searchPlaceholder" clearable />
+ <div>
+ <el-form :inline="true" :model="queryParams" class="search-form">
+ <el-form-item v-if="shouldShowSearch" label="鎼滅储">
+ <el-input v-model="queryParams.searchAll" :placeholder="searchPlaceholder" clearable/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">鏌ヨ</el-button>
@@ -11,58 +12,62 @@
<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-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" v-show="canExport">瀵煎嚭</el-button>
+ <el-button :icon="Plus" type="primary" @click="handleAdd">鏂板缓</el-button>
+ <el-button :icon="Delete" type="danger" @click="handleDelete">鍒犻櫎</el-button>
+ <el-button @click="jump">admins</el-button>
+ <el-button v-show="canExport" :icon="Download" type="info" @click="handleExport">瀵煎嚭</el-button>
</el-row> <!-- 琛ㄦ牸缁勪欢 -->
<div>
- <data-table :loading="loading" :table-data="tableData" :columns="columns"
- @selection-change="handleSelectionChange" @edit="handleEdit" :show-selection="true" :border="true"> <!-- 瀛楁鍚嶇О鍒楃殑鑷畾涔夋彃妲� - 鏄剧ず涓烘爣绛� -->
+ <data-table :border="true" :columns="columns" :loading="loading"
+ :show-selection="true" :table-data="tableData" @edit="handleEdit" @selection-change="handleSelectionChange">
+ <!-- 瀛楁鍚嶇О鍒楃殑鑷畾涔夋彃妲� - 鏄剧ず涓烘爣绛� -->
<template v-if="tabName === 'coalQualityMaintenance'" #fieldIds="{ row }">
<template v-if="typeof row.fieldIds === 'string' && row.fieldIds.includes(',')">
- <el-tag v-for="(field, index) in row.fieldIds.split(',')" :key="index" type="primary" size="small"
- style="margin-right: 4px; margin-bottom: 2px;">
+ <el-tag v-for="(field, index) in row.fieldIds.split(',')" :key="index" size="small" style="margin-right: 4px; margin-bottom: 2px;"
+ type="primary">
{{ getFieldDisplayName(field.trim()) }}
</el-tag>
</template>
<template v-else>
- <el-tag type="primary" size="small">
+ <el-tag size="small" type="primary">
{{ getFieldDisplayName(row.fieldIds) || '--' }}
</el-tag>
</template>
</template>
</data-table>
</div>
- <pagination v-if="total > 0" :page="pageNum" :limit="pageSizes" :total="total" @pagination="handPagination"
- :layout="'total, prev, pager, next, jumper'" />
+ <pagination v-if="total > 0" :layout="'total, prev, pager, next, jumper'" :limit="pageSizes" :page="pageNum" :total="total"
+ @pagination="handPagination"/>
<Supplier v-if="tabName === 'supplier'" v-model:copyForm="copyForm"
- v-model:supplierDialogFormVisible="dialogFormVisible" :form="form" :title="title" @submit="handleSubmit"
- @beforeClose="handleBeforeClose" @update:dialogFormVisible="handleDialogFormVisible" :addOrEdit="addOrEdit" />
+ v-model:supplierDialogFormVisible="dialogFormVisible" :addOrEdit="addOrEdit" :form="form" :title="title"
+ @beforeClose="handleBeforeClose" @submit="handleSubmit"
+ @update:dialogFormVisible="handleDialogFormVisible"/>
<Customer v-if="tabName === 'customer'" v-model:copyForm="copyForm"
- v-model:customerDialogFormVisible="dialogFormVisible" :form="form" :title="title" @submit="handleSubmit"
- :addOrEdit="addOrEdit" @beforeClose="handleBeforeClose" />
- <Coal v-if="tabName === 'coal'" v-model:copyForm="copyForm" v-model:coalDialogFormVisible="dialogFormVisible"
- :form="form" :title="title" :addOrEdit="addOrEdit" @submit="handleSubmit" />
- <coalQualityMaintenance v-if="tabName === 'coalQualityMaintenance'" v-model:copyForm="copyForm"
- v-model:coalQualityMaintenanceDialogFormVisible="dialogFormVisible" :form="form" :title="title"
- :addOrEdit="addOrEdit" @submit="handleSubmit" />
- <coalMeiZhiZiDuanWeiHu v-if="tabName === 'coalMeiZhiZiDuanWeiHu'" v-model:copyForm="copyForm"
- v-model:coalMaintenanceFieldDialogVisible="dialogFormVisible" :form="form" :title="title" :addOrEdit="addOrEdit"
- @submit="handleSubmit" />
+ v-model:customerDialogFormVisible="dialogFormVisible" :addOrEdit="addOrEdit" :form="form" :title="title"
+ @beforeClose="handleBeforeClose" @submit="handleSubmit"/>
+ <Coal v-if="tabName === 'coal'" v-model:coalDialogFormVisible="dialogFormVisible" v-model:copyForm="copyForm"
+ :addOrEdit="addOrEdit" :form="form" :title="title" @submit="handleSubmit"/>
+ <coalQualityMaintenance v-if="tabName === 'coalQualityMaintenance'" v-model:coalQualityMaintenanceDialogFormVisible="dialogFormVisible"
+ v-model:copyForm="copyForm" :addOrEdit="addOrEdit"
+ :form="form"
+ :title="title" @submit="handleSubmit"/>
+ <coalMeiZhiZiDuanWeiHu v-if="tabName === 'coalMeiZhiZiDuanWeiHu'" v-model:coalMaintenanceFieldDialogVisible="dialogFormVisible"
+ v-model:copyForm="copyForm" :addOrEdit="addOrEdit" :form="form"
+ :title="title"
+ @submit="handleSubmit"/>
</el-card>
</div>
</template>
<script setup>
-// ===== 鏍稿績渚濊禆瀵煎叆 =====
-import { ref, reactive, onMounted, computed, getCurrentInstance } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue";
+import {computed, getCurrentInstance, onMounted, reactive, ref, nextTick} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {Delete, Download, Plus} from "@element-plus/icons-vue";
// ===== 缁勪欢瀵煎叆 =====
import DataTable from "@/components/Table/ETable.vue";
@@ -74,18 +79,20 @@
import coalMeiZhiZiDuanWeiHu from "./mould/coalMeiZhiZiDuanWeiHu.vue";
// ===== API 鏈嶅姟瀵煎叆 =====
-import { getSupply, delSupply } from "@/api/basicInformation/supplier.js";
-import { getCoalInfo, delCoalInfo } from "@/api/basicInformation/coal.js";
-import { testUserList } from "@/api/tool/publicInterface.js";
-import { getAreaOptions } from "@/api/system/area.js";
-import { getCustomerList, delCustomer } from "@/api/basicInformation/customer.js";
-import { coalField, deleteCoalField } from "@/api/basicInformation/coalFieldMaintenance.js";
-import { getCoalFieldList, getCoalPlanList } from "@/api/basicInformation/coalQualityMaintenance";
+import {delSupply, getSupply} from "@/api/basicInformation/supplier.js";
+import {delCoalInfo, getCoalInfo} from "@/api/basicInformation/coal.js";
+import {testUserList} from "@/api/tool/publicInterface.js";
+import {getAreaOptions} from "@/api/system/area.js";
+import {delCustomer, getCustomerList} from "@/api/basicInformation/customer.js";
+import {coalField, deleteCoalField} from "@/api/basicInformation/coalFieldMaintenance.js";
+import {getCoalFieldList, getCoalPlanList} from "@/api/basicInformation/coalQualityMaintenance";
-const { proxy } = getCurrentInstance();
+const {proxy} = getCurrentInstance();
+import router from "@/router";
// ===== 鍝嶅簲寮忕姸鎬佺鐞� =====
-
+const jump = () => {
+};
// 寮圭獥鎺у埗鐘舵��
const dialogFormVisible = ref(false);
const form = ref({});
@@ -124,11 +131,11 @@
// 鏍囩椤甸厤缃�
const tabs = reactive([
- { name: "supplier", label: "渚涘簲鍟嗕俊鎭�" },
- { name: "customer", label: "瀹㈡埛淇℃伅" },
- { name: "coal", label: "鐓ょ淇℃伅" },
- { name: "coalQualityMaintenance", label: "鐓よ川鏂规" },
- { name: "coalMeiZhiZiDuanWeiHu", label: "鐓よ川瀛楁" }
+ {name: "supplier", label: "渚涘簲鍟嗕俊鎭�"},
+ {name: "customer", label: "瀹㈡埛淇℃伅"},
+ {name: "coal", label: "鐓ょ淇℃伅"},
+ {name: "coalQualityMaintenance", label: "鐓よ川鏂规"},
+ {name: "coalMeiZhiZiDuanWeiHu", label: "鐓よ川瀛楁"}
]);
// ===== 宸ュ叿鍑芥暟 =====
@@ -178,18 +185,18 @@
* @description 灏嗗湴鍧�ID鏁扮粍杞崲涓哄彲璇荤殑鍦板潃瀛楃涓�
*/
const formatAddressArray = (addressIds) => {
- if (!addressMap.value || Object.keys(addressMap.value).length === 0 ||
- !addressIds || !Array.isArray(addressIds) || addressIds.length === 0 ||
+ if (!addressMap.value || Object.keys(addressMap.value).length === 0 ||
+ !addressIds || !Array.isArray(addressIds) || addressIds.length === 0 ||
addressIds.every(id => !id)) {
return '--';
}
-
+
const addressNames = addressIds.map(id => addressMap.value[id]?.name || '--');
-
+
if (addressNames.every(name => name === '--')) {
return '--';
}
-
+
return addressNames.filter(name => name !== '--').join(' / ');
};
@@ -217,7 +224,7 @@
*/
const coalFieldData = async () => {
try {
- const { data, code } = await getCoalFieldList();
+ const {data, code} = await getCoalFieldList();
if (code === 200) {
coalFieldList.value = data;
}
@@ -234,10 +241,10 @@
*/
const getFieldDisplayName = (fieldId) => {
if (!fieldId) return '--';
-
+
const numId = parseInt(fieldId);
const matchedField = coalFieldList.value.find(item => item.id === numId);
-
+
return matchedField ? matchedField.fieldName : numId;
};
@@ -256,7 +263,7 @@
const searchPlaceholder = computed(() => {
const placeholderMap = {
supplier: "渚涘簲鍟�/璇嗗埆鐮�/璇︾粏鍦板潃",
- customer: "渚涘簲鍟�/璇嗗埆鐮�/璇︾粏鍦板潃",
+ customer: "渚涘簲鍟�/璇嗗埆鐮�/璇︾粏鍦板潃",
coal: "璇疯緭鍏ユ悳绱俊鎭�",
coalQualityMaintenance: "璇疯緭鍏ユ悳绱俊鎭�",
coalMeiZhiZiDuanWeiHu: "璇疯緭鍏ユ悳绱俊鎭�"
@@ -268,7 +275,7 @@
* 鏄惁鏄剧ず鎼滅储妗�
*/
const shouldShowSearch = computed(() => {
- return ['supplier', 'customer', 'coal', 'coalQualityMaintenance','coalMeiZhiZiDuanWeiHu'].includes(tabName.value);
+ return ['supplier', 'customer', 'coal', 'coalQualityMaintenance', 'coalMeiZhiZiDuanWeiHu'].includes(tabName.value);
});
/**
@@ -287,8 +294,8 @@
* 渚涘簲鍟嗚〃鏍煎垪閰嶇疆
*/
const supplierColumns = ref([
- { prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minWidth: 100 },
- { prop: "taxpayerId", label: "缁熶竴浜鸿瘑鍒彿", minWidth: 170 },
+ {prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minWidth: 100},
+ {prop: "taxpayerId", label: "缁熶竴浜鸿瘑鍒彿", minWidth: 170},
{
prop: "bids",
label: "缁忚惀鍦板潃",
@@ -299,10 +306,10 @@
return formatAddressArray(addressIds);
}
},
- { prop: "businessAddress", label: "缁忚惀璇︾粏鍦板潃", minWidth: 150 },
- { prop: "bankAccount", label: "寮�鎴疯", minWidth: 120 },
- { prop: "bankName", label: "閾惰璐﹀彿", minWidth: 150 },
- { prop: "contactPerson", label: "鑱旂郴浜�", minWidth: 100 },
+ {prop: "businessAddress", label: "缁忚惀璇︾粏鍦板潃", minWidth: 150},
+ {prop: "bankAccount", label: "寮�鎴疯", minWidth: 120},
+ {prop: "bankName", label: "閾惰璐﹀彿", minWidth: 150},
+ {prop: "contactPerson", label: "鑱旂郴浜�", minWidth: 100},
{
prop: "cids",
label: "鑱旂郴浜哄湴鍧�",
@@ -313,16 +320,16 @@
return formatAddressArray(addressIds);
}
},
- { prop: "contactAddress", label: "鑱旂郴浜鸿缁嗗湴鍧�", minWidth: 120 },
- { prop: "updateTime", label: "缁存姢鏃ユ湡", minWidth: 120 },
+ {prop: "contactAddress", label: "鑱旂郴浜鸿缁嗗湴鍧�", minWidth: 120},
+ {prop: "updateTime", label: "缁存姢鏃ユ湡", minWidth: 120},
]);
/**
* 瀹㈡埛琛ㄦ牸鍒楅厤缃�
*/
const customerColumns = ref([
- { prop: "customerName", label: "瀹㈡埛鍚嶇О", minWidth: 100 },
- { prop: "taxpayerId", label: "缁熶竴浜鸿瘑鍒彿", minWidth: 120 },
+ {prop: "customerName", label: "瀹㈡埛鍚嶇О", minWidth: 100},
+ {prop: "taxpayerId", label: "缁熶竴浜鸿瘑鍒彿", minWidth: 120},
{
prop: "bids",
label: "缁忚惀鍦板潃",
@@ -333,11 +340,11 @@
return formatAddressArray(addressIds);
}
},
- { prop: "businessAddress", label: "璇︾粏鍦板潃", minWidth: 150 },
- { prop: "bankName", label: "寮�鎴疯", minWidth: 120 },
- { prop: "bankAccount", label: "閾惰璐﹀彿", minWidth: 150 },
- { prop: "contactPerson", label: "鑱旂郴浜�", minWidth: 100 },
- { prop: "contactPhone", label: "鑱旂郴浜虹數璇�", minWidth: 100 },
+ {prop: "businessAddress", label: "璇︾粏鍦板潃", minWidth: 150},
+ {prop: "bankName", label: "寮�鎴疯", minWidth: 120},
+ {prop: "bankAccount", label: "閾惰璐﹀彿", minWidth: 150},
+ {prop: "contactPerson", label: "鑱旂郴浜�", minWidth: 100},
+ {prop: "contactPhone", label: "鑱旂郴浜虹數璇�", minWidth: 100},
{
prop: "cids",
label: "鑱旂郴浜哄湴鍧�",
@@ -348,15 +355,15 @@
return formatAddressArray(addressIds);
}
},
- { prop: "contactAddress", label: "鑱旂郴浜鸿缁嗗湴鍧�", minWidth: 150 },
- { prop: "updateTime", label: "缁存姢鏃ユ湡", minWidth: 100 },
+ {prop: "contactAddress", label: "鑱旂郴浜鸿缁嗗湴鍧�", minWidth: 150},
+ {prop: "updateTime", label: "缁存姢鏃ユ湡", minWidth: 100},
]);
/**
* 鐓ょ琛ㄦ牸鍒楅厤缃�
*/
const coalColumns = ref([
- { prop: "coal", label: "鐓ょ鍚嶇О", minWidth: 200 },
+ {prop: "coal", label: "鐓ょ鍚嶇О", minWidth: 200},
{
prop: "maintainerId",
label: "缁存姢浜�",
@@ -371,14 +378,14 @@
return userMap.value[cellValue] || '--';
}
},
- { prop: "maintenanceDate", label: "缁存姢鏃ユ湡", minWidth: 150 },
+ {prop: "maintenanceDate", label: "缁存姢鏃ユ湡", minWidth: 150},
]);
/**
* 鐓よ川鏂规琛ㄦ牸鍒楅厤缃�
*/
const coalQualityMaintenanceColumns = ref([
- { prop: "plan", label: "鏂规鍚嶇О", minWidth: 100 },
+ {prop: "plan", label: "鏂规鍚嶇О", minWidth: 100},
{
prop: "fieldIds",
label: "瀛楁鍚嶇О",
@@ -392,15 +399,15 @@
return cellValue || '--';
}
},
- { prop: "schemeDesc", label: "瀛楁鎻忚堪", minWidth: 100 },
+ {prop: "schemeDesc", label: "瀛楁鎻忚堪", minWidth: 100},
]);
/**
* 鐓よ川瀛楁琛ㄦ牸鍒楅厤缃�
*/
const coalMeiZhiZiDuanWeiHuColumns = ref([
- { prop: "fieldName", label: "瀛楁鍚嶇О", minWidth: 200 },
- { prop: "fieldDescription", label: "瀛楁鎻忚堪", minWidth: 200 },
+ {prop: "fieldName", label: "瀛楁鍚嶇О", minWidth: 200},
+ {prop: "fieldDescription", label: "瀛楁鎻忚堪", minWidth: 200},
]);
// ===== 浜嬩欢澶勭悊鍑芥暟 =====
@@ -489,10 +496,10 @@
*/
const handleAddEdit = (currentTabName) => {
const actionText = addOrEdit.value === "add" ? "鏂板" : "缂栬緫";
-
+
const tabTitleMap = {
supplier: "渚涘簲鍟嗕俊鎭�",
- customer: "瀹㈡埛淇℃伅",
+ customer: "瀹㈡埛淇℃伅",
coal: "鐓ょ淇℃伅",
coalQualityMaintenance: "鐓よ川鏂规缁存姢",
coalMeiZhiZiDuanWeiHu: "鐓よ川瀛楁缁存姢"
@@ -561,27 +568,27 @@
*/
const handleEdit = (row) => {
form.value = JSON.parse(JSON.stringify(row));
-
+
// 鏋勫缓渚涘簲鍟嗕笟鍔″湴鍧�鏁扮粍
if (form.value.bprovinceId && form.value.bdistrictId && form.value.bcityId) {
form.value.bids = [row.bprovinceId, row.bcityId, row.bdistrictId];
}
-
+
// 鏋勫缓渚涘簲鍟嗚仈绯诲湴鍧�鏁扮粍
if (form.value.cprovinceId && form.value.cdistrictId && form.value.ccityId) {
form.value.cids = [row.cprovinceId, row.ccityId, row.cdistrictId];
}
-
+
// 鏋勫缓瀹㈡埛涓氬姟鍦板潃鏁扮粍
if (form.value.businessCityId && form.value.businessDistrictId && form.value.businessProvinceId) {
form.value.bids = [row.businessProvinceId, row.businessCityId, row.businessDistrictId];
}
-
+
// 鏋勫缓瀹㈡埛鑱旂郴鍦板潃鏁扮粍
if (form.value.cityId && form.value.districtId && form.value.provinceId) {
form.value.cids = [row.provinceId, row.cityId, row.districtId];
}
-
+
addOrEdit.value = "edit";
handleAddEdit(tabName.value);
};
@@ -597,7 +604,7 @@
}
const deleteIds = selectedRows.value.map(item => item.id);
-
+
try {
await ElMessageBox.confirm("纭畾鍒犻櫎閫変腑鐨勬暟鎹悧锛�", "鎻愮ず", {
confirmButtonText: "纭畾",
@@ -608,7 +615,9 @@
const deleteApiMap = {
supplier: delSupply,
coal: delCoalInfo,
- coalQualityMaintenance: () => { throw new Error('delCoalQuality API not imported'); },
+ coalQualityMaintenance: () => {
+ throw new Error('delCoalQuality API not imported');
+ },
customer: delCustomer,
coalMeiZhiZiDuanWeiHu: deleteCoalField
};
@@ -620,12 +629,12 @@
}
console.log(deleteIds)
const res = await deleteApi(deleteIds);
-
+
if (res.code !== 200 && res.msg !== "鎿嶄綔鎴愬姛") {
ElMessage.error("鍒犻櫎澶辫触锛�" + res.msg);
return;
}
-
+
ElMessage.success("鍒犻櫎鎴愬姛");
await getList();
} catch (error) {
@@ -653,10 +662,10 @@
*/
const handleExport = () => {
const exportConfig = {
- supplier: { api: "/supply/export", name: "渚涘簲鍟嗕俊鎭�" },
- customer: { api: "/customer/export", name: "瀹㈡埛淇℃伅" },
- coal: { api: "/supply/export", name: "鐓ょ淇℃伅" },
- coalQualityMaintenance: { api: "/supply/export", name: "鐓よ川缁存姢淇℃伅" }
+ supplier: {api: "/supply/export", name: "渚涘簲鍟嗕俊鎭�"},
+ customer: {api: "/customer/export", name: "瀹㈡埛淇℃伅"},
+ coal: {api: "/supply/export", name: "鐓ょ淇℃伅"},
+ coalQualityMaintenance: {api: "/supply/export", name: "鐓よ川缁存姢淇℃伅"}
};
const config = exportConfig[tabName.value];
@@ -671,7 +680,7 @@
* @param {string} name - 瀵煎嚭鏂囦欢鍚嶅墠缂�
*/
const exportData = (api, name) => {
- proxy.download(api, { ...queryParams }, `${name}${new Date().getTime()}.xlsx`);
+ proxy.download(api, {...queryParams}, `${name}${new Date().getTime()}.xlsx`);
ElMessage.success("瀵煎嚭鏁版嵁锛�" + name);
};
// ===== 鏁版嵁鑾峰彇鍑芥暟 =====
@@ -707,13 +716,13 @@
const getList = async () => {
try {
loading.value = true;
- const { data, code } = await selectInterface();
-
+ const {data, code} = await selectInterface();
+
if (code !== 200) {
ElMessage.error("鑾峰彇鏁版嵁澶辫触锛�" + (data?.msg || '鏈煡閿欒'));
return;
}
-
+
tableData.value = data.records || [];
total.value = data.total || 0;
} catch (error) {
@@ -733,7 +742,7 @@
try {
// 骞惰鎵ц鍒濆鍖栨搷浣�
await Promise.all([
- handleTabClick({ props: { name: "supplier" } }),
+ handleTabClick({props: {name: "supplier"}}),
fetchAreaOptions(),
getUserList()
]);
@@ -778,7 +787,7 @@
/* 琛ㄦ牸宸ュ叿鏍� */
.table-toolbar,
-.table-toolbar>* {
+.table-toolbar > * {
margin: 0 0 0 0 !important;
}
diff --git a/src/views/basicInformation/mould/coal.vue b/src/views/basicInformation/mould/coal.vue
index a0454a3..36e599e 100644
--- a/src/views/basicInformation/mould/coal.vue
+++ b/src/views/basicInformation/mould/coal.vue
@@ -1,73 +1,77 @@
<template>
- <div>
- <el-dialog
- v-model="dialogVisible"
- :title="title"
- width="500"
- :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="120px"
- >
- <el-form-item label="鐓ょ鍚嶇О" prop="coal">
- <el-input
- v-model="formData.coal"
- placeholder="璇疯緭鍏ョ叅绉嶅悕绉�"
- />
- </el-form-item> <el-form-item label="缁存姢浜哄鍚�" prop="maintainerId">
- <el-input
- :value="userStore.name || ''"
- placeholder="缁存姢浜哄鍚�"
- disabled
- />
- </el-form-item> <el-form-item label="缁存姢鏃ユ湡" prop="maintenanceDate">
- <el-input
- :value="getCurrentDate()"
- placeholder="缁存姢鏃ユ湡"
- disabled
- />
- </el-form-item>
-
- <el-form-item class="dialog-footer">
- <el-button v-if="addOrEdit === 'edit'" @click="resetForm">閲嶇疆</el-button>
- <el-button v-if="addOrEdit === 'add'" @click="cancelForm">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">
- 纭畾
- </el-button>
- </el-form-item>
- </el-form>
- </el-dialog>
- </div>
+ <div>
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="500"
+ :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="120px"
+ >
+ <el-form-item label="鐓ょ鍚嶇О" prop="coal">
+ <el-input
+ v-model="formData.coal"
+ placeholder="璇疯緭鍏ョ叅绉嶅悕绉�"
+ />
+ </el-form-item>
+ <el-form-item label="缁存姢浜哄鍚�" prop="maintainerId">
+ <el-input
+ :value="userStore.name || ''"
+ placeholder="缁存姢浜哄鍚�"
+ disabled
+ />
+ </el-form-item>
+ <el-form-item label="缁存姢鏃ユ湡" prop="maintenanceDate">
+ <el-input
+ :value="getCurrentDate()"
+ placeholder="缁存姢鏃ユ湡"
+ disabled
+ />
+ </el-form-item>
+
+ <el-form-item class="dialog-footer">
+ <el-button v-if="addOrEdit === 'edit'" @click="resetForm">閲嶇疆</el-button>
+ <el-button v-if="addOrEdit === 'add'" @click="cancelForm">鍙栨秷</el-button>
+ <el-button type="primary" @click="submitForm">
+ 纭畾
+ </el-button>
+ </el-form-item>
+ </el-form>
+ </el-dialog>
+ </div>
</template>
<script setup>
-import { ref, watch, defineProps, reactive, onMounted } from 'vue'
-import { addOrEditCoalInfo } from '@/api/basicInformation/coal'
+import {ref, watch, defineProps, reactive, onMounted} from 'vue'
+import {addOrEditCoalInfo} from '@/api/basicInformation/coal'
import useUserStore from '@/store/modules/user'
const userStore = useUserStore()
const props = defineProps({
- beforeClose: {
- type: Function,
- default: () => {}
- },
- form: {
- type: Object,
- default: () => ({})
- },
- addOrEdit: {
- type: String,
- default: 'add'
- },
- title: {
- type: String,
- default: ''
- },
+ beforeClose: {
+ type: Function,
+ default: () => {
+ }
+ },
+ form: {
+ type: Object,
+ default: () => ({})
+ },
+ addOrEdit: {
+ type: String,
+ default: 'add'
+ },
+ title: {
+ type: String,
+ default: ''
+ },
})
const copyForm = defineModel("copyForm", {
required: true,
@@ -75,99 +79,100 @@
});
// 鍦ㄧ粍浠舵寕杞芥椂鑾峰彇鐢ㄦ埛淇℃伅
onMounted(async () => {
- // 濡傛灉store涓病鏈夌敤鎴蜂俊鎭紝鍒欒幏鍙栫敤鎴蜂俊鎭�
- if (!userStore.name) {
- try {
- await userStore.getInfo()
- // 鑷姩濉厖缁存姢浜篒D
- if (props.addOrEdit === 'add') {
- formData.value.maintainerId = userStore.id
- }
- } catch (error) {
- console.error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触:', error)
- }
- } else {
- // 鑷姩濉厖缁存姢浜篒D
- if (props.addOrEdit === 'add') {
- formData.value.maintainerId = userStore.id
- }
+ // 濡傛灉store涓病鏈夌敤鎴蜂俊鎭紝鍒欒幏鍙栫敤鎴蜂俊鎭�
+ if (!userStore.name) {
+ try {
+ await userStore.getInfo()
+ // 鑷姩濉厖缁存姢浜篒D
+ if (props.addOrEdit === 'add') {
+ formData.value.maintainerId = userStore.id
+ }
+ } catch (error) {
+ console.error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触:', error)
}
+ } else {
+ // 鑷姩濉厖缁存姢浜篒D
+ if (props.addOrEdit === 'add') {
+ formData.value.maintainerId = userStore.id
+ }
+ }
})
-const emit = defineEmits(['submit', 'handleBeforeClose','update:coalDialogFormVisible'])
+const emit = defineEmits(['submit', 'handleBeforeClose', 'update:coalDialogFormVisible'])
// 琛ㄥ崟寮曠敤
const formRef = ref(null)
// 琛ㄥ崟鏁版嵁
-const formData = ref({ ...props.form })
+const formData = ref({...props.form})
// 寮圭獥鍙鎬�
-const dialogVisible = defineModel("coalDialogFormVisible",{required:true,type:Boolean})
+const dialogVisible = defineModel("coalDialogFormVisible", {required: true, type: Boolean})
// 鐩戝惉澶栭儴浼犲叆鐨勮〃鍗曟暟鎹彉鍖�
watch(() => props.form, (newVal) => {
- formData.value = { ...newVal }
- // 濡傛灉鏄柊澧炴ā寮忥紝璁剧疆缁存姢浜�
- if (props.addOrEdit === 'add' && userStore.id) {
- formData.value.maintainerId = userStore.id
- }
-}, { deep: true })
+ formData.value = {...newVal}
+ // 濡傛灉鏄柊澧炴ā寮忥紝璁剧疆缁存姢浜�
+ if (props.addOrEdit === 'add' && userStore.id) {
+ formData.value.maintainerId = userStore.id
+ }
+}, {deep: true})
// 鐩戝惉鍐呴儴寮圭獥鐘舵�佸彉鍖�
watch(() => dialogVisible.value, (newVal) => {
- emit('update:coalDialogFormVisible', newVal)
+ emit('update:coalDialogFormVisible', newVal)
})
// 鎻愪氦琛ㄥ崟
const submitForm = async () => {
- if (!formRef.value) return
- await formRef.value.validate(async (valid, fields) => {
- if (valid) {
- delete formData.value.maintainerName // 鍒犻櫎鏄剧ず鐢ㄧ殑瀛楁锛屽彧淇濈暀ID
-
- // 纭繚maintainerId鏈夊��
- if (!formData.value.maintainerId) {
- formData.value.maintainerId = userStore.id
- }
-
- // 璁剧疆缁存姢鏃ユ湡
- formData.value.maintenanceDate = getCurrentDate()
-
- let result = await addOrEditCoalInfo({
- ...formData.value,
- })
- let obj = {
- title: props.title,
- result,
- }
- emit('submit', obj)
- }
- })
+ if (!formRef.value) return
+ await formRef.value.validate(async (valid, fields) => {
+ if (valid) {
+ delete formData.value.maintainerName // 鍒犻櫎鏄剧ず鐢ㄧ殑瀛楁锛屽彧淇濈暀ID
+
+ // 纭繚maintainerId鏈夊��
+ if (!formData.value.maintainerId) {
+ formData.value.maintainerId = userStore.id
+ }
+
+ // 璁剧疆缁存姢鏃ユ湡
+ formData.value.maintenanceDate = getCurrentDate()
+
+ let result = await addOrEditCoalInfo({
+ ...formData.value,
+ })
+ let obj = {
+ title: props.title,
+ result,
+ }
+ emit('submit', obj)
+ }
+ })
}
// 鍙栨秷琛ㄥ崟
const cancelForm = () => {
- emit('update:coalDialogFormVisible', false)
- formData.value = {}
+ emit('update:coalDialogFormVisible', false)
+ formData.value = {}
}
// 閲嶇疆琛ㄥ崟
const resetForm = () => {
- if (!formRef.value) return
+ if (!formRef.value) return
formData.value = JSON.parse(JSON.stringify(copyForm.value));
- // formRef.value.resetFields()
+ // formRef.value.resetFields()
}
// 鍏抽棴寮圭獥
const handleClose = () => {
- // 瑙﹀彂鐖剁粍浠剁殑鍏抽棴鍑芥暟
- emit("handleBeforeClose")
- emit('update:coalDialogFormVisible', false)
+ // 瑙﹀彂鐖剁粍浠剁殑鍏抽棴鍑芥暟
+ emit("handleBeforeClose")
+ emit('update:coalDialogFormVisible', false)
}
const rules = reactive({
supplierName: [
- { required: true, message: "璇疯緭鍏ヤ緵璐у晢鍚嶇О", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ヤ緵璐у晢鍚嶇О", trigger: "blur"},
],
identifyNumber: [
- { required: true, message: "璇锋纭緭鍏ョ撼绋庝汉璇嗗埆鍙�", trigger: "blur" },
- { min: 17, max: 20, message: "璇疯緭鍏�17-20浣嶇撼绋庝汉璇嗗埆鍙�", trigger: "blur" },
+ {required: true, message: "璇锋纭緭鍏ョ撼绋庝汉璇嗗埆鍙�", trigger: "blur"},
+ {min: 17, max: 20, message: "璇疯緭鍏�17-20浣嶇撼绋庝汉璇嗗埆鍙�", trigger: "blur"},
],
});
+
// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
function getCurrentDate() {
const today = new Date();
@@ -180,9 +185,9 @@
<style lang="scss" scoped>
.dialog-footer {
- display: flex;
- margin-top: 20px;
- flex-direction: column;
- align-items: flex-end;
+ display: flex;
+ margin-top: 20px;
+ flex-direction: column;
+ align-items: flex-end;
}
</style>
\ No newline at end of file
diff --git a/src/views/basicInformation/mould/coalMeiZhiZiDuanWeiHu.vue b/src/views/basicInformation/mould/coalMeiZhiZiDuanWeiHu.vue
index c7de9c3..8dddf2b 100644
--- a/src/views/basicInformation/mould/coalMeiZhiZiDuanWeiHu.vue
+++ b/src/views/basicInformation/mould/coalMeiZhiZiDuanWeiHu.vue
@@ -1,35 +1,38 @@
<template>
<div>
<el-dialog
- v-model="dialogVisible"
- :title="title"
- width="600"
- :close-on-click-modal="false"
- :before-close="handleClose"
+ v-model="dialogVisible"
+ :title="title"
+ width="600"
+ :close-on-click-modal="false"
+ :before-close="handleClose"
>
<el-form
- ref="formRef"
- style="max-width: 400px; margin: 0 auto"
- :model="formData"
- :rules="rules"
- label-width="auto"
+ ref="formRef"
+ style="max-width: 400px; margin: 0 auto"
+ :model="formData"
+ :rules="rules"
+ label-width="auto"
>
<el-form-item label="瀛楁鍚嶇О" prop="fieldName">
<el-input
- v-model="formData.fieldName"
- placeholder="璇疯緭鍏ュ瓧娈靛悕绉�"
+ v-model="formData.fieldName"
+ placeholder="璇疯緭鍏ュ瓧娈靛悕绉�"
/>
- </el-form-item> <el-form-item label="瀛楁鎻忚堪" prop="fieldDescription">
- <el-input v-model="formData.fieldDescription" type="textarea" placeholder="璇疯緭鍏ュ瓧娈垫弿杩�" />
+ </el-form-item>
+ <el-form-item label="瀛楁鎻忚堪" prop="fieldDescription">
+ <el-input v-model="formData.fieldDescription" type="textarea" placeholder="璇疯緭鍏ュ瓧娈垫弿杩�"/>
</el-form-item>
<el-form-item class="dialog-footer">
<el-button v-if="addOrEdit === 'edit'" @click="resetForm"
- >閲嶇疆</el-button
+ >閲嶇疆
+ </el-button
>
<el-button v-if="addOrEdit === 'add'" @click="cancelForm"
- >鍙栨秷</el-button
+ >鍙栨秷
+ </el-button
>
- <el-button type="primary" @click="submitForm"> 纭畾 </el-button>
+ <el-button type="primary" @click="submitForm"> 纭畾</el-button>
</el-form-item>
</el-form>
</el-dialog>
@@ -37,8 +40,9 @@
</template>
<script setup>
-import { ref, reactive, watch, defineProps } from "vue";
-import { addOrEditCoalField } from "@/api/basicInformation/coalFieldMaintenance.js";
+import {ref, reactive, watch, defineProps} from "vue";
+import {addOrEditCoalField} from "@/api/basicInformation/coalFieldMaintenance.js";
+
const props = defineProps({
form: {
type: Object,
@@ -61,12 +65,12 @@
const formRef = ref();
const emit = defineEmits(["submit", "handleBeforeClose"]);
// 琛ㄥ崟鏁版嵁
-const formData = ref({ ...props.form });
+const formData = ref({...props.form});
// 鐩戝惉props.form鐨勫彉鍖栵紝鏇存柊formData
watch(() => props.form, (newForm) => {
- formData.value = { ...newForm };
-}, { deep: true, immediate: true });
+ formData.value = {...newForm};
+}, {deep: true, immediate: true});
// 寮圭獥鍙鎬�
const dialogVisible = defineModel("coalMaintenanceFieldDialogVisible", {
required: true,
@@ -82,8 +86,8 @@
console.log("鎻愪氦琛ㄥ崟", formData.value);
if (props.title.includes('鏂板')) {
let result = await addOrEditCoalField(
- {...formData.value}
- ,)
+ {...formData.value}
+ ,)
console.log(result);
obj.value = {
title: "鏂板",
@@ -111,7 +115,7 @@
};
// 閲嶇疆琛ㄥ崟
const resetForm = () => {
- if (!formRef.value) return
+ if (!formRef.value) return
formData.value = JSON.parse(JSON.stringify(copyForm.value));
}
// 鍏抽棴寮圭獥
@@ -122,7 +126,7 @@
};
const rules = reactive({
fieldName: [
- { required: true, message: "璇疯緭鍏ョ叅绉嶅悕绉�", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ョ叅绉嶅悕绉�", trigger: "blur"},
],
});
</script>
diff --git a/src/views/basicInformation/mould/coalQualityMaintenance.vue b/src/views/basicInformation/mould/coalQualityMaintenance.vue
index 64373b0..1b3d911 100644
--- a/src/views/basicInformation/mould/coalQualityMaintenance.vue
+++ b/src/views/basicInformation/mould/coalQualityMaintenance.vue
@@ -1,25 +1,26 @@
<!-- 鐓よ川鏂规缁存姢寮圭獥缁勪欢 -->
<template>
<el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false"
- :before-close="handleClose">
+ :before-close="handleClose">
<!-- 琛ㄥ崟鍖哄煙 -->
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px"
- style="max-width: 400px; margin: 0 auto">
+ style="max-width: 400px; margin: 0 auto">
<!-- 鏂规鍚嶇О杈撳叆妗� -->
<el-form-item label="鐓よ川鏂规鍚嶇О" prop="plan">
- <el-input v-model="formData.plan" placeholder="璇疯緭鍏ョ叅璐ㄦ柟妗堝悕绉�" clearable />
+ <el-input v-model="formData.plan" placeholder="璇疯緭鍏ョ叅璐ㄦ柟妗堝悕绉�" clearable/>
</el-form-item>
<!-- 鐓よ川瀛楁澶氶�変笅鎷夋 -->
<el-form-item label="鐓よ川鏂规绫诲瀷" prop="coalFieldList">
- <el-select v-model="formData.coalFieldList" placeholder="璇烽�夋嫨鐓よ川鏂规绫诲瀷" style="width: 100%" clearable multiple>
- <el-option v-for="item in fieldOptions" :key="item.id" :label="item.label" :value="item" />
+ <el-select v-model="formData.coalFieldList" placeholder="璇烽�夋嫨鐓よ川鏂规绫诲瀷" style="width: 100%" clearable
+ multiple>
+ <el-option v-for="item in fieldOptions" :key="item.id" :label="item.label" :value="item"/>
</el-select>
</el-form-item>
<!-- 鏂规鎻忚堪鏂囨湰鍩� -->
<el-form-item label="鐓よ川鏂规鎻忚堪" prop="schemeDesc">
- <el-input v-model="formData.schemeDesc" type="textarea" placeholder="璇疯緭鍏ョ叅璐ㄦ柟妗堟弿杩�" :rows="3" />
+ <el-input v-model="formData.schemeDesc" type="textarea" placeholder="璇疯緭鍏ョ叅璐ㄦ柟妗堟弿杩�" :rows="3"/>
</el-form-item>
<!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
@@ -32,15 +33,16 @@
</el-dialog>
</template>
<script setup>
-import { ref, reactive, watch, computed, onMounted } from "vue";
-import { getCoalFieldList, addOrEditCoalPlan } from "@/api/basicInformation/coalQualityMaintenance";
+import {ref, reactive, watch, computed, onMounted} from "vue";
+import {getCoalFieldList, addOrEditCoalPlan} from "@/api/basicInformation/coalQualityMaintenance";
// ===== 缁勪欢灞炴�у畾涔� =====
const props = defineProps({
/** 鍏抽棴寮圭獥鍓嶇殑鍥炶皟鍑芥暟 */
beforeClose: {
type: Function,
- default: () => { },
+ default: () => {
+ },
},
/** 琛ㄥ崟鏁版嵁 */
form: {
@@ -58,7 +60,10 @@
default: "",
},
});
-
+const copyForm = defineModel("copyForm", {
+ required: true,
+ type: Object,
+});
// ===== 浜嬩欢瀹氫箟 =====
const emit = defineEmits(["submit", "handleBeforeClose"]);
@@ -85,10 +90,10 @@
// ===== 琛ㄥ崟楠岃瘉瑙勫垯 =====
const formRules = reactive({
plan: [
- { required: true, message: "璇疯緭鍏ユ柟妗堝悕绉�", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ユ柟妗堝悕绉�", trigger: "blur"},
],
coalFieldList: [
- { required: true, message: "璇烽�夋嫨鏂规绫诲瀷", trigger: "blur" },
+ {required: true, message: "璇烽�夋嫨鏂规绫诲瀷", trigger: "blur"},
],
});
@@ -99,9 +104,9 @@
const parseCoalFields = (coalFieldsStr) => {
if (!coalFieldsStr || typeof coalFieldsStr !== 'string') return [];
return coalFieldsStr
- .split(',')
- .map(id => parseInt(id.trim()))
- .filter(id => !isNaN(id));
+ .split(',')
+ .map(id => parseInt(id.trim()))
+ .filter(id => !isNaN(id));
};
/**
@@ -117,7 +122,7 @@
* @param {Object} newForm - 鏂扮殑琛ㄥ崟鏁版嵁
*/
const initFormData = (newForm) => {
- formData.value = { ...newForm };
+ formData.value = {...newForm};
// 澶勭悊 coalFieldList 瀛楁锛氱紪杈戞椂闇�瑕佸皢瀛楃涓茶浆鎹负鏁扮粍渚涘閫夌粍浠朵娇鐢�
if (newForm.fieldIds) {
if (typeof newForm.fieldIds === 'string') {
@@ -125,7 +130,7 @@
const ids = parseCoalFields(newForm.fieldIds);
formData.value.coalFieldList = ids.map(id => {
const option = fieldOptions.find(opt => opt.value === id);
- return option || { fields: `瀛楁${id}`, value: id };
+ return option || {fields: `瀛楁${id}`, value: id};
});
} else if (Array.isArray(newForm.coalFieldList)) {
// 纭繚鏁扮粍涓殑鍊奸兘鏄纭殑瀵硅薄鏍煎紡
@@ -136,7 +141,7 @@
// 濡傛灉鏄函ID锛岄渶瑕佸尮閰嶅搴旂殑閫夐」
const id = parseInt(item);
const option = fieldOptions.find(opt => opt.value === id);
- return option || { fields: `瀛楁${id}`, value: id };
+ return option || {fields: `瀛楁${id}`, value: id};
}
});
}
@@ -152,13 +157,13 @@
*/
onMounted(async () => {
try {
- const { data, code } = await getCoalFieldList();
+ const {data, code} = await getCoalFieldList();
if (code === 200) {
// 鏋勫缓閫夐」鏁版嵁锛屾牸寮忓寲涓簕 label, value }
fieldOptions.push(...data.map(item => ({
label: item.fieldName,
value: item.id,
- fields:item.fields
+ fields: item.fields
})));
} else {
console.error("鑾峰彇鐓よ川瀛楁鍒楄〃澶辫触", data);
@@ -248,8 +253,8 @@
* 閲嶇疆琛ㄥ崟
*/
const resetForm = () => {
- if (!formRef.value) return;
- formRef.value.resetFields();
+ formData.value = JSON.parse(JSON.stringify(copyForm.value));
+ initFormData(formData.value);
};
/**
diff --git a/src/views/basicInformation/mould/customer.vue b/src/views/basicInformation/mould/customer.vue
index 0aa5a62..db4d96b 100644
--- a/src/views/basicInformation/mould/customer.vue
+++ b/src/views/basicInformation/mould/customer.vue
@@ -1,44 +1,47 @@
<template>
<div>
<el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false"
- :before-close="handleClose">
- <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" label-width="auto">
+ :before-close="handleClose">
+ <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules"
+ label-width="auto">
<el-form-item label="瀹㈡埛鍚嶇О" prop="customerName">
- <el-input v-model="formData.customerName" placeholder="璇疯緭鍏ュ鎴峰悕绉�" />
+ <el-input v-model="formData.customerName" placeholder="璇疯緭鍏ュ鎴峰悕绉�"/>
</el-form-item>
<el-form-item label="绾崇◣浜鸿瘑鍒彿" prop="taxpayerId">
- <el-input v-model="formData.taxpayerId" placeholder="璇疯緭鍏ョ撼绋庝汉璇嗗埆鍙�" />
+ <el-input v-model="formData.taxpayerId" placeholder="璇疯緭鍏ョ撼绋庝汉璇嗗埆鍙�"/>
</el-form-item>
<el-form-item label="缁忚惀鍦板潃" prop="bids">
- <el-cascader placeholder="璇烽�夋嫨缁忚惀鍦板潃" size="default" :options="addressSelectOptions" v-model="formData.bids"
- :props="cascaderProps" @change="handleChange">
+ <el-cascader placeholder="璇烽�夋嫨缁忚惀鍦板潃" size="default" :options="addressSelectOptions"
+ v-model="formData.bids"
+ :props="cascaderProps" @change="handleChange">
</el-cascader>
</el-form-item>
<el-form-item label="缁忚惀璇︾粏鍦板潃" prop="businessAddress">
- <el-input v-model="formData.businessAddress" placeholder="璇疯緭鍏ョ粡钀ヨ缁嗗湴鍧�" />
+ <el-input v-model="formData.businessAddress" placeholder="璇疯緭鍏ョ粡钀ヨ缁嗗湴鍧�"/>
</el-form-item>
<el-form-item label="寮�鎴疯" prop="bankName">
- <el-input v-model="formData.bankName" placeholder="璇疯緭鍏ュ紑鎴疯" />
+ <el-input v-model="formData.bankName" placeholder="璇疯緭鍏ュ紑鎴疯"/>
</el-form-item>
<el-form-item label="閾惰璐︽埛" prop="bankAccount">
- <el-input v-model="formData.bankAccount" placeholder="璇疯緭鍏ラ摱琛岃处鎴�" />
+ <el-input v-model="formData.bankAccount" placeholder="璇疯緭鍏ラ摱琛岃处鎴�"/>
</el-form-item>
<el-form-item label="鑱旂郴浜�" prop="contactPerson">
- <el-input v-model="formData.contactPerson" placeholder="璇疯緭鍏ヨ仈绯讳汉" />
+ <el-input v-model="formData.contactPerson" placeholder="璇疯緭鍏ヨ仈绯讳汉"/>
</el-form-item>
<el-form-item label="鑱旂郴鐢佃瘽" prop="contactPhone">
- <el-input v-model="formData.contactPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
+ <el-input v-model="formData.contactPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�"/>
</el-form-item>
-
+
<el-form-item label="鑱旂郴浜哄湴鍧�" prop="cids">
- <el-cascader placeholder="璇烽�夋嫨鑱旂郴浜哄湴鍧�" size="default" :options="addressSelectOptions" v-model="formData.cids"
- :props="cascaderProps" @change="handleChange">
+ <el-cascader placeholder="璇烽�夋嫨鑱旂郴浜哄湴鍧�" size="default" :options="addressSelectOptions"
+ v-model="formData.cids"
+ :props="cascaderProps" @change="handleChange">
</el-cascader>
</el-form-item>
<el-form-item label="鑱旂郴浜鸿缁�" prop="contactAddress">
- <el-input v-model="formData.contactAddress" placeholder="璇疯緭鍏ヨ仈绯讳汉璇︾粏鍦板潃" />
+ <el-input v-model="formData.contactAddress" placeholder="璇疯緭鍏ヨ仈绯讳汉璇︾粏鍦板潃"/>
</el-form-item>
- <el-form-item class="dialog-footer">
+ <el-form-item class="dialog-footer">
<el-button v-if="addOrEdit === 'edit'" @click="resetForm">閲嶇疆</el-button>
<el-button v-if="addOrEdit === 'add'" @click="cancelForm">鍙栨秷</el-button>
<el-button type="primary" @click="submitForm">
@@ -51,15 +54,16 @@
</template>
<script setup>
-import { ref, watch, onMounted } from "vue";
-import { getAreaOptions } from "@/api/system/area.js";
+import {ref, watch, onMounted} from "vue";
+import {getAreaOptions} from "@/api/system/area.js";
import addressList from "@/api/jsonApi/areaList.json";
-import { addOrEditCustomer } from "@/api/basicInformation/customer";
+import {addOrEditCustomer} from "@/api/basicInformation/customer";
const props = defineProps({
beforeClose: {
type: Function,
- default: () => { },
+ default: () => {
+ },
},
form: {
type: Object,
@@ -111,7 +115,7 @@
// 琛ㄥ崟寮曠敤
const formRef = ref(null);
// 琛ㄥ崟鏁版嵁
-const formData = ref({ ...props.form });
+const formData = ref({...props.form});
// 寮圭獥鍙鎬�
const dialogVisible = defineModel("customerDialogFormVisible", {
required: true,
@@ -120,26 +124,26 @@
// 鐩戝惉澶栭儴浼犲叆鐨勮〃鍗曟暟鎹彉鍖�
watch(
- () => props.form,
- (newVal) => {
- formData.value = { ...newVal };
- },
- { deep: true }
+ () => props.form,
+ (newVal) => {
+ formData.value = {...newVal};
+ },
+ {deep: true}
);
watch(
- () => props.form,
- (newVal) => {
- formData.value = { ...newVal };
- },
- { deep: true }
+ () => props.form,
+ (newVal) => {
+ formData.value = {...newVal};
+ },
+ {deep: true}
);
// 鐩戝惉鍐呴儴寮圭獥鐘舵�佸彉鍖�
watch(
- () => dialogVisible.value,
- (newVal) => {
- emit("update:customerDialogFormVisible", newVal);
- }
+ () => dialogVisible.value,
+ (newVal) => {
+ emit("update:customerDialogFormVisible", newVal);
+ }
);
// 鎻愪氦琛ㄥ崟
@@ -191,11 +195,11 @@
};
const rules = reactive({
customerName: [
- { required: true, message: "璇疯緭鍏ヤ緵璐у晢鍚嶇О", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ヤ緵璐у晢鍚嶇О", trigger: "blur"},
],
taxpayerId: [
- { required: true, message: "璇锋纭緭鍏ョ撼绋庝汉璇嗗埆鍙�", trigger: "blur" },
- { min: 17, max: 20, message: "璇疯緭鍏�17-20浣嶇撼绋庝汉璇嗗埆鍙�", trigger: "blur" },
+ {required: true, message: "璇锋纭緭鍏ョ撼绋庝汉璇嗗埆鍙�", trigger: "blur"},
+ {min: 17, max: 20, message: "璇疯緭鍏�17-20浣嶇撼绋庝汉璇嗗埆鍙�", trigger: "blur"},
],
address: [
{
@@ -204,14 +208,14 @@
trigger: "change",
},
],
- bankAccount: [{ required: true, message: "璇疯緭鍏ラ摱琛岃处鎴�", trigger: "blur" }],
- bankName: [{ required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur" }],
- contactPerson: [{ required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur" }],
- cids: [{ required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur" }],
- bids: [{ required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur" }],
+ bankAccount: [{required: true, message: "璇疯緭鍏ラ摱琛岃处鎴�", trigger: "blur"}],
+ bankName: [{required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur"}],
+ contactPerson: [{required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur"}],
+ cids: [{required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur"}],
+ bids: [{required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur"}],
contactPhone: [
- { required: true, message: "璇疯緭鍏ヨ仈绯讳汉", trigger: "blur" },
- { min: 11, max: 11, message: "璇疯緭鍏�11浣嶈仈绯讳汉鐢佃瘽", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ヨ仈绯讳汉", trigger: "blur"},
+ {min: 11, max: 11, message: "璇疯緭鍏�11浣嶈仈绯讳汉鐢佃瘽", trigger: "blur"},
],
});
</script>
diff --git a/src/views/basicInformation/mould/supplier.vue b/src/views/basicInformation/mould/supplier.vue
index 15ac14d..88a2192 100644
--- a/src/views/basicInformation/mould/supplier.vue
+++ b/src/views/basicInformation/mould/supplier.vue
@@ -1,41 +1,44 @@
<template>
<div>
<el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false"
- :before-close="handleClose">
- <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" label-width="auto">
+ :before-close="handleClose">
+ <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules"
+ label-width="auto">
<el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
- <el-input v-model="formData.supplierName" placeholder="璇疯緭鍏ヤ緵璐у晢鍚嶇О" />
+ <el-input v-model="formData.supplierName" placeholder="璇疯緭鍏ヤ緵璐у晢鍚嶇О"/>
</el-form-item>
<el-form-item label="绾崇◣浜鸿瘑鍒彿" prop="taxpayerId">
- <el-input v-model="formData.taxpayerId" placeholder="璇疯緭鍏ョ撼绋庝汉璇嗗埆鍙�" />
+ <el-input v-model="formData.taxpayerId" placeholder="璇疯緭鍏ョ撼绋庝汉璇嗗埆鍙�"/>
</el-form-item>
<el-form-item label="缁忚惀鍦板潃" prop="bids">
- <el-cascader placeholder="璇烽�夋嫨缁忚惀鍦板潃" size="default" :options="addressSelectOptions" v-model="formData.bids"
- :props="cascaderProps" @change="handleChange">
+ <el-cascader placeholder="璇烽�夋嫨缁忚惀鍦板潃" size="default" :options="addressSelectOptions"
+ v-model="formData.bids"
+ :props="cascaderProps" @change="handleChange">
</el-cascader>
</el-form-item>
<el-form-item label="璇︾粏鍦板潃" prop="businessAddress">
- <el-input v-model="formData.businessAddress" placeholder="璇疯緭鍏ュ鎴疯缁嗗湴鍧�" />
+ <el-input v-model="formData.businessAddress" placeholder="璇疯緭鍏ュ鎴疯缁嗗湴鍧�"/>
</el-form-item>
<el-form-item label="寮�鎴疯" prop="bankAccount">
- <el-input v-model="formData.bankAccount" placeholder="璇疯緭鍏ュ紑鎴疯" />
+ <el-input v-model="formData.bankAccount" placeholder="璇疯緭鍏ュ紑鎴疯"/>
</el-form-item>
<el-form-item label="閾惰璐︽埛" prop="bankName">
- <el-input v-model="formData.bankName" placeholder="璇疯緭鍏ラ摱琛岃处鎴�" />
+ <el-input v-model="formData.bankName" placeholder="璇疯緭鍏ラ摱琛岃处鎴�"/>
</el-form-item>
<el-form-item label="鑱旂郴浜�" prop="contactPerson">
- <el-input v-model="formData.contactPerson" placeholder="璇疯緭鍏ヨ仈绯讳汉" />
+ <el-input v-model="formData.contactPerson" placeholder="璇疯緭鍏ヨ仈绯讳汉"/>
</el-form-item>
<el-form-item label="鑱旂郴浜虹數璇�" prop="contactPhone">
- <el-input v-model="formData.contactPhone" placeholder="璇疯緭鍏ヨ仈绯讳汉鐢佃瘽" />
+ <el-input v-model="formData.contactPhone" placeholder="璇疯緭鍏ヨ仈绯讳汉鐢佃瘽"/>
</el-form-item>
<el-form-item label="鑱旂郴浜哄湴鍧�" prop="cids">
- <el-cascader placeholder="璇烽�夋嫨鑱旂郴浜哄湴鍧�" size="default" :options="addressSelectOptions" v-model="formData.cids"
- :props="cascaderProps" @change="handleChange">
+ <el-cascader placeholder="璇烽�夋嫨鑱旂郴浜哄湴鍧�" size="default" :options="addressSelectOptions"
+ v-model="formData.cids"
+ :props="cascaderProps" @change="handleChange">
</el-cascader>
</el-form-item>
<el-form-item label="鑱旂郴浜鸿缁嗗湴鍧�" prop="contactAddress">
- <el-input v-model="formData.contactAddress" placeholder="璇疯緭鍏ヨ仈绯讳汉鍦板潃" />
+ <el-input v-model="formData.contactAddress" placeholder="璇疯緭鍏ヨ仈绯讳汉鍦板潃"/>
</el-form-item>
<el-form-item class="dialog-footer">
<el-button v-if="addOrEdit === 'edit'" @click="resetForm">閲嶇疆</el-button>
@@ -48,9 +51,9 @@
</template>
<script setup>
-import { ref, watch, defineProps, onMounted } from "vue";
-import { addOrEditSupply } from "@/api/basicInformation/supplier";
-import { getAreaOptions } from "@/api/system/area.js";
+import {ref, watch, defineProps, onMounted} from "vue";
+import {addOrEditSupply} from "@/api/basicInformation/supplier";
+import {getAreaOptions} from "@/api/system/area.js";
const props = defineProps({
beforeClose: {
@@ -111,7 +114,7 @@
// 琛ㄥ崟寮曠敤
const formRef = ref(null);
// 琛ㄥ崟鏁版嵁
-const formData = ref({ ...props.form });
+const formData = ref({...props.form});
// 寮圭獥鍙鎬�
const dialogVisible = defineModel("supplierDialogFormVisible", {
required: true,
@@ -119,19 +122,19 @@
});
// 鐩戝惉澶栭儴浼犲叆鐨勮〃鍗曟暟鎹彉鍖�
watch(
- () => props.form,
- (newVal) => {
- formData.value = { ...newVal };
- },
- { deep: true }
+ () => props.form,
+ (newVal) => {
+ formData.value = {...newVal};
+ },
+ {deep: true}
);
// 鐩戝惉鍐呴儴寮圭獥鐘舵�佸彉鍖�
watch(
- () => dialogVisible.value,
- (newVal) => {
- emit("update:supplierDialogFormVisible", newVal);
- }
+ () => dialogVisible.value,
+ (newVal) => {
+ emit("update:supplierDialogFormVisible", newVal);
+ }
);
// 澶勭悊鍦板潃閫夋嫨鍙樺寲
const handleChange = (value) => {
@@ -175,7 +178,6 @@
const resetForm = () => {
if (!formRef.value) return;
formData.value = JSON.parse(JSON.stringify(copyForm.value));
- // formRef.value.resetFields();
};
// 鍏抽棴寮圭獥
const handleClose = () => {
@@ -185,11 +187,11 @@
};
const rules = reactive({
supplierName: [
- { required: true, message: "璇疯緭鍏ヤ緵璐у晢鍚嶇О", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ヤ緵璐у晢鍚嶇О", trigger: "blur"},
],
taxpayerId: [
- { required: true, message: "璇锋纭緭鍏ョ撼绋庝汉璇嗗埆鍙�", trigger: "blur" },
- { min: 17, max: 20, message: "璇疯緭鍏�17-20浣嶇撼绋庝汉璇嗗埆鍙�", trigger: "blur" },
+ {required: true, message: "璇锋纭緭鍏ョ撼绋庝汉璇嗗埆鍙�", trigger: "blur"},
+ {min: 17, max: 20, message: "璇疯緭鍏�17-20浣嶇撼绋庝汉璇嗗埆鍙�", trigger: "blur"},
],
// bids: [
// {
@@ -198,12 +200,12 @@
// trigger: "change",
// },
// ],
- bankName: [{ required: true, message: "璇疯緭鍏ラ摱琛岃处鎴�", trigger: "blur" }],
- bankAccount: [{ required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur" }],
- contactPerson: [{ required: true, message: "鑱旂郴浜�", trigger: "blur" }],
+ bankName: [{required: true, message: "璇疯緭鍏ラ摱琛岃处鎴�", trigger: "blur"}],
+ bankAccount: [{required: true, message: "璇疯緭鍏ュ紑鎴疯", trigger: "blur"}],
+ contactPerson: [{required: true, message: "鑱旂郴浜�", trigger: "blur"}],
contactPhone: [
- { required: true, message: "璇疯緭鍏ヨ仈绯讳汉", trigger: "blur" },
- { min: 11, max: 11, message: "璇疯緭鍏�11浣嶈仈绯讳汉鐢佃瘽", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ヨ仈绯讳汉", trigger: "blur"},
+ {min: 11, max: 11, message: "璇疯緭鍏�11浣嶈仈绯讳汉鐢佃瘽", trigger: "blur"},
],
});
</script>
diff --git a/src/views/index.vue b/src/views/index.vue
index 76688c0..60dba1c 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1,1095 +1,550 @@
<template>
- <div class="app-container home">
- <el-row :gutter="20">
- <el-col :sm="24" :lg="12" style="padding-left: 20px">
- <h2>鑻ヤ緷鍚庡彴绠$悊妗嗘灦</h2>
- <p>
- 涓�鐩存兂鍋氫竴娆惧悗鍙扮鐞嗙郴缁燂紝鐪嬩簡寰堝浼樼鐨勫紑婧愰」鐩絾鏄彂鐜版病鏈夊悎閫傝嚜宸辩殑銆備簬鏄埄鐢ㄧ┖闂蹭紤鎭椂闂村紑濮嬭嚜宸卞啓涓�濂楀悗鍙扮郴缁熴�傚姝ゆ湁浜嗚嫢渚濈鐞嗙郴缁燂紝濂瑰彲浠ョ敤浜庢墍鏈夌殑Web搴旂敤绋嬪簭锛屽缃戠珯绠$悊鍚庡彴锛岀綉绔欎細鍛樹腑蹇冿紝CMS锛孋RM锛孫A绛夌瓑锛屽綋鐒讹紝鎮ㄤ篃鍙互瀵瑰ス杩涜娣卞害瀹氬埗锛屼互鍋氬嚭鏇村己绯荤粺銆傛墍鏈夊墠绔悗鍙颁唬鐮佸皝瑁呰繃鍚庡崄鍒嗙簿绠�鏄撲笂鎵嬶紝鍑洪敊姒傜巼浣庛�傚悓鏃舵敮鎸佺Щ鍔ㄥ鎴风璁块棶銆傜郴缁熶細闄嗙画鏇存柊涓�浜涘疄鐢ㄥ姛鑳姐��
- </p>
- <p>
- <b>褰撳墠鐗堟湰:</b> <span>v{{ version }}</span>
- </p>
- <p>
- <el-tag type="danger">¥鍏嶈垂寮�婧�</el-tag>
- </p>
- <p>
- <el-button
- type="primary"
- icon="Cloudy"
- plain
- @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')"
- >璁块棶鐮佷簯</el-button
- >
- <el-button
- icon="HomeFilled"
- plain
- @click="goTarget('http://ruoyi.vip')"
- >璁块棶涓婚〉</el-button
- >
- </p>
- </el-col>
-
- <el-col :sm="24" :lg="12" style="padding-left: 50px">
- <el-row>
- <el-col :span="12">
- <h2>鎶�鏈�夊瀷</h2>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="6">
- <h4>鍚庣鎶�鏈�</h4>
- <ul>
- <li>SpringBoot</li>
- <li>Spring Security</li>
- <li>JWT</li>
- <li>MyBatis</li>
- <li>Druid</li>
- <li>Fastjson</li>
- <li>...</li>
- </ul>
- </el-col>
- <el-col :span="6">
- <h4>鍓嶇鎶�鏈�</h4>
- <ul>
- <li>Vue</li>
- <li>Vuex</li>
- <li>Element-ui</li>
- <li>Axios</li>
- <li>Sass</li>
- <li>Quill</li>
- <li>...</li>
- </ul>
- </el-col>
- </el-row>
- </el-col>
- </el-row>
- <el-divider />
- <el-row :gutter="20">
- <el-col :xs="24" :sm="24" :md="12" :lg="8">
- <el-card class="update-log">
- <template v-slot:header>
- <div class="clearfix">
- <span>鑱旂郴淇℃伅</span>
- </div>
- </template>
- <div class="body">
- <p>
- <i class="el-icon-s-promotion"></i> 瀹樼綉锛�<el-link
- href="http://www.ruoyi.vip"
- target="_blank"
- >http://www.ruoyi.vip</el-link
- >
- </p>
- <p>
- <i class="el-icon-user-solid"></i> QQ缇わ細<s> 婊�937441 </s> <s> 婊�887144332 </s>
- <s> 婊�180251782 </s> <s> 婊�104180207 </s> <s> 婊�186866453 </s> <s> 婊�201396349 </s>
- <s> 婊�101456076 </s> <s> 婊�101539465 </s> <s> 婊�264312783 </s> <s> 婊�167385320 </s>
- <s> 婊�104748341 </s> <s> 婊�160110482 </s> <s> 婊�170801498 </s> <s> 婊�108482800 </s>
- <s> 婊�101046199 </s> <s> 婊�136919097 </s> <s> 婊�143961921 </s> <s> 婊�174951577 </s>
- <s> 婊�161281055 </s> <s> 婊�138988063 </s> <s> 婊�151450850 </s> <s> 婊�224622315 </s>
- <s> 婊�287842588 </s> <s> 婊�187944233 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329" target="_blank">228578329</a>
- </p>
- <p>
- <i class="el-icon-chat-dot-round"></i> 寰俊锛�<a
- href="javascript:;"
- >/ *鑻ヤ緷</a
- >
- </p>
- <p>
- <i class="el-icon-money"></i> 鏀粯瀹濓細<a
- href="javascript:;"
- class="鏀粯瀹濅俊鎭�"
- >/ *鑻ヤ緷</a
- >
- </p>
+ <div class="dashboard">
+ <!-- 椤堕儴缁熻鍗$墖 -->
+ <div class="top-cards">
+ <div class="stat-card revenue">
+ <div class="card-icon">
+ <i class="el-icon-money"></i>
+ </div>
+ <div class="card-content">
+ <div class="card-title">钀ユ敹閲戦</div>
+ <div class="card-value">楼1,234,567</div>
+ <div class="card-trend">
+ <span class="trend-label">杈冩槰鏃�</span>
+ <span class="trend-value up">+12.5%</span>
</div>
- </el-card>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="8">
- <el-card class="update-log">
- <template v-slot:header>
- <div class="clearfix">
- <span>鏇存柊鏃ュ織</span>
- </div>
- </template>
- <el-collapse accordion>
- <el-collapse-item title="v3.8.9 - 2024-12-30">
- <ol>
- <li>鐢ㄦ埛绠$悊鏀寔鍒嗘爮鎷栧姩</li>
- <li>淇敼涓婚鏍峰紡鏈湴璇诲彇</li>
- <li>鐢ㄦ埛澶村儚http(s)閾炬帴鏀寔</li>
- <li>鐢ㄦ埛绠$悊杩囨护鎺夊凡绂佺敤閮ㄩ棬</li>
- <li>鏀寔鑷畾涔夋樉绀篍xcel灞炴�у垪</li>
- <li>鎿嶄綔鏃ュ織璁板綍DELETE璇锋眰鍙傛暟</li>
- <li>鐧藉悕鍗曟敮鎸佸閫氶厤绗﹁矾寰勫尮閰�</li>
- <li>鏍℃鏂囦欢鍚嶆槸鍚﹀寘鍚壒娈婂瓧绗�</li>
- <li>浠g爜鐢熸垚鍒涘缓琛ㄥ睆钄借繚瑙勭殑瀛楃</li>
- <li>鑿滃崟闈㈠寘灞戝鑸敮鎸佸灞傜骇鏄剧ず</li>
- <li>Excel娉ㄨВ鏀寔wrapText鏄惁鍏佽鍐呭鎹㈣</li>
- <li>浠g爜鐢熸垚鏂板閰嶇疆鏄惁鍏佽鏂囦欢瑕嗙洊鍒版湰鍦�</li>
- <li>淇瑙掕壊绂佺敤鏉冮檺涓嶅け鏁堥棶棰�</li>
- <li>淇浠g爜鐢熸垚涓婄骇鑿滃崟鏄剧ず闂</li>
- <li>淇瀵煎嚭瀛愬垪琛ㄥ璞″彧鑳藉湪鏈�鍚庣殑闂</li>
- <li>淇TopNav鏃犳硶姝g‘鑾峰彇active鐨勯棶棰�</li>
- <li>淇榛樿鍏抽棴Tags-Views鍐呴摼椤甸潰鎵撲笉寮�</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.6.5</li>
- <li>鍗囩骇tomcat鍒版渶鏂扮増鏈�9.0.96</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.53</li>
- <li>鍗囩骇logback鍒版渶鏂扮増鏈�1.2.13</li>
- <li>鍗囩骇spring-framework鍒版渶鏂扮増鏈�5.3.39</li>
- <li>鍗囩骇quill鍒版渶鏂扮増鏈�2.0.2</li>
- <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.28.1</li>
- <li>浼樺寲韬唤璇佽劚鏁忔鍒�</li>
- <li>浼樺寲鏉冮檺鏇存柊鍚庡悓姝ョ紦瀛�</li>
- <li>浼樺寲鏌ヨ鏃堕棿鑼冨洿鏃ユ湡鏍煎紡</li>
- <li>浼樺寲鍙傛暟閿�兼洿鎹负澶氳鏂囨湰</li>
- <li>浼樺寲瀵煎叆甯︽爣棰樻枃浠跺叧闂竻鐞�</li>
- <li>浼樺寲涓婁紶鍥剧墖甯﹀煙鍚嶄笉澧炲姞鍓嶇紑</li>
- <li>浼樺寲鐗规畩瀛楃瀵嗙爜淇敼澶辫触闂</li>
- <li>浼樺寲鏃犵敤鎴风紪鍙蜂笉鏍¢獙鏁版嵁鏉冮檺</li>
- <li>浼樺寲TopNav鍐呴摼鑿滃崟鐐瑰嚮娌℃湁楂樹寒</li>
- <li>浼樺寲鑿滃崟绠$悊鍒囨崲Mini甯冨眬閿欎贡闂</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.8 - 2024-06-30">
- <ol>
- <li>鑿滃崟绠$悊鏂板璺敱鍚嶇О</li>
- <li>鏂板鏁版嵁鑴辨晱杩囨护娉ㄨВ</li>
- <li>鐢ㄦ埛瀵嗙爜鏂板闈炴硶瀛楃楠岃瘉</li>
- <li>闄愬埗鐢ㄦ埛鎿嶄綔鏁版嵁鏉冮檺鑼冨洿</li>
- <li>浠g爜鐢熸垚鏂板鍒涘缓琛ㄧ粨鏋勫姛鑳�</li>
- <li>瀹氭椂浠诲姟鐧藉悕鍗曢厤缃寖鍥寸缉灏�</li>
- <li>浼樺寲浠g爜鐢熸垚涓诲瓙琛ㄥ叧鑱旀煡璇㈡柟寮�</li>
- <li>Excel娉ㄨВ鏂板灞炴�omboReadDict</li>
- <li>Excel娉ㄨВColumnType绫诲瀷鏂板鏂囨湰</li>
- <li>鏂板鍥介檯鍖栬祫婧愭枃浠堕厤缃�</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.6.1</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.23</li>
- <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.37.1</li>
- <li>鏇存柊HttpUtils涓殑User-Agent</li>
- <li>鏇存柊compressionPlugin鍒�6.1.2浠ュ吋瀹筺ode18+</li>
- <li>鍗囩骇spring-security鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li>
- <li>鍗囩骇spring-framework鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li>
- <li>浼樺寲鑷畾涔塜SS娉ㄨВ鍖归厤鏂瑰紡</li>
- <li>浼樺寲缂撳瓨鐩戞帶閿悕鍒楄〃鎺掑簭鏄剧ず</li>
- <li>浼樺寲瀹氭椂浠诲姟鏃ュ織榛樿鎸夋椂闂存帓搴�</li>
- <li>浼樺寲榛樿鏂囦欢澶у皬瓒呰繃2G鏃犳晥鐨勯棶棰�</li>
- <li>浼樺寲鏌ヨ〃鐗规畩瀛楃浣跨敤鍙嶆枩鏉犺繘琛岃浆涔�</li>
- <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃堕厤缃樉绀洪敊璇棶棰�</li>
- <li>浼樺寲澶氫釜鑷畾鏁版嵁鏉冮檺浣跨敤in鏌ヨ,閬垮厤澶氭鎷兼帴</li>
- <li>浼樺寲瀵煎叆Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.7 - 2023-12-08">
- <ol>
- <li>鎿嶄綔鏃ュ織璁板綍閮ㄩ棬鍚嶇О</li>
- <li>鍏ㄥ眬鏁版嵁瀛樺偍鐢ㄦ埛缂栧彿</li>
- <li>鏂板缂栫▼寮忓垽鏂祫婧愯闂潈闄�</li>
- <li>鎿嶄綔鏃ュ織鍒楄〃鏂板IP鍦板潃鏌ヨ</li>
- <li>瀹氭椂浠诲姟鏂板椤靛幓闄ょ姸鎬侀�夐」</li>
- <li>浠g爜鐢熸垚鏀寔閫夋嫨鍓嶇妯℃澘绫诲瀷</li>
- <li>鏄鹃殣鍒楃粍浠舵敮鎸佸閫夋寮瑰嚭绫诲瀷</li>
- <li>閫氱敤鎺掑簭灞炴�rderBy鍙傛暟闄愬埗闀垮害</li>
- <li>Excel鑷畾涔夋暟鎹鐞嗗櫒澧炲姞鍗曞厓鏍�/宸ヤ綔绨垮璞�</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.8</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.20</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.43</li>
- <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.7</li>
- <li>鍗囩骇commons.io鍒版渶鏂扮増鏈�2.13.0</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.14</li>
- <li>淇浜旂骇璺敱缂撳瓨鏃犳晥闂</li>
- <li>淇澶栭摼甯︾鍙e嚭鐜扮殑寮傚父</li>
- <li>淇鏍戞ā鏉跨埗绾х紪鐮佸彉閲忛敊璇�</li>
- <li>淇瀛楀吀琛ㄨ鎯呴〉闈㈡悳绱㈤棶棰�</li>
- <li>淇鍐呴摼iframe娌℃湁浼犻�掑弬鏁伴棶棰�</li>
- <li>淇鑷畾涔夊瓧鍏告牱寮忎笉鐢熸晥鐨勯棶棰�</li>
- <li>淇瀛楀吀缂撳瓨鍒犻櫎鏂规硶鍙傛暟閿欒闂</li>
- <li>淇Excel瀵煎叆鏁版嵁涓存椂鏂囦欢鏃犳硶鍒犻櫎闂</li>
- <li>淇鏈櫥褰曞甫鍙傛暟璁块棶鎴愬姛鍚庡弬鏁颁涪澶遍棶棰�</li>
- <li>淇HeaderSearch缁勪欢璺宠浆query鍙傛暟涓㈠け闂</li>
- <li>淇浠g爜鐢熸垚瀵煎叆鍚庡繀濉」涓庢暟鎹簱涓嶅尮閰嶉棶棰�</li>
- <li>淇Excels瀵煎叆鏃舵棤娉曡幏鍙栧埌dictType瀛楀吀鍊奸棶棰�</li>
- <li>浼樺寲涓嬭浇zip鏂规硶鏂板閬僵灞�</li>
- <li>浼樺寲澶村儚涓婁紶鍙傛暟鏂板鏂囦欢鍚嶇О</li>
- <li>浼樺寲瀛楀吀鏍囩鏀寔鑷畾涔夊垎闅旂</li>
- <li>浼樺寲鑿滃崟绠$悊绫诲瀷涓烘寜閽姸鎬佸彲閫�</li>
- <li>浼樺寲鍓嶇闃查噸澶嶆彁浜ゆ暟鎹ぇ灏忛檺鍒�</li>
- <li>浼樺寲TopNav鑿滃崟娌℃湁鍥炬爣svg涓嶆樉绀�</li>
- <li>浼樺寲鏁板瓧閲戦澶у啓杞崲绮惧害涓㈠け闂</li>
- <li>浼樺寲瀵屾枃鏈珽ditor缁勪欢妫�楠屽浘鐗囨牸寮�</li>
- <li>浼樺寲椤电鍦‵irefox娴忚鍣ㄨ閬尅鐨勯棶棰�</li>
- <li>浼樺寲涓汉涓績/鍩烘湰璧勬枡淇敼鏃舵暟鎹樉绀洪棶棰�</li>
- <li>浼樺寲缂撳瓨鐩戞帶鍥捐〃鏀寔璺熼殢灞忓箷澶у皬鑷�傚簲璋冩暣</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.6 - 2023-06-30">
- <ol>
- <li>鏀寔鐧诲綍IP榛戝悕鍗曢檺鍒�</li>
- <li>鏂板鐩戞帶椤甸潰鍥炬爣鏄剧ず</li>
- <li>鎿嶄綔鏃ュ織鏂板娑堣�楁椂闂村睘鎬�</li>
- <li>灞忚斀瀹氭椂浠诲姟bean杩濊鐨勫瓧绗�</li>
- <li>鏃ュ織绠$悊浣跨敤绱㈠紩鎻愬崌鏌ヨ鎬ц兘</li>
- <li>鏃ュ織娉ㄨВ鏀寔鎺掗櫎鎸囧畾鐨勮姹傚弬鏁�</li>
- <li>鏀寔鑷畾涔夐殣钘忓睘鎬у垪杩囨护瀛愬璞�</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.3</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.16</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.34</li>
- <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.15</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.13</li>
- <li>绉婚櫎apache/commons-fileupload渚濊禆</li>
- <li>淇椤甸潰鍒囨崲鏃跺竷灞�閿欎贡鐨勯棶棰�</li>
- <li>淇鍖垮悕娉ㄨВAnonymous绌烘寚閽堥棶棰�</li>
- <li>淇璺敱璺宠浆琚樆姝㈡椂鍐呴儴浜х敓鎶ラ敊淇℃伅闂</li>
- <li>淇isMatchedIp鐨勫弬鏁板垽鏂骇鐢熺┖鎸囬拡鐨勯棶棰�</li>
- <li>淇鐢ㄦ埛澶氳鑹叉暟鎹潈闄愬彲鑳藉嚭鐜版潈闄愭姮鍗囩殑鎯呭喌</li>
- <li>淇寮�鍚疶opNav鍚庝竴绾ц彍鍗曡矾鐢卞弬鏁拌缃棤鏁堥棶棰�</li>
- <li>淇DictTag缁勪欢value娌℃湁鍖归厤鐨勫�兼椂鍒欏睍绀簐alue</li>
- <li>浼樺寲鏂囦欢涓嬭浇鍑虹幇鐨勫紓甯�</li>
- <li>浼樺寲閫夋嫨鍥炬爣缁勪欢楂樹寒鍥炴樉</li>
- <li>浼樺寲寮圭獥鍚庡鑸爮鍋忕Щ鐨勯棶棰�</li>
- <li>浼樺寲淇敼瀵嗙爜鏃ュ織瀛樺偍鏄庢枃闂</li>
- <li>浼樺寲椤电鏍忓叧闂叾浠栧嚭鐜扮殑寮傚父闂</li>
- <li>浼樺寲椤电鍏抽棴宸︿晶閫夐」鎺掗櫎棣栭〉閫夐」</li>
- <li>浼樺寲鍏抽棴褰撳墠tab椤佃烦杞渶鍙充晶tab椤�</li>
- <li>浼樺寲缂撳瓨鍒楄〃娓呴櫎鎿嶄綔鎻愮ず涓嶅彉鐨勯棶棰�</li>
- <li>浼樺寲瀛楃鏈娇鐢ㄤ笅鍒掔嚎涓嶈繘琛岄┘宄板紡澶勭悊</li>
- <li>浼樺寲鐢ㄦ埛瀵煎叆鏇存柊鏃堕渶鑾峰彇鐢ㄦ埛缂栧彿闂</li>
- <li>浼樺寲渚ц竟鏍忕殑骞冲彴鏍囬涓嶸UE_APP_TITLE淇濇寔鍚屾</li>
- <li>浼樺寲瀵煎嚭Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li>
- <li>杩炴帴姹燚ruid鏀寔鏂扮殑閰嶇疆connectTimeout鍜宻ocketTimeout</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.5 - 2023-01-01">
- <ol>
- <li>瀹氭椂浠诲姟杩濊鐨勫瓧绗�</li>
- <li>閲嶇疆鏃跺彇娑堥儴闂ㄩ�変腑</li>
- <li>鏂板杩斿洖璀﹀憡娑堟伅鎻愮ず</li>
- <li>蹇界暐涓嶅繀瑕佺殑灞炴�ф暟鎹繑鍥�</li>
- <li>淇敼鍙傛暟閿悕鏃剁Щ闄ゅ墠缂撳瓨閰嶇疆</li>
- <li>瀵煎叆鏇存柊鐢ㄦ埛鏁版嵁鍓嶆牎楠屾暟鎹潈闄�</li>
- <li>鍏煎Excel涓嬫媺妗嗗唴瀹硅繃澶氭棤娉曟樉绀虹殑闂</li>
- <li>鍗囩骇echarts鍒版渶鏂扮増鏈�5.4.0</li>
- <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.3</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.0</li>
- <li>鍗囩骇kaptcha鍒版渶鏂扮増2.3.3</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.15</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.20</li>
- <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.6</li>
- <li>浼樺寲寮圭獥鍐呭杩囧灞曠ず涓嶅叏闂</li>
- <li>浼樺寲swagger-ui闈欐�佽祫婧愪娇鐢ㄧ紦瀛�</li>
- <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曢殣钘忎晶杈规爮</li>
- <li>鍒犻櫎fuse鏃犳晥閫夐」maxPatternLength</li>
- <li>浼樺寲瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃涓虹┖浼氬嚭鐜癧]闂</li>
- <li>浼樺寲缂栬緫澶村儚鏃堕�忔槑閮ㄥ垎浼氬彉鎴愰粦鑹查棶棰�</li>
- <li>浼樺寲灏忓睆骞曚笂淇敼澶村儚鐣岄潰甯冨眬閿欎綅鐨勯棶棰�</li>
- <li>淇浠g爜鐢熸垚鍕鹃�夊睘鎬ф棤鏁堥棶棰�</li>
- <li>淇鏂囦欢涓婁紶缁勪欢鏍煎紡楠岃瘉闂</li>
- <li>淇鍥炴樉鏁版嵁瀛楀吀鏁扮粍寮傚父闂</li>
- <li>淇sheet瓒呭嚭鏈�澶ц鏁板紓甯搁棶棰�</li>
- <li>淇Log娉ㄨВGET璇锋眰璁板綍涓嶅埌鍙傛暟闂</li>
- <li>淇璋冨害鏃ュ織鐐瑰嚮澶氭鏁版嵁涓嶅彉鍖栫殑闂</li>
- <li>淇涓婚棰滆壊鍦―rawer缁勪欢涓嶄細鍔犺浇闂</li>
- <li>淇鏂囦欢鍚嶅寘鍚壒娈婂瓧绗︾殑鏂囦欢鏃犳硶涓嬭浇闂</li>
- <li>淇table涓洿澶氭寜閽垏鎹富棰樿壊鏈敓鏁堜慨澶嶉棶棰�</li>
- <li>淇鏌愪簺鐗规�х殑鐜鐢熸垚浠g爜鍙樹贡鐮乀XT鏂囦欢闂</li>
- <li>淇浠g爜鐢熸垚鍥剧墖/鏂囦欢/鍗曢�夋椂閫夋嫨蹇呭~鏃犳硶鏍¢獙闂</li>
- <li>淇鏌愪簺鐗规�х殑鎯呭喌鐢ㄦ埛缂栬緫瀵硅瘽妗嗕腑瑙掕壊鍜岄儴闂ㄦ棤娉曚慨鏀归棶棰�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.4 - 2022-09-26">
- <ol>
- <li>鏁版嵁閫昏緫鍒犻櫎涓嶈繘琛屽敮涓�楠岃瘉</li>
- <li>Excel娉ㄨВ鏀寔瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃鏂规硶</li>
- <li>Excel娉ㄨВ鏀寔鑷畾涔夐殣钘忓睘鎬у垪</li>
- <li>Excel娉ㄨВ鏀寔backgroundColor灞炴�ц缃儗鏅壊</li>
- <li>鏀寔閰嶇疆瀵嗙爜鏈�澶ч敊璇鏁�/閿佸畾鏃堕棿</li>
- <li>鐧诲綍鏃ュ織鏂板瑙i攣璐︽埛鍔熻兘</li>
- <li>閫氱敤涓嬭浇鏂规硶鏂板config閰嶇疆閫夐」</li>
- <li>鏀寔澶氭潈闄愬瓧绗﹀尮閰嶈鑹叉暟鎹潈闄�</li>
- <li>椤甸潰鍐呭祵iframe鍒囨崲tab涓嶅埛鏂版暟鎹�</li>
- <li>鎿嶄綔鏃ュ織璁板綍鏀寔鎺掗櫎鏁忔劅灞炴�у瓧娈�</li>
- <li>淇澶氭枃浠朵笂浼犳姤閿欏嚭鐜扮殑寮傚父闂</li>
- <li>淇鍥剧墖棰勮缁勪欢src灞炴�т负null鍊兼帶鍒跺彴鎶ラ敊闂</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.2.2</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.14</li>
- <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.3</li>
- <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.2</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.10</li>
- <li>浼樺寲浠诲姟杩囨湡涓嶆墽琛岃皟搴�</li>
- <li>浼樺寲瀛楀吀鏁版嵁浣跨敤store瀛樺彇</li>
- <li>浼樺寲淇敼璧勬枡澶村儚琚鐩栫殑闂</li>
- <li>浼樺寲淇敼鐢ㄦ埛鐧诲綍璐﹀彿閲嶅楠岃瘉</li>
- <li>浼樺寲浠g爜鐢熸垚鍚屾鍚庡�糔ULL闂</li>
- <li>浼樺寲瀹氭椂浠诲姟鏀寔鎵ц鐖剁被鏂规硶</li>
- <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼閮ㄩ棬</li>
- <li>浼樺寲甯冨眬璁剧疆浣跨敤el-drawer鎶藉眽鏄剧ず</li>
- <li>浼樺寲娌℃湁鏉冮檺鐨勭敤鎴风紪杈戦儴闂ㄧ己灏戞暟鎹�</li>
- <li>浼樺寲鏃ュ織娉ㄨВ璁板綍闄愬埗璇锋眰鍦板潃鐨勯暱搴�</li>
- <li>浼樺寲excel/scale灞炴�у鍑哄崟鍏冩牸鏁板�肩被鍨�</li>
- <li>浼樺寲鏃ュ織鎿嶄綔涓噸缃寜閽椂閲嶅鏌ヨ鐨勯棶棰�</li>
- <li>浼樺寲澶氫釜鐩稿悓瑙掕壊鏁版嵁瀵艰嚧鏉冮檺SQL閲嶅闂</li>
- <li>浼樺寲琛ㄦ牸涓婂彸渚у伐鍏锋潯锛堟悳绱㈡寜閽樉闅�&鍙充晶鏍峰紡鍑稿嚭锛�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.3 - 2022-06-27">
- <ol>
- <li>鏂板缂撳瓨鍒楄〃鑿滃崟鍔熻兘</li>
- <li>浠g爜鐢熸垚鏍戣〃鏂板(灞曞紑/鎶樺彔)</li>
- <li>Excel娉ㄨВ鏀寔color瀛椾綋棰滆壊</li>
- <li>鏂板Anonymous鍖垮悕璁块棶涓嶉壌鏉冩敞瑙�</li>
- <li>鐢ㄦ埛澶村儚涓婁紶闄愬埗鍙兘涓哄浘鐗囨牸寮�</li>
- <li>鎺ュ彛浣跨敤娉涘瀷浣垮叾鐪嬪埌鍝嶅簲灞炴�у瓧娈�</li>
- <li>妫�鏌ュ畾鏃朵换鍔ean鎵�鍦ㄥ寘鍚嶆槸鍚︿负鐧藉悕鍗曢厤缃�</li>
- <li>娣诲姞椤电openPage鏀寔浼犻�掑弬鏁�</li>
- <li>鐢ㄦ埛缂撳瓨淇℃伅娣诲姞閮ㄩ棬ancestors绁栫骇鍒楄〃</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.8</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.6</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.11</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.8</li>
- <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.14</li>
- <li>闄嶇骇jsencrypt鐗堟湰鍏煎IE娴忚鍣�</li>
- <li>鍒犻櫎澶氫綑鐨剆alt瀛楁</li>
- <li>鏂板鑾峰彇涓嶅甫鍚庣紑鏂囦欢鍚嶇О鏂规硶</li>
- <li>鏂板鑾峰彇閰嶇疆鏂囦欢涓殑灞炴�у�兼柟娉�</li>
- <li>鏂板鍐呭缂栫爜/瑙g爜鏂逛究鎻掍欢闆嗘垚浣跨敤</li>
- <li>瀛楀吀绫诲瀷蹇呴』浠ュ瓧姣嶅紑澶达紝涓斿彧鑳戒负锛堝皬鍐欏瓧姣嶏紝鏁板瓧锛屼笅婊戠嚎锛�</li>
- <li>浼樺寲璁剧疆鍒嗛〉鍙傛暟榛樿鍊�</li>
- <li>浼樺寲瀵圭┖瀛楃涓插弬鏁板鐞嗙殑杩囨护</li>
- <li>浼樺寲鏄剧ず椤哄簭orderNum绫诲瀷涓烘暣鍨�</li>
- <li>浼樺寲琛ㄥ崟鏋勫缓鎸夐挳涓嶆樉绀烘鍒欐牎楠�</li>
- <li>浼樺寲瀛楀吀鏁版嵁鍥炴樉鏍峰紡涓嬫媺妗嗘樉绀哄��</li>
- <li>浼樺寲R鍝嶅簲鎴愬姛鐘舵�佺爜涓庡叏灞�淇濇寔涓�鑷�</li>
- <li>浼樺寲druid寮�鍚痺all杩囨护鍣ㄥ嚭鐜扮殑寮傚父闂</li>
- <li>浼樺寲鐢ㄦ埛绠$悊宸︿晶鏍戝瀷缁勪欢澧炲姞閫変腑楂樹寒淇濇寔</li>
- <li>浼樺寲鏂板鐢ㄦ埛涓庤鑹蹭俊鎭�&鐢ㄦ埛涓庡矖浣嶄俊鎭�昏緫</li>
- <li>浼樺寲榛樿涓嶅惎鐢ㄥ帇缂╂枃浠剁紦瀛橀槻姝ode_modules杩囧ぇ</li>
- <li>淇瀛楀吀鏁版嵁鏄剧ず涓嶅叏闂</li>
- <li>淇鎿嶄綔鏃ュ織鏌ヨ绫诲瀷鏉′欢涓�0鏃朵細鏌ュ埌鎵�鏈夋暟鎹�</li>
- <li>淇Excel娉ㄨВprompt/combo鍚屾椂浣跨敤涓嶇敓鏁堥棶棰�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.2 - 2022-04-01">
- <ol>
- <li>鍓嶇鏀寔璁剧疆鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜�</li>
- <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曟儏鍐甸殣钘忎晶杈规爮</li>
- <li>渚ц竟鏍忚彍鍗曞悕绉拌繃闀挎偓鍋滄樉绀烘爣棰�</li>
- <li>鐢ㄦ埛璁块棶鎺у埗鏃舵牎楠屾暟鎹潈闄愶紝闃叉瓒婃潈</li>
- <li>瀵煎嚭Excel鏃跺睆钄藉叕寮忥紝闃叉CSV娉ㄥ叆椋庨櫓</li>
- <li>缁勪欢ImagePreview鏀寔澶氬浘棰勮鏄剧ず</li>
- <li>缁勪欢ImageUpload鏀寔澶氬浘鍚屾椂閫夋嫨涓婁紶</li>
- <li>缁勪欢FileUpload鏀寔澶氭枃浠跺悓鏃堕�夋嫨涓婁紶</li>
- <li>鏈嶅姟鐩戞帶鏂板杩愯鍙傛暟淇℃伅鏄剧ず</li>
- <li>瀹氭椂浠诲姟鐩爣瀛楃涓茶繃婊ょ壒娈婂瓧绗�</li>
- <li>瀹氭椂浠诲姟鐩爣瀛楃涓查獙璇佸寘鍚嶇櫧鍚嶅崟</li>
- <li>浠g爜鐢熸垚鍒楄〃鍥剧墖鏀寔棰勮</li>
- <li>浠g爜鐢熸垚缂栬緫淇敼鎵撳紑鏂伴〉绛�</li>
- <li>浠g爜鐢熸垚鏂板Java绫诲瀷Boolean</li>
- <li>浠g爜鐢熸垚瀛愯〃鏀寔鏃ユ湡/瀛楀吀閰嶇疆</li>
- <li>浠g爜鐢熸垚鍚屾淇濈暀蹇呭~/绫诲瀷閫夐」</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.2</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.80</li>
- <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.1</li>
- <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.11</li>
- <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.2</li>
- <li>娣诲姞閬楁紡鐨勫垎椤靛弬鏁板悎鐞嗗寲灞炴��</li>
- <li>淇敼npm鍗冲皢杩囨湡鐨勬敞鍐屾簮鍦板潃</li>
- <li>淇鍒嗛〉缁勪欢璇锋眰涓ゆ闂</li>
- <li>淇閫氱敤鏂囦欢涓嬭浇鎺ュ彛璺ㄥ煙闂</li>
- <li>淇Xss娉ㄨВ瀛楁鍊间负绌烘椂鐨勫紓甯搁棶棰�</li>
- <li>淇閫夐」鍗$偣鍑诲彸閿埛鏂颁涪澶卞弬鏁伴棶棰�</li>
- <li>淇琛ㄥ崟娓呴櫎鍏冪礌浣嶇疆鏈瀭鐩村眳涓棶棰�</li>
- <li>淇鏈嶅姟鐩戞帶涓繍琛屽弬鏁版樉绀烘潯浠堕敊璇�</li>
- <li>淇瀵煎叆Excel鏃跺瓧鍏稿瓧娈电被鍨嬩负Long杞箟涓虹┖闂</li>
- <li>淇鐧诲綍瓒呮椂鍒锋柊椤甸潰璺宠浆鐧诲綍椤甸潰杩樻彁绀洪噸鏂扮櫥褰曢棶棰�</li>
- <li>浼樺寲鍔犺浇瀛楀吀缂撳瓨鏁版嵁</li>
- <li>浼樺寲IP鍦板潃鑾峰彇鍒板涓殑闂</li>
- <li>浼樺寲浠诲姟闃熷垪婊℃椂浠诲姟鎷掔粷绛栫暐</li>
- <li>浼樺寲鏂囦欢涓婁紶鍏煎Weblogic鐜</li>
- <li>浼樺寲瀹氭椂浠诲姟榛樿淇濆瓨鍒板唴瀛樹腑鎵ц</li>
- <li>浼樺寲閮ㄩ棬淇敼缂╂斁鍚庡嚭鐜扮殑閿欎綅闂</li>
- <li>浼樺寲Excel鏍煎紡鍖栦笉鍚岀被鍨嬬殑鏃ユ湡瀵硅薄</li>
- <li>浼樺寲鑿滃崟琛ㄥ叧閿瓧瀵艰嚧鐨勬彃浠舵姤閿欓棶棰�</li>
- <li>浼樺寲Oracle鐢ㄦ埛澶村儚鍒椾负绌烘椂涓嶆樉绀洪棶棰�</li>
- <li>浼樺寲椤甸潰鑻ユ湭鍖归厤鍒板瓧鍏告爣绛惧垯杩斿洖鍘熷瓧鍏稿��</li>
- <li>浼樺寲淇鐧诲綍澶辨晥鍚庡娆¤姹傛彁绀哄娆″脊绐楅棶棰�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.1 - 2022-01-01">
- <ol>
- <li>鏂板Vue3鍓嶇浠g爜鐢熸垚妯℃澘</li>
- <li>鏂板鍥剧墖棰勮缁勪欢</li>
- <li>鏂板鍘嬬缉鎻掍欢瀹炵幇鎵撳寘Gzip</li>
- <li>鑷畾涔墄ss鏍¢獙娉ㄨВ瀹炵幇</li>
- <li>鑷畾涔夋枃瀛楀鍒跺壀璐存寚浠�</li>
- <li>浠g爜鐢熸垚棰勮鏀寔澶嶅埗鍐呭</li>
- <li>璺敱鏀寔鍗曠嫭閰嶇疆鑿滃崟鎴栬鑹叉潈闄�</li>
- <li>鐢ㄦ埛绠$悊閮ㄩ棬鏌ヨ閫夋嫨鑺傜偣鍚庡垎椤靛弬鏁板垵濮�</li>
- <li>淇鐢ㄦ埛鍒嗛厤瑙掕壊灞炴�ч敊璇�</li>
- <li>淇鎵撳寘鍚庡瓧浣撳浘鏍囧伓鐜扮殑涔辩爜闂</li>
- <li>淇鑿滃崟绠$悊閲嶇疆琛ㄥ崟鍑虹幇鐨勯敊璇�</li>
- <li>淇鐗堟湰宸紓瀵艰嚧鐨勬噿鍔犺浇鎶ラ敊闂</li>
- <li>淇Cron缁勪欢涓懆鍥炴樉闂</li>
- <li>淇瀹氭椂浠诲姟澶氬弬鏁伴�楀彿鍒嗛殧鐨勯棶棰�</li>
- <li>淇鏍规嵁ID鏌ヨ鍒楄〃鍙兘鍑虹幇鐨勪富閿孩鍑洪棶棰�</li>
- <li>淇tomcat閰嶇疆鍙傛暟宸茶繃鏈熼棶棰�</li>
- <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.8</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.6</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.79</li>
- <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.8</li>
- <li>鍗囩骇log4j2鍒�2.17.1锛岄槻姝㈡紡娲為闄�</li>
- <li>浼樺寲涓嬭浇瑙f瀽blob寮傚父鎻愮ず</li>
- <li>浼樺寲浠g爜鐢熸垚瀛楀吀缁勯噸澶嶉棶棰�</li>
- <li>浼樺寲鏌ヨ鐢ㄦ埛鐨勮鑹茬粍&宀椾綅缁勪唬鐮�</li>
- <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃惰缃�24</li>
- <li>浼樺寲鐢ㄦ埛瀵煎叆鎻愮ず婧㈠嚭鍒欐樉绀烘粴鍔ㄦ潯</li>
- <li>浼樺寲闃查噸澶嶆彁浜ゆ爣璇嗙粍鍚堜负(key+url+header)</li>
- <li>浼樺寲鍒嗛〉鏂规硶璁剧疆鎴愰�氱敤鏂逛究鐏垫椿璋冪敤</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.8.0 - 2021-12-01">
- <ol>
- <li>鏂板閰嶅骞跺悓姝ョ殑Vue3鍓嶇鐗堟湰</li>
- <li>鏂板閫氱敤鏂规硶绠�鍖栨ā鎬�/缂撳瓨/涓嬭浇/鏉冮檺/椤电浣跨敤</li>
- <li>浼樺寲瀵煎嚭鏁版嵁/浣跨敤閫氱敤涓嬭浇鏂规硶</li>
- <li>Excel娉ㄨВ鏀寔鑷畾涔夋暟鎹鐞嗗櫒</li>
- <li>Excel娉ㄨВ鏀寔瀵煎叆瀵煎嚭鏍囬淇℃伅</li>
- <li>Excel瀵煎叆鏀寔@Excels娉ㄨВ</li>
- <li>鏂板缁勪欢data-dict锛岀畝鍖栨暟鎹瓧鍏镐娇鐢�</li>
- <li>鏂板Jaxb渚濊禆锛岄槻姝dk8浠ヤ笂鍑虹幇鐨勫吋瀹归敊璇�</li>
- <li>鐢熶骇鐜浣跨敤璺敱鎳掑姞杞芥彁鍗囬〉闈㈠搷搴旈�熷害</li>
- <li>淇浜旂骇浠ヤ笂鑿滃崟鍑虹幇鐨�404闂</li>
- <li>闃查噸鎻愪氦娉ㄨВ鏀寔閰嶇疆闂撮殧鏃堕棿/鎻愮ず娑堟伅</li>
- <li>鏃ュ織娉ㄨВ鏂板鏄惁淇濆瓨鍝嶅簲鍙傛暟</li>
- <li>浠诲姟灞忚斀杩濊瀛楃&鍙傛暟蹇界暐鍙屽紩鍙蜂腑鐨勯�楀彿</li>
- <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.5.6</li>
- <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.0</li>
- <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.0</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.2</li>
- <li>鍗囩骇druid鍒版渶鏂扮増1.2.8</li>
- <li>鍗囩骇velocity鍒版渶鏂扮増鏈�2.3</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.78</li>
- <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.24.0</li>
- <li>鍗囩骇dart-sass鍒扮増鏈�1.32.13</li>
- <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.19.1</li>
- <li>鍗囩骇jsencrypt鍒版渶鏂扮増鏈�3.2.1</li>
- <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�3.0.1</li>
- <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.5</li>
- <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.1</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.6</li>
- <li>鏂板sendGet鏃犲弬璇锋眰鏂规硶</li>
- <li>绂佺敤el-tag缁勪欢鐨勬笎鍙樺姩鐢�</li>
- <li>浠g爜鐢熸垚鐐瑰嚮棰勮閲嶇疆婵�娲籺ab</li>
- <li>AjaxResult閲嶅啓put鏂规硶锛屼互鏂逛究閾惧紡璋冪敤</li>
- <li>浼樺寲鐧诲綍/楠岃瘉鐮佽姹俬eaders涓嶈缃畉oken</li>
- <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼鐢ㄦ埛鍚�</li>
- <li>浼樺寲Cron琛ㄨ揪寮忕敓鎴愬櫒鍏抽棴鏃堕攢姣侀伩鍏嶇紦瀛�</li>
- <li>浼樺寲娉ㄥ唽鎴愬姛鎻愮ず娑堟伅绫诲瀷success</li>
- <li>浼樺寲aop璇硶锛屼娇鐢╯pring鑷姩娉ㄥ叆娉ㄨВ</li>
- <li>浼樺寲璁板綍鐧诲綍淇℃伅锛岀Щ闄や笉蹇呰鐨勪慨鏀�</li>
- <li>浼樺寲mybatis鍏ㄥ眬榛樿鐨勬墽琛屽櫒</li>
- <li>浼樺寲Excel瀵煎叆鍥剧墖鍙兘鍑虹幇鐨勫紓甯�</li>
- <li>淇浠g爜鐢熸垚妯℃澘涓诲瓙琛ㄥ垹闄ょ己灏戜簨鍔�</li>
- <li>淇鏃ュ織璁板綍鍙兘鍑虹幇鐨勮浆鎹㈠紓甯�</li>
- <li>淇浠g爜鐢熸垚澶嶉�夋瀛楀吀閬楁紡闂</li>
- <li>淇鍏抽棴xss鍔熻兘瀵艰嚧鍙噸澶嶈RepeatableFilter澶辨晥</li>
- <li>淇瀛楃涓叉棤娉曡鍙嶈浆涔夐棶棰�</li>
- <li>淇鍚庣涓诲瓙琛ㄤ唬鐮佹ā鏉挎柟娉曞悕鐢熸垚閿欒闂</li>
- <li>淇xss杩囨护鍚庢牸寮忓嚭鐜扮殑寮傚父</li>
- <li>淇swagger娌℃湁鎸囧畾dataTypeClass瀵艰嚧鍚姩鍑虹幇warn鏃ュ織</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.7.0 - 2021-09-13">
- <ol>
- <li>鍙傛暟绠$悊鏀寔閰嶇疆楠岃瘉鐮佸紑鍏�</li>
- <li>鏂板鏄惁寮�鍚敤鎴锋敞鍐屽姛鑳�</li>
- <li>瀹氭椂浠诲姟鏀寔鍦ㄧ嚎鐢熸垚cron琛ㄨ揪寮�</li>
- <li>鑿滃崟绠$悊鏀寔閰嶇疆璺敱鍙傛暟</li>
- <li>鏀寔鑷畾涔夋敞瑙e疄鐜版帴鍙i檺娴�</li>
- <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎叆</li>
- <li>鑷畾涔夊脊灞傛孩鍑烘粴鍔ㄦ牱寮�</li>
- <li>鑷畾涔夊彲鎷栧姩寮圭獥瀹藉害鎸囦护</li>
- <li>鑷畾涔夊彲鎷栧姩寮圭獥楂樺害鎸囦护</li>
- <li>淇浠绘剰璐︽埛瓒婃潈闂</li>
- <li>淇敼鏃舵鏌ョ敤鎴锋暟鎹潈闄愯寖鍥�</li>
- <li>淇淇濆瓨閰嶇疆涓婚棰滆壊澶辨晥闂</li>
- <li>鏂板鏆楄壊鑿滃崟椋庢牸涓婚</li>
- <li>鑿滃崟&閮ㄩ棬鏂板灞曞紑/鎶樺彔鍔熻兘</li>
- <li>椤电鏂板鍏抽棴宸︿晶&娣诲姞鍥炬爣</li>
- <li>椤堕儴鑿滃崟鎺掗櫎闅愯棌鐨勯粯璁よ矾鐢�</li>
- <li>椤堕儴鑿滃崟鍚屾绯荤粺涓婚鏍峰紡</li>
- <li>璺宠浆璺敱楂樹寒鐩稿搴旂殑鑿滃崟鏍�</li>
- <li>浠g爜鐢熸垚涓诲瓙琛ㄥ閫夎鏁版嵁</li>
- <li>鏃ユ湡鑼冨洿鏀寔娣诲姞澶氱粍</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.5</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.0</li>
- <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.11.0</li>
- <li>瀹氭椂浠诲姟灞忚斀ldap杩滅▼璋冪敤</li>
- <li>瀹氭椂浠诲姟灞忚斀http(s)杩滅▼璋冪敤</li>
- <li>琛ュ厖瀹氭椂浠诲姟琛ㄥ瓧娈垫敞閲�</li>
- <li>瀹氭椂浠诲姟瀵规鏌ュ紓甯歌繘琛屼簨鍔″洖婊�</li>
- <li>鍚敤鐖堕儴闂ㄧ姸鎬佹帓闄ら《绾ц妭鐐�</li>
- <li>瀵屾枃鏈柊澧炰笂浼犳枃浠跺ぇ灏忛檺鍒�</li>
- <li>榛樿棣栭〉浣跨敤keep-alive缂撳瓨</li>
- <li>淇敼浠g爜鐢熸垚瀛楀吀鍥炴樉鏍峰紡</li>
- <li>鑷畾涔夊垎椤靛悎鐞嗗寲浼犲叆鍙傛暟</li>
- <li>淇瀛楀吀缁勪欢鍊间负鏁村舰涓嶆樉绀洪棶棰�</li>
- <li>淇瀹氭椂浠诲姟鏃ュ織鎵ц鐘舵�佹樉绀�</li>
- <li>瑙掕壊&鑿滃崟鏂板瀛楁灞炴�ф彁绀轰俊鎭�</li>
- <li>淇瑙掕壊鍒嗛厤鐢ㄦ埛椤甸潰鍙傛暟绫诲瀷閿欒鎻愰啋</li>
- <li>浼樺寲甯冨眬璁剧疆鍔ㄧ敾鐗规晥</li>
- <li>浼樺寲寮傚父澶勭悊淇℃伅</li>
- <li>浼樺寲閿欒token瀵艰嚧鐨勮В鏋愬紓甯�</li>
- <li>瀵嗙爜妗嗘柊澧炴樉绀哄垏鎹㈠瘑鐮佸浘鏍�</li>
- <li>瀹氭椂浠诲姟鏂板鏇村鎿嶄綔</li>
- <li>鏇村鎿嶄綔鎸夐挳娣诲姞鏉冮檺鎺у埗</li>
- <li>瀵煎叆鐢ㄦ埛鏍峰紡浼樺寲</li>
- <li>鎻愬彇閫氱敤鏂规硶鍒板熀绫绘帶鍒跺櫒</li>
- <li>浼樺寲浣跨敤鏉冮檺宸ュ叿鑾峰彇鐢ㄦ埛淇℃伅</li>
- <li>浼樺寲鐢ㄦ埛涓嶈兘鍒犻櫎鑷繁</li>
- <li>浼樺寲XSS璺ㄧ珯鑴氭湰杩囨护</li>
- <li>浼樺寲浠g爜鐢熸垚妯℃澘</li>
- <li>楠岃瘉鐮侀粯璁�20s瓒呮椂</li>
- <li>BLOB涓嬭浇鏃舵竻闄RL瀵硅薄寮曠敤</li>
- <li>浠g爜鐢熸垚瀵煎叆琛ㄦ寜鍒涘缓鏃堕棿鎺掑簭</li>
- <li>淇浠g爜鐢熸垚椤甸潰鏁版嵁缂栬緫淇濆瓨涔嬪悗鎬绘槸璺宠浆绗竴椤电殑闂</li>
- <li>淇甯afari娴忚鍣ㄦ棤娉曟牸寮忓寲utc鏃ユ湡鏍煎紡yyyy-MM-dd'T'HH:mm:ss.SSS闂</li>
- <li>澶氬浘涓婁紶缁勪欢绉婚櫎澶氫綑鐨刟pi鍦板潃&楠岃瘉澶辫触瀵艰嚧鍥剧墖鍒犻櫎闂&鏃犳硶鍒犻櫎鐩稿簲鍥剧墖淇</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.6.0 - 2021-07-12">
- <ol>
- <li>瑙掕壊绠$悊鏂板鍒嗛厤鐢ㄦ埛鍔熻兘</li>
- <li>鐢ㄦ埛绠$悊鏂板鍒嗛厤瑙掕壊鍔熻兘</li>
- <li>鏃ュ織鍒楄〃鏀寔鎺掑簭鎿嶄綔</li>
- <li>浼樺寲鍙傛暟&瀛楀吀缂撳瓨鎿嶄綔</li>
- <li>绯荤粺甯冨眬閰嶇疆鏀寔鍔ㄦ�佹爣棰樺紑鍏�</li>
- <li>鑿滃崟璺敱閰嶇疆鏀寔鍐呴摼璁块棶</li>
- <li>榛樿璁块棶鍚庣棣栭〉鏂板鎻愮ず璇�</li>
- <li>瀵屾枃鏈粯璁や笂浼犺繑鍥瀠rl绫诲瀷</li>
- <li>鏂板鑷畾涔夊脊绐楁嫋鎷芥寚浠�</li>
- <li>鍏ㄥ眬娉ㄥ唽甯哥敤閫氱敤缁勪欢</li>
- <li>鍏ㄥ眬鎸傝浇瀛楀吀鏍囩缁勪欢</li>
- <li>ImageUpload缁勪欢鏀寔澶氬浘鐗囦笂浼�</li>
- <li>FileUpload缁勪欢鏀寔澶氭枃浠朵笂浼�</li>
- <li>鏂囦欢涓婁紶缁勪欢娣诲姞鏁伴噺闄愬埗灞炴��</li>
- <li>瀵屾枃鏈紪杈戠粍浠舵坊鍔犵被鍨嬪睘鎬�</li>
- <li>瀵屾枃鏈粍浠跺伐鍏锋爮閰嶇疆瑙嗛</li>
- <li>灏佽閫氱敤iframe缁勪欢</li>
- <li>闄愬埗瓒呯骇绠$悊鍛樹笉鍏佽鎿嶄綔</li>
- <li>鐢ㄦ埛淇℃伅闀垮害鏍¢獙闄愬埗</li>
- <li>鍒嗛〉缁勪欢鏂板pagerCount灞炴��</li>
- <li>娣诲姞bat鑴氭湰鎵ц搴旂敤</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.7.4</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.2</li>
- <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.1</li>
- <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.10.0</li>
- <li>鍗囩骇commons.fileupload鍒版渶鏂扮増鏈瑅1.4</li>
- <li>鍗囩骇swagger鍒版渶鏂扮増鏈瑅3.0.0</li>
- <li>淇鍏抽棴confirm鎻愮ず妗嗘帶鍒跺彴鎶ラ敊闂</li>
- <li>淇瀛樺湪鐨凷QL娉ㄥ叆婕忔礊闂</li>
- <li>瀹氭椂浠诲姟灞忚斀rmi杩滅▼璋冪敤</li>
- <li>淇鐢ㄦ埛鎼滅储鍒嗛〉鍙橀噺閿欒</li>
- <li>淇瀵煎嚭瑙掕壊鏁版嵁鑼冨洿缈昏瘧缂哄皯浠呮湰浜�</li>
- <li>淇琛ㄥ崟鏋勫缓閫夋嫨涓嬫媺閫夋嫨鎺у埗鍙版姤閿欓棶棰�</li>
- <li>浼樺寲鍥剧墖宸ュ叿绫昏鍙栨枃浠�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.5.0 - 2021-05-25">
- <ol>
- <li>鏂板鑿滃崟瀵艰埅鏄剧ず椋庢牸TopNav锛坒alse涓哄乏渚у鑸彍鍗曪紝true涓洪《閮ㄥ鑸彍鍗曪級</li>
- <li>甯冨眬璁剧疆鏀寔淇濆瓨&閲嶇疆閰嶇疆</li>
- <li>淇鏍戣〃鏁版嵁鏄剧ず涓嶅叏&鍔犺浇鎱㈤棶棰�</li>
- <li>鏂板IE娴忚鍣ㄧ増鏈繃浣庢彁绀洪〉闈�</li>
- <li>鐢ㄦ埛鐧诲綍鍚庤褰曟渶鍚庣櫥褰旾P&鏃堕棿</li>
- <li>椤甸潰瀵煎嚭鎸夐挳鐐瑰嚮涔嬪悗娣诲姞閬僵</li>
- <li>瀵屾枃鏈紪杈戝櫒鏀寔鑷畾涔変笂浼犲湴鍧�</li>
- <li>瀵屾枃鏈紪杈戠粍浠舵柊澧瀝eadOnly灞炴��</li>
- <li>椤电TagsView鏂板鍏抽棴鍙充晶鍔熻兘</li>
- <li>鏄鹃殣鍒楃粍浠跺姞杞藉垵濮嬮粯璁ら殣钘忓垪</li>
- <li>鍏抽棴澶村儚涓婁紶绐楀彛杩樺師榛樿鍥剧墖</li>
- <li>涓汉淇℃伅娣诲姞鎵嬫満&閭閲嶅楠岃瘉</li>
- <li>浠g爜鐢熸垚妯℃澘瀵煎嚭鎸夐挳鐐瑰嚮鍚庢坊鍔犻伄缃�</li>
- <li>浠g爜鐢熸垚妯℃澘鏍戣〃鎿嶄綔鍒楁坊鍔犳柊澧炴寜閽�</li>
- <li>浠g爜鐢熸垚妯℃澘淇涓诲瓙琛ㄥ瓧娈甸噸鍚嶉棶棰�</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.76</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.6</li>
- <li>鍗囩骇mybatis鍒版渶鏂扮増3.5.6 闃绘杩滅▼浠g爜鎵ц婕忔礊</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.6.0</li>
- <li>velocity鍓旈櫎commons-collections鐗堟湰锛岄槻姝�3.2.1鐗堟湰鐨勫弽搴忓垪鍖栨紡娲�</li>
- <li>鏁版嵁鐩戞帶椤甸粯璁よ处鎴峰瘑鐮侀槻姝㈣秺鏉冭闂�</li>
- <li>淇firefox涓嬭〃鍗曟瀯寤烘嫋鎷戒細鏂版墦鍗′竴涓�夐」鍗�</li>
- <li>淇鍚庣瀵煎叆琛ㄦ潈闄愭爣璇�</li>
- <li>淇鍓嶇鎿嶄綔鏃ュ織&鐧诲綍鏃ュ織鏉冮檺鏍囪瘑</li>
- <li>璁剧疆Redis閰嶇疆HashKey搴忓垪鍖�</li>
- <li>鍒犻櫎鎿嶄綔鏃ュ織璁板綍淇℃伅</li>
- <li>涓婁紶濯掍綋绫诲瀷娣诲姞瑙嗛鏍煎紡</li>
- <li>淇璇锋眰褰㈠弬鏈紶鍊艰褰曟棩蹇楀紓甯搁棶棰�</li>
- <li>浼樺寲xss鏍¢獙json璇锋眰鏉′欢</li>
- <li>鏍戠骇缁撴瀯鏇存柊瀛愯妭鐐逛娇鐢╮eplaceFirst</li>
- <li>浼樺寲ExcelUtil绌哄�煎鐞�</li>
- <li>鏃ュ織璁板綍杩囨护BindingResult瀵硅薄锛岄槻姝㈠紓甯�</li>
- <li>淇敼涓婚鍚巑ini绫诲瀷鎸夐挳鏃犳晥闂</li>
- <li>浼樺寲閫氱敤涓嬭浇瀹屾垚鍚庡垹闄よ妭鐐�</li>
- <li>閫氱敤Controller娣诲姞鍝嶅簲杩斿洖娑堟伅</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.4.0 - 2021-02-22">
- <ol>
- <li>浠g爜鐢熸垚妯℃澘鏀寔涓诲瓙琛�</li>
- <li>琛ㄦ牸鍙充晶宸ュ叿鏍忕粍浠舵敮鎸佹樉闅愬垪</li>
- <li>鍥剧墖缁勪欢娣诲姞棰勮&绉婚櫎鍔熻兘</li>
- <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎嚭</li>
- <li>鎿嶄綔鎸夐挳缁勮皟鏁翠负鏈寸礌鎸夐挳鏍峰紡</li>
- <li>浠g爜鐢熸垚鏀寔鏂囦欢涓婁紶缁勪欢</li>
- <li>浠g爜鐢熸垚鏃ユ湡鎺т欢鍖哄垎鑼冨洿</li>
- <li>浠g爜鐢熸垚鏁版嵁搴撴枃鏈被鍨嬬敓鎴愯〃鍗曟枃鏈煙</li>
- <li>鐢ㄦ埛鎵嬫満閭&鑿滃崟缁勪欢淇敼鍏佽绌哄瓧绗︿覆</li>
- <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.2.13 鎻愬崌鍚姩閫熷害</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.4</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.75</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.0</li>
- <li>淇IE11娴忚鍣ㄦ姤閿欓棶棰�</li>
- <li>浼樺寲澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li>
- <li>淇鍥涚骇鑿滃崟鏃犳硶鏄剧ず闂</li>
- <li>淇渚ц竟鏍忛潤鎬佽矾鐢变涪澶遍棶棰�</li>
- <li>淇瑙掕壊绠$悊-缂栬緫瑙掕壊-鍔熻兘鏉冮檺鏄剧ず寮傚父</li>
- <li>閰嶇疆鏂囦欢鏂板redis鏁版嵁搴撶储寮曞睘鎬�</li>
- <li>鏉冮檺宸ュ叿绫诲鍔燼dmin鍒ゆ柇</li>
- <li>瑙掕壊闈炶嚜瀹氫箟鏉冮檺鑼冨洿娓呯┖閫夋嫨鍊�</li>
- <li>淇瀵煎叆鏁版嵁涓鸿礋娴偣鏁版椂涓㈠け绮惧害闂</li>
- <li>绉婚櫎path-to-regexp姝e垯鍖归厤鎻掍欢</li>
- <li>淇鐢熸垚鏍戣〃浠g爜寮傚父</li>
- <li>淇敼ip瀛楁闀垮害闃叉ipv6鍦板潃闀垮害涓嶅</li>
- <li>闃叉get璇锋眰鍙傛暟鍊间负false鎴�0绛夌壒娈婂�间細瀵艰嚧鏃犳硶姝g‘鐨勪紶鍙�</li>
- <li>鐧诲綍鍚巔ush娣诲姞catch闃叉鍑虹幇妫�鏌ラ敊璇�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.3.0 - 2020-12-14">
- <ol>
- <li>鏂板缂撳瓨鐩戞帶鍔熻兘</li>
- <li>鏀寔涓婚椋庢牸閰嶇疆</li>
- <li>淇澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li>
- <li>澶氱骇鑿滃崟鑷姩閰嶇疆缁勪欢</li>
- <li>浠g爜鐢熸垚棰勮鏀寔楂樹寒鏄剧ず</li>
- <li>鏀寔Get璇锋眰鏄犲皠Params鍙傛暟</li>
- <li>鍒犻櫎鐢ㄦ埛鍜岃鑹茶В缁戝叧鑱�</li>
- <li>鍘婚櫎鐢ㄦ埛鎵嬫満閭閮ㄩ棬蹇呭~楠岃瘉</li>
- <li>Excel鏀寔娉ㄨВalign瀵归綈鏂瑰紡</li>
- <li>Excel鏀寔瀵煎叆Boolean鍨嬫暟鎹�</li>
- <li>浼樺寲澶村儚鏍峰紡锛岄紶鏍囩Щ鍏ユ偓鍋滈伄缃�</li>
- <li>浠g爜鐢熸垚棰勮鎻愪緵婊氬姩鏈哄埗</li>
- <li>浠g爜鐢熸垚鍒犻櫎澶氫綑鐨勬暟瀛梖loat绫诲瀷</li>
- <li>淇杞崲瀛楃涓茬殑鐩爣瀛楃闆嗗睘鎬�</li>
- <li>鍥炴樉鏁版嵁瀛楀吀闃叉绌哄�兼姤閿�</li>
- <li>鏃ュ織璁板綍澧炲姞杩囨护澶氭枃浠跺満鏅�</li>
- <li>淇敼缂撳瓨Set鏂规硶鍙兘瀵艰嚧宓屽鐨勯棶棰�</li>
- <li>绉婚櫎鍓嶇涓�浜涘浣欑殑渚濊禆</li>
- <li>闃叉瀹夊叏鎵弿YUI鍑虹幇鐨勯闄╂彁绀�</li>
- <li>淇敼node-sass涓篸art-sass</li>
- <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.1.18</li>
- <li>鍗囩骇poi鍒版渶鏂扮増鏈�4.1.2</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.3.6</li>
- <li>鍗囩骇bitwalker鍒版渶鏂扮増鏈�1.21</li>
- <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.21.0</li>
- <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.14.1</li>
- <li>鍗囩骇vue鍒版渶鏂扮増鏈�2.6.12</li>
- <li>鍗囩骇vuex鍒版渶鏂扮増鏈�3.6.0</li>
- <li>鍗囩骇vue-cli鍒扮増鏈�4.5.9</li>
- <li>鍗囩骇vue-router鍒版渶鏂扮増鏈�3.4.9</li>
- <li>鍗囩骇vue-cli鍒版渶鏂扮増鏈�4.4.6</li>
- <li>鍗囩骇vue-cropper鍒版渶鏂扮増鏈�0.5.5</li>
- <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.6</li>
- <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.8.1</li>
- <li>鍗囩骇echarts鍒版渶鏂扮増鏈�4.9.0</li>
- <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.4</li>
- <li>鍗囩骇fuse.js鍒版渶鏂扮増鏈�6.4.3</li>
- <li>鍗囩骇js-beautify鍒版渶鏂扮増鏈�1.13.0</li>
- <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�2.2.1</li>
- <li>鍗囩骇path-to-regexp鍒版渶鏂扮増鏈�6.2.0</li>
- <li>鍗囩骇quill鍒版渶鏂扮増鏈�1.3.7</li>
- <li>鍗囩骇screenfull鍒版渶鏂扮増鏈�5.0.2</li>
- <li>鍗囩骇sortablejs鍒版渶鏂扮増鏈�1.10.2</li>
- <li>鍗囩骇vuedraggable鍒版渶鏂扮増鏈�2.24.3</li>
- <li>鍗囩骇chalk鍒版渶鏂扮増鏈�4.1.0</li>
- <li>鍗囩骇eslint鍒版渶鏂扮増鏈�7.15.0</li>
- <li>鍗囩骇eslint-plugin-vue鍒版渶鏂扮増鏈�7.2.0</li>
- <li>鍗囩骇lint-staged鍒版渶鏂扮増鏈�10.5.3</li>
- <li>鍗囩骇runjs鍒版渶鏂扮増鏈�4.4.2</li>
- <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.0</li>
- <li>鍗囩骇script-ext-html-webpack-plugin鍒版渶鏂扮増鏈�2.1.5</li>
- <li>鍗囩骇svg-sprite-loader鍒版渶鏂扮増鏈�5.1.1</li>
- <li>鍗囩骇vue-template-compiler鍒版渶鏂扮増鏈�2.6.12</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.2.1 - 2020-11-18">
- <ol>
- <li>闃绘浠绘剰鏂囦欢涓嬭浇婕忔礊</li>
- <li>浠g爜鐢熸垚鏀寔涓婁紶鎺т欢</li>
- <li>鏂板鍥剧墖涓婁紶缁勪欢</li>
- <li>璋冩暣榛樿棣栭〉</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.2</li>
- <li>mapperLocations閰嶇疆鏀寔鍒嗛殧绗�</li>
- <li>鏉冮檺淇℃伅璋冩暣</li>
- <li>璋冩暣sql榛樿鏃堕棿</li>
- <li>瑙e喅浠g爜鐢熸垚娌℃湁bit绫诲瀷鐨勯棶棰�</li>
- <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.0</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v3.2.0 - 2020-10-10">
- <ol>
- <li>鍗囩骇springboot鐗堟湰鍒�2.1.17 鎻愬崌瀹夊叏鎬�</li>
- <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.2.5</li>
- <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.1</li>
- <li>鍗囩骇jjwt鍒扮増鏈�0.9.1</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.74</li>
- <li>淇敼sass涓簄ode-sass锛岄伩鍏峞l-icon鍥炬爣涔辩爜</li>
- <li>浠g爜鐢熸垚鏀寔鍚屾鏁版嵁搴�</li>
- <li>浠g爜鐢熸垚鏀寔瀵屾枃鏈帶浠�</li>
- <li>浠g爜鐢熸垚椤甸潰鏃朵笉蹇界暐remark灞炴��</li>
- <li>浠g爜鐢熸垚娣诲姞select蹇呭~閫夐」</li>
- <li>Excel瀵煎嚭绫诲瀷NUMERIC鏀寔绮惧害娴偣绫诲瀷</li>
- <li>Excel瀵煎嚭targetAttr浼樺寲鑾峰彇鍊硷紝闃叉get鏂规硶涓嶈鑼�</li>
- <li>Excel娉ㄨВ鏀寔鑷姩缁熻鏁版嵁鎬诲拰</li>
- <li>Excel娉ㄨВ鏀寔璁剧疆BigDecimal绮惧害&鑸嶅叆瑙勫垯</li>
- <li>鑿滃崟&鏁版嵁鏉冮檺鏂板锛堝睍寮�/鎶樺彔 鍏ㄩ��/鍏ㄤ笉閫� 鐖跺瓙鑱斿姩锛�</li>
- <li>鍏佽鐢ㄦ埛鍒嗛厤鍒伴儴闂ㄧ埗鑺傜偣</li>
- <li>鑿滃崟鏂板鏄惁缂撳瓨keep-alive</li>
- <li>琛ㄦ牸鎿嶄綔鍒楅棿璺濊皟鏁�</li>
- <li>闄愬埗绯荤粺鍐呯疆鍙傛暟涓嶅厑璁稿垹闄�</li>
- <li>瀵屾枃鏈粍浠朵紭鍖栵紝鏀寔鑷畾涔夐珮搴�&鍥剧墖鍐茬獊闂</li>
- <li>瀵屾枃鏈伐鍏锋爮鏍峰紡瀵归綈</li>
- <li>瀵煎叆excel鏁村舰鍊兼牎楠屼紭鍖�</li>
- <li>淇椤电鍏抽棴鎵�鏈夋椂鍥哄畾鏍囩璺敱涓嶅埛鏂伴棶棰�</li>
- <li>琛ㄥ崟鏋勫缓甯冨眬鍨嬬粍浠舵柊澧炴寜閽�</li>
- <li>宸︿晶鑿滃崟鏂囧瓧杩囬暱鏄剧ず鐪佺暐鍙�</li>
- <li>淇鏍硅妭鐐逛负瀛愰儴闂ㄦ椂锛屾爲鐘剁粨鏋勬樉绀洪棶棰�</li>
- <li>淇璋冪敤鐩爣瀛楃涓叉渶澶ч暱搴�</li>
- <li>淇鑿滃崟鎻愮ず淇℃伅閿欒</li>
- <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃潈闄愭爣璇�</li>
- <li>淇鏁版嵁搴撳瓧绗︿覆绫诲瀷nvarchar</li>
- <li>浼樺寲閫掑綊瀛愯妭鐐�</li>
- <li>浼樺寲鏁版嵁鏉冮檺鍒ゆ柇</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
-
- <el-collapse-item title="v3.1.0 - 2020-08-13">
- <ol>
- <li>琛ㄦ牸宸ュ叿鏍忓彸渚ф坊鍔犲埛鏂�&鏄鹃殣鏌ヨ缁勪欢</li>
- <li>鍚庣鏀寔CORS璺ㄥ煙璇锋眰</li>
- <li>浠g爜鐢熸垚鏀寔閫夋嫨涓婄骇鑿滃崟</li>
- <li>浠g爜鐢熸垚鏀寔鑷畾涔夎矾寰�</li>
- <li>浠g爜鐢熸垚鏀寔澶嶉�夋</li>
- <li>Excel瀵煎嚭瀵煎叆鏀寔dictType瀛楀吀绫诲瀷</li>
- <li>Excel鏀寔鍒嗗壊瀛楃涓茬粍鍐呭</li>
- <li>楠岃瘉鐮佺被鍨嬫敮鎸侊紙鏁扮粍璁$畻銆佸瓧绗﹂獙璇侊級</li>
- <li>鍗囩骇vue-cli鐗堟湰鍒�4.4.4</li>
- <li>淇敼 node-sass 涓� dart-sass</li>
- <li>琛ㄥ崟绫诲瀷涓篒nteger/Long璁剧疆鏁村舰榛樿鍊�</li>
- <li>浠g爜鐢熸垚鍣ㄩ粯璁apper璺緞涓庨粯璁apperScan璺緞涓嶄竴鑷�</li>
- <li>浼樺寲闃查噸澶嶆彁浜ゆ嫤鎴櫒</li>
- <li>浼樺寲涓婄骇鑿滃崟涓嶈兘閫夋嫨鑷繁</li>
- <li>淇瑙掕壊鐨勬潈闄愬垎閰嶅悗锛屾湭瀹炴椂鐢熸晥闂</li>
- <li>淇鍦ㄧ嚎鐢ㄦ埛鏃ュ織璁板綍绫诲瀷</li>
- <li>淇瀵屾枃鏈┖鏍煎拰缂╄繘淇濆瓨鍚庝笉鐢熸晥闂</li>
- <li>淇鍦ㄧ嚎鐢ㄦ埛鍒ゆ柇閫昏緫</li>
- <li>鍞竴闄愬埗鏉′欢鍙繑鍥炲崟鏉℃暟鎹�</li>
- <li>娣诲姞鑾峰彇褰撳墠鐨勭幆澧冮厤缃柟娉�</li>
- <li>瓒呮椂鐧诲綍鍚庨〉闈㈣烦杞埌棣栭〉</li>
- <li>鍏ㄥ眬寮傚父鐘舵�佹眽鍖栨嫤鎴鐞�</li>
- <li>HTML杩囨护鍣ㄦ敼涓哄皢html杞箟</li>
- <li>妫�鏌ュ瓧绗︽敮鎸佸皬鏁扮偣&闄嶇骇鏀规垚寮傚父鎻愰啋</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
-
- <el-collapse-item title="v3.0.0 - 2020-07-20">
- <ol>
- <li>鍗曞簲鐢ㄨ皟鏁翠负澶氭ā鍧楅」鐩�</li>
- <li>鍗囩骇element-ui鐗堟湰鍒�2.13.2</li>
- <li>鍒犻櫎babel锛屾彁楂樼紪璇戦�熷害銆�</li>
- <li>鏂板鑿滃崟榛樿涓荤被鐩�</li>
- <li>缂栫爜鏂囦欢鍚嶄慨鏀逛负uuid鏂瑰紡</li>
- <li>瀹氭椂浠诲姟cron琛ㄨ揪寮忛獙璇�</li>
- <li>瑙掕壊鏉冮檺淇敼鏃跺凡鏈夋潈闄愭湭鑷姩鍕鹃�夊紓甯镐慨澶�</li>
- <li>闃叉鍒囨崲鏉冮檺鐢ㄦ埛鍚庣櫥褰曞嚭鐜�404</li>
- <li>Excel鏀寔sort瀵煎嚭鎺掑簭</li>
- <li>鍒涘缓鐢ㄦ埛涓嶅厑璁搁�夋嫨瓒呯骇绠$悊鍛樿鑹�</li>
- <li>淇浠g爜鐢熸垚瀵煎叆琛ㄧ粨鏋勫嚭鐜板紓甯搁〉闈笉鎻愰啋闂</li>
- <li>淇浠g爜鐢熸垚鐐瑰嚮澶氭琛ㄤ慨鏀规暟鎹笉鍙樺寲鐨勯棶棰�</li>
- <li>淇澶村儚涓婁紶鎴愬姛浜屾鎵撳紑鏃犳硶鏀瑰彉瑁佸壀妗嗗ぇ灏忓拰浣嶇疆闂</li>
- <li>淇甯冨眬涓簊mall鑰卪ini鐢ㄦ埛琛ㄥ崟鏄剧ず閿欎綅闂</li>
- <li>淇鐑儴缃插鑷寸殑寮烘崲寮傚父闂</li>
- <li>淇敼鐢ㄦ埛绠$悊澶嶉�夋瀹藉害锛岄槻姝㈤儴鍒嗘祻瑙堝櫒鍑虹幇鐪佺暐鍙�</li>
- <li>IpUtils宸ュ叿锛屾竻闄ss鐗规畩瀛楃锛岄槻姝ff娉ㄥ叆鏀诲嚮</li>
- <li>鐢熸垚domain 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal</li>
- <li>瀹氭椂浠诲姟璋冩暣label-width锛岄槻姝㈤儴缃插嚭鐜伴敊浣�</li>
- <li>璋冩暣琛ㄥご鍥哄畾鍒楅粯璁ゆ牱寮�</li>
- <li>浠g爜鐢熸垚妯℃澘璋冩暣锛屽瓧娈典负String骞朵笖蹇呭~鍒欏姞绌轰覆鏉′欢</li>
- <li>浠g爜鐢熸垚瀛楀吀Integer/Long浣跨敤parseInt</li>
- <li>
- 淇dict_sort涓嶅彲update涓�0鐨勯棶棰�&鏌ヨ杩斿洖澧炲姞dict_sort鍗囧簭鎺掑簭
- </li>
- <li>淇宀椾綅瀵煎嚭鏉冮檺娉ㄨВ</li>
- <li>绂佹鍔犲瘑瀵嗘枃杩斿洖鍓嶇</li>
- <li>淇浠g爜鐢熸垚椤甸潰涓殑鏌ヨ鏉′欢鍒涘缓鏃堕棿鏈敓鏁堢殑闂</li>
- <li>淇棣栭〉鎼滅储鑿滃崟澶栭摼鏃犳硶鐐瑰嚮璺宠浆闂</li>
- <li>淇鑿滃崟绠$悊閫夋嫨鍥炬爣锛宐ackspace鍒犻櫎鏃朵笉杩囨护鏁版嵁</li>
- <li>鐢ㄦ埛绠$悊閮ㄩ棬鍒嗘敮鑺傜偣涓嶅彲妫�鏌�&鏄剧ず璁℃暟</li>
- <li>鏁版嵁鑼冨洿杩囨护灞炴�ц皟鏁�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
-
- <el-collapse-item title="v2.3.0 - 2020-06-01">
- <ol>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.70 淇楂樺嵄瀹夊叏婕忔礊</li>
- <li>dev鍚姩榛樿鎵撳紑娴忚鍣�</li>
- <li>vue-cli浣跨敤榛樿source-map</li>
- <li>slidebar eslint鎶ラ敊浼樺寲</li>
- <li>褰搕ags-view婊氬姩鍏抽棴鍙抽敭鑿滃崟</li>
- <li>瀛楀吀绠$悊娣诲姞缂撳瓨璇诲彇</li>
- <li>鍙傛暟绠$悊鏀寔缂撳瓨鎿嶄綔</li>
- <li>鏀寔涓�绾ц彍鍗曪紙鍜屼富椤靛悓绾э級鍦╩ain鍖哄煙鏄剧ず</li>
- <li>闄愬埗澶栭摼鍦板潃蹇呴』浠ttp(s)寮�澶�</li>
- <li>tagview & sidebar 涓婚棰滆壊涓巈lement ui(鍏ㄥ眬)鍚屾</li>
- <li>淇敼鏁版嵁婧愮被鍨嬩紭鍏堢骇锛屽厛鏍规嵁鏂规硶锛屽啀鏍规嵁绫�</li>
- <li>鏀寔鏄惁闇�瑕佽缃畉oken灞炴�э紝鑷畾涔夎繑鍥炵爜娑堟伅銆�</li>
- <li>swagger璇锋眰鍓嶇紑鍔犲叆閰嶇疆銆�</li>
- <li>鐧诲綍鍦扮偣璁剧疆鍐呭杩囬暱鍒欓殣钘忔樉绀�</li>
- <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃寜閽悗涓嶆彁绀烘秷鎭棶棰�</li>
- <li>淇敼涓婄骇閮ㄩ棬锛堥�夋嫨椤规帓闄ゆ湰韬拰涓嬬骇锛�</li>
- <li>閫氱敤http鍙戦�佹柟娉曞鍔犲弬鏁� contentType 缂栫爜绫诲瀷</li>
- <li>鏇存崲IP鍦板潃鏌ヨ鎺ュ彛</li>
- <li>淇椤电鍙橀噺undefined</li>
- <li>娣诲姞鏍¢獙閮ㄩ棬鍖呭惈鏈仠鐢ㄧ殑瀛愰儴闂�</li>
- <li>淇敼瀹氭椂浠诲姟璇︽儏涓嬫鎵ц鏃堕棿鏃ユ湡鏄剧ず閿欒</li>
- <li>瑙掕壊绠$悊鏌ヨ璁剧疆榛樿鎺掑簭瀛楁</li>
- <li>swagger娣诲姞enable鍙傛暟鎺у埗鏄惁鍚敤</li>
- <li>鍙json绫诲瀷璇锋眰鏋勫缓鍙噸澶嶈鍙杋nputStream鐨剅equest</li>
- <li>淇敼浠g爜鐢熸垚瀛楀吀瀛楁int绫诲瀷娌℃湁鑷姩閫変腑闂</li>
- <li>vuex鐢ㄦ埛鍚嶅彇鍊间慨姝�</li>
- <li>琛ㄦ牸鏍戞ā鏉垮幓鎺夊浣欑殑)</li>
- <li>浠g爜鐢熸垚搴忓彿淇</li>
- <li>鍏ㄥ睆鎯呭喌涓嬩笉璋冩暣涓婂杈硅窛</li>
- <li>浠g爜鐢熸垚Date瀛楁娣诲姞榛樿鏍煎紡</li>
- <li>鐢ㄦ埛绠$悊瑙掕壊閫夋嫨鏉冮檺鎺у埗</li>
- <li>淇璺敱鎳掑姞杞芥姤閿欓棶棰�</li>
- <li>妯℃澘sql.vm娣诲姞鑿滃崟鐘舵��</li>
- <li>璁剧疆鐢ㄦ埛鍚嶇О涓嶈兘淇敼</li>
- <li>dialog娣诲姞append-to-body灞炴�э紝闃叉ie閬僵</li>
- <li>鑿滃崟鍖哄垎鐘舵�佸拰鏄剧ず闅愯棌鍔熻兘</li>
- <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.68 淇瀹夊叏鍔犲浐</li>
- <li>淇浠g爜鐢熸垚濡傛灉閫夋嫨瀛楀吀绫诲瀷缂哄け閫楀彿闂</li>
- <li>鐧诲綍璇锋眰params鏇存崲涓篸ata锛岄槻姝㈡毚闇瞮rl</li>
- <li>鏃ュ織杩斿洖鏃堕棿鏍煎紡澶勭悊</li>
- <li>娣诲姞handle鎺у埗鍏佽鎷栧姩鐨勫厓绱�</li>
- <li>甯冨眬璁剧疆鐐瑰嚮鎵╁ぇ鑼冨洿</li>
- <li>浠g爜鐢熸垚鍒楀睘鎬ф帓搴忔煡璇�</li>
- <li>浠g爜鐢熸垚鍒楁敮鎸佹嫋鍔ㄦ帓搴�</li>
- <li>淇鏃堕棿鏍煎紡涓嶆敮鎸乮os闂</li>
- <li>琛ㄥ崟鏋勫缓娣诲姞鐖剁骇class锛岄槻姝㈠啿绐�</li>
- <li>瀹氭椂浠诲姟骞跺彂灞炴�т慨姝�</li>
- <li>瑙掕壊绂佺敤&鑿滃崟闅愯棌涓嶆煡璇㈡潈闄�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
-
- <el-collapse-item title="v2.2.0 - 2020-03-18">
- <ol>
- <li>绯荤粺鐩戞帶鏂板瀹氭椂浠诲姟鍔熻兘</li>
- <li>娣诲姞涓�涓墦鍖匴eb宸ョ▼bat</li>
- <li>淇椤电榧犳爣婊氳疆鎸変笅鐨勬椂鍊欙紝鍙互鍏抽棴涓嶅彲鍏抽棴鐨則ag</li>
- <li>淇鐐瑰嚮閫�鍑虹櫥褰曟湁鏃朵細鏃犳彁绀洪棶棰�</li>
- <li>淇闃查噸澶嶆彁浜ゆ敞瑙f棤鏁堥棶棰�</li>
- <li>淇閫氱煡鍏憡鎵归噺鍒犻櫎寮傚父闂</li>
- <li>娣诲姞鑿滃崟鏃惰矾鐢卞湴鍧�蹇呭~闄愬埗</li>
- <li>浠g爜鐢熸垚瀛楁鎻忚堪鍙紪杈�</li>
- <li>淇鐢ㄦ埛淇敼涓汉淇℃伅瀵艰嚧缂撳瓨涓嶈繃鏈熼棶棰�</li>
- <li>涓汉淇℃伅鍒涘缓鏃堕棿鑾峰彇姝g‘灞炴�у��</li>
- <li>鎿嶄綔鏃ュ織璇︾粏鏄剧ず姝g‘绫诲瀷</li>
- <li>瀵煎叆琛ㄥ崟鍑昏鏁版嵁鏃堕�変腑瀵瑰簲鐨勫閫夋</li>
- <li>鎵归噺鏇挎崲琛ㄥ墠缂�閫昏緫璋冩暣</li>
- <li>鍥哄畾閲嶅畾鍚戣矾寰勮〃杈惧紡</li>
- <li>鍗囩骇element-ui鐗堟湰鍒�2.13.0</li>
- <li>鎿嶄綔鏃ュ織鎺掑簭璋冩暣</li>
- <li>淇charts鍒囨崲渚ц竟鏍忔垨鑰呯缉鏀剧獥鍙f樉绀篵ug</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
-
- <el-collapse-item title="v2.1.0 - 2020-02-24">
- <ol>
- <li>鏂板琛ㄥ崟鏋勫缓</li>
- <li>浠g爜鐢熸垚鏀寔鏍戣〃缁撴瀯</li>
- <li>鏂板鐢ㄦ埛瀵煎叆</li>
- <li>淇鍔ㄦ�佸姞杞借矾鐢遍〉闈㈠埛鏂伴棶棰�</li>
- <li>淇鍦板潃寮�鍏虫棤鏁堥棶棰�</li>
- <li>姹夊寲閿欒鎻愮ず椤甸潰</li>
- <li>浠g爜鐢熸垚宸茬煡闂淇敼</li>
- <li>淇澶氭暟鎹簮涓嬮厤缃叧闂嚭鐜板紓甯稿鐞�</li>
- <li>娣诲姞HTML杩囨护鍣紝鐢ㄤ簬鍘婚櫎XSS婕忔礊闅愭偅</li>
- <li>淇涓婁紶澶村儚鎺у埗鍙板嚭鐜板紓甯�</li>
- <li>淇敼鐢ㄦ埛绠$悊鍒嗛〉涓嶆纭殑闂</li>
- <li>淇楠岃瘉鐮佽褰曟彁绀洪敊璇�</li>
- <li>淇request.js缂哄皯Message寮曠敤</li>
- <li>淇琛ㄦ牸鏃堕棿涓虹┖鍑虹幇鐨勫紓甯�</li>
- <li>娣诲姞Jackson鏃ユ湡鍙嶅簭鍒楀寲鏃跺尯閰嶇疆</li>
- <li>璋冩暣鏍规嵁鐢ㄦ埛鏉冮檺鍔犺浇鑿滃崟鏁版嵁鏍戝舰缁撴瀯</li>
- <li>璋冩暣鎴愬姛鐧诲綍涓嶆仮澶嶆寜閽紝闃叉澶氭鐐瑰嚮</li>
- <li>淇敼鐢ㄦ埛涓汉璧勬枡鍚屾缂撳瓨淇℃伅</li>
- <li>淇椤甸潰鍚屾椂鍑虹幇el-upload鍜孍ditor涓嶆樉绀哄鐞�</li>
- <li>淇鍦ㄨ鑹茬鐞嗛〉淇敼鑿滃崟鏉冮檺鍋跺皵鏈�変腑闂</li>
- <li>閰嶇疆鏂囦欢鏂板redis瀵嗙爜灞炴��</li>
- <li>璁剧疆mybatis鍏ㄥ眬鐨勯厤缃枃浠�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
-
- <el-collapse-item title="v2.0.0 - 2019-12-02">
- <ol>
- <li>鏂板浠g爜鐢熸垚</li>
- <li>鏂板@RepeatSubmit娉ㄨВ锛岄槻姝㈤噸澶嶆彁浜�</li>
- <li>鏂板鑿滃崟涓荤洰褰曟坊鍔�/鍒犻櫎鎿嶄綔</li>
- <li>鏃ュ織璁板綍杩囨护鐗规畩瀵硅薄锛岄槻姝㈣浆鎹㈠紓甯�</li>
- <li>淇敼浠g爜鐢熸垚璺敱鑴氭湰閿欒</li>
- <li>鐢ㄦ埛涓婁紶澶村儚瀹炴椂鍚屾缂撳瓨锛屾棤闇�閲嶆柊鐧诲綍</li>
- <li>璋冩暣鍒囨崲椤电鍚庝笉閲嶆柊鍔犺浇鏁版嵁</li>
- <li>娣诲姞jsencrypt瀹炵幇鍙傛暟鐨勫墠绔姞瀵�</li>
- <li>绯荤粺閫�鍑哄垹闄ょ敤鎴风紦瀛樿褰�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v1.1.0 - 2019-11-11">
- <ol>
- <li>鏂板鍦ㄧ嚎鐢ㄦ埛绠$悊</li>
- <li>鏂板鎸夐挳缁勫姛鑳藉疄鐜帮紙鎵归噺鍒犻櫎銆佸鍑恒�佹竻绌猴級</li>
- <li>鏂板鏌ヨ鏉′欢閲嶇疆鎸夐挳</li>
- <li>鏂板Swagger鍏ㄥ眬Token閰嶇疆</li>
- <li>鏂板鍚庣鍙傛暟鏍¢獙</li>
- <li>淇瀛楀吀绠$悊椤甸潰鐨勬棩鏈熸煡璇㈠紓甯�</li>
- <li>淇敼鏃堕棿鍑芥暟鍛藉悕闃叉鍐茬獊</li>
- <li>鍘婚櫎鑿滃崟涓婄骇鏍¢獙锛岄粯璁や负椤剁骇</li>
- <li>淇鐢ㄦ埛瀵嗙爜鏃犳硶淇敼闂</li>
- <li>淇鑿滃崟绫诲瀷涓烘寜閽椂涓嶆樉绀烘潈闄愭爣璇�</li>
- <li>鍏朵粬缁嗚妭浼樺寲</li>
- </ol>
- </el-collapse-item>
- <el-collapse-item title="v1.0.0 - 2019-10-08">
- <ol>
- <li>鑻ヤ緷鍓嶅悗绔垎绂荤郴缁熸寮忓彂甯�</li>
- </ol>
- </el-collapse-item>
- </el-collapse>
- </el-card>
- </el-col>
- <el-col :xs="24" :sm="24" :md="12" :lg="8">
- <el-card class="update-log">
- <template v-slot:header>
- <div class="clearfix">
- <span>鎹愯禒鏀寔</span>
- </div>
- </template>
- <div class="body">
- <img
- src="@/assets/images/pay.png"
- alt="donate"
- style="width:100%"
- />
- <span style="display: inline-block; height: 30px; line-height: 30px"
- >浣犲彲浠ヨ浣滆�呭枬鏉挅鍟¤〃绀洪紦鍔�</span
- >
+ </div>
+ </div>
+
+ <div class="stat-card supply">
+ <div class="card-icon">
+ <i class="el-icon-truck"></i>
+ </div>
+ <div class="card-content">
+ <div class="card-title">渚涘簲閲�</div>
+ <div class="card-value">8,965 鍚�</div>
+ <div class="card-trend">
+ <span class="trend-label">杈冩槰鏃�</span>
+ <span class="trend-value up">+8.2%</span>
</div>
- </el-card>
- </el-col>
- </el-row>
+ </div>
+ </div>
+ </div>
+
+ <!-- 涓棿鍥捐〃鍖哄煙 -->
+ <div class="chart-section">
+ <div class="chart-container">
+ <div class="chart-title">钀ユ敹鍒嗗竷</div>
+ <div ref="pieChart" class="chart-content pie-chart"></div>
+ </div>
+
+ <div class="chart-container">
+ <div class="chart-title">渚涘簲閲忚秼鍔�</div>
+ <div ref="areaChart" class="chart-content area-chart"></div>
+ </div>
+ </div>
+
+ <!-- 搴曢儴涓夋爮甯冨眬 -->
+ <div class="bottom-section">
+ <!-- 搴撳瓨缁熻 -->
+ <div class="bottom-card inventory">
+ <div class="card-header">
+ <h3>搴撳瓨缁熻</h3>
+ </div>
+ <div class="inventory-items">
+ <div class="inventory-item">
+ <div class="item-name">鍘熺叅</div>
+ <div class="item-value">15,432 鍚�</div>
+ <div class="item-status normal">姝e父</div>
+ </div>
+ <div class="inventory-item">
+ <div class="item-name">绮剧叅</div>
+ <div class="item-value">8,765 鍚�</div>
+ <div class="item-status normal">姝e父</div>
+ </div>
+ <div class="inventory-item">
+ <div class="item-name">鐒︾叅</div>
+ <div class="item-value">3,241 鍚�</div>
+ <div class="item-status low">鍋忎綆</div>
+ </div>
+ <div class="inventory-item">
+ <div class="item-name">鍧楃叅</div>
+ <div class="item-value">6,789 鍚�</div>
+ <div class="item-status normal">姝e父</div>
+ </div>
+ </div>
+ </div>
+
+ <!-- 鏌辩姸鍥� -->
+ <div class="bottom-card chart">
+ <div class="card-header">
+ <h3>鏈堝害瀵规瘮</h3>
+ </div>
+ <div ref="barChart" class="chart-content bar-chart"></div>
+ </div>
+
+ <!-- 閿�鍞暟鎹〃鏍� -->
+ <div class="bottom-card table">
+ <div class="card-header">
+ <h3>閿�鍞暟鎹�</h3>
+ </div>
+ <el-table
+ :data="salesData"
+ style="width: 100%"
+ :header-cell-style="tableHeaderStyle"
+ >
+ <el-table-column prop="product" label="浜у搧" width="80"></el-table-column>
+ <el-table-column prop="quantity" label="鏁伴噺" width="80"></el-table-column>
+ <el-table-column prop="amount" label="閲戦" width="90"></el-table-column>
+ <el-table-column prop="status" label="鐘舵��" width="70">
+ <template #default="scope">
+ <el-tag
+ :type="scope.row.status === '宸插畬鎴�' ? 'success' : 'warning'"
+ size="small"
+ >
+ {{ scope.row.status }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div>
</div>
</template>
-<script setup name="Index">
-const version = ref('3.8.9')
+<script>
+import * as echarts from 'echarts'
-function goTarget(url) {
- window.open(url, '__blank')
+export default {
+ name: 'Dashboard',
+ data() {
+ return {
+ salesData: [
+ { product: '鍘熺叅', quantity: '1,234鍚�', amount: '楼456,789', status: '宸插畬鎴�' },
+ { product: '绮剧叅', quantity: '567鍚�', amount: '楼234,567', status: '宸插畬鎴�' },
+ { product: '鐒︾叅', quantity: '890鍚�', amount: '楼345,678', status: '杩涜涓�' },
+ { product: '鍧楃叅', quantity: '432鍚�', amount: '楼123,456', status: '宸插畬鎴�' },
+ { product: '鐓ゆ偿', quantity: '678鍚�', amount: '楼234,567', status: '杩涜涓�' }
+ ],
+ tableHeaderStyle: {
+ backgroundColor: '#f5f7fa',
+ color: '#606266',
+ fontSize: '12px'
+ }
+ }
+ },
+ mounted() {
+ this.$nextTick(() => {
+ this.initCharts()
+ })
+ },
+ methods: {
+ initCharts() {
+ this.initPieChart()
+ this.initAreaChart()
+ this.initBarChart()
+ },
+
+ initPieChart() {
+ const chart = echarts.init(this.$refs.pieChart)
+ const option = {
+ tooltip: {
+ trigger: 'item',
+ formatter: '{a} <br/>{b}: {c} ({d}%)'
+ },
+ legend: {
+ orient: 'vertical',
+ left: 'right',
+ top: 'center',
+ textStyle: {
+ fontSize: 12
+ }
+ },
+ series: [
+ {
+ name: '钀ユ敹鍒嗗竷',
+ type: 'pie',
+ radius: ['30%', '70%'],
+ center: ['40%', '50%'],
+ avoidLabelOverlap: false,
+ label: {
+ show: false,
+ position: 'center'
+ },
+ emphasis: {
+ label: {
+ show: true,
+ fontSize: '16',
+ fontWeight: 'bold'
+ }
+ },
+ labelLine: {
+ show: false
+ },
+ data: [
+ { value: 335, name: '鍘熺叅', itemStyle: { color: '#409EFF' } },
+ { value: 310, name: '绮剧叅', itemStyle: { color: '#67C23A' } },
+ { value: 234, name: '鐒︾叅', itemStyle: { color: '#E6A23C' } },
+ { value: 135, name: '鍧楃叅', itemStyle: { color: '#F56C6C' } },
+ { value: 155, name: '鍏朵粬', itemStyle: { color: '#909399' } }
+ ]
+ }
+ ]
+ }
+ chart.setOption(option)
+
+ // 鍝嶅簲寮�
+ window.addEventListener('resize', () => {
+ chart.resize()
+ })
+ },
+
+ initAreaChart() {
+ const chart = echarts.init(this.$refs.areaChart)
+ const option = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'cross',
+ label: {
+ backgroundColor: '#6a7985'
+ }
+ }
+ },
+ legend: {
+ data: ['渚涘簲閲�'],
+ top: 10
+ },
+ grid: {
+ left: '3%',
+ right: '4%',
+ bottom: '3%',
+ containLabel: true
+ },
+ xAxis: [
+ {
+ type: 'category',
+ boundaryGap: false,
+ data: ['1鏈�', '2鏈�', '3鏈�', '4鏈�', '5鏈�', '6鏈�', '7鏈�'],
+ axisLabel: {
+ fontSize: 12
+ }
+ }
+ ],
+ yAxis: [
+ {
+ type: 'value',
+ axisLabel: {
+ fontSize: 12
+ }
+ }
+ ],
+ series: [
+ {
+ name: '渚涘簲閲�',
+ type: 'line',
+ stack: 'Total',
+ areaStyle: {
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ { offset: 0, color: 'rgba(64, 158, 255, 0.3)' },
+ { offset: 1, color: 'rgba(64, 158, 255, 0.1)' }
+ ])
+ },
+ emphasis: {
+ focus: 'series'
+ },
+ data: [1200, 1320, 1010, 1340, 900, 1230, 1100],
+ lineStyle: {
+ color: '#409EFF'
+ },
+ itemStyle: {
+ color: '#409EFF'
+ }
+ }
+ ]
+ }
+ chart.setOption(option)
+
+ // 鍝嶅簲寮�
+ window.addEventListener('resize', () => {
+ chart.resize()
+ })
+ },
+
+ initBarChart() {
+ const chart = echarts.init(this.$refs.barChart)
+ const option = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+ },
+ grid: {
+ left: '3%',
+ right: '4%',
+ bottom: '3%',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ data: ['鍘熺叅', '绮剧叅', '鐒︾叅', '鍧楃叅', '鐓ゆ偿'],
+ axisLabel: {
+ fontSize: 11
+ }
+ },
+ yAxis: {
+ type: 'value',
+ axisLabel: {
+ fontSize: 11
+ }
+ },
+ series: [
+ {
+ name: '閿�閲�',
+ type: 'bar',
+ data: [320, 302, 301, 334, 290],
+ itemStyle: {
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ { offset: 0, color: '#409EFF' },
+ { offset: 1, color: '#79bbff' }
+ ])
+ },
+ barWidth: '60%'
+ }
+ ]
+ }
+ chart.setOption(option)
+
+ // 鍝嶅簲寮�
+ window.addEventListener('resize', () => {
+ chart.resize()
+ })
+ }
+ }
}
</script>
-<style scoped lang="scss">
-.home {
- blockquote {
- padding: 10px 20px;
- margin: 0 0 20px;
- font-size: 17.5px;
- border-left: 5px solid #eee;
- }
- hr {
- margin-top: 20px;
- margin-bottom: 20px;
- border: 0;
- border-top: 1px solid #eee;
- }
- .col-item {
- margin-bottom: 20px;
- }
+<style scoped>
+.dashboard {
+ padding: 20px;
+ background-color: #f5f7fa;
+ min-height: 100vh;
+}
- ul {
- padding: 0;
- margin: 0;
+/* 椤堕儴缁熻鍗$墖 */
+.top-cards {
+ display: flex;
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+.stat-card {
+ flex: 1;
+ background: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ display: flex;
+ align-items: center;
+ gap: 15px;
+}
+
+.card-icon {
+ width: 60px;
+ height: 60px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 24px;
+ color: white;
+}
+
+.revenue .card-icon {
+ background: linear-gradient(135deg, #409EFF, #79bbff);
+}
+
+.supply .card-icon {
+ background: linear-gradient(135deg, #67C23A, #95d475);
+}
+
+.card-content {
+ flex: 1;
+}
+
+.card-title {
+ font-size: 14px;
+ color: #909399;
+ margin-bottom: 8px;
+}
+
+.card-value {
+ font-size: 24px;
+ font-weight: bold;
+ color: #303133;
+ margin-bottom: 5px;
+}
+
+.card-trend {
+ font-size: 12px;
+}
+
+.trend-label {
+ color: #909399;
+ margin-right: 5px;
+}
+
+.trend-value.up {
+ color: #67C23A;
+}
+
+/* 涓棿鍥捐〃鍖哄煙 */
+.chart-section {
+ display: flex;
+ gap: 20px;
+ margin-bottom: 20px;
+}
+.el-scrollbar__view{
+ width: 100%;
+}
+.chart-container {
+ flex: 1;
+ background: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.chart-title {
+ font-size: 16px;
+ font-weight: bold;
+ color: #303133;
+ margin-bottom: 15px;
+ padding-bottom: 10px;
+ border-bottom: 2px solid #f0f0f0;
+}
+
+.chart-content {
+ height: 280px;
+}
+
+/* 搴曢儴涓夋爮甯冨眬 */
+.bottom-section {
+ display: flex;
+ gap: 20px;
+}
+
+.bottom-card {
+ flex: 1;
+ background: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.card-header {
+ margin-bottom: 15px;
+ padding-bottom: 10px;
+ border-bottom: 2px solid #f0f0f0;
+}
+
+.card-header h3 {
+ margin: 0;
+ font-size: 16px;
+ font-weight: bold;
+ color: #303133;
+}
+
+/* 搴撳瓨缁熻鏍峰紡 */
+.inventory-items {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.inventory-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 12px;
+ background: #f8f9fa;
+ border-radius: 6px;
+ border-left: 3px solid #409EFF;
+}
+
+.item-name {
+ font-weight: bold;
+ color: #303133;
+}
+
+.item-value {
+ color: #606266;
+ font-size: 14px;
+}
+
+.item-status {
+ padding: 2px 8px;
+ border-radius: 12px;
+ font-size: 12px;
+ font-weight: bold;
+}
+
+.item-status.normal {
+ background: #f0f9ff;
+ color: #67C23A;
+}
+
+.item-status.low {
+ background: #fef0e6;
+ color: #E6A23C;
+}
+
+/* 鏌辩姸鍥惧鍣� */
+.bar-chart {
+ height: 200px;
+}
+
+/* 琛ㄦ牸鏍峰紡璋冩暣 */
+.bottom-card.table {
+ min-width: 320px;
+}
+
+.bottom-card.table .el-table {
+ font-size: 12px;
+}
+
+.bottom-card.table .el-table td,
+.bottom-card.table .el-table th {
+ padding: 8px 0;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 1200px) {
+ .bottom-section {
+ flex-direction: column;
}
-
- font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- color: #676a6c;
- overflow-x: hidden;
-
- ul {
- list-style-type: none;
+
+ .chart-section {
+ flex-direction: column;
}
+}
- h4 {
- margin-top: 0px;
+@media (max-width: 768px) {
+ .top-cards {
+ flex-direction: column;
}
-
- h2 {
- margin-top: 10px;
- font-size: 26px;
- font-weight: 100;
+
+ .dashboard {
+ padding: 10px;
}
-
- p {
- margin-top: 10px;
-
- b {
- font-weight: 700;
- }
+
+ .stat-card {
+ padding: 15px;
}
-
- .update-log {
- ol {
- display: block;
- list-style-type: decimal;
- margin-block-start: 1em;
- margin-block-end: 1em;
- margin-inline-start: 0;
- margin-inline-end: 0;
- padding-inline-start: 40px;
- }
+
+ .card-value {
+ font-size: 20px;
}
}
</style>
-
diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue
index e420fbe..3c03cbb 100644
--- a/src/views/procureMent/components/ProductionDialog.vue
+++ b/src/views/procureMent/components/ProductionDialog.vue
@@ -1,57 +1,48 @@
<template>
<div>
<el-dialog
- v-model="dialogFormVisible"
- :title="title"
- width="600"
- :close-on-click-modal="false"
- @close="handleClose"
+ v-model="dialogFormVisible"
+ :title="title"
+ width="600"
+ :close-on-click-modal="false"
+ @close="handleClose"
>
<el-form
- ref="formRef"
- :model="form"
- :rules="rules"
- label-width="auto"
- class="production-form"
- label-position="right"
- style="max-width: 400px; margin: 0 auto"
+ ref="formRef"
+ :model="form"
+ :rules="rules"
+ label-width="auto"
+ class="production-form"
+ label-position="right"
+ style="max-width: 400px; margin: 0 auto"
>
<el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierId">
<el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�">
- <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value" />
+ <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value"/>
</el-select>
</el-form-item>
<el-form-item label="鐓ょ" prop="coalId">
<el-select v-model="form.coalId" placeholder="璇烽�夋嫨鐓ょ">
- <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍗曚綅" prop="unit">
- <el-select
- v-model="form.unit"
- placeholder="璇烽�夋嫨鍗曚綅"
- clearable
- style="width: 100%"
- >
- <el-option label="鍚�" value="鍚�" />
- <el-option label="鍗冨厠" value="鍗冨厠" />
+ <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value"/>
</el-select>
</el-form-item>
<el-form-item label="閲囪喘鏁伴噺" prop="purchaseQuantity">
<el-input
- v-model.number="form.purchaseQuantity"
- placeholder="璇疯緭鍏�"
- @blur="handleQuantityBlur"
+ v-model.number="form.purchaseQuantity"
+ placeholder="璇疯緭鍏�"
+ @blur="handleQuantityBlur"
>
<template v-slot:suffix>
- <i style="font-style: normal">{{ form.unit ? form.unit : "" }}</i>
+ <i style="font-style: normal">鍚�</i>
</template>
- </el-input> </el-form-item
- ><el-form-item label="绋庣巼" prop="taxRate">
+ </el-input>
+ </el-form-item
+ >
+ <el-form-item label="绋庣巼" prop="taxRate">
<el-input
- v-model.number="form.taxRate"
- placeholder="璇疯緭鍏ョ◣鐜�"
- @blur="handleTaxRateBlur"
+ v-model.number="form.taxRate"
+ placeholder="璇疯緭鍏ョ◣鐜�"
+ @blur="handleTaxRateBlur"
>
<template v-slot:suffix>
<i style="font-style: normal">%</i>
@@ -60,9 +51,9 @@
</el-form-item>
<el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
<el-input
- v-model.number="form.priceExcludingTax"
- placeholder="璇疯緭鍏�"
- @blur="handlePriceBlur"
+ v-model.number="form.priceExcludingTax"
+ placeholder="璇疯緭鍏�"
+ @blur="handlePriceBlur"
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -71,8 +62,8 @@
</el-form-item>
<el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
<el-input
- v-model.number="form.priceIncludingTax"
- placeholder="鑷姩璁$畻"
+ v-model.number="form.priceIncludingTax"
+ placeholder="鑷姩璁$畻"
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -81,8 +72,8 @@
</el-form-item>
<el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
<el-input
- v-model.number="form.totalPriceExcludingTax"
- placeholder="鑷姩璁$畻"
+ v-model.number="form.totalPriceExcludingTax"
+ placeholder="鑷姩璁$畻"
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -91,8 +82,8 @@
</el-form-item>
<el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
<el-input
- v-model.number="form.totalPriceIncludingTax"
- placeholder="鑷姩璁$畻"
+ v-model.number="form.totalPriceIncludingTax"
+ placeholder="鑷姩璁$畻"
>
<template v-slot:suffix>
<i style="font-style: normal">鍏�</i>
@@ -100,16 +91,16 @@
</el-input>
</el-form-item>
<el-form-item label="鐧昏浜�" prop="registrantId">
- <el-input v-model="form.registrantId" disabled placeholder="璇疯緭鍏�" />
+ <el-input v-model="form.registrantId" disabled placeholder="璇疯緭鍏�"/>
</el-form-item>
<el-form-item label="鐧昏鏃ユ湡" prop="registrationDate">
<el-date-picker
- disabled
- v-model="form.registrationDate"
- type="date"
- placeholder="YYYY-MM-DD"
- style="width: 100%"
- value-format="YYYY-MM-DD"
+ disabled
+ v-model="form.registrationDate"
+ type="date"
+ placeholder="YYYY-MM-DD"
+ style="width: 100%"
+ value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-form>
@@ -117,10 +108,12 @@
<div class="dialog-footer">
<!-- 閲嶇疆鍜屽彇娑� -->
<el-button @click="handleClose" v-if="title.includes('鏂板')"
- >鍙栨秷</el-button
+ >鍙栨秷
+ </el-button
>
<el-button @click="handleReset" v-if="title.includes('缂栬緫')"
- >閲嶇疆</el-button
+ >閲嶇疆
+ </el-button
>
<el-button type="primary" @click="handleSubmit">纭</el-button>
</div>
@@ -130,12 +123,11 @@
</template>
<script setup name="ProductionDialog">
-import { ref, defineProps, watch, onMounted, nextTick, computed } from "vue";
-import { ElMessage } from "element-plus";
+import {ref, defineProps, watch, onMounted, nextTick, computed} from "vue";
+import {ElMessage} from "element-plus";
import useUserStore from "@/store/modules/user";
-import { addOrEditPR,getSupplyList, getCoalInfoList } from "@/api/procureMent";
-import { getSupply } from "@/api/basicInformation/supplier";
-import { getCoalInfo } from "@/api/basicInformation/coal";
+import {addOrEditPR, getSupplyList, getCoalInfoList} from "@/api/procureMent";
+
const props = defineProps({
title: {
type: String,
@@ -164,7 +156,6 @@
getSupplyList(),
getCoalInfoList(),
]);
- console.log(supplyRes, coalRes);
let supplyData = supplyRes.data;
let coalData = coalRes.data;
supplyList.value = supplyData.map((item) => ({
@@ -188,8 +179,8 @@
return 0;
}
return (
- Math.floor(parseFloat(num) * Math.pow(10, precision)) /
- Math.pow(10, precision)
+ Math.floor(parseFloat(num) * Math.pow(10, precision)) /
+ Math.pow(10, precision)
);
};
// 鍚◣鍗曚环璁$畻
@@ -250,9 +241,9 @@
// 澶勭悊绋庣巼杈撳叆妗嗗け鐒︼紝纭繚绮惧害
const handleTaxRateBlur = () => {
if (
- form.value.taxRate !== null &&
- form.value.taxRate !== undefined &&
- form.value.taxRate !== ""
+ form.value.taxRate !== null &&
+ form.value.taxRate !== undefined &&
+ form.value.taxRate !== ""
) {
form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
}
@@ -261,13 +252,13 @@
// 澶勭悊涓嶅惈绋庡崟浠疯緭鍏ユ澶辩劍锛岀‘淇濈簿搴�
const handlePriceBlur = () => {
if (
- form.value.priceExcludingTax !== null &&
- form.value.priceExcludingTax !== undefined &&
- form.value.priceExcludingTax !== ""
+ form.value.priceExcludingTax !== null &&
+ form.value.priceExcludingTax !== undefined &&
+ form.value.priceExcludingTax !== ""
) {
form.value.priceExcludingTax = toFixed(
- parseFloat(form.value.priceExcludingTax),
- 2
+ parseFloat(form.value.priceExcludingTax),
+ 2
);
}
};
@@ -275,13 +266,13 @@
// 澶勭悊閲囪喘鏁伴噺杈撳叆妗嗗け鐒︼紝纭繚绮惧害
const handleQuantityBlur = () => {
if (
- form.value.purchaseQuantity !== null &&
- form.value.purchaseQuantity !== undefined &&
- form.value.purchaseQuantity !== ""
+ form.value.purchaseQuantity !== null &&
+ form.value.purchaseQuantity !== undefined &&
+ form.value.purchaseQuantity !== ""
) {
form.value.purchaseQuantity = toFixed(
- parseFloat(form.value.purchaseQuantity),
- 3
+ parseFloat(form.value.purchaseQuantity),
+ 3
); // 鏁伴噺淇濈暀3浣嶅皬鏁�
}
};
@@ -293,30 +284,29 @@
});
const rules = {
supplierName: [
- { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur"},
],
- coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }],
- unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
+ coal: [{required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur"}],
purchaseQuantity: [
- { required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur" },
- { type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur"},
+ {type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur"},
],
priceExcludingTax: [
- { required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur"},
],
totalPriceExcludingTax: [
- { required: true, message: "璇疯緭鍏ユ�讳环", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ユ�讳环", trigger: "blur"},
],
priceIncludingTax: [
- { required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur"},
],
totalPriceIncludingTax: [
- { required: true, message: "璇疯緭鍏ュ惈绋庢�讳环", trigger: "blur" },
+ {required: true, message: "璇疯緭鍏ュ惈绋庢�讳环", trigger: "blur"},
],
- taxRate: [{ required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur" }],
- registrantId: [{ required: true, message: "璇疯緭鍏ョ櫥璁颁汉", trigger: "blur" }],
+ taxRate: [{required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur"}],
+ registrantId: [{required: true, message: "璇疯緭鍏ョ櫥璁颁汉", trigger: "blur"}],
registrationDate: [
- { required: true, message: "璇烽�夋嫨鐧昏鏃ユ湡", trigger: "change" },
+ {required: true, message: "璇烽�夋嫨鐧昏鏃ユ湡", trigger: "change"},
],
};
// 鍏抽棴寮圭獥
diff --git a/src/views/procureMent/index.vue b/src/views/procureMent/index.vue
index 644b3a8..793267a 100644
--- a/src/views/procureMent/index.vue
+++ b/src/views/procureMent/index.vue
@@ -18,12 +18,11 @@
<!-- 鎿嶄綔鎸夐挳鍖� -->
<el-row :gutter="24" class="table-toolbar">
<el-button type="primary" :icon="Plus" @click="handleAdd"
- >鏂板缓</el-button
- >
+ >鏂板缓
+ </el-button>
<el-button type="danger" :icon="Delete" @click="handleDelete"
- >鍒犻櫎</el-button
- >
- <!-- <el-button type="info" :icon="Download" @click="handleExport">瀵煎嚭</el-button> -->
+ >鍒犻櫎
+ </el-button>
</el-row>
<!-- 琛ㄦ牸缁勪欢 -->
<data-table
@@ -66,7 +65,12 @@
import DataTable from "@/components/Table/ETable.vue";
import Pagination from "@/components/Pagination";
import ProductionDialog from "./components/ProductionDialog.vue";
-import { purchaseRegistration } from "@/api/procureMent";
+import {
+ purchaseRegistration,
+ getSupplyList,
+ getCoalInfoList,
+} from "@/api/procureMent";
+
import useUserStore from "@/store/modules/user";
// 寮曞叆瀛楀吀鏁版嵁
const { proxy } = getCurrentInstance();
@@ -117,9 +121,22 @@
// supplier 渚涘簲鍟嗘暟鎹�
const columns = ref([
- { prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minWidth: 200 },
- { prop: "coal", label: "鐓ょ绫诲瀷", minWidth: 120 },
- { prop: "unit", label: "鍗曚綅", minWidth: 150 },
+ {
+ prop: "supplierId",
+ label: "渚涘簲鍟嗗悕绉�",
+ minWidth: 200,
+ formatter: (row) => {
+ return MatchQuery(row.supplierId, "supplyRes") || "鏈煡渚涘簲鍟�";
+ },
+ },
+ {
+ prop: "coalId",
+ label: "鐓ょ绫诲瀷",
+ minWidth: 120,
+ formatter: (row) => {
+ return MatchQuery(row.coalId, "coalRes") || "鏈煡鐓ょ";
+ },
+ },
{ prop: "purchaseQuantity", label: "閲囪喘鏁伴噺", minWidth: 100 },
{ prop: "priceIncludingTax", label: "鍗曚环锛堝惈绋庯級", minWidth: 150 },
{ prop: "totalPriceIncludingTax", label: "鎬讳环锛堝惈绋庯級", minWidth: 100 },
@@ -128,6 +145,16 @@
{ prop: "registrantId", label: "鐧昏浜�", minWidth: 100 },
{ prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 },
]);
+
+// 鍖归厤鏌ヨ瀛楁
+const MatchQuery = (data, name) => {
+ const list = name === "supplyRes" ? supplyRes.value.data : coalRes.value.data;
+ const item = list.find((items) => items.id == data);
+ return item ? item.coal || item.supplierName : "";
+};
+// 鑾峰彇渚涘簲鍟嗗垪琛�
+const supplyRes = ref([]);
+const coalRes = ref([]);
// 閲嶇疆鏌ヨ
const resetQuery = () => {
@@ -167,7 +194,7 @@
form.value = {
supplierName: "",
coal: "",
- unit: "",
+ unit: "鍚�",
purchaseQuantity: "",
priceExcludingTax: "",
totalPriceExcludingTax: "",
@@ -227,17 +254,6 @@
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) => {
tableData.value.push(val);
@@ -248,6 +264,10 @@
const getList = async () => {
loading.value = true;
try {
+ [supplyRes.value, coalRes.value] = await Promise.all([
+ getSupplyList(),
+ getCoalInfoList(),
+ ]);
// 浼犻�掑垎椤靛弬鏁�
let res = await purchaseRegistration({
current: current.value,
@@ -271,6 +291,7 @@
.app-container {
box-sizing: border-box;
}
+
.search-form {
background-color: #fff;
padding: 20px 20px 0 20px;
@@ -278,6 +299,7 @@
border-radius: 4px;
box-shadow: var(--el-box-shadow-light);
}
+
.search-form :deep(.el-form-item) {
margin-bottom: 16px;
width: 100%;
@@ -289,11 +311,13 @@
width: 50%;
}
}
+
@media screen and (min-width: 1200px) {
.search-form :deep(.el-form-item) {
width: 18%;
}
}
+
.table-toolbar {
margin-bottom: 20px;
display: flex;
@@ -306,15 +330,18 @@
.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;
}
diff --git a/src/views/production/components/ProductionDetailsTable.vue b/src/views/production/components/ProductionDetailsTable.vue
index 7a87b17..1db3794 100644
--- a/src/views/production/components/ProductionDetailsTable.vue
+++ b/src/views/production/components/ProductionDetailsTable.vue
@@ -1,20 +1,20 @@
<template>
- <el-table :data="tableData" :border="border" style="width: 100%">
+ <el-table :data="tableData" :border="border" style="width: 100%">
<el-table-column label="鐓ょ" min-width="120">
<template #default="{ row, $index }">
- <el-select
- clearable
- :model-value="getCoalNameById(row.coalId) || row.coalId"
- placeholder="璇烽�夋嫨鐓ょ"
- @change="(value) => handleCoalSelectChange(row, value)"
- filterable
- :key="`coalId-select-${$index}-${weekList.length}`"
+ <el-select
+ clearable
+ :model-value="getCoalNameById(row.coalId) || row.coalId"
+ placeholder="璇烽�夋嫨鐓ょ"
+ @change="(value) => handleCoalSelectChange(row, value)"
+ filterable
+ :key="`coalId-select-${$index}-${weekList.length}`"
>
<el-option
- v-for="(item, index) of weekList"
- :key="`option-${index}-${item.key}`"
- :label="item.value"
- :value="item.value"
+ v-for="(item, index) of weekList"
+ :key="`option-${index}-${item.key}`"
+ :label="item.value"
+ :value="item.value"
/>
</el-select>
</template>
@@ -22,10 +22,10 @@
<el-table-column label="鐢熶骇鏁伴噺" min-width="120">
<template #default="{ row, $index }">
<el-input
- v-model="row.productionQuantity"
- placeholder="璇疯緭鍏ョ敓浜ф暟閲�"
- type="number"
- @input="handleInput('productionQuantity', $index, $event)"
+ v-model="row.productionQuantity"
+ placeholder="璇疯緭鍏ョ敓浜ф暟閲�"
+ type="number"
+ @input="handleInput('productionQuantity', $index, $event)"
/>
</template>
</el-table-column>
@@ -33,10 +33,10 @@
<el-table-column label="浜哄伐鎴愭湰" min-width="120">
<template #default="{ row, $index }">
<el-input
- v-model="row.laborCost"
- placeholder="璇疯緭鍏ヤ汉宸ユ垚鏈�"
- type="number"
- @input="handleInput('laborCost', $index, $event)"
+ v-model="row.laborCost"
+ placeholder="璇疯緭鍏ヤ汉宸ユ垚鏈�"
+ type="number"
+ @input="handleInput('laborCost', $index, $event)"
>
<template #suffix>
<i style="font-style: normal">鍏�</i>
@@ -48,10 +48,10 @@
<el-table-column label="鑳借�楁垚鏈�" min-width="120">
<template #default="{ row, $index }">
<el-input
- v-model="row.energyConsumptionCost"
- placeholder="璇疯緭鍏ヨ兘鑰楁垚鏈�"
- type="number"
- @input="handleInput('energyConsumptionCost', $index, $event)"
+ v-model="row.energyConsumptionCost"
+ placeholder="璇疯緭鍏ヨ兘鑰楁垚鏈�"
+ type="number"
+ @input="handleInput('energyConsumptionCost', $index, $event)"
>
<template #suffix>
<i style="font-style: normal">鍏�</i>
@@ -63,10 +63,10 @@
<el-table-column label="璁惧鎶樻棫" min-width="120">
<template #default="{ row, $index }">
<el-input
- v-model="row.equipmentDepreciation"
- placeholder="璇疯緭鍏ヨ澶囨姌鏃�"
- type="number"
- @input="handleInput('equipmentDepreciation', $index, $event)"
+ v-model="row.equipmentDepreciation"
+ placeholder="璇疯緭鍏ヨ澶囨姌鏃�"
+ type="number"
+ @input="handleInput('equipmentDepreciation', $index, $event)"
>
<template #suffix>
<i style="font-style: normal">鍏�</i>
@@ -78,10 +78,10 @@
<el-table-column label="閲囪喘鍗曚环" min-width="120">
<template #default="{ row, $index }">
<el-input
- v-model="row.purchasePrice"
- placeholder="璇疯緭鍏ラ噰璐崟浠�"
- type="number"
- @input="handleInput('purchasePrice', $index, $event)"
+ v-model="row.purchasePrice"
+ placeholder="璇疯緭鍏ラ噰璐崟浠�"
+ type="number"
+ @input="handleInput('purchasePrice', $index, $event)"
>
<template #suffix>
<i style="font-style: normal">鍏�</i>
@@ -93,12 +93,12 @@
<el-table-column label="鎬绘垚鏈�" min-width="120">
<template #default="{ row, $index }">
<el-input
- disabled
- v-model="row.totalCost"
- placeholder="鎬绘垚鏈�"
- type="number"
- :readonly="autoCalculate"
- @input="handleInput('totalCost', $index, $event)"
+ disabled
+ v-model="row.totalCost"
+ placeholder="鎬绘垚鏈�"
+ type="number"
+ :readonly="autoCalculate"
+ @input="handleInput('totalCost', $index, $event)"
>
<template #suffix>
<i style="font-style: normal">鍏�</i>
@@ -109,34 +109,34 @@
<el-table-column label="鐢熶骇浜�" min-width="120">
<template #default="{ row, $index }">
<el-select
- clearable
- :model-value="getUserNameById(row.producer) || row.producer"
- placeholder="璇烽�夋嫨鐢熶骇浜�"
- @change="(value) => handleUserSelectChange(row, value)"
- filterable
- :key="`producer-select-${$index}-${userList.length}`"
+ clearable
+ :model-value="getUserNameById(row.producer) || row.producer"
+ placeholder="璇烽�夋嫨鐢熶骇浜�"
+ @change="(value) => handleUserSelectChange(row, value)"
+ filterable
+ :key="`producer-select-${$index}-${userList.length}`"
>
<el-option
- v-for="(item, index) of userList"
- :key="`option-${index}-${item.key}`"
- :label="item.value"
- :value="item.value"
+ v-for="(item, index) of userList"
+ :key="`option-${index}-${item.key}`"
+ :label="item.value"
+ :value="item.value"
/>
</el-select>
</template>
</el-table-column>
<el-table-column
- v-if="showOperations"
- label="鎿嶄綔"
- width="120"
- fixed="right"
+ v-if="showOperations"
+ label="鎿嶄綔"
+ width="120"
+ fixed="right"
>
<template #default="{ $index }">
<el-button
- type="danger"
- size="small"
- @click="handleDelete($index)"
- :icon="Delete"
+ type="danger"
+ size="small"
+ @click="handleDelete($index)"
+ :icon="Delete"
>
鍒犻櫎
</el-button>
@@ -146,11 +146,12 @@
</template>
<script setup name="ProductionDetailsTable">
-import { ref, computed, watch, onMounted, nextTick } from "vue";
-import { Delete } from "@element-plus/icons-vue";
-import { getCoalFieldList } from "@/api/basicInformation/coalQualityMaintenance";
-import { getCoalInfoList } from "@/api/production";
-import { userListAll } from "@/api/publicApi";
+import {ref, computed, watch, onMounted, nextTick} from "vue";
+import {Delete} from "@element-plus/icons-vue";
+import {getCoalFieldList} from "@/api/basicInformation/coalQualityMaintenance";
+import {getCoalInfoList} from "@/api/production";
+import {userListAll} from "@/api/publicApi";
+
const props = defineProps({
modelValue: {
type: Array,
@@ -189,19 +190,19 @@
// 濡傛灉寮�鍚嚜鍔ㄨ绠楁�绘垚鏈�
if (
- props.autoCalculate &&
- [
- "laborCost",
- "energyCost",
- "equipmentDepreciation",
- "purchasePrice",
- ].includes(field)
+ props.autoCalculate &&
+ [
+ "laborCost",
+ "energyCost",
+ "equipmentDepreciation",
+ "purchasePrice",
+ ].includes(field)
) {
calculateTotalCost(newData[index]);
}
tableData.value = newData;
- emit("input-change", { field, index, value, row: newData[index] });
+ emit("input-change", {field, index, value, row: newData[index]});
};
// 璁$畻鎬绘垚鏈�
@@ -212,10 +213,10 @@
const purchasePrice = parseFloat(row.purchasePrice) || 0;
row.totalCost = (
- laborCost +
- energyCost +
- equipmentDepreciation +
- purchasePrice
+ laborCost +
+ energyCost +
+ equipmentDepreciation +
+ purchasePrice
).toFixed(2);
};
@@ -254,7 +255,7 @@
if (newValue && weekList.value.length > 0) {
// 褰撴暟鎹姞杞藉畬鎴愪笖weekList宸茶幏鍙栨椂锛岀‘淇濇樉绀烘纭�
}
-}, { deep: true });
+}, {deep: true});
// 鐩戝惉weekList鍙樺寲锛屽綋涓嬫媺鏁版嵁鍔犺浇瀹屾垚鍚庡鐞嗘樉绀�
watch(weekList, (newList) => {
@@ -266,23 +267,23 @@
tableData.value = tempData;
});
}
-}, { deep: true });
+}, {deep: true});
-onMounted(async()=>{
+onMounted(async () => {
let res = await getCoalInfoList()
console.log(res);
res.data.forEach(item => {
let obj = {};
obj.value = item.coal;
obj.key = item.id;
- weekList.value.push(obj);
+ weekList.value.push(obj);
});
let ress = await userListAll();
ress.data.forEach(item => {
let obj = {};
obj.value = item.nickName;
obj.key = item.userId;
- userList.value.push(obj);
+ userList.value.push(obj);
});
// 閫氱煡鐖剁粍浠秝eekList宸插姞杞藉畬鎴�
nextTick(() => {
@@ -302,7 +303,7 @@
}
};
const userList = ref([]);
-const getUserList = (async()=>{
+const getUserList = (async () => {
let res = await userListAll();
if (res.code === 200) {
userList.value = res.data.map((item) => ({
@@ -318,7 +319,7 @@
if (newValue && userList.value.length > 0) {
// 褰撴暟鎹姞杞藉畬鎴愪笖weekList宸茶幏鍙栨椂锛岀‘淇濇樉绀烘纭�
}
-}, { deep: true });
+}, {deep: true});
// 鐩戝惉userList鍙樺寲锛屽綋涓嬫媺鏁版嵁鍔犺浇瀹屾垚鍚庡鐞嗘樉绀�
watch(userList, (newList) => {
@@ -330,7 +331,7 @@
tableData.value = tempData;
});
}
-}, { deep: true });
+}, {deep: true});
const getUserNameById = (id) => {
const producer = userList.value.find(item => item.key == id);
diff --git a/src/views/production/components/ProductionDialog.vue b/src/views/production/components/ProductionDialog.vue
index 0cd330e..124e32f 100644
--- a/src/views/production/components/ProductionDialog.vue
+++ b/src/views/production/components/ProductionDialog.vue
@@ -1,25 +1,30 @@
<template>
<el-dialog
- v-model="dialogVisible"
- :title="dialogType === 'add' ? '鏂板鐢熶骇鍔犲伐' : '缂栬緫鐢熶骇鍔犲伐'"
- width="1200px"
- :close-on-click-modal="false"
- @close="handleClose"
+ v-model="dialogVisible"
+ :title="dialogType === 'add' ? '鏂板鐢熶骇鍔犲伐' : '缂栬緫鐢熶骇鍔犲伐'"
+ width="1200px"
+ :close-on-click-modal="false"
+ @close="handleClose"
>
<el-row :gutter="10" style="margin-bottom: 10px">
<el-col :span="3">
<el-button type="primary" @click="handlData"
- ><el-icon> <Plus /> </el-icon>閫夋嫨鏁版嵁</el-button
+ >
+ <el-icon>
+ <Plus/>
+ </el-icon>
+ 閫夋嫨鏁版嵁
+ </el-button
>
</el-col>
<el-col :span="4">
<el-button
- type="danger"
- @click="removeSelectedData"
- :disabled="tableData.length === 0"
+ type="danger"
+ @click="removeSelectedData"
+ :disabled="tableData.length === 0"
>
<el-icon>
- <Delete />
+ <Delete/>
</el-icon>
娓呯┖宸查��
</el-button>
@@ -34,15 +39,15 @@
</el-col>
</el-row>
<ETableModify
- :columns="columns"
- :showOperations="false"
- height="200"
- @cell-edit="handleCellEdit"
- :tableData="tableData"
- :showOverflowTooltip="false"
- @row-click="handleRowClick"
- :editableColumns="['usedQuantity']"
- @delete="handleRemoveItem"
+ :columns="columns"
+ :showOperations="false"
+ height="200"
+ @cell-edit="handleCellEdit"
+ :tableData="tableData"
+ :showOverflowTooltip="false"
+ @row-click="handleRowClick"
+ :editableColumns="['usedQuantity']"
+ @delete="handleRemoveItem"
/>
<div class="empty-table">
<h1>鐢熶骇鏄庣粏</h1>
@@ -50,7 +55,7 @@
<el-col :span="2">
<el-button type="primary" @click="addNewRow">
<el-icon>
- <Plus />
+ <Plus/>
</el-icon>
鏂板
</el-button>
@@ -65,60 +70,62 @@
</el-col> -->
</el-row>
<ProductionDetailsTable
- v-model="detailsTableData"
- :border="false"
- :show-operations="true"
- :auto-calculate="true"
- @input-change="handleDetailsChange"
- @delete-row="handleDeleteRow"
+ v-model="detailsTableData"
+ :border="false"
+ :show-operations="true"
+ :auto-calculate="true"
+ @input-change="handleDetailsChange"
+ @delete-row="handleDeleteRow"
/>
</div>
<template #footer>
<div class="dialog-footer">
<el-button
- @click="handleClose"
- v-if="dialogType === 'add' || dialogType === 'edit'"
- >鍙� 娑�</el-button
+ @click="handleClose"
+ v-if="dialogType === 'add' || dialogType === 'edit'"
+ >鍙� 娑�
+ </el-button
>
<!-- <el-button @click="handleReset" v-if="dialogType === 'edit'"
>閲� 缃�</el-button
> -->
<el-button type="primary" :loading="loading" @click="handleSubmit"
- >纭� 瀹�</el-button
+ >纭� 瀹�
+ </el-button
>
</div>
</template>
</el-dialog>
<el-dialog
- v-model="innerVisible"
- width="1000"
- title="閫夋嫨閰嶇疆鏁版嵁"
- center
- append-to-body
+ v-model="innerVisible"
+ width="1000"
+ title="閫夋嫨閰嶇疆鏁版嵁"
+ center
+ append-to-body
>
<div style="margin-bottom: 10px">
<el-alert
- v-if="tableData.length > 0"
- :title="`褰撳墠宸查�夋嫨 ${tableData.length} 鏉℃暟鎹甡"
- type="info"
- :closable="false"
- show-icon
+ v-if="tableData.length > 0"
+ :title="`褰撳墠宸查�夋嫨 ${tableData.length} 鏉℃暟鎹甡"
+ type="info"
+ :closable="false"
+ show-icon
/>
</div>
<ETable
- :showIndex="false"
- :showOverflowTooltip="false"
- @selection-change="handleSelectionChange"
- :showOperations="false"
- ref="etableRef"
- :columns="formalDatabaseColumns"
- :tableData="formalDatabaseData"
- :defaultSelectedIds="selectedIds"
- :rowKey="'id'"
- height="400"
- @cell-edit="handleCellEdit"
- :show-selection="true"
+ :showIndex="false"
+ :showOverflowTooltip="false"
+ @selection-change="handleSelectionChange"
+ :showOperations="false"
+ ref="etableRef"
+ :columns="formalDatabaseColumns"
+ :tableData="formalDatabaseData"
+ :defaultSelectedIds="selectedIds"
+ :rowKey="'id'"
+ height="400"
+ @cell-edit="handleCellEdit"
+ :show-selection="true"
/>
<el-row :gutter="24" style="margin-top: 15px">
<el-col :span="12">
@@ -129,9 +136,9 @@
<el-col :span="12" style="text-align: right">
<el-button @click="innerVisible = false">鍙栨秷</el-button>
<el-button
- type="primary"
- @click="handleSelectData"
- :disabled="formalDatabaseSelectedData.length === 0"
+ type="primary"
+ @click="handleSelectData"
+ :disabled="formalDatabaseSelectedData.length === 0"
>
纭畾娣诲姞
</el-button>
@@ -141,34 +148,34 @@
</template>
<script setup>
-import { ref, reactive, watch, onMounted, nextTick, computed } from "vue";
+import {ref, reactive, watch, onMounted, nextTick, computed} from "vue";
import ETable from "@/components/Table/ETable.vue";
import ETableModify from "@/components/Table/EtableModify.vue";
import ProductionDetailsTable from "./ProductionDetailsTable.vue";
-import { ElMessage, ElMessageBox, ElAlert, ElText } from "element-plus";
-import { Delete, Warning, Plus } from "@element-plus/icons-vue";
+import {ElMessage, ElMessageBox, ElAlert, ElText} from "element-plus";
+import {Delete, Warning, Plus} from "@element-plus/icons-vue";
import {
getOfficialAll,
addOrEditPM,
deleteProductionInventory,
} from "@/api/production/index.js";
-import { validateFormData, validateNumber, deepClone, createDefaultProductionRow } from "@/utils/production";
-import { useCoalData } from "./useCoalData";
+import {validateFormData, validateNumber, deepClone, createDefaultProductionRow} from "@/utils/production";
+import {useCoalData} from "./useCoalData";
import useUserStore from "@/store/modules/user";
// Props 鍜� Emits
const props = defineProps({
- visible: { type: Boolean, default: false },
- type: { type: String, default: "add" },
- rowData: { type: Object, default: () => ({}) },
+ visible: {type: Boolean, default: false},
+ type: {type: String, default: "add"},
+ rowData: {type: Object, default: () => ({})},
});
-const dialogVisible = defineModel("visible", { type: Boolean, default: false });
+const dialogVisible = defineModel("visible", {type: Boolean, default: false});
const emit = defineEmits(["update:visible", "success", "update:productionAndProcessing"]);
// 鐢ㄦ埛淇℃伅鍜岀叅绉嶆暟鎹�
const userStore = useUserStore();
-const { getCoalNameById } = useCoalData();
+const {getCoalNameById} = useCoalData();
let userInfo;
// 瀵硅瘽妗嗙姸鎬�
@@ -187,8 +194,8 @@
const copyForm = ref(null);
// 琛ㄦ牸鍒楅厤缃�
const columns = [
- { label: "鐓ょ", prop: "coal", minwidth: 120 },
- { label: "搴撳瓨鏁伴噺", prop: "inventoryQuantity", minwidth: 100 },
+ {label: "鐓ょ", prop: "coal", minwidth: 120},
+ {label: "搴撳瓨鏁伴噺", prop: "inventoryQuantity", minwidth: 100},
{
label: "浣跨敤鏁伴噺",
prop: "usedQuantity",
@@ -199,18 +206,18 @@
];
const formalDatabaseColumns = ref([
- { prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minwidth: 150 },
- { prop: "coal", label: "鐓ょ绫诲瀷", minwidth: 60 },
- { prop: "inventoryQuantity", label: "搴撳瓨鏁伴噺", minwidth: 80 },
- { prop: "unit", label: "鍗曚綅", minwidth: 20 },
- { prop: "priceExcludingTax", label: "鍗曚环锛堜笉鍚◣锛�", minwidth: 80 },
- { prop: "createTime", label: "鐧昏鏃ユ湡", width: 200 },
+ {prop: "supplierName", label: "渚涘簲鍟嗗悕绉�", minwidth: 150},
+ {prop: "coal", label: "鐓ょ绫诲瀷", minwidth: 60},
+ {prop: "inventoryQuantity", label: "搴撳瓨鏁伴噺", minwidth: 80},
+ {prop: "unit", label: "鍗曚綅", minwidth: 20},
+ {prop: "priceExcludingTax", label: "鍗曚环锛堜笉鍚◣锛�", minwidth: 80},
+ {prop: "createTime", label: "鐧昏鏃ユ湡", width: 200},
]);
// 宸ュ叿鍑芥暟
const debugIdMatching = () => {
if (formalDatabaseData.value.length > 0 && selectedIds.value.length > 0) {
const matchedRows = formalDatabaseData.value.filter((row) =>
- selectedIds.value.includes(row.id)
+ selectedIds.value.includes(row.id)
);
}
};
@@ -226,8 +233,8 @@
if (res.code === 200) {
formalDatabaseData.value = res.data;
const existingOfficialIds = tableData.value
- .map((item) => item.officialId)
- .filter((id) => id);
+ .map((item) => item.officialId)
+ .filter((id) => id);
selectedIds.value = existingOfficialIds;
debugIdMatching();
nextTick(() => {
@@ -252,7 +259,7 @@
try {
etableRef.value.clearSelection();
const rowsToSelect = formalDatabaseData.value.filter((row) =>
- ids.includes(row.id)
+ ids.includes(row.id)
);
if (rowsToSelect.length > 0) {
etableRef.value.setRowsSelection(rowsToSelect, true);
@@ -277,8 +284,8 @@
detailsTableData.value = data.productionList || [];
dialogType.value = "edit";
const existingOfficialIds = tableData.value
- .map((item) => item.officialId)
- .filter((id) => id);
+ .map((item) => item.officialId)
+ .filter((id) => id);
selectedIds.value = existingOfficialIds;
};
// 鐩戝惉瀵硅瘽妗嗙姸鎬侊紝鍦ㄦ墦寮�鏃惰缃�変腑鐘舵��
@@ -319,8 +326,8 @@
// 鏇存柊selectedIds锛岀‘淇濆寘鍚墍鏈夊綋鍓峵ableData涓殑officialId
const allOfficialIds = tableData.value
- .map((item) => item.officialId)
- .filter((id) => id);
+ .map((item) => item.officialId)
+ .filter((id) => id);
selectedIds.value = allOfficialIds;
// 鍏抽棴閫夋嫨瀵硅瘽妗�
@@ -348,13 +355,13 @@
// 楠岃瘉鐢熶骇鏄庣粏鏁版嵁
const detailsValidation = validateFormData(detailsTableData.value, [
"coalId",
- "productionQuantity",
+ "productionQuantity",
"laborCost",
"energyConsumptionCost",
"equipmentDepreciation",
"purchasePrice"
]);
-
+
if (!detailsValidation.isValid) {
ElMessage.warning(detailsValidation.message);
return;
@@ -400,13 +407,13 @@
const handleCellEdit = (row, prop, value) => {
if (prop === "usedQuantity") {
const validation = validateNumber(value, 0, Number(row.inventoryQuantity));
-
+
if (!validation.isValid) {
ElMessage.warning(validation.message);
row.usedQuantity = validation.value;
return;
}
-
+
row.usedQuantity = validation.value;
}
};
@@ -445,15 +452,15 @@
// 鍒犻櫎鍗曚釜宸查�夋暟鎹」
const handleRemoveItem = (row) => {
const index = tableData.value.findIndex(
- (item) => item.officialId === row.officialId
+ (item) => item.officialId === row.officialId
);
if (index > -1) {
tableData.value.splice(index, 1);
// 鏇存柊selectedIds
const updatedOfficialIds = tableData.value
- .map((item) => item.officialId)
- .filter((id) => id);
+ .map((item) => item.officialId)
+ .filter((id) => id);
selectedIds.value = updatedOfficialIds;
ElMessage.success("宸插垹闄ら�変腑椤�");
}
@@ -470,21 +477,22 @@
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(async () => {
- if (dialogType.value === "edit") {
- let res = await deleteProductionInventory({
- productionInventoryList: tableData.value,
- });
- emit("update:productionAndProcessing", tableData.value, copyForm.value);
- }
- // [Vue warn]: Component emitted event "update:productionAndProcessing" but it is neither declared in the emits option nor as an "onUpdate:productionAndProcessing" prop.
+ .then(async () => {
+ if (dialogType.value === "edit") {
+ let res = await deleteProductionInventory({
+ productionInventoryList: tableData.value,
+ });
+ emit("update:productionAndProcessing", tableData.value, copyForm.value);
+ }
+ // [Vue warn]: Component emitted event "update:productionAndProcessing" but it is neither declared in the emits option nor as an "onUpdate:productionAndProcessing" prop.
- formalDatabaseSelectedData.value = [];
- tableData.value = [];
- selectedIds.value = [];
- ElMessage.success("宸叉竻绌烘墍鏈夋暟鎹�");
- })
- .catch(() => {});
+ formalDatabaseSelectedData.value = [];
+ tableData.value = [];
+ selectedIds.value = [];
+ ElMessage.success("宸叉竻绌烘墍鏈夋暟鎹�");
+ })
+ .catch(() => {
+ });
};
// 璁$畻鎬讳娇鐢ㄩ噺
@@ -507,6 +515,7 @@
.el-row > .el-col > h1 {
font-weight: bolder;
}
+
.empty-table > .el-row {
margin-bottom: 12px;
}
diff --git a/src/views/production/components/useCoalData.js b/src/views/production/components/useCoalData.js
index 37b2245..9a86b81 100644
--- a/src/views/production/components/useCoalData.js
+++ b/src/views/production/components/useCoalData.js
@@ -2,9 +2,9 @@
* 鐓ょ鏁版嵁绠$悊缁勫悎寮忓嚱鏁�
* 鎻愪緵鐓ょ鏁版嵁鐨勮幏鍙栥�佺紦瀛樸�佽浆鎹㈢瓑鍔熻兘
*/
-import { ref, computed, watch } from 'vue';
-import { getCoalInfoList } from "@/api/production";
-import { ElMessage } from 'element-plus';
+import {ref, computed, watch} from 'vue';
+import {getCoalInfoList} from "@/api/production";
+import {ElMessage} from 'element-plus';
// 鍏ㄥ眬鐓ょ鏁版嵁缂撳瓨
const coalData = ref([]);
@@ -12,85 +12,85 @@
const isLoaded = ref(false);
export function useCoalData() {
-
- // 鑾峰彇鐓ょ鏁版嵁
- const getCoalData = async (forceRefresh = false) => {
- if (isLoaded.value && !forceRefresh) {
- return coalData.value;
- }
- if (isLoading.value) {
- // 濡傛灉姝e湪鍔犺浇锛岀瓑寰呭姞杞藉畬鎴�
- return new Promise((resolve) => {
- const unwatch = watch(isLoading, (loading) => {
- if (!loading) {
- unwatch();
- resolve(coalData.value);
- }
- });
- });
- }
+ // 鑾峰彇鐓ょ鏁版嵁
+ const getCoalData = async (forceRefresh = false) => {
+ if (isLoaded.value && !forceRefresh) {
+ return coalData.value;
+ }
- isLoading.value = true;
- try {
- const res = await getCoalInfoList();
- if (res.code === 200) {
- coalData.value = res.data;
- isLoaded.value = true;
- return coalData.value;
- } else {
- ElMessage.error('鑾峰彇鐓ょ鏁版嵁澶辫触');
- return [];
- }
- } catch (error) {
- ElMessage.error('鑾峰彇鐓ょ鏁版嵁澶辫触');
- console.error('鐓ょ鏁版嵁鑾峰彇閿欒:', error);
- return [];
- } finally {
- isLoading.value = false;
- }
- };
+ if (isLoading.value) {
+ // 濡傛灉姝e湪鍔犺浇锛岀瓑寰呭姞杞藉畬鎴�
+ return new Promise((resolve) => {
+ const unwatch = watch(isLoading, (loading) => {
+ if (!loading) {
+ unwatch();
+ resolve(coalData.value);
+ }
+ });
+ });
+ }
- // 鏍规嵁ID鑾峰彇鐓ょ鍚嶇О
- const getCoalNameById = (id) => {
- if (!id || coalData.value.length === 0) return id;
- const coal = coalData.value.find(item => item.id == id);
- return coal ? coal.coal : id;
- };
+ isLoading.value = true;
+ try {
+ const res = await getCoalInfoList();
+ if (res.code === 200) {
+ coalData.value = res.data;
+ isLoaded.value = true;
+ return coalData.value;
+ } else {
+ ElMessage.error('鑾峰彇鐓ょ鏁版嵁澶辫触');
+ return [];
+ }
+ } catch (error) {
+ ElMessage.error('鑾峰彇鐓ょ鏁版嵁澶辫触');
+ console.error('鐓ょ鏁版嵁鑾峰彇閿欒:', error);
+ return [];
+ } finally {
+ isLoading.value = false;
+ }
+ };
- // 鏍规嵁鍚嶇О鑾峰彇鐓ょID
- const getCoalIdByName = (name) => {
- if (!name || coalData.value.length === 0) return '';
- const coal = coalData.value.find(item => item.coal === name);
- return coal ? coal.id : '';
- };
+ // 鏍规嵁ID鑾峰彇鐓ょ鍚嶇О
+ const getCoalNameById = (id) => {
+ if (!id || coalData.value.length === 0) return id;
+ const coal = coalData.value.find(item => item.id == id);
+ return coal ? coal.coal : id;
+ };
- // 鐢熸垚涓嬫媺閫夐」
- const coalOptions = computed(() => {
- return coalData.value.map(item => ({
- label: item.coal,
- value: item.coal,
- key: item.id
- }));
- });
+ // 鏍规嵁鍚嶇О鑾峰彇鐓ょID
+ const getCoalIdByName = (name) => {
+ if (!name || coalData.value.length === 0) return '';
+ const coal = coalData.value.find(item => item.coal === name);
+ return coal ? coal.id : '';
+ };
- // 鐢熸垚key-value鏄犲皠
- const coalMap = computed(() => {
- const map = {};
- coalData.value.forEach(item => {
- map[item.id] = item.coal;
+ // 鐢熸垚涓嬫媺閫夐」
+ const coalOptions = computed(() => {
+ return coalData.value.map(item => ({
+ label: item.coal,
+ value: item.coal,
+ key: item.id
+ }));
});
- return map;
- });
- return {
- coalData: computed(() => coalData.value),
- coalOptions,
- coalMap,
- isLoading: computed(() => isLoading.value),
- isLoaded: computed(() => isLoaded.value),
- getCoalData,
- getCoalNameById,
- getCoalIdByName
- };
+ // 鐢熸垚key-value鏄犲皠
+ const coalMap = computed(() => {
+ const map = {};
+ coalData.value.forEach(item => {
+ map[item.id] = item.coal;
+ });
+ return map;
+ });
+
+ return {
+ coalData: computed(() => coalData.value),
+ coalOptions,
+ coalMap,
+ isLoading: computed(() => isLoading.value),
+ isLoaded: computed(() => isLoaded.value),
+ getCoalData,
+ getCoalNameById,
+ getCoalIdByName
+ };
}
diff --git a/src/views/production/components/useDialog.js b/src/views/production/components/useDialog.js
index c3694b3..23eb8ad 100644
--- a/src/views/production/components/useDialog.js
+++ b/src/views/production/components/useDialog.js
@@ -2,55 +2,55 @@
* 瀵硅瘽妗嗙鐞嗙粍鍚堝紡鍑芥暟
* 鎻愪緵瀵硅瘽妗嗙殑鎵撳紑銆佸叧闂�佹暟鎹鐞嗙瓑鍔熻兘
*/
-import { ref } from 'vue';
+import {ref} from 'vue';
export function useDialog() {
- const dialogVisible = ref(false);
- const dialogType = ref('add');
- const dialogRef = ref(null);
- const currentRowData = ref(null);
+ const dialogVisible = ref(false);
+ const dialogType = ref('add');
+ const dialogRef = ref(null);
+ const currentRowData = ref(null);
- // 鎵撳紑瀵硅瘽妗�
- const openDialog = (type = 'add', rowData = null) => {
- dialogType.value = type;
- currentRowData.value = rowData;
- dialogVisible.value = true;
-
- // 璋冪敤瀵硅瘽妗嗙粍浠剁殑鍒濆鍖栨柟娉�
- if (dialogRef.value) {
- if (type === 'add') {
- dialogRef.value.Initialization?.();
- } else if (type === 'edit' && rowData) {
- dialogRef.value.editInitialization?.(rowData);
- }
- }
- };
+ // 鎵撳紑瀵硅瘽妗�
+ const openDialog = (type = 'add', rowData = null) => {
+ dialogType.value = type;
+ currentRowData.value = rowData;
+ dialogVisible.value = true;
- // 鍏抽棴瀵硅瘽妗�
- const closeDialog = () => {
- dialogVisible.value = false;
- dialogType.value = 'add';
- currentRowData.value = null;
- };
+ // 璋冪敤瀵硅瘽妗嗙粍浠剁殑鍒濆鍖栨柟娉�
+ if (dialogRef.value) {
+ if (type === 'add') {
+ dialogRef.value.Initialization?.();
+ } else if (type === 'edit' && rowData) {
+ dialogRef.value.editInitialization?.(rowData);
+ }
+ }
+ };
- // 瀵硅瘽妗嗘垚鍔熷洖璋�
- const handleDialogSuccess = (callback) => {
- closeDialog();
- if (typeof callback === 'function') {
- callback();
- }
- };
+ // 鍏抽棴瀵硅瘽妗�
+ const closeDialog = () => {
+ dialogVisible.value = false;
+ dialogType.value = 'add';
+ currentRowData.value = null;
+ };
- return {
- // 鐘舵��
- dialogVisible,
- dialogType,
- dialogRef,
- currentRowData,
-
- // 鏂规硶
- openDialog,
- closeDialog,
- handleDialogSuccess
- };
+ // 瀵硅瘽妗嗘垚鍔熷洖璋�
+ const handleDialogSuccess = (callback) => {
+ closeDialog();
+ if (typeof callback === 'function') {
+ callback();
+ }
+ };
+
+ return {
+ // 鐘舵��
+ dialogVisible,
+ dialogType,
+ dialogRef,
+ currentRowData,
+
+ // 鏂规硶
+ openDialog,
+ closeDialog,
+ handleDialogSuccess
+ };
}
diff --git a/src/views/production/components/useTableData.js b/src/views/production/components/useTableData.js
index ccdd846..4f48ef6 100644
--- a/src/views/production/components/useTableData.js
+++ b/src/views/production/components/useTableData.js
@@ -2,131 +2,131 @@
* 琛ㄦ牸鏁版嵁绠$悊缁勫悎寮忓嚱鏁�
* 鎻愪緵鍒嗛〉銆佹悳绱€�侀�夋嫨绛夐�氱敤鍔熻兘
*/
-import { ref, reactive } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import {ref, reactive} from 'vue';
+import {ElMessage, ElMessageBox} from 'element-plus';
export function useTableData(apiFunction, options = {}) {
- const {
- pageSize = 10,
- searchField = 'searchAll'
- } = options;
+ const {
+ pageSize = 10,
+ searchField = 'searchAll'
+ } = options;
- // 鍝嶅簲寮忔暟鎹�
- const tableData = ref([]);
- const loading = ref(false);
- const total = ref(0);
- const selectedRows = ref([]);
+ // 鍝嶅簲寮忔暟鎹�
+ const tableData = ref([]);
+ const loading = ref(false);
+ const total = ref(0);
+ const selectedRows = ref([]);
- // 鏌ヨ鍙傛暟
- const queryParams = reactive({
- [searchField]: '',
- current: 1,
- size: pageSize,
- });
+ // 鏌ヨ鍙傛暟
+ const queryParams = reactive({
+ [searchField]: '',
+ current: 1,
+ size: pageSize,
+ });
- // 鑾峰彇鍒楄〃鏁版嵁
- const getList = async () => {
- loading.value = true;
- try {
- const params = {
- [searchField]: queryParams[searchField],
- current: queryParams.current,
- size: queryParams.size,
- };
- console.log('鏌ヨ鍙傛暟:', params);
- const res = await apiFunction(params);
- tableData.value = res.data.records || [];
- total.value = res.data.total || 0;
- } catch (error) {
- ElMessage.error('鑾峰彇鏁版嵁澶辫触');
- console.error('API閿欒:', error);
- } finally {
- loading.value = false;
- }
- };
-
- // 鎼滅储
- const handleSearch = () => {
- queryParams.current = 1;
- getList();
- };
-
- // 閲嶇疆鎼滅储
- const handleReset = () => {
- queryParams[searchField] = '';
- console.log('閲嶇疆鎼滅储鍙傛暟:', queryParams);
- handleSearch();
- };
-
- // 鍒嗛〉澶勭悊
- const handlePageChange = ({ page, limit }) => {
- if (page && page !== queryParams.current) {
- queryParams.current = page;
- }
- if (limit && limit !== queryParams.size) {
- queryParams.size = limit;
- queryParams.current = 1; // 鏀瑰彉姣忛〉澶у皬鏃跺洖鍒扮涓�椤�
- }
- getList();
- };
-
- // 琛ㄦ牸閫夋嫨澶勭悊
- const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
- };
-
- // 鎵归噺鍒犻櫎
- const deleteSelected = async (deleteFunction) => {
- if (selectedRows.value.length === 0) {
- ElMessage.warning('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁');
- return;
- }
-
- try {
- await ElMessageBox.confirm(
- `纭鍒犻櫎閫変腑鐨� ${selectedRows.value.length} 鏉℃暟鎹悧锛焋,
- '鍒犻櫎纭',
- {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
+ // 鑾峰彇鍒楄〃鏁版嵁
+ const getList = async () => {
+ loading.value = true;
+ try {
+ const params = {
+ [searchField]: queryParams[searchField],
+ current: queryParams.current,
+ size: queryParams.size,
+ };
+ console.log('鏌ヨ鍙傛暟:', params);
+ const res = await apiFunction(params);
+ tableData.value = res.data.records || [];
+ total.value = res.data.total || 0;
+ } catch (error) {
+ ElMessage.error('鑾峰彇鏁版嵁澶辫触');
+ console.error('API閿欒:', error);
+ } finally {
+ loading.value = false;
}
- );
+ };
- const ids = selectedRows.value.map(row => row.id);
- await deleteFunction(ids);
-
- ElMessage.success('鍒犻櫎鎴愬姛');
- selectedRows.value = [];
- getList();
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('鍒犻櫎澶辫触');
- console.error('鍒犻櫎閿欒:', error);
- }
- }
- };
+ // 鎼滅储
+ const handleSearch = () => {
+ queryParams.current = 1;
+ getList();
+ };
- // 鍒锋柊鏁版嵁
- const refresh = () => {
- getList();
- };
+ // 閲嶇疆鎼滅储
+ const handleReset = () => {
+ queryParams[searchField] = '';
+ console.log('閲嶇疆鎼滅储鍙傛暟:', queryParams);
+ handleSearch();
+ };
- return {
- // 鏁版嵁
- tableData,
- loading,
- total,
- selectedRows,
- queryParams,
-
- // 鏂规硶
- getList,
- handleSearch,
- handleReset,
- handlePageChange,
- handleSelectionChange,
- deleteSelected,
- refresh
- };
+ // 鍒嗛〉澶勭悊
+ const handlePageChange = ({page, limit}) => {
+ if (page && page !== queryParams.current) {
+ queryParams.current = page;
+ }
+ if (limit && limit !== queryParams.size) {
+ queryParams.size = limit;
+ queryParams.current = 1; // 鏀瑰彉姣忛〉澶у皬鏃跺洖鍒扮涓�椤�
+ }
+ getList();
+ };
+
+ // 琛ㄦ牸閫夋嫨澶勭悊
+ const handleSelectionChange = (selection) => {
+ selectedRows.value = selection;
+ };
+
+ // 鎵归噺鍒犻櫎
+ const deleteSelected = async (deleteFunction) => {
+ if (selectedRows.value.length === 0) {
+ ElMessage.warning('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁');
+ return;
+ }
+
+ try {
+ await ElMessageBox.confirm(
+ `纭鍒犻櫎閫変腑鐨� ${selectedRows.value.length} 鏉℃暟鎹悧锛焋,
+ '鍒犻櫎纭',
+ {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }
+ );
+
+ const ids = selectedRows.value.map(row => row.id);
+ await deleteFunction(ids);
+
+ ElMessage.success('鍒犻櫎鎴愬姛');
+ selectedRows.value = [];
+ getList();
+ } catch (error) {
+ if (error !== 'cancel') {
+ ElMessage.error('鍒犻櫎澶辫触');
+ console.error('鍒犻櫎閿欒:', error);
+ }
+ }
+ };
+
+ // 鍒锋柊鏁版嵁
+ const refresh = () => {
+ getList();
+ };
+
+ return {
+ // 鏁版嵁
+ tableData,
+ loading,
+ total,
+ selectedRows,
+ queryParams,
+
+ // 鏂规硶
+ getList,
+ handleSearch,
+ handleReset,
+ handlePageChange,
+ handleSelectionChange,
+ deleteSelected,
+ refresh
+ };
}
diff --git a/src/views/production/index.vue b/src/views/production/index.vue
index 8ab5e23..8108dd7 100644
--- a/src/views/production/index.vue
+++ b/src/views/production/index.vue
@@ -4,9 +4,9 @@
<el-form :inline="true" :model="queryParams" class="search-form">
<el-form-item label="鎼滅储">
<el-input
- v-model="queryParams.searchAll"
- placeholder="璇疯緭鍏ュ叧閿瘝"
- clearable
+ v-model="queryParams.searchAll"
+ placeholder="璇疯緭鍏ュ叧閿瘝"
+ clearable
/>
</el-form-item>
<el-form-item>
@@ -27,18 +27,19 @@
</el-button>
</div> <!-- 鏁版嵁琛ㄦ牸 -->
<ETable
- :showOverflowTooltip="false"
- :loading="loading"
- :table-data="tableData"
- :columns="columns"
- :current-page="queryParams.current"
- :page-size="queryParams.size"
- @selection-change="handleSelectionChange"
- @edit="row => openDialog('edit', row)"
- :show-selection="true"
- :border="true"
- :maxHeight="480"
- > <template #coal="{ row }">
+ :showOverflowTooltip="false"
+ :loading="loading"
+ :table-data="tableData"
+ :columns="columns"
+ :current-page="queryParams.current"
+ :page-size="queryParams.size"
+ @selection-change="handleSelectionChange"
+ @edit="row => openDialog('edit', row)"
+ :show-selection="true"
+ :border="true"
+ :maxHeight="480"
+ >
+ <template #coal="{ row }">
<div class="coal-tags">
<el-tag v-for="coal in parseCoalArray(row.coal)" :key="coal" size="small">
{{ getCoalNameById(coal) }}
@@ -48,47 +49,47 @@
</template>
</ETable> <!-- 鍒嗛〉缁勪欢 -->
<Pagination
- :layout="'total, prev, pager, next, jumper'"
- :total="total"
- v-model:page="queryParams.current"
- :limit="queryParams.size"
- @pagination="handlePageChange"
+ :layout="'total, prev, pager, next, jumper'"
+ :total="total"
+ v-model:page="queryParams.current"
+ :limit="queryParams.size"
+ @pagination="handlePageChange"
/>
</el-card>
<!-- 鐢熶骇瀵硅瘽妗� -->
<!-- handleProductionAndProcessing -->
<ProductionDialog
- v-model:visible="dialogVisible"
- ref="dialogRef"
- :type="dialogType"
- @update:productionAndProcessing="handleProductionAndProcessing"
- @success="handleDialogSuccess"
+ v-model:visible="dialogVisible"
+ ref="dialogRef"
+ :type="dialogType"
+ @update:productionAndProcessing="handleProductionAndProcessing"
+ @success="handleDialogSuccess"
/>
</div>
</template>
<script setup>
-import { onMounted } from "vue";
-import { ElMessage } from "element-plus";
-import { Plus, Delete } from "@element-plus/icons-vue";
+import {onMounted} from "vue";
+import {ElMessage} from "element-plus";
+import {Plus, Delete} from "@element-plus/icons-vue";
import ProductionDialog from "./components/ProductionDialog.vue";
import ETable from "@/components/Table/ETable.vue";
import Pagination from "@/components/Pagination/index.vue";
-import { getProductionMasterList, delPM } from "@/api/production";
-import { parseCoalArray } from "@/utils/production";
-import { useTableData } from "./components/useTableData.js";
-import { useDialog } from "./components/useDialog.js";
-import { useCoalData } from "./components/useCoalData.js";
+import {getProductionMasterList, delPM} from "@/api/production";
+import {parseCoalArray} from "@/utils/production";
+import {useTableData} from "./components/useTableData.js";
+import {useDialog} from "./components/useDialog.js";
+import {useCoalData} from "./components/useCoalData.js";
// 琛ㄦ牸鍒楅厤缃�
const columns = [
- { prop: "coal", label: "鐓ょ", minWidth: 150, slot: 'coal' },
- { prop: "productionQuantity", label: "鐢熶骇鏁伴噺", minWidth: 120 },
- { prop: "laborCost", label: "浜哄伐鎴愭湰", minWidth: 150 },
- { prop: "energyConsumptionCost", label: "鑳借�楁垚鏈�", minWidth: 120 },
- { prop: "equipmentDepreciation", label: "璁惧鎶樻棫", minWidth: 143 },
- { prop: "totalCost", label: "鎬绘垚鏈�", minWidth: 150 },
+ {prop: "coal", label: "鐓ょ", minWidth: 150, slot: 'coal'},
+ {prop: "productionQuantity", label: "鐢熶骇鏁伴噺", minWidth: 120},
+ {prop: "laborCost", label: "浜哄伐鎴愭湰", minWidth: 150},
+ {prop: "energyConsumptionCost", label: "鑳借�楁垚鏈�", minWidth: 120},
+ {prop: "equipmentDepreciation", label: "璁惧鎶樻棫", minWidth: 143},
+ {prop: "totalCost", label: "鎬绘垚鏈�", minWidth: 150},
];
// 浣跨敤琛ㄦ牸鏁版嵁缁勫悎寮忓嚱鏁�
@@ -104,7 +105,7 @@
handlePageChange,
handleSelectionChange,
deleteSelected
-} = useTableData(getProductionMasterList, { pageSize: 10 });
+} = useTableData(getProductionMasterList, {pageSize: 10});
// 浣跨敤瀵硅瘽妗嗙粍鍚堝紡鍑芥暟
const {
@@ -116,13 +117,13 @@
} = useDialog();
// 浣跨敤鐓ょ鏁版嵁缁勫悎寮忓嚱鏁�
-const { getCoalNameById, getCoalData } = useCoalData();
+const {getCoalNameById, getCoalData} = useCoalData();
// 澶勭悊鐢熶骇鏁版嵁鏇存柊
const handleProductionAndProcessing = (row, rows) => {
const index = tableData.value.findIndex(item => item.id === rows.id);
if (index !== -1) {
- tableData.value[index] = { ...tableData.value[index], ...row };
+ tableData.value[index] = {...tableData.value[index], ...row};
}
};
@@ -158,6 +159,7 @@
width: 20%;
}
}
+
.search-form {
display: flex;
justify-content: space-between;
@@ -172,15 +174,16 @@
margin-left: 10px;
}
}
+
.coal-tags {
display: flex;
flex-wrap: wrap;
gap: 4px;
-
+
.el-tag {
margin-right: 4px;
margin-bottom: 4px;
-
+
&:last-child {
margin-right: 0;
}
--
Gitblit v1.9.3