feat: LLM多阶段交互式Schema生成 + UI布局优化

- AI Service: 多阶段对话模型(理解→澄清→生成→校验→确认),支持对话历史和当前Schema上下文
- Backend: 适配多阶段AI模型,Gateway/Service/Controller传递history和currentSchema
- Frontend: AiDesignerChat组件重写,支持阶段徽章、快速回复、Schema校验展示
- Frontend: 表单/流程设计器布局优化,AI助手和Schema预览作为独立列
- Frontend: 流程设计器元数据和模式选择器合并为一行
- Keycloak: 自定义登录主题(中文化)
- 修复CSS媒体查询括号平衡问题
This commit is contained in:
selfrelease
2026-07-19 09:36:42 +08:00
parent a2238bc853
commit 57c8a26147
19 changed files with 853 additions and 14 deletions
+1
View File
@@ -38,6 +38,7 @@ services:
- "8081:8080"
volumes:
- ./keycloak/realm-aioa.json:/opt/keycloak/data/import/realm-aioa.json:ro
- ./keycloak/themes/aioa:/opt/keycloak/themes/aioa:ro
minio:
image: minio/minio:RELEASE.2025-06-13T11-33-47Z
+5 -1
View File
@@ -1,10 +1,14 @@
{
"realm": "aioa",
"enabled": true,
"displayName": "AIOA Development",
"displayName": "AIOA 智能办公自动化平台",
"registrationAllowed": false,
"resetPasswordAllowed": true,
"loginWithEmailAllowed": true,
"loginTheme": "aioa",
"internationalizationEnabled": true,
"defaultLocale": "zh_CN",
"supportedLocales": ["zh-CN", "zh_CN", "en", "en-US"],
"roles": {
"realm": [
{ "name": "employee", "description": "普通员工" },
@@ -0,0 +1,105 @@
# AIOA 自定义中文消息
# 登录页
loginTitle=AIOA 管理平台登录
loginTitleHtml=AIOA 管理平台
loginSubtitle=请使用您的账号登录
doLogIn=登 录
doRegister=注册
doCancel=取消
doSubmit=提交
doBack=返回
doYes=
doNo=
doContinue=继续
doIgnore=忽略
doAccept=接受
doDecline=拒绝
doForgotPassword=忘记密码?
doClickHere=点击这里
doTryAgain=重试
doTryAnotherWay=尝试其他方式
doConfirmDelete=确认删除
# 账号字段
username=用户名
usernameOrEmail=用户名或邮箱
password=密码
passwordConfirm=确认密码
passwordNew=新密码
passwordConfirmNew=再次输入新密码
email=邮箱
firstName=
lastName=
rememberMe=记住我
# 提示信息
loginTotpTitle=移动认证器应用
loginTotpMessage=请输入验证码
loginTotpStep1=第 1 步:在认证器应用中添加此账号
loginTotpStep2=第 2 步:输入验证码
loginTotpStep3DeviceName=请为您的设备命名(可选)
loginTotpManualStep2=请输入以下密钥:
loginTotpScanBarcode=扫描二维码
loginTotpOneTimeCode=验证码
loginTotp.totp=基于时间(TOTP
loginTotp.hotp=基于计数器(HOTP
# 忘记密码
emailForgotTitle=忘记密码
emailForgotInstructions=请输入您的用户名或邮箱,我们将发送重置密码的链接。
# 错误信息
invalidUserMessage=用户名或密码错误
invalidPasswordMessage=密码错误
invalidEmailMessage=请输入有效的邮箱地址
invalidUsernameMessage=用户名不存在
invalidUsernameOrEmailMessage=用户名或邮箱不存在
accountDisabledMessage=账号已被禁用
accountTemporarilyDisabledMessage=账号已被临时锁定
expiredCodeMessage=登录超时,请重试
expiredActionMessage=操作超时,请重试
sessionLimitExceeded=会话数超限
identityProviderDisabledMessage=身份提供者已被禁用
identityProviderAlreadyLinkedMessage=该第三方账号已绑定其他用户
identityProviderNotFoundMessage=无法连接到身份提供者
emailNotFoundMessage=未找到与该邮箱关联的账号
federatedIdentityLinkMessage=请验证您的邮箱以关联账号
federatedIdentityUnlinkSuccessMsg=已成功解除第三方账号关联
confirmAccountLinkingMsg=确认关联您的账号 {0} 与 {1}
confirmEmailAddress=请确认您的邮箱地址
confirmExecutionDescription=确认执行操作
# 信息提示
emailSendInstructions=重置密码邮件已发送
emailSendAlreadyInstructions=重置密码邮件已发送
updatePasswordTitle=更新密码
updatePasswordMessage=请设置您的新密码
updatePasswordMessageTwo=请确认您的新密码
# 页脚
termsText=登录即表示您同意我们的服务条款
privacyPolicy=隐私政策
termsOfService=服务条款
# 其他
requiredMessage=此字段为必填
browserLogin=浏览器登录
otherMethods=其他登录方式
grantInformation=请确认授权以下权限
scopes=权限范围
# OTP 验证
loginTotpIntro=为了您的账号安全,请配置两步验证
# 信息页面
infoTitle=提示
infoMessage=请按照说明操作
# 登出
logoutTitle=您已登出
logoutSignOutIn=您已成功登出,可以重新登录
backToApplication=返回应用
# 会话超时
sessionTimeoutMsg=您的会话已超时,请重新登录
@@ -0,0 +1,124 @@
/*
* AIOA 自定义登录主题样式
* 适配 Keycloak v2 主题 (PatternFly v5)
*/
:root {
--pf-v5-global--primary-color--100: #2563eb;
--pf-v5-global--primary-color--200: #1d4ed8;
--pf-v5-global--BackgroundColor--100: #f0f4f8;
--aioa-gradient-start: #1e3a8a;
--aioa-gradient-end: #2563eb;
}
/* 整体页面背景 */
.login-pf body,
body.pf-v5-c-login {
background: linear-gradient(135deg, var(--aioa-gradient-start) 0%, var(--aioa-gradient-end) 100%) !important;
min-height: 100vh;
}
/* 登录卡片 */
.pf-v5-c-login__main {
background: #ffffff;
border-radius: 16px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);
}
.pf-v5-c-login__main-header {
padding: 40px 36px 0 36px;
}
.pf-v5-c-login__main-header h1 {
font-size: 22px;
font-weight: 700;
color: #1e293b;
}
.pf-v5-c-login__main-header p {
font-size: 14px;
color: #64748b;
}
.pf-v5-c-login__main-body {
padding: 28px 36px;
}
/* 表单输入框 */
.pf-v5-c-form__group {
margin-bottom: 20px;
}
.pf-v5-c-form-control {
border: 1.5px solid #cbd5e1 !important;
border-radius: 8px !important;
padding: 10px 14px !important;
font-size: 15px !important;
transition: border-color 0.2s, box-shadow 0.2s;
}
.pf-v5-c-form-control:focus {
border-color: #2563eb !important;
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15) !important;
outline: none;
}
/* 登录按钮 */
.pf-v5-c-button.pf-m-primary {
background: linear-gradient(135deg, #1e3a8a, #2563eb) !important;
border: none !important;
border-radius: 8px !important;
padding: 12px 24px !important;
font-size: 15px !important;
font-weight: 600 !important;
width: 100%;
cursor: pointer;
transition: opacity 0.2s, transform 0.1s;
}
.pf-v5-c-button.pf-m-primary:hover {
opacity: 0.92;
}
.pf-v5-c-button.pf-m-primary:active {
transform: scale(0.98);
}
/* 次要链接 */
.pf-v5-c-login__main-footer a,
.pf-v5-c-form__helper-text a {
color: #2563eb;
font-size: 14px;
text-decoration: none;
}
.pf-v5-c-login__main-footer a:hover,
.pf-v5-c-form__helper-text a:hover {
text-decoration: underline;
}
/* 提示信息 */
.pf-v5-c-alert {
border-radius: 8px;
font-size: 14px;
}
/* 页脚 */
.pf-v5-c-login__footer {
text-align: center;
font-size: 12px;
color: rgba(255, 255, 255, 0.7);
padding: 16px;
}
/* 响应式 */
@media (max-width: 480px) {
.pf-v5-c-login__main {
border-radius: 12px;
}
.pf-v5-c-login__main-header,
.pf-v5-c-login__main-body {
padding-left: 20px;
padding-right: 20px;
}
}
@@ -0,0 +1,18 @@
// AIOA 开发环境:预填充测试管理员凭据
(function () {
function prefill() {
var usernameInput = document.getElementById('username');
var passwordInput = document.getElementById('password');
if (usernameInput && !usernameInput.value) {
usernameInput.value = 'admin';
}
if (passwordInput && !passwordInput.value) {
passwordInput.value = 'Admin123!';
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', prefill);
} else {
prefill();
}
})();
@@ -0,0 +1,12 @@
parent=keycloak.v2
import=common/keycloak
# Styles generated by the server
styles=css/login.css
scripts=js/prefill.js
# Meta tags
meta=viewport==width=device-width,initial-scale=1.0
# Branding
displayName=AIOA 登录