This commit is contained in:
oneao committed 2026-03-24 17:29:55 +08:00
1 parent 401a6719f6
commit b7f50f3ccb
22 files changed
+1595 -343

No files matched your search

@@ -32,7 +32,7 @@ import { loadDataApi, saveObjectKeysApi, deleteFileApi } from "@/request/api";
const props = defineProps({
father: {
type: String,
type: [String, Number],
required: true,
},
moduleId: {
@@ -56,6 +56,8 @@ const props = defineProps({
default: () => [],
},
});
const emits = defineEmits(["files-deleted"]);
const treeRef = ref(null);
const tableRef = ref(null);
@@ -206,6 +208,8 @@ watch(
if (newCategories && newCategories.length > 0) {
categories.value[0].children.push(...newCategories);
}
console.log(categories.value);
},
{ immediate: true },
);
@@ -349,11 +353,7 @@ async function uploadLocalFiles(files) {
const tempUrl = URL.createObjectURL(blob);
if (file.size > 512000) {
const {
url,
size,
blob: compressedBlob,
} = await compressImage(tempUrl);
const { url, size, blob: compressedBlob } = await compressImage(tempUrl);
fileInfo.mx_mapfilename = url;
fileInfo.mx_filesize = size;
@@ -498,9 +498,7 @@ async function handleDownloadFile(file) {
function handleShowPreview(file) {
console.log(file);
if (isImage(file.mx_fileext)) {
const index = previewImageList.value.findIndex(
(item) => item === file.mx_mapfilename,
);
const index = previewImageList.value.findIndex((item) => item === file.mx_mapfilename);
if (index !== -1) {
preViewImageIndex.value = index;
@@ -513,10 +511,7 @@ function handleShowPreview(file) {
if (isExcel(file.mx_fileext)) {
// https://view.officeapps.live.com/op/view.aspx?src=
window.open(
`https://view.officeapps.live.com/op/view.aspx?src=${fileUrl}`,
"_blank",
);
window.open(`https://view.officeapps.live.com/op/view.aspx?src=${fileUrl}`, "_blank");
} else {
window.open(fileUrl, "_blank");
}
@@ -526,9 +521,7 @@ function handleShowPreview(file) {
function handleDownloadPreviewImage(index) {
const previewFileUrl = previewImageList.value[index];
const previewFile = fileList.value.find(
(item) => item.mx_mapfilename === previewFileUrl,
);
const previewFile = fileList.value.find((item) => item.mx_mapfilename === previewFileUrl);
if (previewFile) {
handleDownloadFile(previewFile);
@@ -573,6 +566,8 @@ async function deleteFiles(files) {
}
}
emits("files-deleted", files);
ElMessage.success("文件删除成功");
done();
} catch (error) {
@@ -598,12 +593,12 @@ async function handleSave() {
loading.value = true;
loadingTip.value = "正在保存中 . . .";
const { insertdata, updatedata, deletedata, hasChanges } =
compareAndClassifyData(fileList.value, oldFileList.value, "subid", [
"_content",
"_status",
"checked",
]);
const { insertdata, updatedata, deletedata, hasChanges } = compareAndClassifyData(
fileList.value,
oldFileList.value,
"subid",
["_content", "_status", "checked"],
);
// 处理新增的文件
for (const item of insertdata) {
@@ -661,6 +656,8 @@ function onClosed() {
loading.value = false;
loadingTip.value = "正在加载中 . . .";
cateId.value = "";
}
function handleTreeNodeClick(data) {
@@ -690,9 +687,7 @@ function handleTreeNodeClick(data) {
<div class="g3-title">
附件管理({{ fileList.length }})
<template v-if="!props.readonly">
未上传 ({{ pendingFileList.length }})
</template>
<template v-if="!props.readonly"> 未上传 ({{ pendingFileList.length }}) </template>
</div>
</template>
<input
@@ -792,11 +787,7 @@ function handleTreeNodeClick(data) {
</div>
<div v-else-if="displayMode === 0" class="g3-files">
<div
v-for="(file, index) in fileList"
:key="index"
class="g3-file-item"
>
<div v-for="(file, index) in fileList" :key="index" class="g3-file-item">
<div class="g3-file-checkbox">
<el-checkbox v-model="file._checked" size="large" />
</div>
@@ -808,15 +799,9 @@ function handleTreeNodeClick(data) {
<span v-if="file._status === 'pending'">未上传</span>
<span v-if="file._status === 'failed'">上传失败</span>
</div>
<div
class="g3-file-preview"
@click.stop="handleShowPreview(file)"
>
<div class="g3-file-preview" @click.stop="handleShowPreview(file)">
<template v-if="getFileIcon(file.mx_fileext) === 'image'">
<el-image
class="g3-file-preview-img"
:src="file.mx_mapfilename"
/>
<el-image class="g3-file-preview-img" :src="file.mx_mapfilename" />
</template>
<template v-else>
<G3Icon :icon="getFileIcon(file.mx_fileext)" size="88" />
@@ -832,15 +817,9 @@ function handleTreeNodeClick(data) {
<div>{{ formatFileSize(file.mx_filesize) }}</div>
<div>
{{ file.mx_updateuser_id || file.mx_inputuser_id }}
<template
v-if="file.mx_inputdatetime || file.mx_updatedatetime"
>
<template v-if="file.mx_inputdatetime || file.mx_updatedatetime">
|
{{
formatTime(
file.mx_updatedatetime || file.mx_inputdatetime,
)
}}
{{ formatTime(file.mx_updatedatetime || file.mx_inputdatetime) }}
</template>
</div>
</div>
@@ -862,17 +841,8 @@ function handleTreeNodeClick(data) {
>
<G3Icon icon="lucide:download" />
</el-button>
<el-dropdown
v-if="!props.readonly"
placement="top"
trigger="click"
>
<el-button
type="info"
size="small"
circle
style="margin-left: 12px"
>
<el-dropdown v-if="!props.readonly" placement="top" trigger="click">
<el-button type="info" size="small" circle style="margin-left: 12px">
<G3Icon icon="lucide:ellipsis" />
</el-button>
<template #dropdown>
@@ -912,28 +882,14 @@ function handleTreeNodeClick(data) {
<el-checkbox v-model="row._checked" size="large" />
</template>
</vxe-column>
<vxe-column
field="mx_filename"
title="文件名"
sortable
align="center"
>
<vxe-column field="mx_filename" title="文件名" sortable align="center">
<template #default="{ row }">
<el-button
type="primary"
link
@click.stop="handleShowPreview(row)"
>
<el-button type="primary" link @click.stop="handleShowPreview(row)">
{{ row.mx_filename }}
</el-button>
</template>
</vxe-column>
<vxe-column
field="mx_inputdatetime"
title="上传日期"
sortable
align="center"
>
<vxe-column field="mx_inputdatetime" title="上传日期" sortable align="center">
<template #default="{ row }">
{{ formatTime(row.mx_inputdatetime) }}
</template>
@@ -974,26 +930,14 @@ function handleTreeNodeClick(data) {
>
删除
</el-button>
<el-button
type="primary"
link
@click.stop="handleDownloadFile(row)"
>
<el-button type="primary" link @click.stop="handleDownloadFile(row)">
下载
</el-button>
<el-dropdown
v-if="!props.readonly"
placement="top"
trigger="click"
>
<el-button type="info" link style="margin-left: 12px">
更多
</el-button>
<el-dropdown v-if="!props.readonly" placement="top" trigger="click">
<el-button type="info" link style="margin-left: 12px"> 更多 </el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
@click="handleShowUpdateDialog(row)"
>
<el-dropdown-item @click="handleShowUpdateDialog(row)">
修改文件信息
</el-dropdown-item>
</el-dropdown-menu>
@@ -1029,12 +973,9 @@ function handleTreeNodeClick(data) {
:url-list="previewImageList"
:initial-index="preViewImageIndex"
hide-on-click-modal
preview-teleported
@close="showPreview = false"
>
<template
#toolbar="{ actions, prev, next, reset, activeIndex, setActiveItem }"
>
<template #toolbar="{ actions, prev, next, reset, activeIndex, setActiveItem }">
<ElIcon @click="prev">
<Back />
</ElIcon>
@@ -1047,16 +988,10 @@ function handleTreeNodeClick(data) {
<ElIcon @click="actions('zoomOut')">
<ZoomOut />
</ElIcon>
<ElIcon
@click="actions('zoomIn', { enableTransition: false, zoomRate: 2 })"
>
<ElIcon @click="actions('zoomIn', { enableTransition: false, zoomRate: 2 })">
<ZoomIn />
</ElIcon>
<ElIcon
@click="
actions('clockwise', { rotateDeg: 180, enableTransition: false })
"
>
<ElIcon @click="actions('clockwise', { rotateDeg: 180, enableTransition: false })">
<RefreshRight />
</ElIcon>
<ElIcon @click="actions('anticlockwise')">
@@ -1086,11 +1021,7 @@ function handleTreeNodeClick(data) {
<template #footer>
<div class="dialog-footer">
<el-button @click="showUpdateDialog = false"> 取消 </el-button>
<el-button
type="primary"
:loading="updateLoading"
@click="handleConfirmUpdate"
>
<el-button type="primary" :loading="updateLoading" @click="handleConfirmUpdate">
确认
</el-button>
</div>
@@ -0,0 +1,11 @@
<script lang="js" setup>
</script>
<template>
<div class=""></div>
</template>
<style lang="scss" scoped>
</style>
@@ -23,9 +23,9 @@ const menuList = ref([
icon: "lucide:house",
},
{
label: "业务管理",
icon: "lucide:briefcase-business",
children: [],
label: "集装箱管理",
icon: "lucide:box",
path: "/container",
},
{
label: "系统管理",
@@ -22,6 +22,14 @@ export const routes = [
keepAlive: true,
},
},
{
path: "/container",
component: () => import("@/views/container/index.vue"),
meta: {
title: "集装箱管理",
keepAlive: true,
},
},
// ==================== 系统管理 ====================
{
path: "/system/field",
@@ -1,5 +1,6 @@
import { updateColumnsApi } from "@/request/api";
import { ElMessage } from "element-plus";
import { formatToDate, formatToDateTime } from "./time";
export function updateEditTableColumns(tableRef) {
const $table = unref(tableRef);
@@ -39,19 +40,24 @@ export function updateViewTableColumns(tableRef) {
}
const columns = $table.getColumns();
console.log(columns);
if (!$table || $table.length === 0) {
ElMessage.warning("未获取到栏位信息");
return;
}
const newColumns = columns
.filter((item) => item.params.b_id !== undefined)
.filter((item) => item.type === undefined && item.params && item.params.b_id)
.map((item, index) => ({
b_id: item.params.b_id,
col_Width: item.renderWidth,
col_Position: index,
}));
console.log(newColumns);
updateColumnsApi(newColumns).then((res) => {
if (res.success) {
ElMessage.success("保存成功");
@@ -103,9 +109,11 @@ export function formatValueByFormat(value, format) {
minimumFractionDigits: decimals,
maximumFractionDigits: decimals,
}).format(num);
} else if (fmt.startsWith("date")) {
} else if (fmt === "date") {
return formatToDate(value);
} else if (fmt.startsWith("number")) {
} else if (fmt === "datetime") {
return formatToDateTime(value);
} else if (fmt === "number") {
return Number(value) || 0;
}
@@ -1,4 +1,7 @@
import { getAliyunKeyApi, insertFileApi } from "@/request/api";
import { saveAs } from "file-saver";
import JSZip from "jszip";
import { ElMessage } from "element-plus";
/**
* 选择并压缩图片
@@ -0,0 +1,508 @@
<script lang="js" setup>
import {
deleteFileApi,
loadDataApi,
loadPageDataApi,
loadViewColumnsApi,
saveObjectApi,
} from "@/request/api";
import { getAlignByFormat, formatValueByFormat } from "@/utils/columns";
import { updateViewTableColumns } from "@/utils/columns";
import { ElMessage } from "element-plus";
const tableRef = ref();
const columns = ref([]);
const tableData = ref([]);
const showSearch = ref(true);
const loading = reactive({
table: true,
});
const searchForm = ref({
startTime: "",
endTime: "",
containerNo: "",
username: "",
});
const pagination = reactive({
page: 1,
size: 20,
total: 0,
});
const fileCategories = [
{
label: "集装箱号",
cateId: "0",
},
{
label: "其它照片",
cateId: "1",
},
];
const viewName = "v_container";
const showPreview = ref(false);
const previewIndex = ref(-1);
const previewImageList = computed(() => {
return tableData.value.map((item) => item.b_container_img).filter((img) => img);
});
const currentRow = ref({});
const showFile = ref(false);
onMounted(async () => {
loading.table = true;
await loadTableColumns();
await loadTableDatas();
loading.table = false;
});
const handleSizeChange = (val) => {
pagination.size = val;
loadTableDatas();
};
const handleCurrentChange = (val) => {
pagination.page = val;
loadTableDatas();
};
async function loadTableColumns() {
const columnRes = await loadViewColumnsApi(viewName);
if (columnRes.success) {
columns.value = columnRes.data;
}
}
async function loadTableDatas() {
loading.table = true;
let searchCondition = "";
if (searchForm.value.startTime) {
searchCondition += `b_inputdatetime >= '${searchForm.value.startTime}' AND `;
}
if (searchForm.value.endTime) {
searchCondition += `b_inputdatetime <= '${searchForm.value.endTime}' AND `;
}
if (searchForm.value.containerNo) {
searchCondition += `b_container_no LIKE '%${searchForm.value.containerNo}%' AND `;
}
if (searchForm.value.username) {
searchCondition += `v_username LIKE '%${searchForm.value.username}%' AND `;
}
if (searchCondition.endsWith(" AND ")) {
searchCondition = searchCondition.slice(0, -4);
}
await loadPageDataApi({
viewName,
page: pagination.page,
size: pagination.size,
searchCondition,
orderField: "b_inputdatetime DESC",
}).then((res) => {
if (res.success) {
tableData.value = res.data.rows;
pagination.total = res.data.total;
loading.table = false;
}
});
}
// 删除单行
async function handleDeleteRow(row) {
if (!row) return;
const $table = tableRef.value;
if ($table) {
deleteRows([row]);
}
}
// 删除多选行
async function handleDeleteRows() {
const $table = tableRef.value;
if ($table) {
deleteRows($table.getCheckboxRecords());
}
}
async function deleteRows(rows = []) {
const $table = tableRef.value;
if (!$table) {
return;
}
if (!rows.length) {
ElMessage.warning("请先选择要删除的行");
return;
}
const containerNos = rows.map((row) => row.b_container_no);
const deleteIds = rows.map((row) => row.b_id);
const tipMessage = `确定要删除以下箱号记录吗?<br/><strong>${containerNos.join(", ")}</strong>`;
await ElMessageBox.confirm(tipMessage, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
dangerouslyUseHTMLString: true,
});
if (deleteIds.length === 0) {
ElMessage.success("删除成功");
loadTableDatas();
return;
}
// 确保 deleteIds 数组中的值是数字,防止 SQL 注入
const safeDeleteIds = deleteIds.map((id) => Number(id));
// 使用安全的 SQL 查询
const fileRes = await loadDataApi("bf_file", `father IN (${safeDeleteIds.join(",")})`, "", [
"subid",
]);
if (!fileRes.success) {
return;
}
for (const file of fileRes.data) {
await deleteFileApi(file.subid);
}
const requestData = [
{
tableName: "b_container",
keyField: "b_id",
inserts: [],
updates: [],
deletes: deleteIds.map((id) => ({ b_id: id })),
},
];
await saveObjectApi(requestData).then((res) => {
if (res.success) {
ElMessage.success("删除成功");
loadTableDatas();
}
});
}
function handleSearch() {
pagination.page = 1;
loadTableDatas();
}
function handleSearchReset() {
searchForm.value.startTime = "";
searchForm.value.endTime = "";
searchForm.value.containerNo = "";
searchForm.value.username = "";
}
function handlePreviewShow(imgUrl) {
const index = previewImageList.value.indexOf(imgUrl);
if (index !== -1) {
previewIndex.value = index;
showPreview.value = true;
} else {
showPreview.value = false;
}
}
function handlePreviewClose() {
showPreview.value = false;
previewIndex.value = -1;
}
function handleFileShow(data) {
currentRow.value = data;
showFile.value = true;
}
function handleDownloadOne(data) {
console.log(data);
// 获取
}
</script>
<template>
<div class="g3-container">
<div v-if="showSearch" class="g3-search">
<G3Grid class="grid">
<G3GridGroup :label-width="80" :column="2">
<G3GridItem label="上传日期" :span="2">
<el-date-picker
type="datetime"
placeholder="开始日期"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
v-model="searchForm.startTime"
/>
<el-divider direction="vertical" />
<el-date-picker
type="datetime"
placeholder="结束日期"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
v-model="searchForm.endTime"
/>
</G3GridItem>
<G3GridItem label="箱号">
<el-input v-model="searchForm.containerNo" />
</G3GridItem>
<G3GridItem label="操作员">
<el-input v-model="searchForm.username" />
</G3GridItem>
</G3GridGroup>
</G3Grid>
<div class="search-extra">
<el-button type="primary" @click="handleSearch">
<el-icon class="el-icon--left">
<G3Icon icon="lucide:search" />
</el-icon>
搜索
</el-button>
<el-button @click="handleSearchReset">
<el-icon class="el-icon--left">
<G3Icon icon="lucide:refresh-ccw" />
</el-icon>
重置
</el-button>
</div>
</div>
<div class="g3-content">
<div class="content-top">
<div>
<el-button type="primary">
<el-icon class="el-icon--left">
<G3Icon icon="lucide:cloud-download" />
</el-icon>
批量下载
</el-button>
<el-button type="danger" @click="handleDeleteRows">
<el-icon class="el-icon--left">
<G3Icon icon="lucide:trash-2" />
</el-icon>
批量删除
</el-button>
</div>
<div>
<el-tooltip content="显示/关闭 搜索">
<el-button circle @click="showSearch = !showSearch">
<el-icon>
<G3Icon icon="lucide:search" />
</el-icon>
</el-button>
</el-tooltip>
<el-tooltip content="刷新">
<el-button circle>
<el-icon>
<G3Icon icon="lucide:refresh-ccw" />
</el-icon>
</el-button>
</el-tooltip>
<el-dropdown>
<el-button circle style="margin-left: 12px">
<el-icon>
<G3Icon icon="lucide:ellipsis" />
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="updateViewTableColumns(tableRef)">
栏位保存
</el-dropdown-item>
<el-dropdown-item>导出Execl</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
<div class="g3-table">
<vxe-table
ref="tableRef"
:loading="loading.table"
:data="tableData"
:cell-config="{ height: 100 }"
:column-config="{
resizable: true,
drag: true,
}"
:row-config="{
useKey: true,
isCurrent: true,
isHover: true,
}"
:filter-config="{
showIcon: false,
}"
:column-drag-config="{
showIcon: false,
trigger: 'cell',
}"
height="100%"
>
<vxe-column field="seq" type="seq" width="50" align="center" title=" " fixed="left" />
<vxe-column type="checkbox" width="50" align="center" fixed="left" />
<vxe-column
v-for="column in columns"
:key="column.col_FieldName"
:field="column.col_FieldName"
:title="column.col_Caption"
:width="column.col_Width"
align="center"
:params="column"
:sortable="column.col_FieldName !== 'b_container_img'"
>
<template #default="{ row }">
<template v-if="column.col_FieldName === 'b_container_img'">
<el-image
style="width: 100px; height: 100px; cursor: pointer"
:src="row.b_container_img"
@click="handlePreviewShow(row.b_container_img)"
/>
</template>
<template v-else>
{{ formatValueByFormat(row[column.col_FieldName], column.col_DisplayFormat) }}
</template>
</template>
</vxe-column>
<vxe-column width="220" align="center" fixed="right" title="操作">
<template #default="{ row }">
<el-button link type="primary" @click="handleDownloadOne(row)">
<el-icon class="el-icon--left">
<G3Icon icon="lucide:cloud-download" />
</el-icon>
下载
</el-button>
<el-button link type="primary" @click="handleFileShow(row)">
<el-icon class="el-icon--left">
<G3Icon icon="lucide:file-image" />
</el-icon>
图片
</el-button>
<el-button link type="danger" @click="handleDeleteRow(row)">
<el-icon class="el-icon--left">
<G3Icon icon="lucide:trash-2" />
</el-icon>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>
</div>
<div class="g3-pagination">
<el-pagination
v-model:current-page="pagination.page"
v-model:page-size="pagination.size"
:page-sizes="[20, 50, 100, 200]"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<el-image-viewer
v-if="showPreview"
:url-list="previewImageList"
show-progress
:initial-index="previewIndex"
@close="handlePreviewClose"
/>
<G3File
v-model="showFile"
:father="currentRow.b_id"
module-id="b_container"
:categories="fileCategories"
/>
</div>
</template>
<style lang="scss" scoped>
.g3-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
.g3-search {
display: flex;
align-items: center;
padding: 10px;
background-color: #fff;
margin-bottom: 12px;
.grid {
width: 500px;
}
.search-extra {
display: flex;
margin-left: 24px;
}
}
.g3-content {
flex-grow: 1;
background-color: #fff;
padding: 10px;
min-height: 0;
display: flex;
flex-direction: column;
.content-top {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
::v-deep(.el-button) {
height: 32px !important;
}
}
.g3-table {
flex: 1;
min-height: 0;
}
.g3-pagination {
margin-top: 8px;
display: flex;
align-items: center;
justify-content: flex-end;
flex-shrink: 0;
min-height: 0;
}
}
</style>
@@ -24,9 +24,7 @@ const isCollapse = ref(false);
const showSql = ref(false);
const treeData = [
{ b_id: "root", mc_b: "全部分类", isLeaf: false, children: [] },
];
const treeData = [{ b_id: "root", mc_b: "全部分类", isLeaf: false, children: [] }];
const treeProps = {
children: "children",
@@ -344,18 +342,15 @@ async function handleTreeLoad(node, resolve) {
}
async function handleTreeNodeClick(nodeData) {
console.log("===node===")
console.log(nodeData)
console.log("===node===");
console.log(nodeData);
if (!nodeData || nodeData.b_id === "root" || !nodeData.b_moduleid) return;
currentNode.value = nodeData;
loading.value = true;
try {
const res = await loadDataApi(
"s_module",
`b_id = '${nodeData.b_moduleid}'`,
);
const res = await loadDataApi("s_module", `b_id = '${nodeData.b_moduleid}'`);
if (res.success) {
currentModule.value = res.data[0] || null;
@@ -493,17 +488,10 @@ function handleCheckColumns() {
<div class="content">
<div class="content-head">
<div class="content-head-left">
<el-button
type="primary"
:disabled="!isSelectedNode"
@click="handleCheckColumns"
>检查</el-button
>
<el-button
type="primary"
:disabled="!isSelectedNode"
@click="showPreview = true"
>
<el-button type="primary" :disabled="!isSelectedNode" @click="handleCheckColumns">
检查
</el-button>
<el-button type="primary" :disabled="!isSelectedNode" @click="showPreview = true">
浏览栏位预览
</el-button>
<el-button
@@ -524,18 +512,10 @@ function handleCheckColumns() {
>
属性预览
</el-button>
<el-button
type="primary"
:disabled="!isSelectedRow"
@click="showTag = !showTag"
>
<el-button type="primary" :disabled="!isSelectedRow" @click="showTag = !showTag">
修改标签
</el-button>
<el-button
type="primary"
:disabled="!isSelectedNode"
@click="showSql = !showSql"
>
<el-button type="primary" :disabled="!isSelectedNode" @click="showSql = !showSql">
SQL语句
</el-button>
</div>
@@ -643,21 +623,11 @@ function handleCheckColumns() {
</el-splitter-panel>
</el-splitter>
<PreviewSql
v-model="showSql"
:data="tableData"
:view-name="currentModule?.b_ViewTable"
/>
<PreviewSql v-model="showSql" :data="tableData" :view-name="currentModule?.b_ViewTable" />
<PreviewEdit
v-model="showEditPreview"
:view-name="currentModule?.b_ViewTable"
/>
<PreviewEdit v-model="showEditPreview" :view-name="currentModule?.b_ViewTable" />
<PreviewView
v-model="showPreview"
:view-name="currentModule?.b_ViewTable"
/>
<PreviewView v-model="showPreview" :view-name="currentModule?.b_ViewTable" />
<TagUpdate v-model="showTag" :data="currentRow" />
</div>
@@ -38,6 +38,8 @@ watch(
() => props.node,
(val) => {
if (val) {
console.log(val)
if (props.mode == "add") {
isDisabled.value = false;
if (val.id != "all") {
@@ -1,7 +1,7 @@
<script lang="js" setup>
import { ref, watch } from "vue";
import { ElMessage } from "element-plus";
import { diffObject } from "@/utils/diff";
// Props
const props = defineProps({
@@ -15,6 +15,7 @@ const emit = defineEmits(["update:visible", "submit"]);
// Local state
const form = ref({});
const oldForm = ref({});
const visible = ref(props.visible);
const isDisabled = ref(false); // 控制是否禁用
@@ -33,10 +34,12 @@ watch(
if (props.mode == "add") {
isDisabled.value = false;
form.value = val;
oldForm.value = JSON.parse(JSON.stringify(val));
}
if (props.mode == "edit") {
isDisabled.value = true;
form.value = val;
oldForm.value = JSON.parse(JSON.stringify(val));
}
}
},
@@ -49,7 +52,14 @@ const handleSubmit = () => {
ElMessage.warning("模块代码、类别不能为空");
return;
}
emit("submit", { ...form.value });
const diffRes = diffObject(form.value, oldForm.value, ["b_id"], []);
if (diffRes.isChanged) {
diffRes.result.b_Cate_ID = form.value.b_Cate_ID;
emit("submit", diffRes.result);
}
visible.value = false;
};
@@ -172,12 +182,7 @@ const resetForm = () => {
</div>
<div style="display: flex; margin-top: 3px; align-items: center">
<label class="font-medium">顺序:</label>
<el-input
type="text"
v-model="form.b_Order"
placeholder="请输入顺序"
style="width: 374px"
/>
<el-input type="text" v-model="form.b_Order" placeholder="请输入顺序" style="width: 374px" />
</div>
<div style="display: flex; margin-top: 3px; align-items: center">
<label class="font-medium">编辑路径:</label>
@@ -191,12 +196,7 @@ const resetForm = () => {
<div style="display: flex; margin-top: 3px; align-items: center">
<div style="display: flex; margin-top: 3px; align-items: center">
<label class="font-medium">主模块</label>
<el-checkbox
v-model="form.b_isMainModule"
:true-label="1"
:false-label="0"
size="large"
/>
<el-checkbox v-model="form.b_isMainModule" :true-label="1" :false-label="0" size="large" />
</div>
<div style="display: flex; margin-top: 3px; align-items: center">
<label class="font-medium">虚拟</label>
@@ -209,21 +209,11 @@ const resetForm = () => {
</div>
<div style="display: flex; margin-top: 3px; align-items: center">
<label class="font-medium">自动编码</label>
<el-checkbox
v-model="form.b_autoid"
:true-value="1"
:false-value="0"
size="large"
/>
<el-checkbox v-model="form.b_autoid" :true-value="1" :false-value="0" size="large" />
</div>
<div style="display: flex; margin-top: 3px; align-items: center">
<label class="font-medium">审核中心</label>
<el-checkbox
v-model="form.b_SH"
:true-value="1"
:false-value="0"
size="large"
/>
<el-checkbox v-model="form.b_SH" :true-value="1" :false-value="0" size="large" />
</div>
</div>
@@ -138,20 +138,12 @@ function onClosed() {
<div class="form-item">
<div class="label">发布</div>
<el-switch
v-model="form.b_visible"
active-value="1"
inactive-value="0"
/>
<el-switch v-model="form.b_visible" active-value="1" inactive-value="0" />
</div>
<div class="form-item">
<div class="label">公告内容</div>
<WangEditor
v-model="form.b_info"
:father="form.b_id"
module-id="oa_notices"
/>
<WangEditor v-model="form.b_info" :father="form.b_id" module-id="oa_notices" />
</div>
</div>
<template #footer>
@@ -165,9 +157,7 @@ function onClosed() {
<div>
<el-button @click="showVisible = false">取消</el-button>
<el-button type="primary" :loading="loading.save" @click="handleSave"
>确认</el-button
>
<el-button type="primary" :loading="loading.save" @click="handleSave"> 确认 </el-button>
</div>
</div>
</template>
@@ -20,6 +20,7 @@ import Employee from "./employee.vue";
background-color: #fff;
:deep(.el-tabs__content) {
overflow-y: auto;
padding: 6px 0px;
}
}
</style>