fix(F006): UI 审计 P0+P1 修复(--primary 别名/dialog 4 档/3 列表 TableActions)

- P0-1: themes.scss 给 4 套主题加 --primary/--primary-soft 别名指向 --brand/--brand-soft,
       修复 EnterpriseListView 行业龙头标签暗色下白块(P0 必修)
- P0-2: 38 处 el-dialog 宽度收敛到 4 档标准 (500/640/800/960), 补 2 处 width=600 缺 px
- P1-3: 拼团/秒杀/品牌 3 个列表页操作列改 TableActions (统一 详情/停用/删除 单行),
       删除 PageHeader slot 内重复的批量删除浮按钮
- 验证: 浏览器亮/暗双主题截图 P0 修复 + 拼团页操作列规范
This commit is contained in:
zou 2026-08-21 22:58:40 +08:00
parent 83f80fd96c
commit f8b7e72e82
19 changed files with 61 additions and 45 deletions

View File

@ -131,7 +131,7 @@ onMounted(load)
</div>
<!-- 预览弹窗 -->
<el-dialog v-model="previewVisible" title="反馈内容" width="700px">
<el-dialog v-model="previewVisible" title="反馈内容" width="800px">
<el-form label-width="100px" v-if="previewData">
<el-form-item label="用户昵称">
<el-input :model-value="previewData.nickName" readonly />

View File

@ -134,7 +134,7 @@ onMounted(load)
</div>
<!-- 增改弹窗 -->
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增帮助' : '修改帮助'" width="560px">
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增帮助' : '修改帮助'" width="640px">
<el-form label-width="80px">
<el-form-item label="标题" required>
<el-input v-model="editForm.title" placeholder="请输入标题" maxlength="50" show-word-limit />

View File

@ -161,7 +161,7 @@ onMounted(load)
</DataTable>
</div>
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增轮播' : '修改轮播'" width="560px">
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增轮播' : '修改轮播'" width="640px">
<el-form label-width="100px">
<el-form-item label="标题" required>
<el-input v-model="editForm.title" placeholder="请输入标题" maxlength="30" show-word-limit />

View File

@ -383,7 +383,7 @@ onMounted(() => { load(); loadCustomers() })
</el-dialog>
<!-- 撤销确认弹窗(主题色:info 蓝色 + primary 按钮,因为撤销可恢复) -->
<el-dialog v-model="revokeVisible" title="撤销 APIKey" width="480px">
<el-dialog v-model="revokeVisible" title="撤销 APIKey" width="500px">
<el-alert v-if="revokeTarget" type="info" :closable="false" style="margin-bottom: 16px">
<p>应用: <code class="rr-code-accent">{{ revokeTarget.appId }}</code> ({{ revokeTarget.appName }})</p>
<p style="margin-top: 8px;">撤销后 app 将无法继续调用,需要重新申请。</p>
@ -400,7 +400,7 @@ onMounted(() => { load(); loadCustomers() })
</el-dialog>
<!-- 删除确认弹窗(物理删除不可逆,保留红色 danger) -->
<el-dialog v-model="deleteVisible" title="物理删除 app" width="480px">
<el-dialog v-model="deleteVisible" title="物理删除 app" width="500px">
<el-alert type="error" :closable="false" style="margin-bottom: 16px">
<p>仅能删除已撤销(status=2)的 app</p>
<p>物理删除后无法恢复</p>
@ -413,7 +413,7 @@ onMounted(() => { load(); loadCustomers() })
</el-dialog>
<!-- 重置密钥弹窗 (生成新 appSecret,旧密钥立即作废) -->
<el-dialog v-model="resetSecretVisible" title="重置 AppSecret" width="560px">
<el-dialog v-model="resetSecretVisible" title="重置 AppSecret" width="640px">
<el-alert v-if="!newSecret" type="warning" :closable="false" style="margin-bottom: 16px">
<p>重置后,系统会生成新的 appSecret 并更新数据库 BCrypt 哈希</p>
<p>旧密钥立即作废,Mac 平台助手必须同步更新配置</p>

View File

@ -142,7 +142,7 @@ onMounted(load)
</DataTable>
</div>
<el-dialog v-model="editVisible" title="新增单位" width="400px">
<el-dialog v-model="editVisible" title="新增单位" width="500px">
<el-form label-width="80px">
<el-form-item label="名称" required><el-input v-model="editForm.name" placeholder="如: 吨" /></el-form-item>
</el-form>

View File

