Files
leaudit-platform-frontend/docs/routes-documentation.md
T
2025-12-05 00:09:32 +08:00

1090 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目路由文档
## 目录
- [认证相关路由](#认证相关路由)
- [主页路由](#主页路由)
- [文档管理路由](#文档管理路由)
- [交叉评查路由](#交叉评查路由)
- [合同模板路由](#合同模板路由)
- [AI对话路由](#ai对话路由)
- [配置管理路由](#配置管理路由)
- [API路由](#api路由)
- [示例与调试路由](#示例与调试路由)
---
## 认证相关路由
### 1. `/login` - 登录页
**文件:** `app/routes/login.tsx`
**功能:**
- 双登录模式:OAuth2.0统一身份认证 + 管理员账号密码登录
- 卡片翻转动画切换登录方式
- OAuth登录流程:生成state → 跳转IDaaS → 回调处理
- 管理员登录:调用后端API验证账号密码
**Loader**
- 检查用户是否已登录,已登录则重定向到首页
- 读取session中的错误信息(来自OAuth回调)
- 保存重定向目标URL到session
**关键逻辑:**
```typescript
// OAuth登录
const oauthClient = new OAuthClient(CLIENT_OAUTH_CONFIG);
const state = oauthClient.generateState();
const authorizeUrl = oauthClient.getAuthorizeUrl(state);
window.location.href = authorizeUrl;
// 管理员登录
const response = await loginWithPassword(username, password);
storeLoginData(access_token, user_info);
```
---
### 2. `/callback` - OAuth回调
**文件:** `app/routes/callback.tsx`
**功能:**
- 处理OAuth2.0授权回调
- 验证state参数防止CSRF攻击
- 获取访问令牌(access_token
- 获取用户信息
- 调用后端登录接口获取JWT
- 创建用户session
**Loader流程:**
1. 验证回调参数(code、state、error
2. 使用code交换access_token
3. 使用access_token获取用户信息
4. 调用`loginWithOAuth`接口同步用户到本地数据库
5. 创建前端JWT并存储到session
6. 重定向到目标页面
**端口到地区映射:**
```typescript
const PORT_TO_AREA_MAP = {
'51703': '梅州',
'51704': '云浮',
'51705': '揭阳',
'51706': '潮州',
'51707': '省局'
};
```
**错误处理:**
- OAuth失败:调用IDaaS登出,清除登录状态
- 使用session flash传递错误信息到登录页
---
### 3. `/logout` - 登出
**文件:** `app/routes/logout.tsx`
**功能:**
- 清除本地session
- 调用IDaaS单点登出(仅OAuth用户)
- 重定向到登录页
**Loader逻辑:**
```typescript
const isAdmin = userRole === 'admin';
if (accessToken && !isAdmin) {
// 调用IDaaS登出
await oauthClient.logout(accessToken, redirectUrl);
}
// 销毁session
await sessionStorage.destroySession(session);
```
---
## 主页路由
### 4. `/` - 入口页
**文件:** `app/routes/_index.tsx`
**功能:**
- 欢迎页面,展示三大功能模块
- 根据端口号动态显示/隐藏模块
- 实时显示日期时间
- 用户信息展示与登出
**模块导航:**
1. **合同管理**`/contract-template/search`51707端口隐藏)
2. **案卷智能评查**`/home`
3. **智慧法务大模型**`/chat-with-llm`
**端口限制:**
- 端口51707(省局):隐藏合同管理模块
- 其他端口:显示全部三个模块
**Loader**
- 验证用户登录状态
- 未登录重定向到`/login`
---
### 5. `/home` - 系统概览(首页)
**文件:** `app/routes/home.tsx`
**功能:**
- 数据统计仪表盘
- 快捷访问入口
- 最近文档列表
- 实时数据刷新(10秒轮询)
**核心数据:**
1. **今日待审文件数**
2. **本月已审核文件数**(含同比增长)
3. **本月审核通过率**(含同比增长)
4. **本月问题检出数**(含同比增长)
**客户端逻辑:**
-`sessionStorage`读取`reviewType`contract/record
- 根据类型加载对应统计数据
- 监听`reviewType`变化自动刷新数据
- 每10秒自动刷新最近文档列表
**Loader**
- 返回初始空数据(实际数据由客户端异步加载)
- 传递`userRole``userInfo``frontendJWT`
---
## 文档管理路由
### 6. `/documents` - 文档列表(布局)
**文件:** `app/routes/documents.tsx`
**功能:** 嵌套路由容器,提供面包屑导航
---
### 7. `/documents` (Index) - 文档列表页
**文件:** `app/routes/documents._index.tsx`
**功能:**
- 文档搜索与筛选
- 分页显示文档列表
- 查看文档详情
- 文档上传、编辑、删除
**筛选条件:**
- 文档名称搜索
- 文档类型过滤
- 审核状态过滤
- 时间范围筛选
---
### 8. `/documents/upload` - 文档上传
**文件:** `app/routes/documents.upload.tsx`
**功能:**
- 文件上传(PDF/DOCX
- 文档类型选择
- 评查点配置
- 上传进度显示
---
### 9. `/documents/edit` - 文档编辑
**文件:** `app/routes/documents.edit.tsx`
**功能:**
- 修改文档信息
- 更新文档类型
- 修改评查点配置
---
### 10. `/documents/download` - 文档下载
**文件:** `app/routes/documents.download.tsx`
**功能:**
- 处理文档下载请求
- 支持批量下载
---
## 交叉评查路由
### 11. `/cross-checking` - 交叉评查(布局)
**文件:** `app/routes/cross-checking.tsx`
**功能:** 嵌套路由容器
---
### 12. `/cross-checking` (Index) - 任务列表
**文件:** `app/routes/cross-checking._index.tsx`
**功能:**
- 交叉评查任务列表
- 任务状态筛选(待处理/进行中/已完成)
- 查看任务详情
- 创建新任务
**任务状态:**
- `pending` - 待处理
- `in_progress` - 进行中
- `completed` - 已完成
- `arbitrated` - 已仲裁
---
### 13. `/cross-checking/upload` - 上传评查文档
**文件:** `app/routes/cross-checking.upload.tsx`
**功能:**
- 上传需要交叉评查的文档
- 分配评查人员
- 设置评查截止时间
---
### 14. `/cross-checking/result` - 评查结果
**文件:** `app/routes/cross-checking.result.tsx`
**功能:**
- 查看评查结果
- 提交评分意见
- 发起提案
- 投票表决
**民主决策流程:**
1. 评查人员提交评分
2. 发起修改提案
3. 其他评查人员投票
4. 达到阈值自动通过/驳回
---
## 合同模板路由
### 15. `/contract-template` - 合同模板(布局)
**文件:** `app/routes/contract-template.tsx`
**功能:** 嵌套路由容器
---
### 16. `/contract-template/search` - 模板搜索
**文件:** `app/routes/contract-template.search._index.tsx`
**功能:**
- 合同模板关键词搜索
- 模板分类浏览
- 快速筛选
---
### 17. `/contract-template/search/results` - 搜索结果
**文件:** `app/routes/contract-template.search.results.tsx`
**功能:**
- 展示搜索结果列表
- 高亮关键词
- 预览模板内容
---
### 18. `/contract-template/list` - 模板列表
**文件:** `app/routes/contract-template.list._index.tsx`
**功能:**
- 所有合同模板列表
- 模板分类管理
- 模板上传/下载
---
### 19. `/contract-template/detail/:id` - 模板详情
**文件:** `app/routes/contract-template.detail.$id.tsx`
**功能:**
- 查看模板详细信息
- 在线预览模板内容
- 下载模板文件
**动态路由参数:**
- `:id` - 模板ID
---
## AI对话路由
### 20. `/chat-with-llm` - AI对话(布局)
**文件:** `app/routes/chat-with-llm.tsx`
**功能:** 嵌套路由容器
---
### 21. `/chat-with-llm` (Index) - 对话界面
**文件:** `app/routes/chat-with-llm._index.tsx`
**功能:**
- AI法务助手对话界面
- 多轮对话管理
- 会话历史记录
- 文件上传辅助分析
**核心特性:**
- 支持上下文对话
- 法律条文引用
- 案例分析
- 文档解读
---
## 配置管理路由
### 22. `/rules` - 评查点管理(布局)
**文件:** `app/routes/rules.tsx`
**功能:** 评查规则管理容器
**权限:** 仅开发者角色可访问
---
### 23. `/rules` (Index) - 评查点列表
**文件:** `app/routes/rules._index.tsx`
**功能:**
- 评查点列表展示
- 评查点搜索与筛选
- 启用/禁用评查点
- 删除评查点
---
### 24. `/rules/new` - 新建评查点
**文件:** `app/routes/rules-new.tsx`
**功能:**
- 创建新评查点
- 配置评查规则
- 设置评分标准
---
### 25. `/rule-groups` - 评查点分组(布局)
**文件:** `app/routes/rule-groups.tsx`
**功能:** 评查点分组管理容器
---
### 26. `/rule-groups` (Index) - 分组列表
**文件:** `app/routes/rule-groups._index.tsx`
**功能:**
- 评查点分组列表
- 分组管理(增删改)
- 分配评查点到分组
---
### 27. `/rule-groups/new` - 新建分组
**文件:** `app/routes/rule-groups.new.tsx`
**功能:**
- 创建新分组
- 设置分组名称和描述
---
### 28. `/prompts` - 提示词管理(布局)
**文件:** `app/routes/prompts.tsx`
**功能:** 提示词模板管理容器
**权限:** 仅开发者角色可访问
---
### 29. `/prompts` (Index) - 提示词列表
**文件:** `app/routes/prompts._index.tsx`
**功能:**
- AI提示词模板列表
- 提示词搜索
- 启用/禁用模板
- 删除模板
**提示词类型:**
- LLM提示词(文本模型)
- VLM提示词(多模态模型)
---
### 30. `/prompts/new` - 新建提示词
**文件:** `app/routes/prompts.new.tsx`
**功能:**
- 创建新提示词模板
- 配置提示词变量
- 预览提示词效果
---
### 31. `/document-types` - 文档类型管理(布局)
**文件:** `app/routes/document-types.tsx`
**功能:** 文档类型管理容器
**权限:** 仅开发者角色可访问
---
### 32. `/document-types` (Index) - 文档类型列表
**文件:** `app/routes/document-types._index.tsx`
**功能:**
- 文档类型列表
- 类型管理(增删改)
- 绑定评查点模板
**预设类型:**
- 类型1:合同
- 类型2:许可卷宗(类型2
- 类型3:许可卷宗(类型3
---
### 33. `/document-types/new` - 新建文档类型
**文件:** `app/routes/document-types.new.tsx`
**功能:**
- 创建新文档类型
- 配置类型属性
---
### 34. `/config-lists` - 配置列表管理(布局)
**文件:** `app/routes/config-lists.tsx`
**功能:** 系统配置管理容器
**权限:** 仅开发者角色可访问
---
### 35. `/config-lists` (Index) - 配置列表
**文件:** `app/routes/config-lists._index.tsx`
**功能:**
- 系统配置项列表
- 配置项管理
---
### 36. `/config-lists/new` - 新建配置
**文件:** `app/routes/config-lists.new.tsx`
**功能:**
- 创建新配置项
- 设置配置值
---
## API路由
### 37. `/api/oauth/token` - OAuth Token代理
**文件:** `app/routes/api.oauth.token.tsx`
**功能:**
- 代理OAuth token请求
- 避免在客户端暴露client_secret
**方法:** POST
---
### 38. `/api/oauth/userinfo` - OAuth用户信息代理
**文件:** `app/routes/api.oauth.userinfo.tsx`
**功能:**
- 代理OAuth用户信息请求
- 返回用户基本信息
**方法:** GET
---
### 39. `/api/file-upload` - 文件上传(AI对话)
**文件:** `app/routes/api.file-upload.tsx`
**功能:**
- 处理AI对话中的文件上传
- 使用Dify客户端上传文件
**方法:** POST
**请求体:**
```typescript
FormData {
file: File
}
```
**响应:**
```typescript
{
id: string // 上传ID
}
```
---
### 40. `/api/pdf-proxy` - PDF代理
**文件:** `app/routes/api.pdf-proxy.tsx`
**功能:**
- 代理PDF文件请求
- 解决跨域问题
- 支持PDF流式传输
**方法:** GET
**查询参数:**
- `url` - PDF文件URL
---
### 41. `/api/conversations` - 会话管理
**文件:** `app/routes/api.conversations.tsx`
**功能:**
- 获取AI对话会话列表
- 创建新会话
**方法:** GET, POST
---
### 42. `/api/conversations/:id` - 单个会话操作
**文件:** `app/routes/api.conversations.$id.tsx`
**功能:**
- 获取会话详情
- 删除会话
**方法:** GET, DELETE
**动态参数:**
- `:id` - 会话ID
---
### 43. `/api/conversations/:id/name` - 修改会话名称
**文件:** `app/routes/api.conversations.$id.name.tsx`
**功能:**
- 更新会话名称
**方法:** PATCH
---
### 44. `/api/chat-messages` - 发送消息
**文件:** `app/routes/api.chat-messages.tsx`
**功能:**
- 发送AI对话消息
- 流式响应
**方法:** POST
**请求体:**
```typescript
{
query: string, // 用户消息
conversation_id?: string, // 会话ID(可选)
files?: Array<{ // 附件(可选)
type: string,
transfer_method: string,
upload_file_id: string
}>
}
```
---
### 45. `/api/messages` - 消息历史
**文件:** `app/routes/api.messages.tsx`
**功能:**
- 获取会话消息历史
**方法:** GET
**查询参数:**
- `conversation_id` - 会话ID
---
### 46. `/api/parameters` - 应用参数
**文件:** `app/routes/api.parameters.tsx`
**功能:**
- 获取AI应用配置参数
**方法:** GET
---
## 示例与调试路由
### 47. `/examples/message-modal` - 消息弹窗示例
**文件:** `app/routes/examples/message-modal.tsx`
**功能:**
- MessageModal组件使用示例
- 演示确认框、提示框等
---
### 48. `/examples/toast` - Toast示例
**文件:** `app/routes/examples/toast.tsx`
**功能:**
- Toast组件使用示例
- 演示成功、错误、警告、信息提示
---
### 49. `/examples/pdfview` - PDF预览示例
**文件:** `app/routes/examples/pdfview.tsx`
**功能:**
- PDF预览组件示例
- 演示PDF在线查看功能
---
### 50. `/examples/TooltipExample` - Tooltip示例
**文件:** `app/routes/examples/TooltipExample.tsx`
**功能:**
- Tooltip组件使用示例
- 演示气泡提示效果
---
### 51. `/debug` - 调试页面
**文件:** `app/routes/debug.tsx`
**功能:**
- 开发调试工具
- 查看系统状态
- 测试功能
---
## 其他路由
### 52. `/files` - 文件管理(布局)
**文件:** `app/routes/files.tsx`
**功能:** 文件管理容器
---
### 53. `/files/upload` - 文件上传
**文件:** `app/routes/files.upload.tsx`
**功能:**
- 通用文件上传功能
- 支持多文件上传
---
### 54. `/rules-files` - 评查点文件管理
**文件:** `app/routes/rules-files.tsx`
**功能:**
- 评查点相关文件管理
---
### 55. `/reviews` - 评审管理
**文件:** `app/routes/reviews.tsx`
**功能:**
- 文档评审管理
---
### 56. `/contract-search` - 合同搜索(布局)
**文件:** `app/routes/contract-search.tsx`
**功能:** 合同搜索容器(可能已废弃,被contract-template替代)
---
### 57. `/contract-search` (Index) - 合同搜索页
**文件:** `app/routes/contract-search._index.tsx`
**功能:** 合同搜索功能(可能已废弃)
---
## 路由命名规范
### 1. 文件命名模式
**布局路由(Layout):**
```
routes/documents.tsx → /documents (布局)
routes/documents._index.tsx → /documents (Index页面)
routes/documents.upload.tsx → /documents/upload
```
**嵌套路由:**
```
routes/contract-template.tsx → /contract-template
routes/contract-template.search._index.tsx → /contract-template/search
routes/contract-template.search.results.tsx → /contract-template/search/results
```
**动态路由:**
```
routes/contract-template.detail.$id.tsx → /contract-template/detail/:id
routes/api.conversations.$id.tsx → /api/conversations/:id
```
**API路由:**
```
routes/api.file-upload.tsx → /api/file-upload
routes/api.oauth.token.tsx → /api/oauth/token
```
### 2. 路由分组
| 分组 | 前缀 | 说明 |
|------|------|------|
| 认证 | `/login`, `/logout`, `/callback` | 用户认证流程 |
| 主页 | `/`, `/home` | 系统入口和概览 |
| 文档 | `/documents/*` | 文档管理功能 |
| 交叉评查 | `/cross-checking/*` | 交叉评查系统 |
| 合同模板 | `/contract-template/*` | 合同模板管理 |
| AI对话 | `/chat-with-llm/*` | AI法务助手 |
| 配置 | `/rules/*`, `/prompts/*`, `/document-types/*` | 系统配置管理 |
| API | `/api/*` | 后端API代理 |
| 示例 | `/examples/*` | 组件示例 |
---
## 权限控制
### 开发者专属路由(Developer Only
以下路由仅`developer`角色可访问:
1. `/prompts` - 提示词管理
2. `/config-lists` - 配置列表管理
3. `/document-types` - 文档类型管理
4. `/rules` - 评查点管理
**实现方式:**
-`app/root.tsx`的loader中检查用户角色
- 侧边栏根据角色动态显示菜单项
- 路由loader中验证权限,未授权重定向
### 端口限制路由
**端口51707(省局)限制:**
- 隐藏合同管理入口(`/contract-template`
- 仅显示案卷智能评查和AI对话
**端口51708(测试实例)限制:**
- 仅允许访问`/cross-checking/*`路由
- 其他路由返回403
---
## Meta标签配置
每个路由都配置了SEO友好的meta标签:
```typescript
export const meta: MetaFunction = () => {
return [
{ title: "页面标题 - 中国烟草AI合同及卷宗审核系统" },
{ name: "description", content: "页面描述" }
];
};
```
---
## 面包屑导航
使用`handle`导出面包屑信息:
```typescript
export const handle = {
breadcrumb: "评查点列表"
};
```
在Layout组件中读取并显示面包屑导航。
---
## 路由加载器(Loader
### 认证检查模式
**全局认证:**
```typescript
// app/root.tsx
export async function loader({ request }: LoaderFunctionArgs) {
const { isAuthenticated, userRole } = await getUserSession(request);
if (!isAuthenticated && !isPublicRoute(url.pathname)) {
throw redirect("/login");
}
return { isAuthenticated, userRole };
}
```
**路由级认证:**
```typescript
export async function loader({ request }: LoaderFunctionArgs) {
const { isAuthenticated } = await getUserSession(request);
if (!isAuthenticated) {
return redirect("/login");
}
return { /* 数据 */ };
}
```
---
## 路由操作(Action
### 示例:登出操作
```typescript
export async function action({ request }: ActionFunctionArgs) {
const formData = await request.formData();
const intent = formData.get("intent");
if (intent === "logout") {
return logout(request);
}
return null;
}
```
### 示例:文件上传
```typescript
export async function action({ request }: ActionFunctionArgs) {
const formData = await request.formData();
const file = formData.get('file') as File;
// 处理文件上传
const uploadId = await uploadFile(file);
return json({ id: uploadId });
}
```
---
## 客户端状态管理
### SessionStorage使用
**reviewType管理:**
```typescript
// 保存类型
sessionStorage.setItem('reviewType', 'contract');
// 读取类型
const reviewType = sessionStorage.getItem('reviewType');
// 类型切换时刷新数据
useEffect(() => {
const reviewType = sessionStorage.getItem('reviewType');
loadData(reviewType);
}, []);
```
**用户信息:**
```typescript
sessionStorage.setItem('userInfo', JSON.stringify(userInfo));
sessionStorage.setItem('frontendJWT', jwt);
```
---
## 路由导航
### 编程式导航
```typescript
import { useNavigate } from '@remix-run/react';
const navigate = useNavigate();
// 导航到指定路由
navigate('/documents');
// 带状态导航
navigate('/documents/edit', { state: { documentId: 123 } });
// 替换历史记录
navigate('/login', { replace: true });
```
### 声明式导航
```typescript
import { Link } from '@remix-run/react';
<Link to="/documents"></Link>
<Link to={`/contract-template/detail/${id}`}></Link>
```
---
## 错误处理
### 路由级错误边界
```typescript
export function ErrorBoundary() {
const error = useRouteError();
if (isRouteErrorResponse(error)) {
return (
<div>
<h1>{error.status} {error.statusText}</h1>
<p>{error.data}</p>
</div>
);
}
return <div></div>;
}
```
---
## 开发建议
### 1. 路由组织
- 按功能模块分组
- 使用嵌套路由减少重复
- 布局路由放在顶层
### 2. 命名规范
- 使用语义化路由名称
- 动态参数使用`$`前缀
- API路由统一使用`api.`前缀
### 3. 性能优化
- 使用Loader预加载数据
- 避免客户端重复请求
- 使用缓存策略
### 4. 安全性
- 所有路由都应验证认证状态
- 敏感操作检查权限
- API路由添加CSRF保护
---
## 附录
### 完整路由树
```
/ # 入口页(模块选择)
├── /login # 登录页
├── /logout # 登出
├── /callback # OAuth回调
├── /home # 系统概览首页
├── /documents # 文档管理
│ ├── / # 文档列表
│ ├── /upload # 上传文档
│ ├── /edit # 编辑文档
│ └── /download # 下载文档
├── /cross-checking # 交叉评查
│ ├── / # 任务列表
│ ├── /upload # 上传评查文档
│ └── /result # 评查结果
├── /contract-template # 合同模板
│ ├── /search # 模板搜索
│ │ ├── / # 搜索页
│ │ └── /results # 搜索结果
│ ├── /list # 模板列表
│ └── /detail/:id # 模板详情
├── /chat-with-llm # AI对话
│ └── / # 对话界面
├── /rules # 评查点管理 [开发者]
│ ├── / # 评查点列表
│ └── /new # 新建评查点
├── /rule-groups # 评查点分组
│ ├── / # 分组列表
│ └── /new # 新建分组
├── /prompts # 提示词管理 [开发者]
│ ├── / # 提示词列表
│ └── /new # 新建提示词
├── /document-types # 文档类型管理 [开发者]
│ ├── / # 类型列表
│ └── /new # 新建类型
├── /config-lists # 配置管理 [开发者]
│ ├── / # 配置列表
│ └── /new # 新建配置
├── /api # API路由
│ ├── /oauth
│ │ ├── /token # Token代理
│ │ └── /userinfo # 用户信息代理
│ ├── /file-upload # 文件上传
│ ├── /pdf-proxy # PDF代理
│ ├── /conversations # 会话管理
│ │ ├── / # 会话列表/创建
│ │ └── /:id # 单个会话
│ │ └── /name # 修改名称
│ ├── /chat-messages # 发送消息
│ ├── /messages # 消息历史
│ └── /parameters # 应用参数
└── /examples # 示例页面
├── /message-modal # 消息弹窗示例
├── /toast # Toast示例
├── /pdfview # PDF预览示例
└── /TooltipExample # Tooltip示例
```
---
**文档版本:** 1.0
**最后更新:** 2025-11-17
**维护者:** 系统开发团队