wengan01 3 týždňov pred
rodič
commit
89e39174ee

+ 0 - 4
.env.development

@@ -33,7 +33,3 @@ VITE_APP_WEBSOCKET = false
 
 # sse 开关
 VITE_APP_SSE = true
-
-
-
-

+ 2 - 1
src/api/system/physical/tournamentImage/index.ts

@@ -5,7 +5,7 @@ import { TournamentImageVO, TournamentImageForm, TournamentImageQuery } from '@/
 /**
  * 上传赛事图片
  * @param file 图片文件
- * @returns {*} 
+ * @returns {*}
  */
 // TODO: 上传图片到OSS服务器
 export const uploadTournamentImage = (file: File): AxiosPromise<{ url: string }> => {
@@ -102,3 +102,4 @@ export const selectByTypeAndScene = (imageType: string, sceneType: string): Axio
     params: { imageType, sceneType }
   });
 };
+

+ 251 - 56
src/views/system/business/levels/index.vue

@@ -1,4 +1,4 @@
-<template>
++-   <template>
   <div class="p-2">
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
@@ -60,15 +60,35 @@
         </el-row>
       </template>
 
-      <el-table v-loading="loading" border :data="levelsList" @selection-change="handleSelectionChange">
+      <el-table v-loading="loading" :data="levelsList" @selection-change="handleSelectionChange" class="custom-table">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="" align="center" prop="id" v-if="false" />
 <!--        <el-table-column label="所属盲注" align="center" prop="blindStructureId" />-->
-        <el-table-column label="等级" align="center" prop="levelNumber" />
-        <el-table-column label="小盲预置分" align="center" prop="smallBlind" />
-        <el-table-column label="大盲预置分" align="center" prop="bigBlind" />
-        <el-table-column label="前置预置分" align="center" prop="ante" />
-        <el-table-column label="升级时间" align="center" prop="durationMinutes" />
+        <el-table-column label="等级" align="center" width="80">
+          <template #default="scope">
+            <span>{{ scope.row.levelNumber }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="小盲预置分" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.smallBlind" :min="0" size="small" style="width: 100%" />
+          </template>
+        </el-table-column>
+        <el-table-column label="大盲预置分" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.bigBlind" :min="0" size="small" style="width: 100%" />
+          </template>
+        </el-table-column>
+        <el-table-column label="前置预置分" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.ante" :min="0" size="small" style="width: 100%" />
+          </template>
+        </el-table-column>
+        <el-table-column label="升级时间" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.durationMinutes" :min="0" size="small" style="width: 100%" />
+          </template>
+        </el-table-column>
         <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
           <template #default="scope">
             <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
@@ -79,44 +99,39 @@
             <span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <el-table-column label="操作" align="center" width="150">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['business:levels:edit']"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['business:levels:remove']"></el-button>
-            </el-tooltip>
+            <el-button link type="primary" size="small" @click="handleInsertRow(scope.$index)">
+              <el-icon><Grid /></el-icon> 插入
+            </el-button>
+            <el-button link type="danger" size="small" @click="handleDeleteRow(scope.$index)">
+              <el-icon><Delete /></el-icon>
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
 
       <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
     </el-card>
-    <!-- 添加或修改【请填写功能名称】对话框 -->
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body class="custom-dialog">
-      <el-form ref="levelsFormRef" :model="form" :rules="rules" label-width="80px">
-        <!-- 表单内容 -->
-        <el-form-item label="所属盲注" prop="name">
-          <el-input v-model="form.name" disabled />
-        </el-form-item>
+    <!-- 新增/修改对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="levelsFormRef" :model="form" :rules="rules" label-width="100px">
         <el-form-item label="等级" prop="levelNumber">
-          <el-input v-model="form.levelNumber" placeholder="请输入等级" />
+          <el-input v-model="form.levelNumber" placeholder="系统自动生成" disabled />
         </el-form-item>
-        <el-form-item label="小盲" prop="smallBlind">
+        <el-form-item label="小盲预置分" prop="smallBlind">
           <el-input v-model="form.smallBlind" placeholder="请输入小盲预置分" />
         </el-form-item>
-        <el-form-item label="大盲" prop="bigBlind">
+        <el-form-item label="大盲预置分" prop="bigBlind">
           <el-input v-model="form.bigBlind" placeholder="请输入大盲预置分" />
         </el-form-item>
-        <el-form-item label="前置" prop="ante">
+        <el-form-item label="前置预置分" prop="ante">
           <el-input v-model="form.ante" placeholder="请输入前置预置分" />
         </el-form-item>
         <el-form-item label="升级时间" prop="durationMinutes">
           <el-input v-model="form.durationMinutes" placeholder="请输入升级时间" />
         </el-form-item>
       </el-form>
-
       <template #footer>
         <div class="dialog-footer">
           <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
@@ -148,7 +163,6 @@ const props = defineProps({
   }
 });
 
-// 使用统一  获取盲注结构 ID
 // 使用统一 hook 获取盲注结构信息(ID + name)
 const { info } = useBlindStructureInfo(props);
 
