feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,99 +1,99 @@
# 全文复筛前端逻辑调整 - Settings页面优化
**日期**: 2025-01-23
**<EFBFBD><EFBFBD><EFBFBD>**: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>躰秤嚗屸<EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD>𡑒”撖澆<E69296>"<22>?PDF銝𠹺<E98A9D>"銝支葵<E694AF><EFBFBD>甇仿炊
**<EFBFBD><EFBFBD>?*: <20>?撌脣<E6928C><E884A3>?
**调整原因**: 用户反馈逻辑错误,需要区分"文献列表导入"和"PDF上传"两个独立步骤
**状态**: ✅ 已完成
---
## 🔴 **问题发现**
### <EFBFBD><EFBFBD><EFBFBD>躰秤霈曇恣嚗?
### 原始错误设计:
```
甇仿炊1: 撖澆<E69296><EFBFBD><E695BA>蝑𥟇<E89D91><F0A59F87>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Tab1: 隞擧<EFBFBD>憸䀹<EFBFBD><EFBFBD><EFBFBD>蝑𥕦紡<EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Tab2: <EFBFBD>见𢆡銝𠹺<EFBFBD>Excel <20>?<3F>躰秤霈曇恣
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> 銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD><E98984>讃靽⊥<E99DBD><E28AA5><EFBFBD>xcel嚗<6C>毽瘛<E6AFBD><E7989B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PDF嚗?
步骤1: 导入待复筛文献
├── Tab1: 从标题摘要初筛导入
├── Tab2: 手动上传Excel ❌ 错误设计
│ └── 上传包含文献信息的Excel混淆了元信息和PDF
└── Tab3: 从知识库选择
```
**<EFBFBD>躰秤<EFBFBD>?*嚗?
**错误点**
- Tab2暗示可以通过Excel导入PDF但Excel不可能包含PDF文件
- 瘝⊥<EFBFBD><EFBFBD><EFBFBD>"<22><><EFBFBD><E8AE83><EFBFBD>?<3F>?PDF<44><EFBFBD>"銝支葵璁<E891B5>
- 没有区分"文献元信息"和"PDF全文"两个概念
- 流程不清晰,用户容易混淆
---
## <EFBFBD>?**靚<><EFBFBD>𡒊<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
## ✅ **调整后的正确逻辑**
### 銝㗇郊瘚<EFBFBD><EFBFBD>嚗?
### 三步流程:
```
步骤1: 获取待复筛的文献列表(只获取元信息)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Tab1: 隞擧<EFBFBD>憸䀹<EFBFBD><EFBFBD><EFBFBD>蝑𥕦紡<EFBFBD>?
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> 撖澆<E69296>銝𠹺<E98A9D><F0A0B9BA><EFBFBD>"撌脩熙<E884A9>?<3F><><EFBFBD><EFBFBD><EFBFBD>靽⊥<E99DBD>
├── Tab1: 从标题摘要初筛导入
│ └── 导入上一环节"已纳入"的文献元信息
└── Tab2: 手动上传Excel
└── 上传包含文献元信息的ExcelTitle, Abstract, PMID等
└── 不包含PDF文件
甇仿炊2: 銝𠹺<E98A9D><F0A0B9BA><EFBFBD><E586BD><EFBFBD>讃嚗<E8AE83>蛹瘥讐<E798A5><E8AE90><EFBFBD>讃銝𠹺<E98A9D>PDF嚗?
步骤2: 上传全文文献(为每篇文献上传PDF
├── 显示文献列表表格
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 瘥讛<E798A5><E8AE9B>曄內PDF<44><EFBFBD><E59786><EFBFBD><EFBFBD><E695BA>隡?銝𠹺<E98A9D>銝?撌脣停蝏?憭梯揖嚗?
├── 每行显示PDF状态待上传/上传中/已就绪/失败)
└── 操作列提供两种方式:
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (1) <20>见𢆡銝𠹺<E98A9D>PDF嚗㇈VP敶枏<E695B6><E69E8F><EFBFBD>嚗?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (2) 隞𡒊䰻霂<E4B0BB><E99C82><EFBFBD>㗇𥋘嚗<F0A58B98><E59A97><EFBFBD><EFBFBD>箏𦛚嚗?
├── (1) 手动上传PDFMVP当前方式
└── (2) 从知识库选择(技术债务)
步骤3: 启动全文复筛
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E996AC>嚗朞秐撠?蝭<><E89DAD><EFBFBD><EFBFBD>PDF撌脣停蝏?
└── 要求至少1篇文献的PDF已就绪
```
---
## 📝 **详细修改内容**
### **1. 甇仿炊1<EFBFBD><EFBFBD>嚗朞繮<EFBFBD><EFBFBD>憭滨<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵?*
### **1. 步骤1改名获取待复筛的文献列表**
**靽格㺿<EFBFBD>?*嚗?
**修改前**
```
甇仿炊1: 撖澆<E69296><EFBFBD><E695BA>蝑𥟇<E89D91><F0A59F87>?
步骤1: 导入待复筛文献
```
**靽格㺿<EFBFBD>?*嚗?
**修改后**
```
步骤1: 获取待复筛的文献列表
霂湔<EFBFBD>嚗𡁻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>箸𧋦靽⊥<EFBFBD><EFBFBD><EFBFBD>憸塩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗㚁<EFBFBD>PDF<EFBFBD><EFBFBD><EFBFBD>銁銝衤<EFBFBD>甇乩<EFBFBD>隡?
说明首先导入文献的基本信息标题、摘要、作者等PDF全文将在下一步上传
```
**<EFBFBD>孵𢆡<EFBFBD><EFBFBD>眏**嚗?
- <EFBFBD>𡒊霂湔<EFBFBD>餈嗘<EFBFBD>甇亙蘨<EFBFBD><EFBFBD>"<22><><EFBFBD>𡑒”"嚗<><E59A97>靽⊥<E99DBD>嚗?
**改动理由**
- 明确说明这一步只获取"文献列表"(元信息)
- 不包含PDF文件
---
### **2. Tab2<EFBFBD><EFBFBD>嚗𡁏<EFBFBD><EFBFBD><EFBFBD>隡𪊲xcel嚗<EFBFBD><EFBFBD><EFBFBD>靽⊥<EFBFBD>嚗?*
### **2. Tab2改名手动上传Excel只含元信息**
**靽格㺿<EFBFBD>?*嚗?
**修改前**
```jsx
Tab2: 手动上传Excel
<EFBFBD>讛膩嚗帋<EFBFBD>隡惩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵函<EFBFBD>Excel<EFBFBD><EFBFBD>辣嚗<EFBFBD><EFBFBD> <EFBFBD>霂湔<EFBFBD>銝滚鉄PDF嚗?
描述上传包含文献列表的Excel文件 没有说明不含PDF
```
**靽格㺿<EFBFBD>?*嚗?
**修改后**
```jsx
Tab2: 手动上传Excel
霂湔<EFBFBD>嚗帋<EFBFBD>隡惩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>xcel<EFBFBD><EFBFBD>辣嚗<EFBFBD><EFBFBD>憸塩<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MID蝑㚁<EFBFBD>嚗䔶<EFBFBD><EFBFBD><EFBFBD>鉄PDF<EFBFBD><EFBFBD><EFBFBD><EFBFBD>DF<EFBFBD><EFBFBD><EFBFBD>銁銝衤<EFBFBD>甇乩<EFBFBD>隡𨬭<EFBFBD>?
说明上传包含文献元信息的Excel文件标题摘要PMID等不包含PDF文件PDF全文将在下一步上传
Excel踎摮埈挾霂湔<EFBFBD>?
<EFBFBD>摮埈挾嚗?
<EFBFBD>?Title<EFBFBD><EFBFBD>憸矋<EFBFBD>
<EFBFBD>?Abstract<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Excel模板字段说明
必填字段
Title标题
Abstract摘要
可选字段
<EFBFBD>?PMID<EFBFBD><EFBFBD>OI<EFBFBD><EFBFBD>uthors<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ournal<EFBFBD><EFBFBD><EFBFBD>𠺪<EFBFBD><EFBFBD><EFBFBD>ear<EFBFBD>僑隞踝<EFBFBD>
PMIDDOIAuthors作者Journal期刊Year年份
```
**<EFBFBD>孵𢆡<EFBFBD><EFBFBD>眏**嚗?
**改动理由**
- 明确说明"不包含PDF文件"
- 提供Excel模板字段说明
- 添加"下载Excel模板"按钮
@@ -102,168 +102,168 @@ Excel模板字段说明
### **3. 删除Tab3从知识库选择**
**靽格㺿<EFBFBD>?*嚗?
**修改前**
```
Tab3: 从知识库选择
```
**靽格㺿<EFBFBD>?*嚗?
**修改后**
```
<EFBFBD><EFBFBD><EFBFBD>三ab3嚗𣬚䰻霂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝘餃<EFBFBD>甇仿炊2嚗?
删除Tab3知识库功能移到步骤2
```
**<EFBFBD>孵𢆡<EFBFBD><EFBFBD>眏**嚗?
- <EFBFBD><EFBFBD>摨㯄<EFBFBD>㗇𥋘摨磰砲<EFBFBD>?銝𠹺<E98A9D>PDF"<22><EFBFBD>嚗諹<E59A97><EFBFBD><E494B6>?<3F><EFBFBD><E79195><EFBFBD><EFBFBD>𡑒”"<22><EFBFBD>
- <EFBFBD><EFBFBD>巁ab<EFBFBD><EFBFBD>嚗?銝枚ab<61><EFBFBD><E6B994><EFBFBD>
**改动理由**
- 知识库选择应该在"上传PDF"环节,而不是"获取文献列表"环节
- 简化Tab数量2个Tab更清晰
---
### **4. 步骤2重命名上传全文文献**
**靽格㺿<EFBFBD>?*嚗?
**修改前**
```
甇仿炊2: <20><EFBFBD><E586BD><EFBFBD>銝𡒊恣<F0A1928A>?
步骤2: 全文获取与管理
```
**靽格㺿<EFBFBD>?*嚗?
**修改后**
```
步骤2: 上传全文文献
霂湔<EFBFBD>嚗帋蛹瘥讐<EFBFBD><EFBFBD><EFBFBD>讃銝𠹺<EFBFBD>撖孵<EFBFBD><EFBFBD><EFBFBD>DF<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>臭誑<EFBFBD>见𢆡銝𠹺<EFBFBD><EFBFBD>砍𧑐PDF<EFBFBD><EFBFBD>辣嚗峕<EFBFBD>隞𡒊䰻霂<EFBFBD><EFBFBD><EFBFBD>㗇𥋘撌脫<EFBFBD>PDF嚗<EFBFBD><EFBFBD><EFBFBD>睲葉嚗剹<EFBFBD>?
说明为每篇文献上传对应的PDF全文。您可以手动上传本地PDF文件或从知识库选择已有PDF开发中
```
**<EFBFBD>孵𢆡<EFBFBD><EFBFBD>眏**嚗?
- "銝𠹺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃"瘥?<3F><EFBFBD><E586BD><EFBFBD>銝𡒊恣<F0A1928A>?<3F><EFBFBD>蝖?
- <EFBFBD>𡒊霂湔<EFBFBD>餈嗘<EFBFBD>甇亦<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?銝𠹺<E98A9D>PDF"
**改动理由**
- "上传全文文献"比"全文获取与管理"更明确
- 明确说明这一步的目的是"上传PDF"
---
### **5. 操作列增强:支持两种上传方式**
**靽格㺿<EFBFBD>?*嚗?
**修改前**
```jsx
操作列
- 未上传[上传PDF]按钮
- 撌脣停蝏迎<EFBFBD><EFBFBD>曄內"撌脣停蝏?
- 已就绪显示"已就绪"
```
**靽格㺿<EFBFBD>?*嚗?
**修改后**
```jsx
操作列
- <EFBFBD><EFBFBD>?憭梯揖嚗?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> [銝𠹺<EFBFBD>PDF]<EFBFBD>厰僼嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隡䭾𧋦<EFBFBD>訐DF嚗?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<EFBFBD><EFBFBD>摨𨩇<EFBFBD>厰僼嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摨㯄<EFBFBD>㗇𥋘嚗峕<EFBFBD><EFBFBD>鍂嚗?
- 未上传/失败
[上传PDF]按钮手动上传本地PDF
[知识库]按钮从知识库选择暂禁用
- 已就绪
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>?撌脣<EFBFBD><EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<EFBFBD>齿鰵銝𠹺<EFBFBD>]<EFBFBD>厰僼嚗<EFBFBD><EFBFBD>霈豢𤜯<EFBFBD>DF嚗?
已完成
[重新上传]按钮允许替换PDF
```
**<EFBFBD>孵𢆡<EFBFBD><EFBFBD>眏**嚗?
**改动理由**
- 提供两种上传方式选项
- 撌脣停蝏芰<EFBFBD><EFBFBD><EFBFBD>讃銋笔虾隞仿<EFBFBD><EFBFBD><EFBFBD>隡?
- 已就绪的文献也可以重新上传
---
### **6. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>撌亙<EFBFBD><EFBFBD>?*
### **6. 批量操作工具栏**
**<EFBFBD><EFBFBD>**嚗?
**新增**
```jsx
步骤2顶部工具栏
- 撌虫儒嚗𡁜歇<EFBFBD>㗇𥋘 X ?| [<EFBFBD><EFBFBD><EFBFBD>𣳇膄]<EFBFBD>厰僼
- <EFBFBD>喃儒嚗靀隞𡒊䰻霂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖澆<EFBFBD>]<EFBFBD>厰僼嚗<EFBFBD><EFBFBD><EFBFBD>鍂嚗?
- 左侧已选择 X | [批量删除]按钮
- 右侧[从知识库批量导入]按钮暂禁用
```
**<EFBFBD>孵𢆡<EFBFBD><EFBFBD>眏**嚗?
**改动理由**
- 支持批量操作
- 銝箸𧊋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摨𤘪鸌<EFBFBD>誩紡<EFBFBD>仿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- 为未来的知识库批量导入预留入口
---
### **7. 提示信息优化**
**靽格㺿<EFBFBD>?*嚗?
**修改前**
```
<EFBFBD>鞟內嚗朞秐撠煾<EFBFBD>閬?蝭<><E89DAD><EFBFBD><EFBFBD>PDF撌脣停蝏芣<E89D8F><E88AA3>賢鍳<E8B3A2><EFBFBD>蝑𥕢遙<F0A595A2><EFBFBD>?
提示至少需要1篇文献的PDF已就绪才能启动复筛任务。
```
**靽格㺿<EFBFBD>?*嚗?
**修改后**
```
<EFBFBD><EFBFBD>隡牐遙雿𠠬DF嚗?
<EFBFBD>鞟內嚗朞秐撠煾<EFBFBD>閬?蝭<><E89DAD><EFBFBD><EFBFBD>PDF撌脣停蝏芣<E89D8F><E88AA3>賢鍳<E8B3A2><EFBFBD>蝑𥕢遙<F0A595A2><EFBFBD><EFBD9E><EFBFBD>孵稬銵冽聢銝剔<E98A9D><E58994>𣂷<EFBFBD>隡蘯DF<44><EFBFBD><E78390>桐蛹<E6A190><E89BB9>讃銝𠹺<E98A9D><F0A0B9BA><EFBFBD><E586BD>?
未上传任何PDF
提示至少需要1篇文献的PDF已就绪才能启动复筛任务。请点击表格中的【上传PDF】按钮为文献上传全文。
部分PDF已就绪
<EFBFBD>鞟內嚗𡁜歇<EFBFBD>?X 蝭<><E89DAD><EFBFBD><EFBFBD>PDF撠梁貌嚗諹<E59A97><E8ABB9>?Y 蝭<><E89DAD>銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD><EFBFBD>臭誑蝏抒賒銝𠹺<E98A9D><F0A0B9BA><EFBFBD>PDF嚗峕<E59A97><E5B395>湔𦻖<E6B994>臬𢆡憭滨<E686AD><EFBFBD>𧊋銝𠹺<E98A9D>PDF<44><46><EFBFBD><EFBFBD><EFBFBD>鋡怨歲餈<E6ADB2><E9A488><EFBFBD>?
提示:已有 X 篇文献的PDF就绪还有 Y 篇待上传。您可以继续上传剩余PDF或直接启动复筛未上传PDF的文献将被跳过
全部PDF已就绪
<EFBFBD>鞟內嚗𡁜歇<EFBFBD>?X 蝭<><E89DAD><EFBFBD><EFBFBD>PDF撠梁貌嚗<E8B28C>虾隞亙鍳<E4BA99><EFBFBD><E585B8><EFBFBD><EFBFBD>蝑𥕢遙<F0A595A2>?
提示:已有 X 篇文献的PDF就绪可以启动全文复筛任务
```
**<EFBFBD>孵𢆡<EFBFBD><EFBFBD>眏**嚗?
- <EFBFBD>寞旿銝滚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>遬蝷箔<EFBFBD><EFBFBD><EFBFBD>蝷?
**改动理由**
- 根据不同状态显示不同提示
- 明确告知操作步骤
---
## <EFBFBD> **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*
## 🎯 **核心改进点**
### **<EFBFBD><EFBFBD><EFBFBD>氖**嚗?
### **概念分离**
```
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>甇仿炊1嚗?
<EFBFBD>?
PDF<EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣嚗<EFBFBD>郊撉?嚗?
<EFBFBD>?
<EFBFBD>臬𢆡蝑偦<EFBFBD><EFBFBD>甇仿炊3嚗?
文献元信息步骤1
PDF全文文件步骤2
启动筛选步骤3
```
### **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗?
### **流程清晰化**
1. **步骤1**:获取文献列表(只要标题、摘要等元信息)
2. **甇仿炊2**嚗帋蛹瘥讐<E798A5><E8AE90><EFBFBD>讃銝𠹺<E98A9D>PDF嚗<46><E59A97>撖嫣<E69296><E5ABA3><EFBFBD>嚗?
3. **甇仿炊3**嚗𡁜鍳<F0A1819C><EFBFBD><E585B8><EFBFBD><EFBFBD>蝑𨥈<E89D91><EFBFBD><E996AC><EFBFBD><EFBFBD>1蝭𤊿DF撠梁貌嚗?
2. **步骤2**为每篇文献上传PDF一对一关联
3. **步骤3**启动全文复筛要求至少1篇PDF就绪
---
## 📊 **修改统计**
```
靽格㺿<EFBFBD><EFBFBD>辣嚗?銝?
- FulltextSettings.tsx (621銵?
修改文件1个
- FulltextSettings.tsx (621行)
靽格㺿<EFBFBD><EFBFBD>捆嚗?
- <EFBFBD>𣳇膄隞<EFBFBD><EFBFBD>嚗鰺50銵䕘<EFBFBD><EFBFBD>𣳇膄Tab3<EFBFBD><EFBFBD>摨㯄<EFBFBD>㗇𥋘嚗?
修改内容:
- 删除代码:~50行删除Tab3知识库选择
- 修改代码:~150行重写步骤说明、提示信息
- 新增代码:~30行批量操作工具栏、重新上传按钮
Linter<EFBFBD>躰秤嚗?銝?
Linter错误0个
```
---
## <EFBFBD>?**撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>**
## ✅ **验收标准**
### **UI撅閧內**嚗?
- <EFBFBD>?甇仿炊1<E7828A>?銝枚ab嚗<62><E59A97><EFBFBD><EFBFBD>撖澆<E69296> / <20>见𢆡銝𠹺<E98A9D>Excel嚗?
- <EFBFBD>?甇仿炊1<E7828A><31>xcel銝𠹺<E98A9D><F0A0B9BA>𡒊霂湔<E99C82>"銝滚<E98A9D><E6BB9A>DF"
- <EFBFBD>?甇仿炊2<E7828A><32><EFBFBD>銝?銝𠹺<E98A9D><F0A0B9BA><EFBFBD><E586BD><EFBFBD>"
- <EFBFBD>?甇仿炊2瘥讛<E798A5><E8AE9B>?銝𠹺<E98A9D>PDF"<22>?<3F><EFBFBD>摨?<3F>厰僼
- <EFBFBD>?甇仿炊2<E7828A><32><EFBFBD>蝷箸覔<E7AEB8>娑DF<44><EFBFBD><E59786>𢆡<EFBFBD><F0A286A1><EFBFBD><EFBFBD>?
### **UI展示**
- ✅ 步骤1有2个Tab从初筛导入 / 手动上传Excel
- ✅ 步骤1的Excel上传明确说明"不包含PDF"
- ✅ 步骤2标题为"上传全文文献"
- ✅ 步骤2每行有"上传PDF"和"知识库"按钮
- ✅ 步骤2的提示根据PDF状态动态变化
### **<EFBFBD><EFBFBD><EFBFBD>**嚗?
- <EFBFBD>?Excel<EFBFBD>芸紡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>靽⊥<EFBFBD>
- <EFBFBD>?PDF<EFBFBD><EFBFBD>銵冽聢銝剔<EFBFBD>"銝𠹺<E98A9D>PDF"<22>厰僼<E58EB0>𣂷葵銝𠹺<E98A9D>
- <EFBFBD>?<3F><EFBFBD>摨枏<E691A8><E69E8F>賢銁甇仿炊2嚗䔶<E59A97><E494B6>冽郊撉?
- <EFBFBD>?<3F><><EFBFBD><EFBFBD><E585B8><EFBFBD>讃瘝⊥<E7989D>PDF銋笔虾隞亙鍳<E4BA99>其遙<E585B6>?
### **逻辑正确**
- Excel只导入文献元信息
- PDF通过表格中的"上传PDF"按钮逐个上传
- ✅ 知识库功能在步骤2不在步骤1
- ✅ 允许部分文献没有PDF也可以启动任务
---
## 🚀 **后续工作**
### **隡睃<EFBFBD>蝥判1嚗<EFBFBD><EFBFBD>憿鳴<EFBFBD>**嚗?
1. <EFBFBD>?<3F>滨垢<E6BBA8><EFBFBD><EFBFBD>㟲嚗<E39FB2>歇摰峕<E691B0>嚗?
2. <EFBFBD>?摰䂿緵Excel閫<6C><E996AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E99E89><EFBFBD>靽⊥<E99DBD>嚗?
3. <EFBFBD>?摰䂿緵PDF銝𠹺<E98A9D>API撖寞𦻖
### **优先级P1必须**
1. ✅ 前端逻辑调整(已完成)
2. ⏳ 实现Excel解析功能解析文献元信息
3. ⏳ 实现PDF上传API对接
### **隡睃<EFBFBD>蝥判2嚗<EFBFBD>遣霈殷<EFBFBD>**嚗?
1. PDF<EFBFBD><EFBFBD>銝𠹺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝枉DF<EFBFBD><EFBFBD>辣嚗?
### **优先级P2建议**
1. PDF批量上传拖拽多个PDF文件
2. 从知识库选择PDF功能
3. Excel模板下载功能
@@ -271,23 +271,22 @@ Linter错误
## 📝 **备注**
### **<EFBFBD>喲睸霈曇恣<EFBFBD><EFBFBD>**嚗?
1. **<EFBFBD><EFBFBD><EFBFBD>氖**嚗𡁏<E59A97><F0A1818F><EFBFBD>靽⊥<E99DBD> <20>?PDF<44><46>
### **关键设计原则**
1. **概念分离**:文献元信息 ≠ PDF文件
2. **流程清晰**:三步流程,逐步推进
3. **<EFBFBD>菜暑<EFBFBD>?*嚗𡁜<E59A97>霈賊<E99C88><E8B38A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PDF銋笔虾<E7AC94>臬𢆡
3. **灵活性**允许部分文献无PDF也可启动
### **<EFBFBD><EFBFBD>雿㯄<EFBFBD>隡睃<EFBFBD>**嚗?
### **用户体验优化**
- 每一步都有清晰的说明
- 銝滚<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝷?
- 不同状态有不同的提示
- 支持重新上传PDF
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>摨枏<EFBFBD><EFBFBD>?
- 预留知识库入口
---
**文档版本**: v1.0
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*: 2025-01-23
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**: [2025-01-23_<EFBFBD><EFBFBD>憭滨<EFBFBD><EFBFBD>滨垢撘<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?md](./2025-01-23_<EFBFBD><EFBFBD>憭滨<EFBFBD><EFBFBD>滨垢撘<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?md)
**最后更新**: 2025-01-23
**相关文档**: [2025-01-23_全文复筛前端开发完成.md](./2025-01-23_全文复筛前端开发完成.md)