sequenceDiagram participant U as 用户 participant P as category-manage participant D as DragSortList participant S as categoryStore participant A as sortCategories API participant B as PUT /categories/sort U->>P: 长按分类项进入排序模式 P->>P: showSortMode = true P->>D: 渲染 DragSortList (items=currentCategories) U->>D: touchstart (记录起始位置) U->>D: touchmove (计算偏移, 交换元素位置) D->>D: 实时更新 items 数组顺序 U->>D: touchend (拖拽结束) D->>P: @change事件 (新顺序ids) P->>S: sortCategories(newIds) S->>A: sortCategories(ids) A->>B: PUT /categories/sort { ids } B-->>A: { code: 0 } A-->>S: 成功 S->>S: fetchCategories() 刷新 %% 数据导入流程 U->>P2 as data-import: 选择 JSON 文件 P2->>P2: uni.chooseFile / 读取文件内容 P2->>P2: 解析 JSON,显示预览(条数、日期范围) U->>P2: 确认导入 P2->>A2 as transaction API: importTransactions(items) A2->>S2 as POST /transactions/import: POST { items } S2->>S2: 校验每条记录格式 S2->>DB as MySQL: 查询已有记录 (去重比对) S2->>DB: 批量 INSERT (每批100条) S2->>DB: 写入 transaction_tags (如有 tag_names) S2-->>A2: { total, imported, skipped, errors } A2-->>P2: 导入结果 P2->>U: 显示导入结果(成功X条, 跳过Y条) %% 标签关联交易流程 U->>P3 as add/index: 点击"添加标签" P3->>P3: 显示标签选择面板(已有标签 + 新建入口) U->>P3: 选择标签(最多5个) P3->>P3: selectedTagIds 更新 U->>P3: 保存交易 P3->>A3 as transaction API: createTransaction({...data, tagIds}) A3->>S3 as POST /transactions: POST { amount, type, ..., tagIds } S3->>S3: 校验 tagIds (≤5, 属于当前用户) S3->>DB: INSERT INTO transactions S3->>DB: INSERT INTO transaction_tags (批量) S3-->>A3: { id } A3-->>P3: 成功