gongchunyi
3 天以前 649cf95bb793b9a0de7ee4c87bd34d9dbe716b04
src/views/basicData/product/index.vue
@@ -25,18 +25,13 @@
          :data="list"
          @node-click="handleNodeClick"
          :expand-on-click-node="false"
          default-expand-all
          :default-expanded-keys="expandedKeys"
          :draggable="true"
          :filter-node-method="filterNode"
          :props="{ children: 'children', label: 'label' }"
          highlight-current
          node-key="id"
          style="
            height: calc(100vh - 190px);
            overflow-y: scroll;
            scrollbar-width: none;
          "
          class="product-tree-scroll"
          style="height: calc(100vh - 190px); overflow-y: auto"
        >
          <template #default="{ node, data }">
            <div class="custom-tree-node">
@@ -45,7 +40,7 @@
                  <component :is="data.children && data.children.length > 0
                  ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
                </el-icon>
                {{ data.label }}
                <span class="tree-node-label">{{ data.label }}</span>
              </span>
              <div>
                <el-button
@@ -113,6 +108,8 @@
              <el-input
                v-model="form.productName"
                placeholder="请输入产品名称"
                maxlength="20"
                show-word-limit
                clearable
                @keydown.enter.prevent
              />
@@ -241,7 +238,10 @@
    productName: "",
  },
  rules: {
    productName: [{ required: true, message: "请输入", trigger: "blur" }],
    productName: [
      { required: true, message: "请输入", trigger: "blur" },
      { max: 20, message: "产品名称不能超过20个字符", trigger: "blur" },
    ],
  },
  modelForm: {
    model: "",
@@ -319,53 +319,17 @@
  proxy.$refs.formRef.resetFields();
  productDia.value = false;
};
// 封装一个安全的确认框,彻底阻止Enter键触发
const safeConfirm = (message, title) => {
  // 标记是否是鼠标点击(点击按钮会触发focus事件)
  let isMouseClick = false;
  return new Promise((resolve, reject) => {
    const box = ElMessageBox.confirm(message, title, {
      confirmButtonText: "确认",
      cancelButtonText: "取消",
      type: "warning",
      beforeClose: (action, instance, done) => {
        if (action === "confirm") {
          // 只有鼠标点击时才允许确认
          if (isMouseClick) {
            done();
            resolve();
          } else {
            // Enter键触发时阻止
            done(false);
          }
        } else {
          // 取消操作直接允许
          done();
          reject();
        }
      }
    });
    // 监听确认按钮的focus事件(鼠标点击会触发,Enter键不会)
    setTimeout(() => {
      const confirmBtn = document.querySelector('.el-message-box__btns .el-button--primary');
      if (confirmBtn) {
        confirmBtn.addEventListener('focus', () => {
          isMouseClick = true;
        });
      }
    }, 0); // 延迟获取,确保DOM已渲染
  });
};
// 删除产品
// 删除产品
const remove = (node, data) => {
  let ids = [data.id];
  // 使用封装的safeConfirm
  safeConfirm("选中的内容将被删除,是否确认删除?", "删除提示")
  let ids = [];
  ids.push(data.id);
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      // 确认删除逻辑
      tableLoading.value = true;
      delProduct(ids)
        .then((res) => {
@@ -441,7 +405,11 @@
    proxy.$modal.msgWarning("请选择数据");
    return;
  }
  safeConfirm("选中的内容将被删除,是否确认删除?", "删除提示")
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      tableLoading.value = true;
      delProductModel(ids)
@@ -501,18 +469,21 @@
  display: flex;
}
.left {
  width: 380px;
  width: 450px;
  min-width: 450px;
  padding: 16px;
  background: #ffffff;
}
.right {
  width: calc(100% - 380px);
  flex: 1;
  min-width: 0;
  padding: 16px;
  margin-left: 20px;
  background: #ffffff;
}
.custom-tree-node {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
@@ -520,13 +491,42 @@
  padding-right: 8px;
}
.tree-node-content {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center; /* 垂直居中 */
  align-items: center;
  height: 100%;
  overflow: hidden;
}
.tree-node-content .orange-icon {
  flex-shrink: 0;
}
.tree-node-label {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.orange-icon {
  color: orange;
  font-size: 18px;
  margin-right: 8px; /* 图标与文字之间加点间距 */
}
.product-tree-scroll {
  scrollbar-width: thin;
  scrollbar-color: #c0c4cc #f5f7fa;
}
.product-tree-scroll::-webkit-scrollbar {
  width: 8px;
}
.product-tree-scroll::-webkit-scrollbar-track {
  background: #f5f7fa;
  border-radius: 4px;
}
.product-tree-scroll::-webkit-scrollbar-thumb {
  background: #c0c4cc;
  border-radius: 4px;
}
.product-tree-scroll::-webkit-scrollbar-thumb:hover {
  background: #909399;
}
</style>