@@ -257,8 +271,9 @@ const handleSelectionChange = (selection: LevelsVO[]) => {
 /** 新增按钮操作 */
 const handleAdd = () => {
   reset();
+  form.value.blindStructureId = currentId.value;
   dialog.visible = true;
-  dialog.title = '添加盲注等级';
+  dialog.title = '添加盲注等级';
 };
 
 /** 修改按钮操作 */
@@ -268,7 +283,7 @@ const handleUpdate = async (row?: LevelsVO) => {
   const res = await getLevels(_id);
   Object.assign(form.value, res.data);
   dialog.visible = true;
-  dialog.title = '修改盲注等级';
+  dialog.title = '修改盲注等级';
 };
 
 /** 提交按钮 */
@@ -276,14 +291,24 @@ const submitForm = () => {
   levelsFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
       buttonLoading.value = true;
-      if (form.value.id) {
-        await updateLevels(form.value).finally(() => (buttonLoading.value = false));
-      } else {
-        await addLevels(form.value).finally(() => (buttonLoading.value = false));
+      try {
+        if (form.value.id) {
+          await updateLevels(form.value).finally(() => (buttonLoading.value = false));
+        } else {
+          // 新增时自动生成等级编号
+          const maxLevel = levelsList.value.reduce((max, item) => {
+            const num = Number(item.levelNumber) || 0;
+            return num > max ? num : max;
+          }, 0);
+          form.value.levelNumber = maxLevel + 1;
+          await addLevels(form.value).finally(() => (buttonLoading.value = false));
+        }
+        proxy?.$modal.msgSuccess('操作成功');
+        dialog.visible = false;
+        await getList();
+      } catch (error) {
+        proxy?.$modal.msgError('操作失败');
       }
-      proxy?.$modal.msgSuccess('操作成功');
-      dialog.visible = false;
-      await getList();
     }
   });
 };
@@ -309,6 +334,42 @@ const handleExport = () => {
   );
 };
 
