20260826173130

This commit is contained in:
oneao committed 2026-08-26 17:31:31 +08:00
1 parent 9957757b5d
commit 0bbbbd3ecc
15 files changed
+2472 -874

No files matched your search

@@ -363,7 +363,11 @@ async function onSwitchSave() {
switchSaving.value = true
try {
const ok = await saveModule()
if (!ok) return
if (!ok) {
// 保存失败(原因已由 saveModule 内部提示):留在当前对象,弹窗不关闭,可重试或放弃
Message.warning('保存未完成,已留在当前对象,请处理后再切换')
return
}
moduleSelectedId.value = state.pendingId
switchConfirm.value = null
} finally {
@@ -527,6 +531,26 @@ async function deleteModule(id) {
if (powers.length) {
reqs.push({ table: 's_power', key_field: 'b_id', deletes: powers.map((r) => ({ b_id: r.b_id })) })
}
// 多语言(s_i18n 无 b_module_id 字段,需按模块编码匹配 b_key 前缀)。
// 若不清理,删除后残留的孤儿键会被同编码新模块的多语言面板加载,
// 进而产生指向已不存在记录的 UPDATE,导致后端「修改记录数异常: 0」。
const moduleCode = String(module.b_code || '').trim()
if (moduleCode) {
const prefix = module.b_module_type === 'category' ? 'menu' : 'module'
const i18nRes = await loadDataApi(
's_i18n',
`b_key = '${prefix}.${moduleCode}' OR b_key LIKE '${prefix}.${moduleCode}.%' ` +
`OR b_key LIKE 'field.${moduleCode}.%' OR b_key LIKE 'power.${moduleCode}.%'`,
)
const i18nRows = i18nRes.data || []
if (i18nRows.length) {
reqs.push({
table: 's_i18n',
key_field: 'b_id',
deletes: i18nRows.map((r) => ({ b_id: r.b_id })),
})
}
}
reqs.push({ table: 's_module', key_field: 'b_id', deletes: [{ b_id: id }] })
await saveObjectApi(reqs)
// 本地移除整棵子树(未保存子孙随父一并清理),并清除未保存标记
@@ -1003,7 +1027,6 @@ loadModuleTree()
<Tabs
v-if="drafts"
v-model="activeSection"
type="pill"
nav-only
class="mm-config-nav"
:items="configNavItems"
@@ -1235,9 +1258,17 @@ loadModuleTree()
min-height: 0;
}
/* Splitter 适配:面板内容各自内部滚动,避免双滚动条 */
/* Splitter 适配:
* - 面板内容各自内部滚动,避免双滚动条
* - 面板左右留 3px,两张白卡之间形成灰缝(3 + 分隔条 6 + 3 = 12px),无需边框线
* - 隐藏分隔条常显的 1px 线(hover 时的手柄仍会显示,可拖拽调宽) */
.mm-body-splitter :deep(> .fms-splitter-panel) {
overflow: hidden;
padding: 0 3px;
}
.mm-body-splitter :deep(.fms-splitter-bar::before) {
display: none;
}
/* ---- 左树顶部 header:搜索框在左,操作在右,无边框无标题 ---- */
@@ -1296,6 +1327,11 @@ loadModuleTree()
height: 100%;
min-height: 0;
padding: 8px;
/* 灰底画布上的白卡:白底 + 圆角 + 阴影,与右侧内容卡用灰缝分隔 */
background: var(--fms-card);
border-radius: var(--fms-control-radius);
box-shadow: var(--fms-shadow);
overflow: hidden;
}
.mm-tree-panel__scroll {
@@ -1350,6 +1386,10 @@ loadModuleTree()
min-width: 0;
min-height: 0;
overflow: hidden;
/* 灰底画布上的白卡:与左侧树卡用灰缝分隔 */
background: var(--fms-card);
border-radius: var(--fms-control-radius);
box-shadow: var(--fms-shadow);
}
.mm-main__empty {
@@ -1379,28 +1419,9 @@ loadModuleTree()
min-height: 0;
}
/* ---- 配置导航:横向胶囊式 Tabs,位于 header 内左侧,操作按钮贴右 ---- */
/* ---- 配置导航:横向胶囊式 Tabs,位于工作区顶部,操作按钮在 rightExtra 插槽 ---- */
/* ---- 配置导航:横向 Tab 导航(line 类型,不作内部覆盖,组件默认样式即可) ---- */
.mm-config-nav.tabs {
flex: none;
/* 与左侧树 header 的分割线对齐:左右两栏 header 同高同线,视觉统一 */
border-bottom: 1px solid var(--fms-border);
}
.mm-config-nav :deep(.tabs-nav) {
padding: 6px;
}
/* 标签列表由 Scrollbar 组件接管滚动,这里只保持垂直居中 */
.mm-config-nav :deep(.tabs-nav-list) {
align-items: center;
}
/* rightExtra 操作区与标签在同一行垂直居中 */
.mm-config-nav :deep(.tabs-nav-extra) {
margin-top: 0;
margin-bottom: 0;
padding-right: 10px;
}
/* 标签内布局:图标 + 文字 + badge */