status: complete created: 2026-07-15 拆分顺序:契约与纯函数 → 公共组件/底层实现 → 页面与配置编排 → SQL 修复 → 增量验证
AGENTS.md、项目记忆、编码规范和自动化测试标准。fix/user-reported-issues-20260715,不在主分支直接编码。ui-ux-pro-max,页面改动只遵循现有 Forge 组件规范。FLOW_TODO 消息显示并触发“去审批”,已办消息保留查看能力但不进入待办。forge-admin-ui/src/layouts/components/message-notification-utils.js — 新增可测试的消息状态判断。forge-admin-ui/src/layouts/components/__tests__/message-notification-utils.spec.js — 覆盖待办、已办和普通消息。forge-admin-ui/src/layouts/components/MessageNotification.vue — 按待办状态控制按钮和卡片点击。js
export function isFlowApprovalMessage(message) {}
export function isPendingFlowApprovalMessage(message) {}
FLOW_TODO/readFlag=1 不渲染“去审批”;FLOW_TODO/readFlag=0 仍可跳转 /flow/todo。forge-admin-ui/src/components/ai-form/import-utils.js — 预览行与导入结果归一化纯函数。forge-admin-ui/src/components/ai-form/__tests__/import-utils.spec.js — 覆盖预览截断、指标和错误字段兼容。forge-admin-ui/src/components/ai-form/AiCrudImportModal.vue — 新增选择、预览、导入、结果四阶段弹窗。forge-admin-ui/src/components/ai-form/AiCrudPage.vue — 接入新弹窗并把现有上传/模板下载封装为回调。forge-server/forge-framework/forge-starter-parent/forge-starter-excel/src/main/java/com/mdframe/forge/starter/excel/model/ImportTemplateColumn.java — 公共模板列描述。forge-server/forge-framework/forge-starter-parent/forge-starter-excel/src/main/java/com/mdframe/forge/starter/excel/core/ExcelImportTemplateWriter.java — 写入数据样例页和字段说明页。forge-server/forge-framework/forge-starter-parent/forge-starter-excel/src/main/java/com/mdframe/forge/starter/excel/service/impl/ExcelImportServiceImpl.java — 通用配置映射到模板列。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/DynamicCrudExcelService.java — 动态 CRUD 模板接入公共写入器并推导样例/说明。forge-server/forge-framework/forge-starter-parent/forge-starter-excel/src/test/java/com/mdframe/forge/starter/excel/core/ExcelImportTemplateWriterTest.java — 验证两个工作表、样例行和说明字段。js
export function buildImportPreview(rows, maxRows = 20) {}
export function normalizeImportResult(payload) {}
java
public byte[] write(String dataSheetName, List<ImportTemplateColumn> columns);
public void write(OutputStream outputStream, String dataSheetName, List<ImportTemplateColumn> columns);
forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/keyexchange/CryptoRuntimeConfig.java — 安全裁剪的运行配置 DTO。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/keyexchange/KeyExchangeController.java — 新增匿名 /crypto/config。forge-server/forge-framework/forge-starter-parent/forge-starter-auth/src/main/java/com/mdframe/forge/starter/auth/config/SaTokenConfig.java — 放行运行配置接口。forge-server/forge-framework/forge-starter-parent/forge-starter-auth/src/main/java/com/mdframe/forge/starter/auth/interceptor/ApiPermissionInterceptor.java — 密码强制修改白名单补齐运行配置接口。forge-server/forge-framework/forge-starter-parent/forge-starter-config/src/main/java/com/mdframe/forge/starter/config/service/ConfigManagerService.java — 保存 crypto 分组后同步刷新运行属性。forge-server/forge-framework/forge-starter-parent/forge-starter-config/src/main/java/com/mdframe/forge/starter/config/service/ConfigSyncService.java — 把分组属性写入 sys_config 后刷新运行属性。forge-server/forge-framework/forge-starter-parent/forge-starter-config/src/main/java/com/mdframe/forge/starter/config/controller/ConfigManageController.java — 校验保存/同步结果。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/advice/EncryptResponseBodyAdvice.java — 固定运行配置和开关保存响应为明文。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/advice/DecryptRequestBodyAdvice.java — 固定开关保存请求为明文。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/config/JacksonCryptoConfiguration.java — 注入动态属性到字段序列化上下文。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/serializer/CryptoFieldSerializer.java — 序列化时动态检查总开关。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/serializer/CryptoFieldDeserializer.java — 反序列化时动态检查总开关。forge-admin-ui/src/utils/crypto/crypto-config.js — 加载、归一化、应用服务端运行配置。forge-admin-ui/src/utils/crypto/key-exchange.js — 全局关闭时跳过 API 密钥协商。forge-admin-ui/src/utils/crypto/crypto-interceptor.js、src/utils/http/interceptors.js — 请求、响应和防重放处理服从运行开关。forge-admin-ui/src/utils/crypto/__tests__/crypto-config.spec.js — 覆盖关闭、开启及安全默认值。forge-admin-ui/src/main.js — 路由初始化前加载运行配置。forge-admin-ui/src/views/system/config-center.vue — 保存后更新当前浏览器配置。java
@GetMapping("/config")
public ResponseEntity<Map<String, Object>> getRuntimeConfig();
js
export function normalizeRuntimeCryptoConfig(config) {}
export function applyRuntimeCryptoConfig(config) {}
export async function loadRuntimeCryptoConfig() {}
forge-admin-ui/src/views/ai/provider-model.vue — 调整右固定操作列宽度、表格横向宽度和操作间距。js
{ title: '操作', key: 'actions', width: 160, fixed: 'right' }
ONLY_FULL_GROUP_BY 并保持稳定去重排序。forge-server/forge-framework/forge-plugin-parent/forge-plugin-system/src/main/resources/mapper/SysUserOrgRoleMapper.xml — 用显式 GROUP BY 替代非法 DISTINCT + ORDER BY。sql
SELECT r.role_name
FROM sys_user_org_role uor
INNER JOIN sys_role r ON ...
WHERE ...
GROUP BY r.id, r.role_name, r.sort
ORDER BY r.sort ASC, r.role_name ASC
SELECT DISTINCT r.role_name,排序语义不变。code-copilot/changes/user-reported-platform-issues/test-spec.md — 更新实际结果。code-copilot/changes/user-reported-platform-issues/execution-log.md — 追加命令、结果、警告和跳过项。code-copilot/changes/user-reported-platform-issues/spec.md — 回填任务状态和审查结论。code-copilot/changes/user-reported-platform-issues/tasks.md — 勾选已完成任务。bash
source ~/.nvm/nvm.sh && nvm use v20.19.0
pnpm exec vitest run src/components/ai-form/__tests__/import-utils.spec.js src/layouts/components/__tests__/message-notification-utils.spec.js src/utils/crypto/__tests__/crypto-config.spec.js
NODE_OPTIONS=--max-old-space-size=8192 pnpm build
bash
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH \
mvn -Penable-tests -pl forge-framework/forge-starter-parent/forge-starter-excel \
-Dtest=ExcelImportTemplateWriterTest test
bash
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH \
mvn -pl forge-admin-server -am package -DskipTests
xmllint --noout forge-framework/forge-plugin-parent/forge-plugin-system/src/main/resources/mapper/SysUserOrgRoleMapper.xml
git diff --check
execution-log.md,不把警告或跳过项表述为通过。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/crypto/impl/SM4Encryptor.javaforge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/crypto/impl/AESEncryptor.javaforge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/config/CryptoAutoConfiguration.javaforge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/test/java/com/mdframe/forge/starter/crypto/crypto/impl/CryptoEncryptorLifecycleTest.java