+/** 保存当前行 */
+const handleInsertRow = async (index: number) => {
+  try {
+    buttonLoading.value = true;
+
+    // 保存当前行
+    const currentRow = levelsList.value[index];
+    if (currentRow.id) {
+      // 更新已有数据
+      await updateLevels(currentRow);
+    } else {
+      // 新增数据
+      await addLevels(currentRow);
+    }
+
+    proxy?.$modal.msgSuccess('保存成功');
+    await getList();
+  } catch (error) {
+    proxy?.$modal.msgError('保存失败');
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+
+/** 删除行 */
+const handleDeleteRow = async (index: number) => {
+  const row = levelsList.value[index];
+  if (row.id) {
+    // 已有数据,需要确认删除
+    await proxy?.$modal.confirm('是否确认删除该行数据?');
+    await delLevels(row.id);
+    proxy?.$modal.msgSuccess('删除成功');
+  }
+  levelsList.value.splice(index, 1);
+};
+
 onMounted(() => {
   const id = currentId;
   if (id !== undefined) {
@@ -318,21 +379,6 @@ onMounted(() => {
   getList();
 });
 
-// 监听路由变化
-/*
-watch(
-  () => route.query,
-  (newQuery) => {
-    const id = newQuery.blindStructureId;
-    if (id !== undefined) {
-      data.queryParams.blindStructureId = Number(id);
-    }
-    getList();
-  },
-  { immediate: true, deep: true }
-);
-*/
-
 // 监听 info 变化,更新 currentId 和 currentName
 watch(
   () => info(),
@@ -352,10 +398,159 @@ watch(
   { immediate: true }
 );
 </script>
-<style>
-.custom-dialog .el-dialog__body {
-  max-height: 60vh;
-  overflow-y: auto;
-  padding: 20px;
+
+<style scoped>
+/* 去掉表格竖线,只保留横线 */
+:deep(.custom-table .el-table__inner-wrapper::before) {
+  display: none;
+}
+
+:deep(.custom-table .el-table__row td) {
+  border-right: none;
+  border-left: none;
+}
+
+:deep(.custom-table .el-table__header th) {
+  border-right: none;
+  border-left: none;
+  background-color: transparent;
+  font-weight: 600;
+  color: #606266;
+  font-size: 13px;
+  padding: 12px 0;
+}
+
+:deep(.custom-table .el-table__row) {
+  border-bottom: 1px solid #ebeef5;
+}
+
+:deep(.custom-table .el-table__row:last-child) {
+  border-bottom: none;
+}
+
+/* 表格输入框样式优化 - 无边框设计 */
+:deep(.custom-table .el-input__wrapper) {
+  box-shadow: none;
+  background-color: #f5f7fa;
+  border-radius: 4px;
+  padding: 0 10px;
+  transition: all 0.3s;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+:deep(.custom-table .el-input__wrapper:hover) {
+  background-color: #e8eaf0;
+}
+
+:deep(.custom-table .el-input__wrapper.is-focus) {
+  background-color: #fff;
+  box-shadow: 0 0 0 1px #409eff inset;
+}
+
+:deep(.custom-table .el-input) {
+  width: 100%;
+}
+
+:deep(.custom-table .el-input__inner) {
+  text-align: center !important;
+  font-size: 13px;
+  width: 100%;
+}
+
+/* 数字输入框样式 */
+:deep(.custom-table .el-input-number) {
+  width: 100%;
+}
+
+:deep(.custom-table .el-input-number .el-input__wrapper) {
+  padding: 0 28px 0 10px;
+  justify-content: center;
+}
+
+:deep(.custom-table .el-input-number .el-input__inner) {
+  text-align: center !important;
+}
+
+:deep(.custom-table .el-input-number__decrease),
+:deep(.custom-table .el-input-number__increase) {
+  background-color: transparent;
+  border: none;
+}
+
+/* 操作按钮样式 - 图标按钮 */
+:deep(.custom-table .el-button--small.is-link) {
+  padding: 4px 8px;
+  border-radius: 4px;
+  font-size: 12px;
+  transition: all 0.3s;
+}
+
+:deep(.custom-table .el-button--small.is-link:hover) {
+  transform: scale(1.05);
+}
+
+/* 操作列单元格样式 - 横向排列按钮 */
+:deep(.custom-table .el-table__row td:last-child .cell) {
+  display: flex !important;
+  flex-direction: row !important;
+  align-items: center !important;
+  justify-content: center !important;
+  gap: 6px !important;
+  padding: 4px 0 !important;
+}
+
+:deep(.custom-table .el-table__row td:last-child .cell .el-button) {
+  margin: 0 !important;
+}
+
+/* 插入按钮样式 */
+:deep(.custom-table .el-button--primary.is-link) {
+  background-color: rgba(64, 158, 255, 0.1);
+  color: #409eff;
+}
+
+:deep(.custom-table .el-button--primary.is-link:hover) {
+  background-color: rgba(64, 158, 255, 0.2);
+}
+
+/* 删除按钮样式 */
+:deep(.custom-table .el-button--danger.is-link) {
+  background-color: rgba(245, 108, 108, 0.1);
+  color: #f56c6c;
+}
+
+:deep(.custom-table .el-button--danger.is-link:hover) {
+  background-color: rgba(245, 108, 108, 0.2);
+}
+
+/* 表格行悬停效果 */
+:deep(.custom-table .el-table__row:hover) {
+  background-color: #fafafa;
+}
+
+/* 单元格内边距 */
+:deep(.custom-table .el-table__row td) {
+  padding: 10px 0;
+}
+
+/* 复选框列优化 */
+:deep(.custom-table .el-table-column--selection .cell) {
+  padding-left: 15px;
+}
+
+/* 操作列单元格样式 - 横向排列按钮 */
+:deep(.custom-table .el-table__row td:last-child .cell) {
+  display: flex !important;
+  flex-direction: row !important;
+  align-items: center !important;
+  justify-content: center !important;
+  gap: 6px !important;
+  padding: 4px 0 !important;
+}
+
+:deep(.custom-table .el-table__row td:last-child .cell .el-button) {
+  margin: 0 !important;
 }
 </style>

+ 231 - 0
src/views/system/physical/blindLevels/index.vue

@@ -1,5 +1,78 @@
 <template>
   <div class="p-2">
+    <!-- 预览模式:可编辑表格 -->
+    <template v-if="previewMode">
+      <div class="editable-header">
+        <el-button type="primary" @click="handleAddRow">
+          <el-icon><Plus /></el-icon> 新增级别
+        </el-button>
+        <el-button type="success" @click="handleSaveEditableData">
+          <el-icon><Check /></el-icon> 保存
+        </el-button>
+      </div>
+      <div class="table-header-info">
+        <span class="info-text">内部按顺序自动保存 levelNo;显示级别按非休息级别连续计算。休息级别只使用休息分钟,盲注分钟自动置 0。</span>
+      </div>
+      <el-table :data="editableTableData" border style="width: 100%" class="editable-table">
+        <el-table-column label="显示级别" width="80" align="center">
+          <template #default="scope">
+            <span v-if="!scope.row.isBreak">{{ getDisplayLevel(scope.$index) }}</span>
+            <el-tag v-else type="info" size="small">休息</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="名称" width="150" align="center">
+          <template #default="scope">
+            <el-input v-model="scope.row.remark" placeholder="级别名称(可选)" size="small" />
+          </template>
+        </el-table-column>
+        <el-table-column label="小盲" width="120" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.smallBlind" :min="0" size="small" style="width: 100%" />
+          </template>
+        </el-table-column>
+        <el-table-column label="大盲" width="120" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.bigBlind" :min="0" size="small" style="width: 100%" />
+          </template>
+        </el-table-column>
+        <el-table-column label="前注" width="120" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.ante" :min="0" size="small" style="width: 100%" />
+          </template>
+        </el-table-column>
+        <el-table-column label="盲注分钟" width="120" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.durationMinutes" :min="0" size="small" style="width: 100%" :disabled="scope.row.isBreak" />
+          </template>
+        </el-table-column>
+        <el-table-column label="休息级别" width="120" align="center">
+          <template #default="scope">
+            <el-select v-model="scope.row.isBreak" size="small" style="width: 100%">
+              <el-option label="否" :value="0" />
+              <el-option label="是" :value="1" />
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="休息分钟" width="120" align="center">
+          <template #default="scope">
+            <el-input-number v-model="scope.row.breakDurationMinutes" :min="0" size="small" style="width: 100%" :disabled="!scope.row.isBreak" />
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="150" align="center" fixed="right">
+          <template #default="scope">
+            <el-button link type="primary" size="small" @click="handleInsertRow(scope.$index)">
+              <el-icon><Plus /></el-icon> 插入
+            </el-button>
+            <el-button link type="danger" size="small" @click="handleDeleteRow(scope.$index)">
+              <el-icon><Delete /></el-icon>
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <!-- 普通模式:原有功能 -->
+    <template v-else>
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
@@ -132,6 +205,7 @@
         </div>
       </template>
     </el-dialog>
+    </template>
   </div>
 </template>
 
@@ -164,6 +238,11 @@ const props = defineProps({
     type: String,
     required: false,
     default: ''
+  },
+  previewMode: {
+    type: Boolean,
+    required: false,
+    default: false
   }
 });
 
@@ -348,4 +427,156 @@ watch(
   },
   { immediate: true }
 );
+
+// 可编辑表格相关
+const editableTableData = ref<any[]>([]);
+
+// 监听 previewMode 和 currentId 变化,加载数据到可编辑表格
+watch(
+  [() => props.previewMode, () => currentId.value],
+  async ([newPreviewMode, newCurrentId]) => {
+    console.log('previewMode watch triggered:', newPreviewMode, newCurrentId);
+    if (newPreviewMode && newCurrentId) {
+      // 加载所有数据到可编辑表格
+      const res = await listBlindLevels({
+        pageNum: 1,
+        pageSize: 1000,
+        blindStructureId: newCurrentId
+      });
+
+      editableTableData.value = res.rows.map((item: any) => ({
+        ...item,
+        isBreak: item.isBreak || 0
+      }));
+      console.log('editableTableData loaded:', editableTableData.value.length);
+    }
+  },
+  { immediate: true }
+);
+
+// 计算显示级别
+const getDisplayLevel = (index: number) => {
+  let level = 0;
+  for (let i = 0; i <= index; i++) {
+    if (!editableTableData.value[i].isBreak) {
+      level++;
+    }
+  }
+  return level;
+};
+
+// 新增行
+const handleAddRow = () => {
+  editableTableData.value.push({
+    id: undefined,
+    name: currentName.value,
+    blindStructureId: currentId.value,
+    levelNumber: undefined,
+    smallBlind: 0,
+    bigBlind: 0,
+    ante: 0,
+    durationMinutes: 8,
+    isBreak: 0,
+    breakDurationMinutes: 0,
+    remark: '',
+    displayOrder: editableTableData.value.length + 1
+  });
+};
+
+// 插入行
+const handleInsertRow = (index: number) => {
+  editableTableData.value.splice(index + 1, 0, {
+    id: undefined,
+    name: currentName.value,
+    blindStructureId: currentId.value,
+    levelNumber: undefined,
+    smallBlind: 0,
+    bigBlind: 0,
+    ante: 0,
+    durationMinutes: 8,
+    isBreak: 0,
+    breakDurationMinutes: 0,
+    remark: '',
+    displayOrder: index + 2
+  });
+};
+
+// 删除行
+const handleDeleteRow = (index: number) => {
+  if (editableTableData.value.length <= 1) {
+    proxy?.$modal.msgWarning('至少保留一行数据');
+    return;
+  }
+  editableTableData.value.splice(index, 1);
+};
+
+// 保存可编辑数据
+const handleSaveEditableData = async () => {
+  if (editableTableData.value.length === 0) {
+    proxy?.$modal.msgWarning('数据不能为空');
+    return;
+  }
+
+  try {
+    buttonLoading.value = true;
+
+    // 批量保存数据
+    for (let i = 0; i < editableTableData.value.length; i++) {
+      const row = editableTableData.value[i];
+
+      // 如果是休息级别,盲注分钟自动置0
+      if (row.isBreak) {
+        row.durationMinutes = 0;
+      }
+
+      // 设置 displayOrder
+      row.displayOrder = i + 1;
+
+      if (row.id) {
+        // 更新已有数据
+        await updateBlindLevels(row);
+      } else {
+        // 新增数据
+        await addBlindLevels(row);
+      }
+    }
+
+    proxy?.$modal.msgSuccess('保存成功');
+    await getList();
+  } catch (error) {
+    proxy?.$modal.msgError('保存失败');
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+
+// 暴露方法给父组件
+defineExpose({
+  editableTableData,
+  getList
+});
 </script>
+
+<style scoped>
+.editable-header {
+  display: flex;
+  gap: 10px;
+  margin-bottom: 15px;
+}
+
+.table-header-info {
+  margin-bottom: 15px;
+  padding: 10px;
+  background-color: #f5f7fa;
+  border-radius: 4px;
+}
+
+.info-text {
+  font-size: 13px;
+  color: #606266;
+}
+
+.editable-table {
+  margin-bottom: 15px;
+}
+</style>

+ 689 - 19
src/views/system/physical/blindStructures/index.vue

@@ -130,28 +130,213 @@
     </el-dialog>
 
     <!-- 预览弹窗 -->
-    <el-dialog title="预览" v-model="previewVisible" width="70%" append-to-body>
-      <div style="max-height: 500px; overflow-y: auto">
-        <el-table :data="previewData" border v-if="previewData.length > 0">
-          <!-- 使用动态表头 -->
-          <el-table-column v-for="(header, index) in previewHeaders" :key="index" :label="header">
+    <el-dialog title="盲注等级预览" v-model="previewVisible" width="90%" append-to-body>
+      <el-table :data="previewData" border style="width: 100%">
+        <el-table-column label="显示级别" width="80" align="center">
+          <template #default="scope">
+            <span>{{ scope.$index + 1 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="名称" width="150" align="center">
+          <template #default="scope">
+            <span>{{ scope.row.name }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="小盲" width="120" align="center">
+          <template #default="scope">
+            <span>{{ scope.row.smallBlind }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="大盲" width="120" align="center">
+          <template #default="scope">
+            <span>{{ scope.row.bigBlind }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="前注" width="120" align="center">
+          <template #default="scope">
+            <span>{{ scope.row.ante }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="盲注分钟" width="120" align="center">
+          <template #default="scope">
+            <span>{{ scope.row.durationMinutes }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="休息级别" width="120" align="center">
+          <template #default="scope">
+            <span>{{ scope.row.isBreak ? '是' : '否' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="休息分钟" width="120" align="center">
+          <template #default="scope">
+            <span>{{ scope.row.breakDurationMinutes }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closePreview">关 闭</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <el-dialog v-model="levelsDialogVisible" title="盲注等级列表" width="95%" append-to-body>
+      <!-- 搜索表单 -->
+      <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+        <div v-show="showLevelSearch" class="mb-[10px]">
+          <el-form :inline="true">
+            <el-form-item label="等级">
+              <el-input v-model="levelQueryParams.levelNumber" placeholder="请输入等级" clearable @input="handleLevelQuery" />
+            </el-form-item>
+            <el-form-item label="小盲">
+              <el-input v-model="levelQueryParams.smallBlind" placeholder="请输入小盲" clearable @input="handleLevelQuery" />
+            </el-form-item>
+            <el-form-item label="大盲">
+              <el-input v-model="levelQueryParams.bigBlind" placeholder="请输入大盲" clearable @input="handleLevelQuery" />
+            </el-form-item>
+            <el-form-item label="前注">
+              <el-input v-model="levelQueryParams.ante" placeholder="请输入前注" clearable @input="handleLevelQuery" />
+            </el-form-item>
+            <el-form-item label="盲注分钟">
+              <el-input v-model="levelQueryParams.durationMinutes" placeholder="请输入盲注分钟" clearable @input="handleLevelQuery" />
+            </el-form-item>
+          </el-form>
+        </div>
+      </transition>
+
+      <!-- 操作按钮 -->
+      <el-card shadow="never">
+        <template #header>
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button type="primary" plain icon="Plus" @click="handleAddLevel">新增</el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="success" plain icon="Edit" :disabled="levelSingle" @click="handleUpdateLevel">修改</el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="danger" plain icon="Delete" :disabled="levelMultiple" @click="handleDeleteLevel">删除</el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="warning" plain icon="Download" @click="handleExportLevel">导出</el-button>
+            </el-col>
+            <el-col :span="18" style="text-align: right;">
+              <el-tooltip content="显示搜索" placement="top">
+                <el-button circle icon="Search" @click="showLevelSearch = !showLevelSearch" />
+              </el-tooltip>
+              <el-tooltip content="刷新" placement="top">
+                <el-button circle icon="Refresh" @click="handleRefreshLevel" />
+              </el-tooltip>
+            </el-col>
+          </el-row>
+        </template>
+
+        <!-- 可编辑表格 -->
+        <el-table :data="levelEditableData" style="width: 100%" v-loading="loading" class="custom-table" @selection-change="handleLevelSelectionChange">
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="显示级别" align="center">
+            <template #default="scope">
+              <span v-if="!scope.row.isBreak">{{ (levelQueryParams.pageNum - 1) * levelQueryParams.pageSize + scope.$index + 1 }}</span>
+              <el-tag v-else type="info" size="small">休息</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="名称" align="center">
+            <template #default="scope">
+              <el-input v-model="scope.row.remark" placeholder="级别名称(可选)" size="small" />
+            </template>
+          </el-table-column>
+          <el-table-column label="小盲" align="center">
+            <template #default="scope">
+              <el-input-number v-model="scope.row.smallBlind" :min="0" size="small" style="width: 100%" />
+            </template>
+          </el-table-column>
+          <el-table-column label="大盲" align="center">
+            <template #default="scope">
+              <el-input-number v-model="scope.row.bigBlind" :min="0" size="small" style="width: 100%" />
+            </template>
+          </el-table-column>
+          <el-table-column label="前注" align="center">
+            <template #default="scope">
+              <el-input-number v-model="scope.row.ante" :min="0" size="small" style="width: 100%" />
+            </template>
+          </el-table-column>
+          <el-table-column label="盲注分钟" align="center">
+            <template #default="scope">
+              <el-input-number v-model="scope.row.durationMinutes" :min="0" size="small" style="width: 100%" />
+            </template>
+          </el-table-column>
+          <el-table-column label="休息级别" align="center">
+            <template #default="scope">
+              <el-select v-model="scope.row.isBreak" size="small" style="width: 100%">
+                <el-option label="否" :value="0" />
+                <el-option label="是" :value="1" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="休息分钟" align="center">
+            <template #default="scope">
+              <el-input-number v-model="scope.row.breakDurationMinutes" :min="0" size="small" style="width: 100%" />
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="150">
             <template #default="scope">
-              {{ scope.row[index] }}
+              <div class="operation-buttons">
+                <el-button link type="primary" size="small" @click="handleInsertLevelRow(scope.$index)">
+                  <el-icon><Grid /></el-icon> 插入
+                </el-button>
+                <el-button link type="danger" size="small" @click="handleDeleteLevelRow(scope.$index)">
+                  <el-icon><Delete /></el-icon>
+                </el-button>
+              </div>
             </template>
           </el-table-column>
         </el-table>
-        <p v-else>暂无数据可预览</p>
-      </div>
+
+        <!-- 分页 -->
+        <pagination v-show="levelTotal > 0" :total="levelTotal" v-model:page="levelQueryParams.pageNum" v-model:limit="levelQueryParams.pageSize" @pagination="handleLevelPagination" />
+      </el-card>
+
       <template #footer>
         <div class="dialog-footer">
-          <el-button @click="closePreview">关 闭</el-button>
+          <el-button @click="levelsDialogVisible = false">关 闭</el-button>
         </div>
       </template>
     </el-dialog>
 
-    <el-dialog v-model="levelsDialogVisible" title="盲注等级列表" width="80%">
-      <!-- 使用 component 动态加载目标组件 -->
-      <levels-index :blind-structure-id="dialogParams.blindStructureId" :name="dialogParams.name" />
+    <!-- 盲注等级编辑弹窗 -->
+    <el-dialog v-model="levelEditDialogVisible" :title="levelEditForm.id ? '修改盲注等级' : '新增盲注等级'" width="500px" append-to-body>
+      <el-form ref="levelEditFormRef" :model="levelEditForm" label-width="100px">
+        <el-form-item label="名称">
+          <el-input v-model="levelEditForm.remark" placeholder="级别名称(可选)" />
+        </el-form-item>
+        <el-form-item label="小盲">
+          <el-input-number v-model="levelEditForm.smallBlind" :min="0" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="大盲">
+          <el-input-number v-model="levelEditForm.bigBlind" :min="0" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="前注">
+          <el-input-number v-model="levelEditForm.ante" :min="0" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="盲注分钟">
+          <el-input-number v-model="levelEditForm.durationMinutes" :min="0" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="休息级别">
+          <el-select v-model="levelEditForm.isBreak" style="width: 100%">
+            <el-option label="否" :value="0" />
+            <el-option label="是" :value="1" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="休息分钟">
+          <el-input-number v-model="levelEditForm.breakDurationMinutes" :min="0" style="width: 100%" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="levelEditDialogVisible = false">取 消</el-button>
+          <el-button type="primary" @click="submitLevelEditForm">确 定</el-button>
+        </div>
+      </template>
     </el-dialog>
   </div>
 </template>
@@ -165,9 +350,9 @@ import {
   updateBlindStructures,
   downloadImportTemplate
 } from '@/api/system/physical/blindStructures';
+import { listBlindLevels, addBlindLevels, updateBlindLevels } from '@/api/system/physical/blindLevels';
 import { BlindStructuresVO, BlindStructuresQuery, BlindStructuresForm } from '@/api/system/physical/blindStructures/types';
 import * as XLSX from 'xlsx';
-import LevelsIndex from '@/views/system/physical/blindLevels/index.vue';
 
 // ✅ 引入 parseTime
 import { parseTime } from '@/utils/dateUtils';
@@ -184,6 +369,35 @@ const total = ref(0);
 // 控制 Dialog 是否显示
 const levelsDialogVisible = ref(false);
 
+// 盲注等级可编辑表格数据
+const levelEditableData = ref<any[]>([]);
+
+// 盲注等级查询参数
+const levelQueryParams = ref({
+  pageNum: 1,
+  pageSize: 10,
+  blindStructureId: null,
+  levelNumber: undefined,
+  smallBlind: undefined,
+  bigBlind: undefined,
+  ante: undefined,
+  durationMinutes: undefined
+});
+
+// 盲注等级分页总数
+const levelTotal = ref(0);
+
+// 盲注等级选中状态
+const levelIds = ref<Array<string | number>>([]);
+const levelSingle = ref(true);
+const levelMultiple = ref(true);
+const showLevelSearch = ref(true);
+
+// 盲注等级编辑弹窗
+const levelEditDialogVisible = ref(false);
+const levelEditForm = ref<any>({});
+const levelEditFormRef = ref<ElFormInstance>();
+
 // 传递给子组件的参数
 const dialogParams = ref({
   blindStructureId: null,
@@ -411,9 +625,10 @@ const handleFileRemove = (file) => {
 
 // 预览数据
 const previewData = ref<any[]>([]);
-const previewHeaders = ref<string[]>([]); // 新增表头数组
-const previewVisible = ref(false); // 控制预览弹窗
-//  打开预览弹窗并解析文件
+const previewHeaders = ref<string[]>([]);
+const previewVisible = ref(false);
+
+// 打开预览弹窗并解析文件
 const openPreview = () => {
   if (fileList.value.length === 0) {
     return;
@@ -435,7 +650,7 @@ const openPreview = () => {
 
     // 获取表头(第二行)
     const headerRow = XLSX.utils.decode_range(worksheet['!ref']).e.r + 1;
-    const headerRange = `A2:E2`; // 假设最多5列
+    const headerRange = `A2:E2`;
     const headerCells = XLSX.utils.decode_range(headerRange);
     previewHeaders.value = [];
     for (let C = headerCells.s.c; C <= headerCells.e.c; ++C) {
@@ -447,8 +662,9 @@ const openPreview = () => {
     }
 
     // 获取数据(第三行开始)
-    const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, range: 1 }); // 从第3行开始读取
+    const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, range: 1 });
     previewData.value = jsonData;
+
     previewVisible.value = true;
   };
   reader.readAsArrayBuffer(file);
@@ -469,9 +685,463 @@ const formatBlindLevel = (blindLevels) => {
   const ante = firstLevel.ante ?? 0;
   return `${smallBlind}/${bigBlind} ${ante}`;
 };
-const handleViewLevels = (row) => {
+const handleViewLevels = async (row) => {
+  console.log('=== handleViewLevels 被调用 ===');
+  console.log('row:', row);
+
   dialogParams.value.blindStructureId = row.id;
   dialogParams.value.name = row.name;
+
+  console.log('dialogParams:', dialogParams.value);
+
+  // 重置查询参数
+  levelQueryParams.value = {
+    pageNum: 1,
+    pageSize: 10,
+    blindStructureId: row.id,
+    levelNumber: undefined,
+    smallBlind: undefined,
+    bigBlind: undefined,
+    ante: undefined,
+    durationMinutes: undefined
+  };
+
+  // 加载盲注等级数据
+  await getLevelList();
+
   levelsDialogVisible.value = true;
+  console.log('levelsDialogVisible 已设置为 true');
+  console.log('=== handleViewLevels 执行完毕 ===');
+};
+
+// 计算显示级别
+const getLevelDisplayLevel = (index: number) => {
+  // 计算当前行之前的非休息级别数量(当前页内)
+  let currentPageNonBreakCount = 0;
+  for (let i = 0; i < index; i++) {
+    if (!levelEditableData.value[i].isBreak) {
+      currentPageNonBreakCount++;
+    }
+  }
+
+  // 基础级别 = (页码-1) * 每页条数 + 当前页内的非休息级别计数
+  const baseLevel = (levelQueryParams.value.pageNum - 1) * levelQueryParams.value.pageSize + currentPageNonBreakCount;
+
+  // 如果当前行不是休息级别,则加1
+  return levelEditableData.value[index].isBreak ? 0 : baseLevel + 1;
+};
+
+/** 保存当前行(插入按钮) */
+const handleInsertLevelRow = async (index: number) => {
+  try {
+    loading.value = true;
+    const currentRow = levelEditableData.value[index];
+
+    // 确保 blindStructureId 存在
+    if (!currentRow.blindStructureId) {
+      currentRow.blindStructureId = dialogParams.value.blindStructureId;
+    }
+
+    if (currentRow.id) {
+      // 更新已有数据
+      await updateBlindLevels(currentRow);
+      proxy?.$modal.msgSuccess('保存成功');
+    } else {
+      // 新增数据
+      await addBlindLevels(currentRow);
+      proxy?.$modal.msgSuccess('新增成功');
+    }
+
+    // 刷新数据
+    const res = await listBlindLevels({
+      pageNum: 1,
+      pageSize: 1000,
+      blindStructureId: dialogParams.value.blindStructureId
+    });
+    levelEditableData.value = res.rows.map((item: any) => ({
+      ...item,
+      isBreak: item.isBreak || 0
+    }));
+  } catch (error) {
+    console.error('保存失败:', error);
+    proxy?.$modal.msgError('保存失败');
+  } finally {
+    loading.value = false;
+  }
+};
+
+/** 删除行 */
+const handleDeleteLevelRow = async (index: number) => {
+  const row = levelEditableData.value[index];
+  if (row.id) {
+    // 已有数据,需要确认删除
+    await proxy?.$modal.confirm('是否确认删除该行数据?');
+    const { delBlindLevels } = await import('@/api/system/physical/blindLevels');
+    await delBlindLevels(row.id);
+    proxy?.$modal.msgSuccess('删除成功');
+  }
+  levelEditableData.value.splice(index, 1);
+};
+
+/** 获取盲注等级列表 */
+const getLevelList = async () => {
+  loading.value = true;
+  try {
+    const params: any = {
+      pageNum: levelQueryParams.value.pageNum,
+      pageSize: levelQueryParams.value.pageSize,
+      blindStructureId: dialogParams.value.blindStructureId
+    };
+
+    // 添加搜索条件(只添加有值的条件)
+    if (levelQueryParams.value.levelNumber !== undefined && levelQueryParams.value.levelNumber !== '') {
+      params.levelNumber = levelQueryParams.value.levelNumber;
+    }
+    if (levelQueryParams.value.smallBlind !== undefined && levelQueryParams.value.smallBlind !== '') {
+      params.smallBlind = levelQueryParams.value.smallBlind;
+    }
+    if (levelQueryParams.value.bigBlind !== undefined && levelQueryParams.value.bigBlind !== '') {
+      params.bigBlind = levelQueryParams.value.bigBlind;
+    }
+    if (levelQueryParams.value.ante !== undefined && levelQueryParams.value.ante !== '') {
+      params.ante = levelQueryParams.value.ante;
+    }
+    if (levelQueryParams.value.durationMinutes !== undefined && levelQueryParams.value.durationMinutes !== '') {
+      params.durationMinutes = levelQueryParams.value.durationMinutes;
+    }
+
+    console.log('=== 盲注等级列表请求参数 ===');
+    console.log('params:', params);
+
+    const res = await listBlindLevels(params);
+    console.log('API返回数据:', res);
+    console.log('res.rows:', res.rows);
+    console.log('res.total:', res.total);
+
+    const rows = res.rows || [];
+    levelEditableData.value = rows.map((item: any) => ({
+      ...item,
+      isBreak: item.isBreak || 0
+    }));
+    levelTotal.value = res.total || 0;
+
+    console.log('levelEditableData长度:', levelEditableData.value.length);
+    console.log('levelTotal:', levelTotal.value);
+  } catch (error) {
+    console.error('加载数据失败:', error);
+    proxy?.$modal.msgError('加载数据失败');
+  } finally {
+    loading.value = false;
+  }
+};
+
+/** 盲注等级搜索 */
+const handleLevelQuery = () => {
+  levelQueryParams.value.pageNum = 1;
+  getLevelList();
+};
+
+/** 盲注等级分页 */
+const handleLevelPagination = (data: { page: number; limit: number }) => {
+  levelQueryParams.value.pageNum = data.page;
+  levelQueryParams.value.pageSize = data.limit;
+  getLevelList();
+};
+
+/** 盲注等级重置搜索 */
+const resetLevelQuery = () => {
+  levelQueryParams.value = {
+    pageNum: 1,
+    pageSize: 10,
+    blindStructureId: dialogParams.value.blindStructureId,
+    levelNumber: undefined,
+    smallBlind: undefined,
+    bigBlind: undefined,
+    ante: undefined,
+    durationMinutes: undefined
+  };
+  getLevelList();
+};
+
+/** 刷新按钮:仅刷新表格,不清空搜索条件 */
+const handleRefreshLevel = () => {
+  getLevelList();
+};
+
+/** 盲注等级多选 */
+const handleLevelSelectionChange = (selection: any[]) => {
+  levelIds.value = selection.map((item) => item.id);
+  levelSingle.value = selection.length != 1;
+  levelMultiple.value = !selection.length;
+};
+
+/** 新增盲注等级 */
+const handleAddLevel = () => {
+  levelEditForm.value = {
+    id: undefined,
+    blindStructureId: dialogParams.value.blindStructureId,
+    levelNumber: undefined,
+    smallBlind: undefined,
+    bigBlind: undefined,
+    ante: undefined,
+    durationMinutes: undefined,
+    isBreak: 0,
+    breakDurationMinutes: undefined,
+    remark: ''
+  };
+  levelEditDialogVisible.value = true;
+};
+
+/** 修改盲注等级 */
+const handleUpdateLevel = async () => {
+  if (levelIds.value.length === 0) {
+    proxy?.$modal.msgWarning('请选择要修改的数据');
+    return;
+  }
+
+  // 获取选中的数据
+  const selectedRow = levelEditableData.value.find((item) => item.id === levelIds.value[0]);
+  if (!selectedRow) {
+    proxy?.$modal.msgWarning('未找到选中的数据');
+    return;
+  }
+
+  // 打开编辑弹窗
+  levelEditDialogVisible.value = true;
+  levelEditForm.value = { ...selectedRow };
+};
+
+/** 提交盲注等级编辑表单 */
+const submitLevelEditForm = async () => {
+  try {
+    loading.value = true;
+    if (levelEditForm.value.id) {
+      await updateBlindLevels(levelEditForm.value);
+      proxy?.$modal.msgSuccess('修改成功');
+    } else {
+      await addBlindLevels(levelEditForm.value);
+      proxy?.$modal.msgSuccess('新增成功');
+    }
+    levelEditDialogVisible.value = false;
+    await getLevelList();
+  } catch (error) {
+    console.error('操作失败:', error);
+    proxy?.$modal.msgError('操作失败');
+  } finally {
+    loading.value = false;
+  }
+};
+
+/** 删除盲注等级 */
+const handleDeleteLevel = async () => {
+  if (levelIds.value.length === 0) {
+    proxy?.$modal.msgWarning('请选择要删除的数据');
+    return;
+  }
+  await proxy?.$modal.confirm('是否确认删除选中的数据项?');
+  const { delBlindLevels } = await import('@/api/system/physical/blindLevels');
+  await delBlindLevels(levelIds.value);
+  proxy?.$modal.msgSuccess('删除成功');
+  getLevelList();
+};
+
+/** 导出盲注等级 */
+const handleExportLevel = () => {
+  proxy?.download(
+    'physical/blindLevels/export',
+    {
+      ...levelQueryParams.value,
+      blindStructureId: dialogParams.value.blindStructureId
+    },
+    `盲注等级${parseTime(new Date(), '{y}{m}{d}{h}{i}{s}')}.xlsx`
+  );
 };
 </script>
+
+<style scoped>
+.editable-table-container {
+  padding: 10px;
+}
+
+.table-header-info {
+  margin-bottom: 15px;
+  padding: 10px;
+  background-color: #f5f7fa;
+  border-radius: 4px;
+}
+
+.info-text {
+  font-size: 13px;
+  color: #606266;
+}
+
+.editable-table {
+  margin-bottom: 15px;
+}
+
+.table-footer-actions {
+  display: flex;
+  justify-content: center;
+  gap: 15px;
+  margin-top: 15px;
+}
+
+/* 去掉表格竖线,只保留横线 */
+:deep(.custom-table .el-table__inner-wrapper::before) {
+  display: none;
+}
+
+:deep(.custom-table .el-table__row td) {
+  border-right: none;
+  border-left: none;
+}
+
+:deep(.custom-table .el-table__header th) {
+  border-right: none;
+  border-left: none;
+  background-color: transparent;
+  font-weight: 600;
+  color: #606266;
+  font-size: 13px;
+  padding: 12px 0;
+}
+
+:deep(.custom-table .el-table__row) {
+  border-bottom: 1px solid #ebeef5;
+}
+
+:deep(.custom-table .el-table__row:last-child) {
+  border-bottom: none;
+}
+
+/* 表格输入框样式优化 - 无边框设计 */
+:deep(.custom-table .el-input__wrapper) {
+  box-shadow: none;
+  background-color: #f5f7fa;
+  border-radius: 4px;
+  padding: 0 10px;
+  transition: all 0.3s;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+:deep(.custom-table .el-input__wrapper:hover) {
+  background-color: #e8eaf0;
+}
+
+:deep(.custom-table .el-input__wrapper.is-focus) {
+  background-color: #fff;
+  box-shadow: 0 0 0 1px #409eff inset;
+}
+
+:deep(.custom-table .el-input) {
+  width: 100%;
+}
+
+:deep(.custom-table .el-input__inner) {
+  text-align: center !important;
+  font-size: 13px;
+  width: 100%;
+}
+
+/* 数字输入框样式 */
+:deep(.custom-table .el-input-number) {
+  width: 100%;
+}
+
+:deep(.custom-table .el-input-number .el-input__wrapper) {
+  padding: 0 28px 0 10px;
+  justify-content: center;
+}
+
+:deep(.custom-table .el-input-number .el-input__inner) {
+  text-align: center !important;
+}
+
+:deep(.custom-table .el-input-number__decrease),
+:deep(.custom-table .el-input-number__increase) {
+  background-color: transparent;
+  border: none;
+}
+
+/* 下拉框样式 */
+:deep(.custom-table .el-select .el-input__wrapper) {
+  box-shadow: none;
+  background-color: #f5f7fa;
+  border-radius: 4px;
+  padding: 0 10px;
+}
+
+:deep(.custom-table .el-select .el-input__wrapper:hover) {
+  background-color: #e8eaf0;
+}
+
+:deep(.custom-table .el-select .el-input__wrapper.is-focus) {
+  background-color: #fff;
+  box-shadow: 0 0 0 1px #409eff inset;
+}
+
+/* 操作按钮样式 - 图标按钮 */
+:deep(.custom-table .el-button--small.is-link) {
+  padding: 6px 10px;
+  border-radius: 6px;
+  font-size: 12px;
+  display: inline-flex;
+  align-items: center;
+  gap: 4px;
+  transition: all 0.3s;
+}
+
+:deep(.custom-table .el-button--small.is-link:hover) {
+  transform: scale(1.05);
+}
+
+/* 插入按钮样式 */
+:deep(.custom-table .el-button--primary.is-link) {
+  background-color: rgba(64, 158, 255, 0.1);
+  color: #409eff;
+}
+
+:deep(.custom-table .el-button--primary.is-link:hover) {
+  background-color: rgba(64, 158, 255, 0.2);
+}
+
+/* 删除按钮样式 */
+:deep(.custom-table .el-button--danger.is-link) {
+  background-color: rgba(245, 108, 108, 0.1);
+  color: #f56c6c;
+}
+
+:deep(.custom-table .el-button--danger.is-link:hover) {
+  background-color: rgba(245, 108, 108, 0.2);
+}
+
+/* 表格行悬停效果 */
+:deep(.custom-table .el-table__row:hover) {
+  background-color: #fafafa;
+}
+
+/* 单元格内边距 */
+:deep(.custom-table .el-table__row td) {
+  padding: 10px 0;
+}
+
+/* 复选框列优化 */
+:deep(.custom-table .el-table-column--selection .cell) {
+  padding-left: 15px;
+}
+
+/* 操作按钮容器 - 横向排列 */
+:deep(.operation-buttons) {
+  display: flex !important;
+  flex-direction: row !important;
+  align-items: center !important;
+  justify-content: center !important;
+  gap: 8px !important;
+}
+
+:deep(.operation-buttons .el-button) {
+  margin: 0 !important;
+}
+</style>