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:
@@ -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
|
||||
|
||||
@@ -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 登录
|
||||
Reference in New Issue
Block a user