feat(web): 统一平台管理员判定与 AI 工作台申请预览动作接入

- authUser 抽出 resolveAuthUserAdminFlag,统一 isAdmin 解析(含 superadmin、role_codes、中英文角色名),accessControl 复用同一逻辑
- 登录态、应用外壳路由、系统状态接入统一管理员判定,LoginView 与相关 composable 配套调整
- AI 工作台申请提交改为调用新的 /application-preview-action 接口,草稿保存仍走 orchestrator;预审模型补充重叠冲突提示与阻断判断
- 同步更新 accessControl/api-request/ai 预览动作等前端测试
This commit is contained in:
caoxiaozhu
2026-06-20 14:42:04 +08:00
parent 729d833edb
commit 96c2e1099a
21 changed files with 1364 additions and 331 deletions

View File

@@ -72,38 +72,6 @@
min-width: 0;
}
.login-entry-veil {
position: absolute;
inset: 0;
z-index: 380;
display: grid;
place-items: center;
background: rgba(248, 250, 252, 0.9);
backdrop-filter: blur(3px);
pointer-events: none;
}
.login-entry-veil-enter-active {
transition: opacity 180ms var(--ease);
}
.login-entry-veil-leave-active {
transition: opacity 260ms cubic-bezier(0.4, 0, 0.2, 1);
}
.login-entry-veil-enter-from,
.login-entry-veil-leave-to {
opacity: 0;
}
.app.login-entry-active .app-sidebar {
animation: loginEntrySidebarIn 520ms cubic-bezier(0.16, 1, 0.3, 1) both;
}
.app.login-entry-active > .main {
animation: loginEntryMainIn 620ms 90ms cubic-bezier(0.16, 1, 0.3, 1) both;
}
.boot-state {
min-height: var(--desktop-stage-height, 100dvh);
display: grid;
@@ -234,6 +202,28 @@
padding: 0;
background: transparent;
}
.document-detail-loading {
min-height: 280px;
display: grid;
place-items: center;
align-content: center;
gap: 14px;
text-align: center;
color: #475569;
}
.document-detail-loading i {
font-size: 30px;
color: var(--theme-primary-active);
}
.document-detail-loading strong {
color: #0f172a;
font-size: 16px;
}
.document-detail-loading p {
margin: 6px 0 0;
color: #64748b;
font-size: 13px;
}
.workarea.settings-workarea {
padding: 0;
background: #fff;
@@ -299,10 +289,6 @@
transform: translateX(0);
}
.app.login-entry-active .app-sidebar {
animation: none;
}
.app > .main {
flex: 1 1 100%;
width: 100vw;
@@ -374,14 +360,4 @@
flex-basis 120ms ease-out !important;
transition-duration: 120ms, 120ms !important;
}
.app.login-entry-active .app-sidebar,
.app.login-entry-active > .main {
animation: none !important;
}
.login-entry-veil-enter-active,
.login-entry-veil-leave-active {
transition: opacity 120ms ease-out !important;
}
}

View File

@@ -1556,12 +1556,28 @@
cursor: pointer;
}
.application-preview-row.is-disabled {
cursor: wait;
}
.application-preview-row.is-disabled .application-preview-label,
.application-preview-row.is-disabled .application-preview-value {
background: rgba(248, 250, 252, 0.84);
color: #64748b;
}
.application-preview-row.editable:hover,
.application-preview-row.editable:hover .application-preview-label,
.application-preview-row.editable:hover .application-preview-value {
background: rgba(239, 246, 255, 0.58);
}
.application-preview-row.is-disabled:hover,
.application-preview-row.is-disabled:hover .application-preview-label,
.application-preview-row.is-disabled:hover .application-preview-value {
background: rgba(248, 250, 252, 0.84);
}
.application-preview-row.editable:focus-visible {
z-index: 1;
outline: 2px solid rgba(37, 99, 235, 0.42);
@@ -1655,6 +1671,12 @@
transform: translateY(-1px);
}
.application-preview-edit-btn:disabled {
cursor: wait;
opacity: 0.46;
transform: none;
}
.application-preview-footer {
color: #334155;
font-size: 15px;
@@ -1748,11 +1770,17 @@
transform 160ms ease;
}
.workbench-ai-suggested-actions button:hover {
.workbench-ai-suggested-actions button:hover:not(:disabled) {
transform: translateY(-1px);
background: #eff6ff;
}
.workbench-ai-suggested-actions button:disabled {
cursor: wait;
opacity: 0.6;
transform: none;
}
.workbench-ai-message-actions {
display: flex;
align-items: center;
@@ -1940,6 +1968,12 @@
box-shadow: 0 12px 22px rgba(220, 38, 38, 0.2);
}
.workbench-ai-confirm-actions .primary {
background: #2563eb;
color: #fff;
box-shadow: 0 12px 22px rgba(37, 99, 235, 0.2);
}
.workbench-ai-confirm-fade-enter-active,
.workbench-ai-confirm-fade-leave-active {
transition: opacity 180ms ease;

View File

@@ -559,11 +559,72 @@
.submit-btn:disabled,
.sso-btn:disabled {
opacity: .6;
cursor: not-allowed;
}
/* 登录中SSO 按钮置灰,登录按钮保持主色并显示 spinner */
.sso-btn:disabled {
opacity: .6;
box-shadow: none;
}
.submit-btn:disabled {
opacity: 1;
box-shadow: 0 16px 30px rgba(var(--theme-primary-rgb, 58, 124, 165), .20);
}
/*
* 登录中表单态:用户名 / 密码 / 租户 / 记住账号 / 忘记密码全部置灰禁用,
* 让视觉焦点集中在正在校验的登录按钮上
*/
.login-form.is-submitting .field input,
.login-form.is-submitting .field select {
background: #f1f5f9;
border-color: #e2e8f0;
color: #94a3b8;
cursor: not-allowed;
}
.login-form.is-submitting .field input::placeholder {
color: #cbd5e1;
}
.login-form.is-submitting .field > .mdi,
.login-form.is-submitting .field-icon-btn,
.login-form.is-submitting .field-select-chevron {
color: #cbd5e1;
opacity: .5;
pointer-events: none;
}
.login-form.is-submitting .remember,
.login-form.is-submitting .link-btn {
opacity: .55;
pointer-events: none;
}
/* 登录按钮内的旋转 loading */
.submit-btn__spinner {
width: 20px;
height: 20px;
border: 2.5px solid rgba(255, 255, 255, .4);
border-top-color: #fff;
border-radius: 999px;
animation: loginSubmitSpin 720ms linear infinite;
}
@keyframes loginSubmitSpin {
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: reduce) {
.submit-btn__spinner {
animation-duration: 1800ms;
}
}
.divider {
position: relative;
display: grid;