kuaifan
27c65cc582
fix(frontend): TagInput 体质优化与多分隔符支持 + 后端 saveOrIgnore 加固
TagInput:
- cut prop 支持字符串或字符串数组,多分隔符任一匹配即切;
v-model 写回用第一个分隔符 (joinChar) 拼接保持向后兼容
- 修复 max 仅在 cut 分隔符路径生效,回车/blur/paste 路径未查 max 的 bug
- 修复 data() 初始化与 watch(value) 用硬编码 ',' 切分,
统一走 joinChar (单一输出分隔符) 还原 v-model,避免含空格的列名
(如项目模板 'Sprint 1') 被切碎
- 修复 watch(value) 空值/null 时不清空 disSource 的潜在残留数据
- v-for 加 :key='text',配合初始化去重避免拖拽错位
- 重复 tag 由静默忽略改为提示「该标签已存在」
- 编辑 tag 加 dedup 检查,重命名成已有 tag 文本时阻止关闭
- 粘贴改为按 cut 切分逐个 addTag;addTag 返回 boolean,
pasteText 在 max 满时 break 短路
- splitByCuts/parseValue 拆分:回切用 joinChar,paste/输入用 cutPattern
- 拼接翻译 '最多只能添加X个' 改为 $L('最多只能添加(*)个', max);
新增「最多只能添加(*)个」「该标签已存在」到 language/original-web.txt
manage.vue:
- 创建项目任务列表启用 :cut=\"[',', ',', ' ']\",支持半角/全角逗号/空格
IME (compositionstart/end 时序不可靠,统一走 @on-keydown + W3C 标准 229 守卫):
- login/ProjectPanel/TaskAdd/UserTagsModal 的 onXxxKeydown 加
isComposing || key=='Process' || keyCode==229 三重守卫,
与 TagInput.downEnter 风格统一
- file.vue 块模式重命名 onKeydown 用 \$nextTick 包 onEnter,
避免 keydown 早于 input 事件 commit v-model 导致少一个字符
AbstractModel.performInsertOrIgnore:
- \$uniqueBy 不为 null 时抛 InvalidArgumentException;
MySQL INSERT IGNORE 无法按指定列 scope 冲突,与框架 ON CONFLICT 语义不一致
- lastInsertId 仅在 > 0 时回填主键;
避免在无 auto_increment 列的表上把业务设置的 PK 覆盖为 0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-15 01:26:55 +00:00
..
2025-04-14 18:23:04 +08:00
2026-04-05 12:34:27 +00:00
2026-06-02 06:09:50 +00:00
2026-04-05 09:31:41 +00:00
2026-01-12 09:02:58 +08:00
2025-09-24 20:31:54 +08:00
2025-09-24 20:49:09 +08:00
2025-06-04 15:08:31 +08:00
2024-10-22 20:39:09 +08:00
2025-06-04 15:14:31 +08:00
2025-10-13 18:22:25 +08:00
2025-03-18 18:36:20 +08:00
2026-06-02 05:49:33 +00:00
2026-05-21 06:06:39 +00:00
2024-11-18 15:09:22 +08:00
2026-06-04 21:57:49 +00:00
2025-04-07 14:32:24 +08:00
2025-04-07 14:32:24 +08:00
2026-04-05 09:31:41 +00:00
2026-06-11 03:44:16 +00:00
2025-06-03 20:10:22 +08:00
2023-12-14 13:17:49 +08:00
2025-09-24 18:39:25 +08:00
2025-03-14 19:53:00 +08:00
2026-06-04 21:57:49 +00:00
2025-09-26 12:13:38 +08:00
2025-11-06 14:53:16 +00:00
2026-01-12 09:07:10 +08:00
2025-03-26 14:17:15 +08:00
2023-03-24 09:08:53 +08:00
2026-06-02 05:49:33 +00:00
2026-01-14 09:14:35 +08:00
2025-03-18 18:36:20 +08:00
2026-05-21 00:14:36 +00:00
2025-08-01 08:23:35 +08:00
2026-05-21 06:06:39 +00:00
2026-01-12 09:02:58 +08:00
2022-01-13 00:30:36 +08:00
2025-03-18 18:36:20 +08:00
2026-06-15 01:26:55 +00:00
2025-09-22 16:09:33 +08:00
2026-05-21 00:14:36 +00:00
2025-09-26 12:13:38 +08:00
2026-01-12 09:02:58 +08:00
2026-01-15 10:48:56 +00:00
2026-01-15 10:48:56 +00:00
2025-03-18 18:36:20 +08:00
2025-04-07 01:21:50 +08:00
2026-06-15 01:26:55 +00:00
2025-12-26 02:42:47 +00:00
2025-08-01 11:27:00 +08:00
2026-05-21 00:14:36 +00:00
2025-08-01 11:27:00 +08:00
2026-05-29 23:32:24 +00:00
2025-02-14 20:41:04 +08:00
2024-11-21 16:02:53 +08:00
2025-04-14 15:29:53 +08:00
2025-04-13 00:18:39 +08:00
2025-09-24 23:49:22 +08:00
2026-01-22 05:32:27 +00:00
2024-01-17 23:22:13 +08:00
2026-05-21 00:14:36 +00:00
2026-05-11 03:26:59 +00:00
2023-04-06 10:34:23 +08:00
2026-06-02 05:49:33 +00:00
2026-06-04 03:24:50 +00:00
2026-06-01 01:26:34 +00:00
2026-06-15 01:26:55 +00:00
2026-06-04 03:24:50 +00:00