@ -16,6 +16,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import { httpGet, httpPost } from '@/utils/request'
import PageHeader from '@/components/PageHeader/PageHeader.vue'
import SearchBar from '@/components/SearchBar/SearchBar.vue'
import TableActions from '@/components/TableActions/TableActions.vue'
interface Groupbuy {
id: string
@ -102,9 +103,7 @@ onMounted(load)
<template>
<div class="rr-page">
<PageHeader title="拼团活动" :sub="`拼团/团购活动管理 (共 ${total} 个)`">
<el-button type="danger" :disabled="selection.length === 0" @click="onBatchDelete">批量删除 ({{ selection.length }})</el-button>
</PageHeader>
<PageHeader title="拼团活动" :sub="`拼团/团购活动管理 (共 ${total} 个)`" />
<SearchBar
v-model:filters="filters"
@ -135,11 +134,16 @@ onMounted(load)
</template>
</el-table-column>
<el-table-column prop="createDate" label="创建时间" width="165" />
<el-table-column label="操作" width="170" align="center" fixed="right">
<el-table-column label="操作" width="180" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" size="small" text @click="onView(row)">详情</el-button>
<el-button :type="row.status === 1 ? 'warning' : 'success'" size="small" text @click="onToggleStatus(row)">{{ row.status === 1 ? '停用' : '启用' }}</el-button>
<el-button type="danger" size="small" text @click="onDelete(row)">删除</el-button>
<TableActions
:row="row"
:actions="[
{ label: '详情', type: 'primary', onClick: onView },
{ label: row.status === 1 ? '停用' : '启用', type: row.status === 1 ? 'warning' : 'success', onClick: onToggleStatus },
{ label: '删除', type: 'danger', divided: true, onClick: onDelete }
]"
/>
</template>
</el-table-column>
</el-table>

View File

@ -214,7 +214,7 @@ onMounted(load)
</div>
<!-- 新增/编辑弹窗 -->
<el-dialog v-model="dialogVisible" :title="form.id ? '编辑变量' : '新增变量'" width="520px" destroy-on-close>
<el-dialog v-model="dialogVisible" :title="form.id ? '编辑变量' : '新增变量'" width="500px" destroy-on-close>
<el-form label-width="90px" label-position="left">
<el-form-item label="变量标识" required>
<el-input v-model="form.varKey" placeholder="如 copper_price (英文/下划线, 唯一)" :disabled="!!form.id" />

View File

@ -16,6 +16,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import { httpGet, httpPost } from '@/utils/request'
import PageHeader from '@/components/PageHeader/PageHeader.vue'
import SearchBar from '@/components/SearchBar/SearchBar.vue'
import TableActions from '@/components/TableActions/TableActions.vue'
interface Seckill {
id: string
@ -103,9 +104,7 @@ onMounted(load)
<template>
<div class="rr-page">
<PageHeader title="秒杀活动" :sub="`限时秒杀活动管理 (共 ${total} 个)`">
<el-button type="danger" :disabled="selection.length === 0" @click="onBatchDelete">批量删除 ({{ selection.length }})</el-button>
</PageHeader>
<PageHeader title="秒杀活动" :sub="`限时秒杀活动管理 (共 ${total} 个)`" />
<SearchBar
v-model:filters="filters"
@ -136,11 +135,16 @@ onMounted(load)
</template>
</el-table-column>
<el-table-column prop="createDate" label="创建时间" width="165" />
<el-table-column label="操作" width="170" align="center" fixed="right">
<el-table-column label="操作" width="180" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" size="small" text @click="onView(row)">详情</el-button>
<el-button :type="row.status === 0 ? 'warning' : 'success'" size="small" text @click="onToggleStatus(row)">{{ row.status === 0 ? '停用' : '启用' }}</el-button>
<el-button type="danger" size="small" text @click="onDelete(row)">删除</el-button>
<TableActions
:row="row"
:actions="[
{ label: '详情', type: 'primary', onClick: onView },
{ label: row.status === 0 ? '停用' : '启用', type: row.status === 0 ? 'warning' : 'success', onClick: onToggleStatus },
{ label: '删除', type: 'danger', divided: true, onClick: onDelete }
]"
/>
</template>
</el-table-column>
</el-table>

View File

