20260821173417

This commit is contained in:
oneao committed 2026-08-21 17:34:18 +08:00
1 parent 45854b0570
commit 2e5d532f23
19 files changed
+1495 -93

No files matched your search

@@ -250,7 +250,8 @@ async function submitUpload() {
emit('uploaded')
await loadFiles(1)
} catch (e) {
Message.error('上传失败:' + (e?.message || e))
// 服务端不可达 / 5xx 已由 http 拦截器统一弹 Message,这里去重
if (!e?.toasted) Message.error('上传失败:' + (e?.message || e))
} finally {
uploading.value = false
}
@@ -305,7 +306,8 @@ async function deleteSelected() {
emit('deleted')
await loadFiles(currentPage.value)
} catch (e) {
Message.error('删除失败:' + (e?.message || e))
// 服务端不可达 / 5xx 已由 http 拦截器统一弹 Message,这里去重
if (!e?.toasted) Message.error('删除失败:' + (e?.message || e))
}
},
})
@@ -330,7 +332,8 @@ async function deleteSingle(file) {
emit('deleted')
await loadFiles(currentPage.value)
} catch (e) {
Message.error('删除失败:' + (e?.message || e))
// 服务端不可达 / 5xx 已由 http 拦截器统一弹 Message,这里去重
if (!e?.toasted) Message.error('删除失败:' + (e?.message || e))
}
},
})
@@ -213,6 +213,30 @@ defineExpose({ moduleId, refreshCategories: loadCategories })
min-height: 0;
}
/* 分隔条:宽 0 + 无负 margin,不占 flex 宽度,面板在交界处无缝相接,
消除分割线左右两侧的空白条(对比:DefaultLayout 用负 margin 让面板互相
覆盖,但附件三栏背景色不同——白列表 / 灰预览——覆盖会露底,这里改用
::after 扩展命中区,不挤压面板也不遮挡相邻面板背景)。 */
.ff-splitter :deep(> .fms-splitter-bar) {
width: 0;
position: relative;
z-index: 1;
}
/* 命中区:从宽 0 的分隔条向两侧各伸出 3px(共 6px,与 --fms-splitter-trigger-size
一致),保持拖拽热区不变;伪元素的事件命中会冒泡到 .fms-splitter-bar 本体,
pointerdown / 键盘聚焦仍由原逻辑处理 */
.ff-splitter :deep(> .fms-splitter-bar::after) {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: var(--fms-splitter-trigger-size);
cursor: col-resize;
}
.ff-center {
display: flex;
width: 100%;
@@ -69,10 +69,6 @@ const { state } = useFileModal()
/* Modal 根节点是 Teleport,class 无法透传(Vue 会告警且不生效),
因此通过内容锚点 .ff-container(FmsFile 根元素)用 :has() 定位附件弹窗。
打开中的附件弹窗体内必然渲染 .ff-container,其他弹窗不受影响。 */
.fms-modal:has(.ff-container) {
max-width: 1440px; /* 超宽屏封顶,避免三栏被拉得过宽 */
min-width: 960px; /* 极小屏保底,三栏不挤 */
}
.fms-modal-body:has(.ff-container) {
padding: 0;
+14 -3
View File
@@ -1,5 +1,6 @@
import axios from 'axios'
import { useAuthStore } from '@/stores/auth'
import { Message } from '@/components/ui/message/message-manager'
const AUTH_ERROR_CODE = 401
const SESSION_REPLACED_CODE = 40101
@@ -81,13 +82,23 @@ http.interceptors.response.use(
const errorCode = payload?.code ?? status ?? 0
if (isAuthenticationError(errorCode)) handleUnauthorized(errorCode)
const requestError = new Error(
const message =
payload?.message ||
(error.code === 'ECONNABORTED' ? '请求超时,请稍后重试' : '网络异常,请检查服务是否正常'),
)
(error.code === 'ECONNABORTED' ? '请求超时,请稍后重试' : '网络异常,请检查服务是否正常')
const requestError = new Error(message)
requestError.code = payload?.code ?? status ?? -1
requestError.data = payload?.data
requestError.success = false
// 服务端不可达(无 status)/ 5xx 属全局性问题,统一弹 Message 提示;
// 4xx 等业务错误由调用方自行决定提示方式。
// 打 toasted 标记:登录、上传/删除等已有自身 Message 的调用方据此去重,避免重复弹窗
if (!status || status >= 500) {
Message.error(message)
requestError.toasted = true
}
throw requestError
},
)
+1 -1
View File
@@ -103,7 +103,7 @@
/* 栅格(grid):默认水平/垂直间距(不随主题变化) */
--fms-grid-gutter: 0px;
--fms-splitter-bar-size: 2px;
--fms-splitter-bar-size: 1px;
--fms-splitter-bar-size-hover: 4px;
--fms-splitter-handle-size: 20px;
+2 -1
View File
@@ -60,7 +60,8 @@ async function onSubmit(values) {
Message.success('登录成功')
router.replace(String(route.query.redirect || '/dashboard'))
} catch (e) {
Message.error(e.message || '登录失败,请稍后重试')
// 服务端不可达 / 5xx 已由 http 拦截器统一弹 Message,这里去重避免重复弹窗
if (!e?.toasted) Message.error(e.message || '登录失败,请稍后重试')
} finally {
submitting.value = false
}