@ -19,6 +19,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import { httpGet, httpPost } from '@/utils/request'
import PageHeader from '@/components/PageHeader/PageHeader.vue'
import SearchBar from '@/components/SearchBar/SearchBar.vue'
import TableActions from '@/components/TableActions/TableActions.vue'
interface Brand {
id: string
@ -173,9 +174,7 @@ onMounted(load)
<template>
<div class="rr-page">
<PageHeader title="品牌管理" :sub="`供应商品牌审核与授权管理 (共 ${total} 个)`">
<el-button type="danger" :disabled="selection.length === 0" @click="onBatchDelete">批量删除 ({{ selection.length }})</el-button>
</PageHeader>
<PageHeader title="品牌管理" :sub="`供应商品牌审核与授权管理 (共 ${total} 个)`" />
<SearchBar
v-model:filters="filters"
@ -218,13 +217,14 @@ onMounted(load)
<el-table-column prop="createDate" label="申请时间" header-align="center" align="center" width="170" show-overflow-tooltip />
<el-table-column label="操作" fixed="right" header-align="center" align="center" width="200">
<template #default="{ row }">
<span class="rr-actions">
<el-link v-if="row.sourceType === 1" type="primary" :underline="false" @click="onViewAuth(row)">查看授权</el-link>
<span v-if="row.sourceType === 1" class="rr-actions__sep">|</span>
<el-link v-if="row.status === 1" type="warning" :underline="false" @click="onAudit(row)">审核</el-link>
<span v-if="row.status === 1" class="rr-actions__sep">|</span>
<el-link type="danger" :underline="false" @click="onDelete(row)">删除</el-link>
</span>
<TableActions
:row="row"
:actions="[
{ label: '查看授权', type: 'primary', when: (r: any) => r.sourceType === 1, onClick: onViewAuth },
{ label: '审核', type: 'warning', when: (r: any) => r.status === 1, onClick: onAudit },
{ label: '删除', type: 'danger', divided: true, onClick: onDelete }
]"
/>
</template>
</el-table-column>
</el-table>
@ -241,7 +241,7 @@ onMounted(load)
</div>
</div>
<el-dialog v-model="auditVisible" title="品牌审核" width="480px" :close-on-click-modal="false">
<el-dialog v-model="auditVisible" title="品牌审核" width="500px" :close-on-click-modal="false">
<el-form label-width="80px">
<el-form-item label="审核结果">
<el-radio-group v-model="auditForm.status">

View File

@ -164,7 +164,7 @@ onMounted(load)
</el-dialog>
<!-- 增改弹窗 -->
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增常量' : '修改常量'" width="600px">
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增常量' : '修改常量'" width="640px">
<el-form label-width="100px">
<el-form-item label="编码" required>
<el-input v-model="editForm.code" placeholder="如 system.title" :disabled="editMode === 'edit'" />

View File

@ -164,7 +164,7 @@ onMounted(() => { load() })
</DataTable>
</div>
<el-dialog v-model="detailVisible" title="活动详情" width="600" :style="{ borderRadius: '12px', overflow: 'hidden' }" align-center destroy-on-close>
<el-dialog v-model="detailVisible" title="活动详情" width="640px" :style="{ borderRadius: '12px', overflow: 'hidden' }" align-center destroy-on-close>
<template v-if="detailRow">
<el-descriptions :column="2" border size="default">
<el-descriptions-item label="活动名称" :span="2">{{ detailRow.activityName }}</el-descriptions-item>

View File

@ -216,7 +216,7 @@ onMounted(load)
</div>
</div>
<el-dialog v-model="recordVisible" title="优惠券领取记录" width="720px" :close-on-click-modal="false">
<el-dialog v-model="recordVisible" title="优惠券领取记录" width="800px" :close-on-click-modal="false">
<el-table v-loading="recordLoading" :data="recordList" border style="width: 100%" empty-text="暂无人领取">
<el-table-column prop="userName" label="领取人" align="center" />
<el-table-column label="状态" align="center">
@ -233,7 +233,7 @@ onMounted(load)
</template>
</el-dialog>
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增优惠券' : '编辑优惠券'" width="520px">
<el-dialog v-model="editVisible" :title="editMode === 'add' ? '新增优惠券' : '编辑优惠券'" width="500px">
<el-form label-width="100px">
<el-form-item label="券名称" required><el-input v-model="editForm.name" placeholder="如: 满100减20" /></el-form-item>
<el-form-item label="类型">

View File

@ -472,7 +472,7 @@ onMounted(() => Promise.all([load(), loadStats(), loadCounts()]))
</div>
<!-- 详情弹窗 (含 SKU 列表, 沿用老 vue 弹窗布局) -->
<el-dialog v-model="detailVisible" title="商品详情" width="900px" :close-on-click-modal="false">
<el-dialog v-model="detailVisible" title="商品详情" width="960px" :close-on-click-modal="false">
<div v-if="detailData">
<el-descriptions :column="2" border>
<el-descriptions-item label="商品ID">{{ detailData.supplierGoodId }}</el-descriptions-item>

View File

@ -328,7 +328,7 @@ onMounted(() => Promise.all([load(), loadStats(), loadCounts()]))
</template>
</DataTable>
<el-dialog v-model="detailVisible" title="服务详情" width="700px">
<el-dialog v-model="detailVisible" title="服务详情" width="800px">
<el-descriptions v-if="detailData" :column="2" border>
<el-descriptions-item label="服务ID">{{ detailData.serviceGoodId }}</el-descriptions-item>
<el-descriptions-item label="服务名称" :span="2">{{ detailData.title }}</el-descriptions-item>

View File

@ -220,7 +220,7 @@ onMounted(load)
<el-dialog
v-model="editVisible"
:title="editMode === 'create' ? '新增菜单' : '编辑菜单'"
width="600"
width="640px"
:style="{ borderRadius: '12px', overflow: 'hidden' }"
align-center
destroy-on-close

View File

@ -492,7 +492,7 @@ onMounted(() => load())
</div>
<!-- 单行审核弹窗 -->
<el-dialog v-model="auditVisible" title="企业认证审核" width="480px" :close-on-click-modal="false" destroy-on-close>
<el-dialog v-model="auditVisible" title="企业认证审核" width="500px" :close-on-click-modal="false" destroy-on-close>
<div style="background:var(--bg,#f6f8fb);border:1px solid var(--border);border-radius:8px;padding:10px 14px;font-size:13px;color:var(--ink-2);margin-bottom:18px">
正在审核:<strong style="color:var(--ink)">{{ auditForm.id ? (list.find(r => r.id === auditForm.id)?.enterpriseName || '--') : '--' }}</strong>
</div>
@ -515,7 +515,7 @@ onMounted(() => load())
</el-dialog>
<!-- 批量审核弹窗 -->
<el-dialog v-model="batchAuditVisible" title="批量审核企业" width="480px" :close-on-click-modal="false" destroy-on-close>
<el-dialog v-model="batchAuditVisible" title="批量审核企业" width="500px" :close-on-click-modal="false" destroy-on-close>
<el-form label-width="80px" label-position="left">
<el-form-item label="审核结果">
<el-radio-group v-model="batchAuditForm.result">
@ -540,7 +540,7 @@ onMounted(() => load())
</el-dialog>
<!-- 更换管理员弹窗 -->
<el-dialog v-model="adminDialogVisible" title="更换管理员" width="420px" :close-on-click-modal="false" destroy-on-close>
<el-dialog v-model="adminDialogVisible" title="更换管理员" width="500px" :close-on-click-modal="false" destroy-on-close>
<el-form label-width="100px">
<el-form-item label="管理员姓名" required>
<el-input v-model="adminForm.administrator" placeholder="请输入新管理员姓名" />

View File

@ -541,7 +541,7 @@ onMounted(load)
</div>
<!-- ===== 审核弹窗 ===== -->
<el-dialog v-model="auditVisible" title="企业认证审核" width="480px" :close-on-click-modal="false" destroy-on-close>
<el-dialog v-model="auditVisible" title="企业认证审核" width="500px" :close-on-click-modal="false" destroy-on-close>
<div class="audit-dialog-tip">
正在审核:<strong>{{ detail.enterpriseName || '--' }}</strong>
</div>

View File

@ -201,7 +201,7 @@ onMounted(() => load())
</div>
<!-- 进件详情弹窗 (EnterpriseMerchantDTO 核心字段) -->
<el-dialog v-model="detailVisible" title="商户进件详情" width="760px" :close-on-click-modal="false" destroy-on-close>
<el-dialog v-model="detailVisible" title="商户进件详情" width="800px" :close-on-click-modal="false" destroy-on-close>
<div v-loading="detailLoading">
<template v-if="merchant">
<div style="display:flex;gap:8px;align-items:center;margin-bottom:12px">

View File

@ -24,6 +24,8 @@
--brand-2: #1D4ED8;
--brand-soft: #DBEAFE;
--brand-hover: #1E40AF;
--primary: var(--brand);
--primary-soft: var(--brand-soft);
--brand-glow: rgba(37, 99, 235, 0.15);
// 登录页渐变
--login-grad-1: #EFF6FF;
@ -72,6 +74,8 @@
--brand-2: #B91C1C;
--brand-soft: #FEE2E2;
--brand-hover: #991B1B;
--primary: var(--brand);
--primary-soft: var(--brand-soft);
--brand-glow: rgba(220, 38, 38, 0.15);
--login-grad-1: #FEF2F2;
--login-grad-2: #FECACA;
@ -117,6 +121,8 @@
--brand-2: #4736BC;
--brand-soft: #EDEBFC;
--brand-hover: #392BA0;
--primary: var(--brand);
--primary-soft: var(--brand-soft);
--brand-glow: rgba(86, 69, 212, 0.15);
--login-grad-1: #F3F1FE;
--login-grad-2: #E8E5FB;
@ -164,6 +170,8 @@
--brand-2: #3B82F6;
--brand-soft: rgba(96, 165, 250, 0.15);
--brand-hover: #93C5FD;
--primary: var(--brand);
--primary-soft: var(--brand-soft);
--brand-glow: rgba(96, 165, 250, 0.25);
--login-grad-1: #1E293B;
--login-grad-2: #0F172A;