docs: 添加 PostgREST 使用情况分析和删除确认功能文档
1. PostgREST 使用情况分析文档 - PostgREST使用情况-后端API替代建议.md: 完整的迁移建议和优先级分析 - PostgREST实际使用清单.md: 当前使用的 PostgREST 接口清单 - PostgREST未使用函数清单.md: 已封装但未使用的函数列表 - PostgREST请求模块清单.md: 所有请求模块的使用情况 2. 删除操作延迟确认功能实施文档 - 功能设计和实现细节 - 使用示例和最佳实践 - 技术实现说明 这些文档用于: - 追踪 PostgREST 到 FastAPI 的迁移进度 - 指导后续的接口迁移工作 - 记录 UI 改进的实施细节 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,582 @@
|
||||
# PostgREST 实际使用清单
|
||||
|
||||
> **本文档记录项目中实际使用 PostgREST 的模块**
|
||||
> **更新时间**: 2025-11-25
|
||||
> **PostgREST 客户端**: `app/api/postgrest-client.ts`
|
||||
|
||||
---
|
||||
|
||||
## 📋 目录
|
||||
|
||||
- [实际使用的模块](#实际使用的模块)
|
||||
- [1. 认证服务](#1-认证服务)
|
||||
- [2. 首页与统计](#2-首页与统计)
|
||||
- [3. 文档管理](#3-文档管理)
|
||||
- [4. 文件上传](#4-文件上传)
|
||||
- [5. 评查点管理](#5-评查点管理)
|
||||
- [6. 评查点分组](#6-评查点分组)
|
||||
- [7. 评查文件审核](#7-评查文件审核)
|
||||
- [8. 评审结果](#8-评审结果)
|
||||
- [9. 文档类型](#9-文档类型)
|
||||
- [10. 入口模块](#10-入口模块)
|
||||
- [11. 交叉评查](#11-交叉评查)
|
||||
- [12. 提示词模板](#12-提示词模板)
|
||||
- [13. 合同模板](#13-合同模板)
|
||||
- [14. 评查点编辑页面](#14-评查点编辑页面)
|
||||
- [排除列表](#排除列表)
|
||||
- [统计数据](#统计数据)
|
||||
|
||||
---
|
||||
|
||||
## 实际使用的模块
|
||||
|
||||
### 1. 认证服务
|
||||
|
||||
**文件路径**: `app/api/login/auth.server.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `saveUserInfo()` | 583 | `postgrestGet` | `sso_users` | 查询用户是否已存在 |
|
||||
| `saveUserInfo()` | 625 | `postgrestPut` | `sso_users` | 更新已存在用户信息 |
|
||||
| `saveUserInfo()` | 653 | `postgrestPost` | `sso_users` | 插入新用户记录 |
|
||||
| `addDefaultRole()` | 696 | `postgrestGet` | `user_role` | 查询用户是否已有角色 |
|
||||
| `addDefaultRole()` | 716 | `postgrestPost` | `user_role` | 为用户添加默认角色 |
|
||||
| `getUserBySub()` | 750 | `postgrestGet` | `sso_users` | 根据 sub 查询用户信息 |
|
||||
|
||||
#### 使用场景
|
||||
|
||||
- ✅ OAuth2.0 登录后保存用户信息到数据库
|
||||
- ✅ 自动为新用户添加默认角色(common 角色)
|
||||
- ✅ 更新用户信息(如部门、手机号等)
|
||||
- ✅ 查询用户信息用于会话管理
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/callback.tsx` - OAuth 回调处理
|
||||
- `app/root.tsx` - 全局认证检查
|
||||
- 其他 17 个路由文件
|
||||
|
||||
---
|
||||
|
||||
### 2. 首页与统计
|
||||
|
||||
**文件路径**: `app/api/home/home.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getEntryModules()` | - | `postgrestGet` | `entry_modules` | 获取用户可访问的入口模块 |
|
||||
| `getEntryModules()` | - | `postgrestGet` | `document_types` | 查询入口模块关联的文档类型 |
|
||||
|
||||
#### 使用场景
|
||||
|
||||
- ✅ 根据用户角色和地区过滤可访问的入口模块
|
||||
- ✅ 查询入口模块关联的文档类型
|
||||
- ✅ 客户端地区启用状态过滤
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/home.tsx` - 首页展示
|
||||
|
||||
---
|
||||
|
||||
### 3. 文档管理
|
||||
|
||||
**文件路径**: `app/api/files/documents.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getEvaluationResults()` | 147-159 | `postgrestGet` | `evaluation_results` | 获取文档评查结果 |
|
||||
| `deleteDocument()` | 256 | `postgrestDelete` | `documents` | 删除文档 |
|
||||
| `getDocument()` | 300 | `postgrestGet` | `documents` | 获取单个文档(带用户ID过滤) |
|
||||
| `getDocumentWithNoUserId()` | 351 | `postgrestGet` | `documents` | 获取单个文档(无用户ID限制) |
|
||||
| `updateDocument()` | 432 | `postgrestPut` | `documents` | 更新文档信息 |
|
||||
| `getDocumentHistory()` | 685 | `postgrestPost` (RPC) | `rpc/documents_get_document_history` | 获取文档历史版本 |
|
||||
|
||||
#### 权限控制
|
||||
|
||||
- ✅ `deleteDocument()` - 只能删除自己的文档
|
||||
- ✅ `getDocument()` - 只能查看自己的文档
|
||||
- ❌ `getDocumentWithNoUserId()` - 可跨用户查看(交叉评查场景)
|
||||
- ✅ `updateDocument()` - 只能更新自己的文档
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/home.tsx` - 首页文档展示
|
||||
- `app/routes/documents.list.tsx` - 文档列表
|
||||
- `app/routes/documents.edit.tsx` - 文档编辑
|
||||
- `app/api/evaluation_points/reviews.ts` - 评审结果查询
|
||||
|
||||
---
|
||||
|
||||
### 4. 文件上传
|
||||
|
||||
**文件路径**: `app/api/files/files-upload.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getTodayDocuments()` | 500 | `postgrestGet` | `documents` | 获取当天上传的文档列表 |
|
||||
| `getDocumentTypes()` | 555 | `postgrestGet` | `document_types` | 获取文档类型列表 |
|
||||
| `getDocumentsStatus()` | 603 | `postgrestGet` | `documents` | 查询主文档状态 |
|
||||
| `getDocumentsStatus()` | 616 | `postgrestGet` | `contract_structure_comparison` | 查询合同附件状态 |
|
||||
|
||||
#### 特性说明
|
||||
|
||||
- ✅ `getTodayDocuments()` - 支持从 sessionStorage 读取文档类型 ID 进行动态过滤
|
||||
- ✅ `getDocumentTypes()` - 支持按文档类型 ID 数组过滤
|
||||
- ✅ `getDocumentsStatus()` - 支持批量查询文档和合同附件的处理状态
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/documents.list.tsx` - 文档列表
|
||||
- `app/routes/files.upload.tsx` - 文件上传页面
|
||||
- `app/components/reviews/ReviewTabs.tsx` - 评审标签页
|
||||
|
||||
---
|
||||
|
||||
### 5. 评查点管理
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/rules.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getRulesList()` | - | `postgrestGet` | `evaluation_points` | 获取评查点列表 |
|
||||
| `getRulesList()` | - | `postgrestGet` | `evaluation_point_groups` | 查询规则组(类型筛选) |
|
||||
| `getRule()` | - | `postgrestGet` | `evaluation_points` | 获取单个评查点详情 |
|
||||
| `getRule()` | - | `postgrestGet` | `evaluation_point_groups` | 获取评查点所属分组 |
|
||||
| `createRule()` | - | `postgrestPost` | `evaluation_points` | 创建新评查点 |
|
||||
| `updateRule()` | - | `postgrestPut` | `evaluation_points` | 更新评查点 |
|
||||
| `deleteRule()` | - | `postgrestDelete` | `evaluation_points` | 删除评查点 |
|
||||
| `getRuleTypes()` | - | `postgrestGet` | `document_types` | 获取文档类型 |
|
||||
| `getRuleTypes()` | - | `postgrestGet` | `evaluation_point_groups` | 获取评查点类型 |
|
||||
| `getRuleGroupsByType()` | - | `postgrestGet` | `evaluation_point_groups` | 根据类型获取规则组 |
|
||||
| `getEvaluationPoint()` | - | `postgrestGet` | `evaluation_points` | 获取评查点数据(编辑用) |
|
||||
| `getEvaluationPointGroups()` | - | `postgrestGet` | `evaluation_point_groups` | 获取所有评查点组 |
|
||||
| `saveEvaluationPoint()` | - | `postgrestPut` / `postgrestPost` | `evaluation_points` | 保存评查点(新建或更新) |
|
||||
|
||||
#### 高级特性
|
||||
|
||||
- ✅ 使用 PostgREST 双连接查询获取父子分组关系
|
||||
- ✅ 支持分页、排序、多条件筛选
|
||||
- ✅ 支持按地区过滤(省级管理员可见所有)
|
||||
- ✅ 评查点编码清洗(移除地区后缀)
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/rules.list.tsx` - 评查点列表
|
||||
|
||||
---
|
||||
|
||||
### 6. 评查点分组
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/rule-groups.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getRuleGroups()` | - | `postgrestGet` | `evaluation_point_groups` | 获取顶级评查点分组 |
|
||||
| `getChildGroups()` | - | `postgrestGet` | `evaluation_point_groups` | 获取子分组列表 |
|
||||
| `getChildGroups()` | - | `postgrestGet` | `evaluation_points` | 查询子分组的评查点数量 |
|
||||
| `getAllRuleGroups()` | - | `postgrestGet` | `evaluation_point_groups` | 获取所有分组(树形) |
|
||||
| `getAllRuleGroups()` | - | `postgrestGet` | `evaluation_points` | 查询每个子分组的评查点数量 |
|
||||
| `getRuleGroup()` | - | `postgrestGet` | `evaluation_point_groups` | 获取单个分组详情 |
|
||||
| `getRuleGroup()` | - | `postgrestGet` | `evaluation_points` | 查询分组的评查点数量 |
|
||||
| `createRuleGroup()` | - | `postgrestPost` | `evaluation_point_groups` | 创建新分组 |
|
||||
| `updateRuleGroup()` | - | `postgrestPut` | `evaluation_point_groups` | 更新分组 |
|
||||
| `deleteRuleGroup()` | - | `postgrestDelete` | `evaluation_point_groups` | 删除分组 |
|
||||
| `deleteEvaluationPointsByGroupId()` | - | `postgrestDelete` | `evaluation_points` | 级联删除评查点 |
|
||||
|
||||
#### 特性说明
|
||||
|
||||
- ✅ 支持树形结构查询(一级分组 + 二级分组)
|
||||
- ✅ 级联删除子分组和评查点
|
||||
- ✅ 查询分组关联的评查点数量
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/rule-groups.new.tsx` - 创建/编辑分组
|
||||
- `app/routes/rule-groups._index.tsx` - 分组列表
|
||||
- `app/routes/document-types.new.tsx` - 文档类型关联分组
|
||||
|
||||
---
|
||||
|
||||
### 7. 评查文件审核
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/rules-files.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `updateDocumentAuditStatus()` | 138 | `postgrestPut` | `documents` | 更新文档审核状态 |
|
||||
|
||||
#### 审核状态说明
|
||||
|
||||
- `-1` - 不通过
|
||||
- `0` - 待审核
|
||||
- `1` - 通过
|
||||
- `2` - 警告
|
||||
|
||||
#### 权限控制
|
||||
|
||||
- ✅ 确保只能更新用户自己的文档(通过 `user_id` 过滤)
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/documents.list.tsx` - 文档列表审核操作
|
||||
- `app/routes/files.upload.tsx` - 文件上传后审核
|
||||
|
||||
---
|
||||
|
||||
### 8. 评审结果
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/reviews.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getReviewPoints()` | - | `postgrestGet` | `contract_structure_comparison` | 获取文档附件数据 |
|
||||
| `getReviewPoints()` | - | `postgrestGet` | `evaluation_results` | 获取评查结果 |
|
||||
| `getReviewPoints()` | - | `postgrestGet` | `evaluation_points` | 获取评查点详情 |
|
||||
| `getReviewPoints()` | - | `postgrestGet` | `evaluation_point_groups` | 获取评查点组信息 |
|
||||
| `getReviewPoints()` | - | `postgrestGet` | `audit_status` | 获取人工审核状态 |
|
||||
| `getReviewPoints()` | - | `postgrestGet` | `cross_scoring_proposals` | 获取交叉评分提案 |
|
||||
| `updateReviewResult()` | - | `postgrestGet` | `evaluation_results` | 获取当前评查结果 |
|
||||
| `updateReviewResult()` | - | `postgrestPut` | `evaluation_results` | 更新评查结果 |
|
||||
| `updateReviewResult()` | - | `postgrestPut` | `audit_status` | 更新审核状态 |
|
||||
| `updateReviewResult()` | - | `postgrestPost` | `audit_status` | 创建新审核状态记录 |
|
||||
| `confirmReviewResults()` | - | `postgrestPut` | `documents` | 确认评查并更新文档状态 |
|
||||
|
||||
#### 数据关联复杂度
|
||||
|
||||
- ✅ 跨 6 个表查询完整的评查结果
|
||||
- ✅ 关联评查点、分组、审核状态、交叉提案等
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/reviews.tsx` - 文档评审页面
|
||||
- `app/routes/cross-checking.result.tsx` - 交叉评查结果
|
||||
|
||||
---
|
||||
|
||||
### 9. 文档类型
|
||||
|
||||
**文件路径**: `app/api/document-types/document-types.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getDocumentTypes()` | - | `postgrestGet` | `document_types` | 获取文档类型列表 |
|
||||
| `getDocumentType()` | - | `postgrestGet` | `document_types` | 获取文档类型详情 |
|
||||
| `createDocumentType()` | - | `postgrestPost` | `document_types` | 创建文档类型 |
|
||||
| `updateDocumentType()` | - | `postgrestPut` | `document_types` | 更新文档类型 |
|
||||
| `deleteDocumentType()` | - | `postgrestDelete` | `document_types` | 删除文档类型 |
|
||||
| `getAllEvaluationPointGroups()` | - | `postgrestGet` | `evaluation_point_groups` | 获取所有评查点分组 |
|
||||
| `getParentEvaluationPointGroups()` | - | `postgrestGet` | `evaluation_point_groups` | 获取父级分组 |
|
||||
| `getEntryModules()` | - | `postgrestGet` | `entry_modules` | 获取入口模块列表 |
|
||||
| `getEvaluationPointGroupsByIds()` | - | `postgrestGet` | `evaluation_point_groups` | 根据 ID 获取分组信息 |
|
||||
|
||||
#### 特性说明
|
||||
|
||||
- ✅ 支持资源嵌入查询(关联入口模块)
|
||||
- ✅ 支持按文档类型 ID 数组过滤
|
||||
- ✅ 文档类型关联评查点分组和提示词配置
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/documents.list.tsx` - 文档类型筛选
|
||||
- `app/routes/document-types.new.tsx` - 创建/编辑文档类型
|
||||
- `app/routes/document-types._index.tsx` - 文档类型列表
|
||||
- `app/api/files/documents.ts` - 文档类型查询
|
||||
- `app/routes/documents.edit.tsx` - 文档编辑
|
||||
|
||||
---
|
||||
|
||||
### 10. 入口模块
|
||||
|
||||
**文件路径**: `app/api/entry-modules/entry-modules.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getEntryModules()` | 85 | `postgrestGet` | `entry_modules` | 获取入口模块列表 |
|
||||
| `getEntryModuleById()` | 131 | `postgrestGet` | `entry_modules` | 根据 ID 获取入口模块 |
|
||||
| `createEntryModule()` | 163 | `postgrestPost` | `entry_modules` | 创建入口模块 |
|
||||
| `updateEntryModule()` | 194 | `postgrestPut` | `entry_modules` | 更新入口模块 |
|
||||
| `deleteEntryModule()` | 224 | `postgrestDelete` | `entry_modules` | 删除入口模块 |
|
||||
|
||||
#### 高级特性
|
||||
|
||||
- ✅ 支持 JSONB 数组查询(`areas` 字段)
|
||||
```typescript
|
||||
filter: { 'areas': 'cs.{"梅州"}' } // cs = contains
|
||||
```
|
||||
- ✅ 支持分页、排序、按名称和地区筛选
|
||||
- ✅ 返回 Content-Range 头获取总数
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/entry-modules._index.tsx` - 入口模块列表
|
||||
- `app/routes/entry-modules.new.tsx` - 创建/编辑入口模块
|
||||
|
||||
---
|
||||
|
||||
### 11. 交叉评查
|
||||
|
||||
**文件路径**: `app/api/cross-checking/`
|
||||
|
||||
#### 11.1 cross-files.ts
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `updateDocumentAuditStatus()` | 486 | `postgrestPut` | `documents` | 更新文档审核状态 |
|
||||
|
||||
#### 11.2 cross-file-result.ts
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `findIsProposer()` | 93 | `postgrestGet` | `cross_examination_tasks` | 查找是否是任务发起人 |
|
||||
| `confirmReviewResults()` | 365 | `postgrestPut` | `documents` | 完成评查并更新文档状态 |
|
||||
|
||||
#### 混合使用说明
|
||||
|
||||
- ✅ PostgREST 用于文档状态更新和权限判断
|
||||
- ✅ 后端 API 用于任务、意见、投票管理
|
||||
- ⚠️ 无用户 ID 过滤(交叉评查需要跨用户操作)
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/cross-checking._index.tsx` - 交叉评查任务列表
|
||||
- `app/routes/cross-checking.result.tsx` - 评查结果页面
|
||||
- `app/components/cross-checking/DocumentListModal.tsx` - 文档列表弹窗
|
||||
- `app/components/cross-checking/ReviewPointsList.tsx` - 评查点列表
|
||||
|
||||
---
|
||||
|
||||
### 12. 提示词模板
|
||||
|
||||
**文件路径**: `app/api/prompts/prompts.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getPromptTemplates()` | - | `postgrestGet` | `prompt_templates` | 获取提示词模板列表 |
|
||||
| `getPromptTemplate()` | - | `postgrestGet` | `prompt_templates` | 获取模板详情 |
|
||||
| `createPromptTemplate()` | - | `postgrestPost` | `prompt_templates` | 创建提示词模板 |
|
||||
| `updatePromptTemplate()` | - | `postgrestPut` | `prompt_templates` | 更新提示词模板 |
|
||||
| `deletePromptTemplate()` | - | `postgrestDelete` | `prompt_templates` | 删除提示词模板 |
|
||||
| `getPromptTemplateOptions()` | - | `postgrestGet` | `prompt_templates` | 获取模板选项列表 |
|
||||
|
||||
#### 资源嵌入查询
|
||||
|
||||
```typescript
|
||||
select: `
|
||||
id, template_name, template_type,
|
||||
sso_users!created_by(username)
|
||||
`
|
||||
```
|
||||
|
||||
#### 模板类型
|
||||
|
||||
- `LLM_Extraction` - LLM 抽取
|
||||
- `VLM_Extraction` - VLM 抽取
|
||||
- `Evaluation` - 评查
|
||||
- `Summary` - 总结
|
||||
- `Common` - 通用
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/prompts.new.tsx` - 创建/编辑提示词
|
||||
- `app/routes/prompts._index.tsx` - 提示词列表
|
||||
- `app/routes/document-types.new.tsx` - 文档类型关联提示词
|
||||
- `app/routes/rules.new.tsx` - 评查点关联提示词
|
||||
|
||||
---
|
||||
|
||||
### 13. 合同模板
|
||||
|
||||
**文件路径**: `app/api/contract-template/templates.ts`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `getContractCategories()` | - | `postgrestGet` | `contract_categories` | 获取合同分类列表 |
|
||||
| `getContractCategoriesWithCount()` | - | `postgrestGet` | `contract_categories` | 获取分类及模板数量 |
|
||||
| `getContractCategoriesWithCount()` | - | `postgrestGet` | `contract_templates` | 统计每个分类的模板数量 |
|
||||
| `getContractTemplates()` | - | `postgrestGet` | `contract_categories` | 查询分类(关键词搜索) |
|
||||
| `getContractTemplates()` | - | `postgrestGet` | `contract_templates` | 获取合同模板列表 |
|
||||
| `getContractTemplate()` | - | `postgrestGet` | `contract_templates` | 获取单个模板详情 |
|
||||
| `getFeaturedTemplates()` | - | `postgrestGet` | `contract_templates` | 获取推荐模板 |
|
||||
|
||||
#### 高级特性
|
||||
|
||||
- ✅ 支持 OR 条件查询(多字段模糊搜索)
|
||||
```typescript
|
||||
or: [
|
||||
{ title: 'ilike.*关键词*' },
|
||||
{ description: 'ilike.*关键词*' },
|
||||
{ template_code: 'ilike.*关键词*' }
|
||||
]
|
||||
```
|
||||
- ✅ 使用资源嵌入查询分类信息
|
||||
|
||||
#### 被哪些路由使用
|
||||
|
||||
- `app/routes/contract-template.detail.$id.tsx` - 模板详情
|
||||
- `app/routes/contract-template.search._index.tsx` - 模板搜索
|
||||
- `app/routes/contract-template.search.results.tsx` - 搜索结果
|
||||
- `app/routes/contract-template.list._index.tsx` - 模板列表
|
||||
|
||||
---
|
||||
|
||||
### 14. 评查点编辑页面
|
||||
|
||||
**文件路径**: `app/routes/rules.new.tsx`
|
||||
|
||||
#### PostgREST 函数使用情况
|
||||
|
||||
| 函数名 | 行号 | 操作 | 表名 | 功能说明 |
|
||||
|--------|------|------|------|---------|
|
||||
| `fetchEvaluationPoint()` | - | `postgrestGet` | `evaluation_points` | 获取评查点数据(编辑模式) |
|
||||
| `fetchEvaluationPointGroups()` | - | `postgrestGet` | `evaluation_point_groups` | 获取评查点组数据 |
|
||||
| `handleSave()` | - | `postgrestPut` | `evaluation_points` | 更新评查点(编辑模式) |
|
||||
| `handleSave()` | - | `postgrestPost` | `evaluation_points` | 创建评查点(新建模式) |
|
||||
|
||||
#### 特性说明
|
||||
|
||||
- ✅ 支持评查点创建、编辑、复制模式
|
||||
- ✅ 评查点编码清洗(移除地区后缀)
|
||||
- ✅ 表单验证(必填字段、规则完整性)
|
||||
|
||||
---
|
||||
|
||||
## 排除列表
|
||||
|
||||
### ❌ 已删除或未使用的模块
|
||||
|
||||
| 模块名 | 路径 | 状态 | 原因 |
|
||||
|--------|------|------|------|
|
||||
| `config-lists.ts` | `app/api/system_setting/config-lists.ts` | ✅ 已删除 | 不再使用 |
|
||||
|
||||
---
|
||||
|
||||
## 统计数据
|
||||
|
||||
### 模块统计
|
||||
|
||||
| 类型 | 数量 |
|
||||
|------|------|
|
||||
| API 模块 | 13 |
|
||||
| 路由模块 | 1 |
|
||||
| **总计** | **14** |
|
||||
|
||||
### 数据库表使用频率
|
||||
|
||||
| 表名 | 使用次数 | 主要操作 |
|
||||
|------|---------|---------|
|
||||
| `evaluation_points` | 🔥🔥🔥🔥🔥 | GET, POST, PUT, DELETE(最高频) |
|
||||
| `evaluation_point_groups` | 🔥🔥🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `documents` | 🔥🔥🔥🔥 | GET, PUT, DELETE |
|
||||
| `sso_users` | 🔥🔥🔥 | GET, PUT, POST |
|
||||
| `evaluation_results` | 🔥🔥🔥 | GET, PUT |
|
||||
| `document_types` | 🔥🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `prompt_templates` | 🔥🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `entry_modules` | 🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `contract_templates` | 🔥🔥 | GET |
|
||||
| `contract_categories` | 🔥🔥 | GET |
|
||||
| `user_role` | 🔥 | GET, POST |
|
||||
| `audit_status` | 🔥 | GET, PUT, POST |
|
||||
| `cross_examination_tasks` | 🔥 | GET |
|
||||
| `cross_scoring_proposals` | 🔥 | GET |
|
||||
| `contract_structure_comparison` | 🔥 | GET |
|
||||
|
||||
### PostgREST 操作统计
|
||||
|
||||
| 操作类型 | 使用频率 |
|
||||
|---------|---------|
|
||||
| `postgrestGet` | 🔥🔥🔥🔥🔥 |
|
||||
| `postgrestPut` | 🔥🔥🔥🔥 |
|
||||
| `postgrestPost` | 🔥🔥🔥 |
|
||||
| `postgrestDelete` | 🔥🔥 |
|
||||
|
||||
### PostgREST 高级特性使用
|
||||
|
||||
| 特性 | 使用示例 |
|
||||
|------|---------|
|
||||
| **资源嵌入查询** | 文档类型关联入口模块、提示词关联创建者 |
|
||||
| **JSONB 数组查询** | 入口模块地区过滤 (`areas cs.{"梅州"}`) |
|
||||
| **OR 条件查询** | 合同模板多字段搜索 |
|
||||
| **分页与排序** | 所有列表查询 |
|
||||
| **RPC 函数调用** | 文档历史版本查询 |
|
||||
| **批量查询** | 文档状态轮询 (`id in.(1,2,3)`) |
|
||||
| **总数统计** | Content-Range 头获取 total |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 PostgREST 客户端核心函数
|
||||
|
||||
| 函数名 | 功能 |
|
||||
|--------|------|
|
||||
| `postgrestGet<T>()` | GET 请求,查询数据 |
|
||||
| `postgrestPost<T, U>()` | POST 请求,创建数据或调用 RPC |
|
||||
| `postgrestPut<T, U>()` | PUT 请求,更新数据 |
|
||||
| `postgrestDelete()` | DELETE 请求,删除数据 |
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 重要说明
|
||||
|
||||
### 权限控制差异
|
||||
|
||||
1. **严格用户权限控制**(通过 `user_id` 过滤):
|
||||
- `documents.ts` 中的 CRUD 操作
|
||||
- `rules-files.ts` 中的审核状态更新
|
||||
|
||||
2. **跨用户访问**(无 `user_id` 过滤):
|
||||
- `cross-checking` 模块(交叉评查需要)
|
||||
- `getDocumentWithNoUserId()` 函数
|
||||
|
||||
### 数据提取统一方式
|
||||
|
||||
所有模块使用统一的 `extractApiData<T>()` 函数处理响应:
|
||||
|
||||
```typescript
|
||||
function extractApiData<T>(responseData: unknown): T | null {
|
||||
// 格式1: { code: number, msg: string, data: T }
|
||||
if (typeof responseData === 'object' && 'data' in responseData) {
|
||||
return (responseData as { data: T }).data;
|
||||
}
|
||||
// 格式2: 直接是数据对象
|
||||
return responseData as T;
|
||||
}
|
||||
```
|
||||
|
||||
### JWT 认证
|
||||
|
||||
所有 PostgREST 请求都支持 JWT token 参数:
|
||||
|
||||
```typescript
|
||||
const response = await postgrestGet('table_name', {
|
||||
filter: { ... },
|
||||
token: frontendJWT // JWT 认证
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 添加或删除 PostgREST 模块时,请及时更新此文档。
|
||||
@@ -0,0 +1,348 @@
|
||||
# PostgREST 未使用函数清单
|
||||
|
||||
> **本文档记录所有定义了但未被实际引用的 PostgREST 相关函数**
|
||||
> **更新时间**: 2025-11-25
|
||||
|
||||
---
|
||||
|
||||
## 📋 目录
|
||||
|
||||
- [完全未使用的函数](#完全未使用的函数)
|
||||
- [仅内部使用的函数](#仅内部使用的函数)
|
||||
- [建议的清理操作](#建议的清理操作)
|
||||
|
||||
---
|
||||
|
||||
## 完全未使用的函数
|
||||
|
||||
这些函数被导出但在整个项目中没有任何地方调用。
|
||||
|
||||
### 1. ❌ `getUserBySub()`
|
||||
|
||||
**文件**: `app/api/login/auth.server.ts`
|
||||
**行号**: 746
|
||||
**PostgREST 操作**: `postgrestGet`
|
||||
**表名**: `sso_users`
|
||||
|
||||
```typescript
|
||||
export async function getUserBySub(sub: string) {
|
||||
const userResult = await postgrestGet<SsoUser[]>("sso_users", {
|
||||
filter: { sub: `eq.${sub}` }
|
||||
});
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在定义文件中出现 1 次
|
||||
**建议**: 🗑️ **可以删除**
|
||||
|
||||
---
|
||||
|
||||
### 2. ❌ `getDocumentHistory()`
|
||||
|
||||
**文件**: `app/api/files/documents.ts`
|
||||
**行号**: 665
|
||||
**PostgREST 操作**: `postgrestPost` (RPC)
|
||||
**RPC 函数**: `rpc/documents_get_document_history`
|
||||
|
||||
```typescript
|
||||
export async function getDocumentHistory(
|
||||
documentName: string,
|
||||
userId: string,
|
||||
excludeId: number,
|
||||
token?: string
|
||||
): Promise<{data?: DocumentVersionUI[]; error?: string; status?: number}> {
|
||||
const response = await postgrestPost<any[], unknown>(
|
||||
'rpc/documents_get_document_history',
|
||||
{ p_document_name, p_user_id, p_exclude_id },
|
||||
token
|
||||
);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: routes 和 components 中 0 次引用
|
||||
**建议**: 🗑️ **可以删除** (新API已改用 `/admin/versions/documents-list`)
|
||||
|
||||
---
|
||||
|
||||
### 3. ❌ `duplicateRule()`
|
||||
|
||||
**文件**: `app/api/evaluation_points/rules.ts`
|
||||
**行号**: 740
|
||||
**PostgREST 操作**: `postgrestGet` + `postgrestPost`
|
||||
**表名**: `evaluation_points`
|
||||
|
||||
```typescript
|
||||
export async function duplicateRule(id: string, token?: string): Promise<{
|
||||
data: Rule;
|
||||
error?: never
|
||||
} | {
|
||||
data?: never;
|
||||
error: string;
|
||||
status?: number
|
||||
}> {
|
||||
// 1. 获取原规则
|
||||
const originalRule = await postgrestGet(...);
|
||||
// 2. 创建副本
|
||||
const result = await postgrestPost(...);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在定义文件中出现 1 次
|
||||
**建议**: 🔄 **保留但标记为未来功能** (复制功能可能有计划)
|
||||
|
||||
---
|
||||
|
||||
### 4. ❌ `getEvaluationPointGroupsByIds()`
|
||||
|
||||
**文件**: `app/api/document-types/document-types.ts`
|
||||
**行号**: 245
|
||||
**PostgREST 操作**: `postgrestGet`
|
||||
**表名**: `evaluation_point_groups`
|
||||
|
||||
```typescript
|
||||
export async function getEvaluationPointGroupsByIds(
|
||||
ids: number[] | number,
|
||||
token?: string
|
||||
): Promise<{
|
||||
data: EvaluationPointGroup[];
|
||||
error?: never
|
||||
} | {
|
||||
data?: never;
|
||||
error: string;
|
||||
status?: number
|
||||
}> {
|
||||
const response = await postgrestGet<EvaluationPointGroup[]>(
|
||||
"evaluation_point_groups",
|
||||
{
|
||||
filter: { id: `in.(${idsArray.join(',')})` },
|
||||
token
|
||||
}
|
||||
);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在定义文件中出现 5 次(都是定义和类型导出)
|
||||
**建议**: 🗑️ **可以删除**
|
||||
|
||||
---
|
||||
|
||||
### 5. ❌ `createSimpleUserSession()`
|
||||
|
||||
**文件**: `app/api/login/auth.server.ts`
|
||||
**行号**: 412
|
||||
**PostgREST 操作**: 无(仅 session 管理)
|
||||
|
||||
```typescript
|
||||
export async function createSimpleUserSession(
|
||||
isAuthenticated: boolean,
|
||||
userRole: UserRole,
|
||||
redirectTo: string
|
||||
) {
|
||||
const session = await sessionStorage.getSession();
|
||||
session.set("isAuthenticated", isAuthenticated);
|
||||
session.set("userRole", userRole);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在定义文件中出现 1 次
|
||||
**建议**: 🗑️ **可以删除** (已统一使用 `createUserSession`)
|
||||
|
||||
---
|
||||
|
||||
### 6. ❌ `getFeaturedTemplates()`
|
||||
|
||||
**文件**: `app/api/contract-template/templates.ts`
|
||||
**行号**: 347
|
||||
**PostgREST 操作**: `postgrestGet`
|
||||
**表名**: `contract_templates`
|
||||
|
||||
```typescript
|
||||
export async function getFeaturedTemplates(
|
||||
limit: number = 6,
|
||||
jwt?: string
|
||||
) {
|
||||
const response = await postgrestGet<ContractTemplate[]>(
|
||||
'contract_templates',
|
||||
{
|
||||
filter: { is_featured: 'eq.true' },
|
||||
order: 'created_at.desc',
|
||||
limit: limit,
|
||||
token: jwt
|
||||
}
|
||||
);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在定义文件中出现 1 次
|
||||
**建议**: 🔄 **保留但标记为未来功能** (推荐模板功能可能有计划)
|
||||
|
||||
---
|
||||
|
||||
## 仅内部使用的函数
|
||||
|
||||
这些函数虽然被导出,但只在同一个文件内部被调用,不被其他文件引用。
|
||||
|
||||
### 7. ⚠️ `getEvaluationResults()`
|
||||
|
||||
**文件**: `app/api/files/documents.ts`
|
||||
**行号**: 147-159
|
||||
**PostgREST 操作**: `postgrestGet`
|
||||
**表名**: `evaluation_results`
|
||||
|
||||
```typescript
|
||||
async function getEvaluationResults(id: number, frontendJWT?: string) {
|
||||
const response = await postgrestGet<[]>('evaluation_results', {
|
||||
filter: { 'document_id': `eq.${id}` },
|
||||
token: frontendJWT
|
||||
});
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在 `documents.ts` 内部被 `convertToUIDocument()` 调用
|
||||
**建议**: ✅ **改为内部函数**(去掉 export)
|
||||
|
||||
---
|
||||
|
||||
### 8. ⚠️ `convertToUIDocument()`
|
||||
|
||||
**文件**: `app/api/files/documents.ts`
|
||||
**行号**: 165
|
||||
**PostgREST 操作**: 调用 `getEvaluationResults()`
|
||||
**表名**: 间接查询 `evaluation_results`
|
||||
|
||||
```typescript
|
||||
async function convertToUIDocument(
|
||||
doc: Document,
|
||||
frontendJWT?: string
|
||||
): Promise<DocumentUI> {
|
||||
const evaluationResult = await getEvaluationResults(doc.id, frontendJWT);
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在 `documents.ts` 内部被其他函数调用
|
||||
**建议**: ✅ **改为内部函数**(去掉 export)
|
||||
|
||||
---
|
||||
|
||||
### 9. ⚠️ `convertApiRuleToFormData()`
|
||||
|
||||
**文件**: `app/api/evaluation_points/rules.ts`
|
||||
**行号**: 1079
|
||||
**PostgREST 操作**: 无(数据转换函数)
|
||||
|
||||
```typescript
|
||||
export function convertApiRuleToFormData(
|
||||
apiRule: ApiRule
|
||||
): FormattedEvaluationPoint {
|
||||
// 数据格式转换
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在定义文件中出现 4 次(内部调用)
|
||||
**建议**: ✅ **改为内部函数**(去掉 export)
|
||||
|
||||
---
|
||||
|
||||
### 10. ⚠️ `convertToUITemplate()`
|
||||
|
||||
**文件**: `app/api/prompts/prompts.ts`
|
||||
**行号**: 102
|
||||
**PostgREST 操作**: 无(数据转换函数)
|
||||
|
||||
```typescript
|
||||
export function convertToUITemplate(
|
||||
template: PromptTemplate & { sso_users?: { username: string } }
|
||||
): PromptTemplateUI {
|
||||
// 数据格式转换
|
||||
}
|
||||
```
|
||||
|
||||
**搜索结果**: 只在定义文件中出现 5 次(内部调用)
|
||||
**建议**: ✅ **改为内部函数**(去掉 export)
|
||||
|
||||
---
|
||||
|
||||
## 建议的清理操作
|
||||
|
||||
### 🗑️ 立即删除(6 个函数)
|
||||
|
||||
| 序号 | 函数名 | 文件 | 原因 |
|
||||
|------|--------|------|------|
|
||||
| 1 | `getUserBySub()` | `auth.server.ts` | 完全未使用 |
|
||||
| 2 | `getDocumentHistory()` | `documents.ts` | 已被新 API 替代 |
|
||||
| 3 | `getEvaluationPointGroupsByIds()` | `document-types.ts` | 完全未使用 |
|
||||
| 4 | `createSimpleUserSession()` | `auth.server.ts` | 已统一使用 `createUserSession` |
|
||||
| 5 | ~~`duplicateRule()`~~ | `rules.ts` | 保留(可能是未来功能) |
|
||||
| 6 | ~~`getFeaturedTemplates()`~~ | `templates.ts` | 保留(可能是未来功能) |
|
||||
|
||||
**实际建议删除**: **4 个函数**
|
||||
|
||||
---
|
||||
|
||||
### ✅ 改为私有函数(4 个函数)
|
||||
|
||||
将这些仅内部使用的函数改为非导出(去掉 `export` 关键字):
|
||||
|
||||
| 序号 | 函数名 | 文件 | 操作 |
|
||||
|------|--------|------|------|
|
||||
| 1 | `getEvaluationResults()` | `documents.ts` | 去掉 export |
|
||||
| 2 | `convertToUIDocument()` | `documents.ts` | 去掉 export |
|
||||
| 3 | `convertApiRuleToFormData()` | `rules.ts` | 去掉 export |
|
||||
| 4 | `convertToUITemplate()` | `prompts.ts` | 去掉 export |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 保留但标记的函数(2 个)
|
||||
|
||||
这些函数虽然当前未使用,但可能是计划中的功能:
|
||||
|
||||
| 序号 | 函数名 | 文件 | 建议 |
|
||||
|------|--------|------|------|
|
||||
| 1 | `duplicateRule()` | `rules.ts` | 添加 `@deprecated` 或 `@future` 注释 |
|
||||
| 2 | `getFeaturedTemplates()` | `templates.ts` | 添加 `@deprecated` 或 `@future` 注释 |
|
||||
|
||||
---
|
||||
|
||||
## 📊 统计总结
|
||||
|
||||
| 类别 | 数量 |
|
||||
|------|------|
|
||||
| ❌ 完全未使用(建议删除) | 4 |
|
||||
| ⚠️ 仅内部使用(改为私有) | 4 |
|
||||
| 🔄 保留但标记 | 2 |
|
||||
| **总计** | **10** |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 检查方法
|
||||
|
||||
使用以下命令检查函数引用:
|
||||
|
||||
```bash
|
||||
# 检查函数是否被引用(在 routes 和 components 中)
|
||||
grep -r "函数名" app/routes app/components --include="*.ts" --include="*.tsx"
|
||||
|
||||
# 或使用 Grep 工具
|
||||
Grep: pattern="函数名", glob="app/**/*.{ts,tsx}", output_mode="count"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
1. **删除前再次确认**: 虽然这些函数当前未被引用,但可能在其他分支或未来功能中需要
|
||||
2. **Git 历史**: 删除前检查 Git 历史,看是否之前被使用过
|
||||
3. **API 兼容性**: 如果这些函数是 API 的一部分,删除可能影响其他项目
|
||||
4. **测试代码**: 检查测试文件中是否有引用(本次未扫描测试文件)
|
||||
|
||||
---
|
||||
|
||||
**维护建议**: 定期运行此检查,避免积累过多死代码。
|
||||
@@ -0,0 +1,675 @@
|
||||
# PostgREST 请求模块完整清单
|
||||
|
||||
> 本文档记录了项目中所有直接使用 PostgREST 客户端发送请求的模块和函数。
|
||||
>
|
||||
> **更新时间**: 2025-11-24
|
||||
> **PostgREST 客户端位置**: `app/api/postgrest-client.ts`
|
||||
|
||||
---
|
||||
|
||||
## 📚 目录
|
||||
|
||||
- [API 模块](#api-模块)
|
||||
- [首页与统计](#1-首页与统计)
|
||||
- [认证服务](#2-认证服务)
|
||||
- [文档管理](#3-文档管理)
|
||||
- [文件上传](#4-文件上传)
|
||||
- [评查点管理](#5-评查点管理)
|
||||
- [评查点分组](#6-评查点分组)
|
||||
- [评查文件审核](#7-评查文件审核)
|
||||
- [评审结果](#8-评审结果)
|
||||
- [文档类型](#9-文档类型)
|
||||
- [入口模块](#10-入口模块)
|
||||
- [交叉评查](#11-交叉评查)
|
||||
- [提示词模板](#12-提示词模板)
|
||||
- [系统配置](#13-系统配置)
|
||||
- [合同模板](#14-合同模板)
|
||||
- [路由模块](#路由模块)
|
||||
- [评查点编辑页面](#15-评查点编辑页面)
|
||||
|
||||
---
|
||||
|
||||
## API 模块
|
||||
|
||||
### 1. 首页与统计
|
||||
|
||||
**文件路径**: `app/api/home/home.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getEntryModules()` | `postgrestGet` | `entry_modules` | 获取用户可访问的入口模块 |
|
||||
| `getEntryModules()` | `postgrestGet` | `document_types` | 查询入口模块关联的文档类型 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 获取首页统计数据(通过后端 API,非 PostgREST)
|
||||
- ✅ 获取高频错误评查点(通过后端 API)
|
||||
- ✅ 获取高风险用户(通过后端 API)
|
||||
- ✅ 获取用户可访问的入口模块(使用 PostgREST)
|
||||
- 根据用户角色和地区过滤模块
|
||||
- 查询模块关联的文档类型
|
||||
- 在客户端进行地区启用状态过滤
|
||||
|
||||
---
|
||||
|
||||
### 2. 认证服务
|
||||
|
||||
**文件路径**: `app/api/login/auth.server.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| *待补充* | - | - | 用户会话管理相关功能 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 用户身份验证
|
||||
- ✅ 会话管理
|
||||
- ✅ 登出功能
|
||||
|
||||
---
|
||||
|
||||
### 3. 文档管理
|
||||
|
||||
**文件路径**: `app/api/files/documents.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getDocument()` | `postgrestGet` | `documents` | 获取单个文档详情 |
|
||||
| `getDocumentWithNoUserId()` | `postgrestGet` | `documents` | 获取文档(无用户ID限制) |
|
||||
| `getEvaluationResults()` | `postgrestGet` | `evaluation_results` | 获取文档的评查结果 |
|
||||
| `updateDocument()` | `postgrestPut` | `documents` | 更新文档信息 |
|
||||
| `deleteDocument()` | `postgrestDelete` | `documents` | 删除文档 |
|
||||
| `getDocumentHistory()` | `postgrestPost` | `rpc/documents_get_document_history` | 获取文档历史版本(RPC函数) |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 获取单个文档详情(包含评查结果统计)
|
||||
- ✅ 获取文档列表(使用后端 API `/admin/versions/documents-list`)
|
||||
- ✅ 更新文档信息(文档编号、审核状态、备注等)
|
||||
- ✅ 删除文档(仅限用户自己的文档)
|
||||
- ✅ 获取文档历史版本列表
|
||||
- ✅ 计算文档问题数量(基于评查结果)
|
||||
|
||||
---
|
||||
|
||||
### 4. 文件上传
|
||||
|
||||
**文件路径**: `app/api/files/files-upload.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getTodayDocuments()` | `postgrestGet` | `documents` | 获取当天上传的文档列表 |
|
||||
| `getDocumentTypes()` | `postgrestGet` | `document_types` | 获取文档类型列表 |
|
||||
| `getDocumentsStatus()` | `postgrestGet` | `documents` | 获取文档状态 |
|
||||
| `getDocumentsStatus()` | `postgrestGet` | `contract_structure_comparison` | 获取合同附件状态 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 获取当天文档列表
|
||||
- 根据用户ID和文档类型过滤
|
||||
- 从 sessionStorage 读取文档类型 ID
|
||||
- ✅ 获取文档类型列表(支持动态类型过滤)
|
||||
- ✅ 获取指定文档的状态(支持主文档和合同附件)
|
||||
- ✅ 上传文件到服务器(使用后端 API,非 PostgREST)
|
||||
- ✅ 上传合同模板(使用后端 API)
|
||||
- ✅ 追加合同附件(使用后端 API)
|
||||
|
||||
---
|
||||
|
||||
### 5. 评查点管理
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/rules.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getRulesList()` | `postgrestGet` | `evaluation_points` | 获取评查点列表 |
|
||||
| `getRulesList()` | `postgrestGet` | `evaluation_point_groups` | 查询规则组(用于类型筛选) |
|
||||
| `getRule()` | `postgrestGet` | `evaluation_points` | 获取单个评查点详情 |
|
||||
| `getRule()` | `postgrestGet` | `evaluation_point_groups` | 获取评查点所属分组信息 |
|
||||
| `createRule()` | `postgrestPost` | `evaluation_points` | 创建新评查点 |
|
||||
| `updateRule()` | `postgrestPut` | `evaluation_points` | 更新评查点 |
|
||||
| `deleteRule()` | `postgrestDelete` | `evaluation_points` | 删除评查点 |
|
||||
| `getRuleTypes()` | `postgrestGet` | `document_types` | 获取文档类型 |
|
||||
| `getRuleTypes()` | `postgrestGet` | `evaluation_point_groups` | 获取评查点类型 |
|
||||
| `getRuleGroupsByType()` | `postgrestGet` | `evaluation_point_groups` | 根据类型获取规则组 |
|
||||
| `getEvaluationPoint()` | `postgrestGet` | `evaluation_points` | 获取评查点数据(编辑用) |
|
||||
| `getEvaluationPointGroups()` | `postgrestGet` | `evaluation_point_groups` | 获取所有评查点组 |
|
||||
| `saveEvaluationPoint()` | `postgrestPut` / `postgrestPost` | `evaluation_points` | 保存评查点(新建或更新) |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 评查点列表查询
|
||||
- 支持分页、排序
|
||||
- 支持按类型、分组、状态、关键词筛选
|
||||
- 支持按地区过滤(省级管理员可见所有)
|
||||
- 使用 PostgREST 双连接查询获取父子分组
|
||||
- ✅ 评查点 CRUD 操作
|
||||
- ✅ 评查点复制功能
|
||||
- ✅ 评查点编码清洗(移除地区后缀)
|
||||
- ✅ 评查点分组查询(支持嵌套父子关系)
|
||||
|
||||
---
|
||||
|
||||
### 6. 评查点分组
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/rule-groups.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getRuleGroups()` | `postgrestGet` | `evaluation_point_groups` | 获取顶级评查点分组列表 |
|
||||
| `getChildGroups()` | `postgrestGet` | `evaluation_point_groups` | 获取子分组列表 |
|
||||
| `getChildGroups()` | `postgrestGet` | `evaluation_points` | 查询子分组的评查点数量 |
|
||||
| `getAllRuleGroups()` | `postgrestGet` | `evaluation_point_groups` | 获取所有分组(树形结构) |
|
||||
| `getAllRuleGroups()` | `postgrestGet` | `evaluation_points` | 查询每个子分组的评查点数量 |
|
||||
| `getRuleGroup()` | `postgrestGet` | `evaluation_point_groups` | 获取单个分组详情 |
|
||||
| `getRuleGroup()` | `postgrestGet` | `evaluation_points` | 查询分组的评查点数量 |
|
||||
| `createRuleGroup()` | `postgrestPost` | `evaluation_point_groups` | 创建新分组 |
|
||||
| `updateRuleGroup()` | `postgrestPut` | `evaluation_point_groups` | 更新分组 |
|
||||
| `deleteRuleGroup()` | `postgrestDelete` | `evaluation_point_groups` | 删除分组 |
|
||||
| `deleteEvaluationPointsByGroupId()` | `postgrestDelete` | `evaluation_points` | 删除分组下的所有评查点 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 评查点分组 CRUD 操作
|
||||
- ✅ 分组树形结构查询(一级分组+二级分组)
|
||||
- ✅ 查询分组关联的评查点数量
|
||||
- ✅ 删除分组时级联删除子分组和评查点
|
||||
- ✅ 支持父分组(pid=0)和子分组(pid>0)
|
||||
|
||||
---
|
||||
|
||||
### 7. 评查文件审核
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/rules-files.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `updateDocumentAuditStatus()` | `postgrestPut` | `documents` | 更新文档审核状态 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 更新文件的审核状态
|
||||
- 确保只能更新用户自己的文档
|
||||
- 支持状态:待审核(0)、通过(1)、不通过(-1)、警告(-2)
|
||||
|
||||
---
|
||||
|
||||
### 8. 评审结果
|
||||
|
||||
**文件路径**: `app/api/evaluation_points/reviews.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getReviewPoints()` | `postgrestGet` | `contract_structure_comparison` | 获取文档附件数据 |
|
||||
| `getReviewPoints()` | `postgrestGet` | `evaluation_results` | 获取评查结果 |
|
||||
| `getReviewPoints()` | `postgrestGet` | `evaluation_points` | 获取评查点详情 |
|
||||
| `getReviewPoints()` | `postgrestGet` | `evaluation_point_groups` | 获取评查点组信息 |
|
||||
| `getReviewPoints()` | `postgrestGet` | `audit_status` | 获取人工审核状态 |
|
||||
| `getReviewPoints()` | `postgrestGet` | `cross_scoring_proposals` | 获取交叉评分提案 |
|
||||
| `updateReviewResult()` | `postgrestGet` | `evaluation_results` | 获取当前评查结果 |
|
||||
| `updateReviewResult()` | `postgrestPut` | `evaluation_results` | 更新评查结果 |
|
||||
| `updateReviewResult()` | `postgrestPut` | `audit_status` | 更新审核状态 |
|
||||
| `updateReviewResult()` | `postgrestPost` | `audit_status` | 创建新审核状态记录 |
|
||||
| `confirmReviewResults()` | `postgrestPut` | `documents` | 确认评查并更新文档状态 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 获取文档的完整评查结果
|
||||
- 查询评查点结果(evaluation_results)
|
||||
- 关联评查点详情(evaluation_points)
|
||||
- 关联评查点分组(evaluation_point_groups)
|
||||
- 获取人工审核状态(audit_status)
|
||||
- 获取合同附件比对结果(contract_structure_comparison)
|
||||
- 获取交叉评分提案(cross_scoring_proposals)
|
||||
- ✅ 更新评查结果
|
||||
- 修改评查意见和结果
|
||||
- 更新或创建人工审核状态
|
||||
- 支持重新审核操作
|
||||
- ✅ 确认评查结果(将文档审核状态设为通过)
|
||||
|
||||
---
|
||||
|
||||
### 9. 文档类型
|
||||
|
||||
**文件路径**: `app/api/document-types/document-types.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getDocumentTypes()` | `postgrestGet` | `document_types` | 获取文档类型列表 |
|
||||
| `getDocumentType()` | `postgrestGet` | `document_types` | 获取文档类型详情 |
|
||||
| `createDocumentType()` | `postgrestPost` | `document_types` | 创建文档类型 |
|
||||
| `updateDocumentType()` | `postgrestPut` | `document_types` | 更新文档类型 |
|
||||
| `deleteDocumentType()` | `postgrestDelete` | `document_types` | 删除文档类型 |
|
||||
| `getAllEvaluationPointGroups()` | `postgrestGet` | `evaluation_point_groups` | 获取所有评查点分组 |
|
||||
| `getParentEvaluationPointGroups()` | `postgrestGet` | `evaluation_point_groups` | 获取父级分组 |
|
||||
| `getEntryModules()` | `postgrestGet` | `entry_modules` | 获取入口模块列表 |
|
||||
| `getEvaluationPointGroupsByIds()` | `postgrestGet` | `evaluation_point_groups` | 根据ID获取分组信息 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 文档类型 CRUD 操作
|
||||
- ✅ 文档类型列表查询
|
||||
- 支持分页、排序
|
||||
- 支持按名称、分组筛选
|
||||
- 支持按文档类型 ID 数组过滤
|
||||
- 使用 PostgREST 外键关联查询入口模块
|
||||
- ✅ 文档类型关联评查点分组
|
||||
- ✅ 文档类型关联入口模块
|
||||
- ✅ 文档类型提示词配置(LLM抽取、VLM抽取、评查、总结)
|
||||
|
||||
---
|
||||
|
||||
### 10. 入口模块
|
||||
|
||||
**文件路径**: `app/api/entry-modules/entry-modules.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getEntryModules()` | `postgrestGet` | `entry_modules` | 获取入口模块列表 |
|
||||
| `getEntryModuleById()` | `postgrestGet` | `entry_modules` | 根据ID获取入口模块 |
|
||||
| `createEntryModule()` | `postgrestPost` | `entry_modules` | 创建入口模块 |
|
||||
| `updateEntryModule()` | `postgrestPut` | `entry_modules` | 更新入口模块 |
|
||||
| `deleteEntryModule()` | `postgrestDelete` | `entry_modules` | 删除入口模块 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 入口模块 CRUD 操作
|
||||
- ✅ 入口模块列表查询
|
||||
- 支持分页、排序
|
||||
- 支持按名称、地区筛选
|
||||
- 支持 JSONB 数组查询(areas字段)
|
||||
- ✅ 入口模块地区配置管理
|
||||
|
||||
---
|
||||
|
||||
### 11. 交叉评查
|
||||
|
||||
**文件路径**:
|
||||
- `app/api/cross-checking/cross-files.ts`
|
||||
- `app/api/cross-checking/cross-file-result.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `updateDocumentAuditStatus()` | `postgrestPut` | `documents` | 更新文档审核状态 |
|
||||
| `findIsProposer()` | `postgrestGet` | `cross_examination_tasks` | 查找是否是任务发起人 |
|
||||
| `confirmReviewResults()` | `postgrestPut` | `documents` | 完成评查并更新文档状态 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
**cross-files.ts**:
|
||||
- ✅ 获取用户任务列表(使用后端 API)
|
||||
- ✅ 获取任务文档列表(使用后端 API)
|
||||
- ✅ 获取统计数据(使用后端 API)
|
||||
- ✅ 更新文档审核状态(使用 PostgREST)
|
||||
|
||||
**cross-file-result.ts**:
|
||||
- ✅ 提交交叉评查意见(使用后端 API)
|
||||
- ✅ 获取交叉评查意见列表(使用后端 API)
|
||||
- ✅ 执行意见操作(赞同、反对、撤销,使用后端 API)
|
||||
- ✅ 完成评查(使用 PostgREST 更新文档状态)
|
||||
- ✅ 检查提案投票状态(使用后端 API)
|
||||
- ✅ 查找是否是任务发起人(使用 PostgREST)
|
||||
|
||||
---
|
||||
|
||||
### 12. 提示词模板
|
||||
|
||||
**文件路径**: `app/api/prompts/prompts.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getPromptTemplates()` | `postgrestGet` | `prompt_templates` | 获取提示词模板列表 |
|
||||
| `getPromptTemplate()` | `postgrestGet` | `prompt_templates` | 获取模板详情 |
|
||||
| `createPromptTemplate()` | `postgrestPost` | `prompt_templates` | 创建提示词模板 |
|
||||
| `updatePromptTemplate()` | `postgrestPut` | `prompt_templates` | 更新提示词模板 |
|
||||
| `deletePromptTemplate()` | `postgrestDelete` | `prompt_templates` | 删除提示词模板 |
|
||||
| `getPromptTemplateOptions()` | `postgrestGet` | `prompt_templates` | 获取模板选项列表 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 提示词模板 CRUD 操作
|
||||
- ✅ 提示词模板列表查询
|
||||
- 支持分页、排序
|
||||
- 支持按名称、类型、状态筛选
|
||||
- 使用 PostgREST 外键关联查询创建者信息(sso_users表)
|
||||
- ✅ 提示词模板类型
|
||||
- LLM抽取(LLM_Extraction)
|
||||
- VLM抽取(VLM_Extraction)
|
||||
- 评查(Evaluation)
|
||||
- 总结(Summary)
|
||||
- 通用(Common)
|
||||
- ✅ 获取指定类型的模板选项(用于下拉选择)
|
||||
|
||||
---
|
||||
|
||||
### 13. 系统配置
|
||||
|
||||
**文件路径**: `app/api/system_setting/config-lists.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getConfigLists()` | `postgrestGet` | `configurations` | 获取配置列表 |
|
||||
| `getConfigOptions()` | `postgrestGet` | `configurations` | 获取配置类型和环境选项 |
|
||||
| `getConfigDetail()` | `postgrestGet` | `configurations` | 获取配置详情 |
|
||||
| `createConfig()` | `postgrestPost` | `configurations` | 创建配置 |
|
||||
| `updateConfig()` | `postgrestPut` | `configurations` | 更新配置 |
|
||||
| `updateConfigStatus()` | `postgrestPut` | `configurations` | 更新配置状态 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 系统配置 CRUD 操作
|
||||
- ✅ 配置列表查询
|
||||
- 支持分页、排序
|
||||
- 支持按名称、类型、环境、状态筛选
|
||||
- ✅ 配置类型和环境动态选项查询
|
||||
- ✅ 配置状态管理(启用/禁用)
|
||||
|
||||
---
|
||||
|
||||
### 14. 合同模板
|
||||
|
||||
**文件路径**: `app/api/contract-template/templates.ts`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `getContractCategories()` | `postgrestGet` | `contract_categories` | 获取合同分类列表 |
|
||||
| `getContractCategoriesWithCount()` | `postgrestGet` | `contract_categories` | 获取分类及模板数量 |
|
||||
| `getContractCategoriesWithCount()` | `postgrestGet` | `contract_templates` | 统计每个分类的模板数量 |
|
||||
| `getContractTemplates()` | `postgrestGet` | `contract_categories` | 查询分类(用于关键词搜索) |
|
||||
| `getContractTemplates()` | `postgrestGet` | `contract_templates` | 获取合同模板列表 |
|
||||
| `getContractTemplate()` | `postgrestGet` | `contract_templates` | 获取单个模板详情 |
|
||||
| `getFeaturedTemplates()` | `postgrestGet` | `contract_templates` | 获取推荐模板 |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 合同分类管理
|
||||
- 获取所有分类
|
||||
- 统计每个分类的模板数量
|
||||
- ✅ 合同模板查询
|
||||
- 支持分页、排序
|
||||
- 支持按分类、格式、推荐状态筛选
|
||||
- 支持关键词搜索(标题、描述、模板编码、分类名)
|
||||
- 使用 PostgREST 外键关联查询分类信息
|
||||
- ✅ 获取推荐模板列表
|
||||
- ✅ 智能搜索功能
|
||||
|
||||
---
|
||||
|
||||
## 路由模块
|
||||
|
||||
### 15. 评查点编辑页面
|
||||
|
||||
**文件路径**: `app/routes/rules.new.tsx`
|
||||
|
||||
#### 使用的 PostgREST 函数
|
||||
|
||||
| 函数名 | 操作 | 表名 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `fetchEvaluationPoint()` | `postgrestGet` | `evaluation_points` | 获取评查点数据(编辑模式) |
|
||||
| `fetchEvaluationPointGroups()` | `postgrestGet` | `evaluation_point_groups` | 获取评查点组数据 |
|
||||
| `handleSave()` | `postgrestPut` | `evaluation_points` | 更新评查点(编辑模式) |
|
||||
| `handleSave()` | `postgrestPost` | `evaluation_points` | 创建评查点(新建模式) |
|
||||
|
||||
#### 主要功能
|
||||
|
||||
- ✅ 评查点创建/编辑/复制页面
|
||||
- ✅ 评查点数据加载(支持编辑和复制模式)
|
||||
- ✅ 评查点分组数据加载(用于下拉选择)
|
||||
- ✅ 评查点保存(新建或更新)
|
||||
- 基本信息设置
|
||||
- 抽取设置(LLM、VLM、Regex)
|
||||
- 评查设置(规则配置、消息配置)
|
||||
- ✅ 评查点编码清洗(移除地区后缀)
|
||||
- ✅ 表单验证(必填字段、规则完整性)
|
||||
|
||||
---
|
||||
|
||||
## 📊 统计信息
|
||||
|
||||
### 模块统计
|
||||
|
||||
| 类型 | 数量 |
|
||||
|------|------|
|
||||
| API 模块 | 14 |
|
||||
| 路由模块 | 1 |
|
||||
| 总计 | 15 |
|
||||
|
||||
### 数据库表统计
|
||||
|
||||
| 表名 | 操作频率 | 主要操作 |
|
||||
|------|---------|---------|
|
||||
| `evaluation_points` | 🔥🔥🔥🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `evaluation_point_groups` | 🔥🔥🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `documents` | 🔥🔥🔥🔥 | GET, PUT, DELETE |
|
||||
| `document_types` | 🔥🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `evaluation_results` | 🔥🔥🔥 | GET, PUT |
|
||||
| `prompt_templates` | 🔥🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `entry_modules` | 🔥🔥 | GET, POST, PUT, DELETE |
|
||||
| `contract_templates` | 🔥🔥 | GET |
|
||||
| `contract_categories` | 🔥🔥 | GET |
|
||||
| `configurations` | 🔥 | GET, POST, PUT |
|
||||
| `audit_status` | 🔥 | GET, PUT, POST |
|
||||
| `cross_examination_tasks` | 🔥 | GET |
|
||||
| `cross_scoring_proposals` | 🔥 | GET |
|
||||
| `contract_structure_comparison` | 🔥 | GET |
|
||||
|
||||
### PostgREST 操作统计
|
||||
|
||||
| 操作 | 使用次数 |
|
||||
|------|---------|
|
||||
| `postgrestGet` | 🔥🔥🔥🔥🔥 |
|
||||
| `postgrestPost` | 🔥🔥🔥 |
|
||||
| `postgrestPut` | 🔥🔥🔥🔥 |
|
||||
| `postgrestDelete` | 🔥🔥 |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 PostgREST 使用特性
|
||||
|
||||
### 1. 资源嵌入(Resource Embedding)
|
||||
|
||||
**使用示例**:
|
||||
```typescript
|
||||
// 查询文档类型并关联入口模块
|
||||
select: `
|
||||
id, name, description,
|
||||
entry_modules!fk_document_types_entry_module(id, name)
|
||||
`
|
||||
|
||||
// 查询提示词模板并关联创建者
|
||||
select: `
|
||||
id, template_name, template_type,
|
||||
sso_users!created_by(username)
|
||||
`
|
||||
|
||||
// 查询评查点并关联父子分组
|
||||
select: `
|
||||
id, code, name,
|
||||
child_group:evaluation_point_groups!fk_evaluation_points_group(id,name),
|
||||
parent_group:evaluation_point_groups!fk_evaluation_points_parent_group(id,name)
|
||||
`
|
||||
```
|
||||
|
||||
**使用场景**:
|
||||
- 文档类型查询(关联入口模块)
|
||||
- 提示词模板查询(关联创建者信息)
|
||||
- 评查点查询(关联父子分组)
|
||||
- 合同模板查询(关联分类信息)
|
||||
|
||||
### 2. 过滤查询(Filtering)
|
||||
|
||||
**使用示例**:
|
||||
```typescript
|
||||
// 精确匹配
|
||||
filter: { 'id': 'eq.123' }
|
||||
|
||||
// 模糊搜索
|
||||
filter: { 'name': 'ilike.*关键词*' }
|
||||
|
||||
// 数组包含(in)
|
||||
filter: { 'id': 'in.(1,2,3)' }
|
||||
|
||||
// JSONB 数组包含(cs)
|
||||
filter: { 'areas': 'cs.{"梅州"}' }
|
||||
|
||||
// 大于等于
|
||||
filter: { 'status': 'gte.0' }
|
||||
|
||||
// NULL 判断
|
||||
filter: { 'deleted_at': 'is.null' }
|
||||
```
|
||||
|
||||
### 3. OR 条件查询
|
||||
|
||||
**使用示例**:
|
||||
```typescript
|
||||
// 多字段模糊搜索
|
||||
or: [
|
||||
{ name: 'ilike.*关键词*' },
|
||||
{ code: 'ilike.*关键词*' }
|
||||
]
|
||||
|
||||
// 或者使用字符串格式
|
||||
or: `(title.ilike.*关键词*,description.ilike.*关键词*)`
|
||||
```
|
||||
|
||||
### 4. 分页与排序
|
||||
|
||||
**使用示例**:
|
||||
```typescript
|
||||
// 分页
|
||||
limit: 10,
|
||||
offset: (page - 1) * 10,
|
||||
|
||||
// 排序
|
||||
order: 'created_at.desc',
|
||||
order: 'sort_order.asc,name.asc',
|
||||
|
||||
// 获取总数
|
||||
headers: {
|
||||
'Prefer': 'count=exact'
|
||||
}
|
||||
```
|
||||
|
||||
### 5. RPC 函数调用
|
||||
|
||||
**使用示例**:
|
||||
```typescript
|
||||
// 调用存储过程
|
||||
await postgrestPost(
|
||||
'rpc/documents_get_document_history',
|
||||
{
|
||||
p_document_name: documentName,
|
||||
p_user_id: parseInt(userId, 10),
|
||||
p_exclude_id: excludeId
|
||||
},
|
||||
token
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
### 1. 数据提取
|
||||
|
||||
所有模块都使用统一的 `extractApiData<T>()` 函数处理 API 响应:
|
||||
```typescript
|
||||
function extractApiData<T>(responseData: unknown): T | null {
|
||||
if (!responseData) return null;
|
||||
|
||||
// 格式1: { code: number, msg: string, data: T }
|
||||
if (typeof responseData === 'object' && responseData !== null &&
|
||||
'code' in responseData && 'data' in responseData) {
|
||||
return (responseData as { data: T }).data;
|
||||
}
|
||||
|
||||
// 格式2: 直接是数据对象
|
||||
return responseData as T;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. JWT 认证
|
||||
|
||||
所有 PostgREST 请求都支持 JWT token 参数:
|
||||
```typescript
|
||||
const params: PostgrestParams = {
|
||||
// ... 其他参数
|
||||
token: frontendJWT
|
||||
};
|
||||
```
|
||||
|
||||
### 3. 错误处理
|
||||
|
||||
统一的错误处理模式:
|
||||
```typescript
|
||||
const response = await postgrestGet(...);
|
||||
|
||||
if (response.error) {
|
||||
return { error: response.error, status: response.status };
|
||||
}
|
||||
|
||||
const data = extractApiData<T>(response.data);
|
||||
if (!data) {
|
||||
return { error: '获取数据失败', status: 500 };
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 用户权限控制
|
||||
|
||||
- 大多数更新/删除操作都会检查 `user_id` 确保用户只能操作自己的数据
|
||||
- 省级管理员(`provincial_admin`)可以查看所有地区的数据
|
||||
- 普通用户只能查看自己地区的数据
|
||||
|
||||
---
|
||||
|
||||
## 🔄 混合使用情况
|
||||
|
||||
部分模块同时使用了 PostgREST 和后端 API:
|
||||
|
||||
| 模块 | PostgREST | 后端 API |
|
||||
|------|-----------|---------|
|
||||
| 文档管理 | ✅ 单个文档查询、更新、删除 | ✅ 文档列表查询 |
|
||||
| 首页统计 | ✅ 入口模块查询 | ✅ 统计数据查询 |
|
||||
| 文件上传 | ✅ 文档类型、状态查询 | ✅ 文件上传操作 |
|
||||
| 交叉评查 | ✅ 文档状态更新 | ✅ 任务和意见管理 |
|
||||
|
||||
---
|
||||
|
||||
## 📝 更新记录
|
||||
|
||||
| 日期 | 说明 |
|
||||
|------|------|
|
||||
| 2025-11-24 | 初始版本,整理完整的 PostgREST 使用清单 |
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 当添加新的 PostgREST 请求时,请及时更新此文档。
|
||||
@@ -0,0 +1,557 @@
|
||||
# 删除操作延迟确认功能实施文档
|
||||
|
||||
> **实施时间**: 2025-11-25
|
||||
> **功能描述**: 为所有删除操作添加4秒延迟确认功能,防止误删除操作
|
||||
|
||||
---
|
||||
|
||||
## 📋 目录
|
||||
|
||||
- [功能概述](#功能概述)
|
||||
- [技术实现](#技术实现)
|
||||
- [已更新的文件](#已更新的文件)
|
||||
- [使用示例](#使用示例)
|
||||
- [测试验证](#测试验证)
|
||||
|
||||
---
|
||||
|
||||
## 功能概述
|
||||
|
||||
### 需求背景
|
||||
|
||||
为了防止用户误操作导致数据被删除,所有删除操作都需要:
|
||||
1. 显示确认弹窗提示
|
||||
2. 确认按钮在4秒倒计时结束后才能点击
|
||||
3. 倒计时期间按钮显示剩余秒数
|
||||
|
||||
### 核心功能
|
||||
|
||||
- **延迟确认**: 确认按钮在4秒倒计时后才可点击
|
||||
- **倒计时显示**: 按钮文本显示 "删除 (4s)" → "删除 (3s)" → ... → "删除"
|
||||
- **视觉反馈**: 倒计时期间按钮呈半透明状态且鼠标样式为禁用
|
||||
- **统一体验**: 所有删除操作使用相同的确认流程
|
||||
|
||||
---
|
||||
|
||||
## 技术实现
|
||||
|
||||
### 1. MessageModal 组件增强
|
||||
|
||||
**文件**: `app/components/ui/MessageModal.tsx`
|
||||
|
||||
#### 新增 Props
|
||||
|
||||
```typescript
|
||||
interface MessageModalProps {
|
||||
// ... 现有属性
|
||||
// 确认按钮延迟时间(秒)- 用于危险操作(如删除)
|
||||
confirmDelay?: number;
|
||||
}
|
||||
```
|
||||
|
||||
#### 状态管理
|
||||
|
||||
```typescript
|
||||
const [remainingSeconds, setRemainingSeconds] = useState(confirmDelay);
|
||||
```
|
||||
|
||||
#### 倒计时逻辑
|
||||
|
||||
```typescript
|
||||
useEffect(() => {
|
||||
if (isOpen && confirmDelay > 0) {
|
||||
setRemainingSeconds(confirmDelay);
|
||||
const timer = setInterval(() => {
|
||||
setRemainingSeconds((prev) => {
|
||||
if (prev <= 1) {
|
||||
clearInterval(timer);
|
||||
return 0;
|
||||
}
|
||||
return prev - 1;
|
||||
});
|
||||
}, 1000);
|
||||
return () => clearInterval(timer);
|
||||
}
|
||||
}, [isOpen, confirmDelay]);
|
||||
```
|
||||
|
||||
#### 按钮渲染
|
||||
|
||||
```typescript
|
||||
<button
|
||||
className="message-modal-button primary"
|
||||
onClick={handleConfirm}
|
||||
disabled={remainingSeconds > 0}
|
||||
style={{
|
||||
opacity: remainingSeconds > 0 ? 0.5 : 1,
|
||||
cursor: remainingSeconds > 0 ? 'not-allowed' : 'pointer'
|
||||
}}
|
||||
>
|
||||
{remainingSeconds > 0 ? `${confirmText} (${remainingSeconds}s)` : confirmText}
|
||||
</button>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 已更新的文件
|
||||
|
||||
### 1. 文档管理模块 (documents.list.tsx)
|
||||
|
||||
**文件路径**: `app/routes/documents.list.tsx`
|
||||
|
||||
#### 更新位置 1: 单个文档删除 (Line 580-596)
|
||||
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: `确定要删除文档"${name}"吗?`,
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: () => {
|
||||
// 删除逻辑
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### 更新位置 2: 批量删除文档 (Line 617-642)
|
||||
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认批量删除",
|
||||
message: `确认删除选中的 ${selectedRowKeys.length} 个文档?`,
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: () => {
|
||||
// 批量删除逻辑
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 评查点管理模块 (rules.list.tsx)
|
||||
|
||||
**文件路径**: `app/routes/rules.list.tsx`
|
||||
|
||||
#### 更新位置 1: 单个评查点删除 (Line 526-542)
|
||||
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: `确认删除评查点【${rule.name}】吗?`,
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: () => {
|
||||
// 删除逻辑
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### 更新位置 2: 批量删除评查点 (Line 603-634)
|
||||
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认批量删除",
|
||||
message: `确定要删除选中的 ${selectedIds.length} 个评查点吗?此操作不可恢复。`,
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: async () => {
|
||||
// 批量删除逻辑
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. 评查点分组管理模块 (rule-groups._index.tsx)
|
||||
|
||||
**文件路径**: `app/routes/rule-groups._index.tsx`
|
||||
|
||||
#### 导入更新
|
||||
|
||||
```typescript
|
||||
// 原代码
|
||||
import { toastService } from "~/components/ui";
|
||||
|
||||
// 新代码
|
||||
import { toastService, messageService } from "~/components/ui";
|
||||
```
|
||||
|
||||
#### 更新位置 1: 单个分组删除 (Line 233-275)
|
||||
|
||||
**原代码** (使用 `confirm()`):
|
||||
```typescript
|
||||
if (confirm("确定要删除该分组吗?此操作将同时删除该分组下的所有评查点,且不可恢复。")) {
|
||||
// 删除逻辑
|
||||
}
|
||||
```
|
||||
|
||||
**新代码** (使用 `messageService`):
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: "确定要删除该分组吗?此操作将同时删除该分组下的所有评查点,且不可恢复。",
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: async () => {
|
||||
// 删除逻辑
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
#### 更新位置 2: 批量删除分组 (Line 307-328)
|
||||
|
||||
**原代码** (使用 `confirm()`):
|
||||
```typescript
|
||||
if (!confirm(`确定要删除选中的 ${selectedIds.length} 个分组吗?此操作不可恢复。`)) {
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
**新代码** (使用 `messageService`):
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认批量删除",
|
||||
message: `确定要删除选中的 ${selectedIds.length} 个分组吗?此操作不可恢复。`,
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: async () => {
|
||||
// 删除逻辑
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. 提示词模板管理模块 (prompts._index.tsx)
|
||||
|
||||
**文件路径**: `app/routes/prompts._index.tsx`
|
||||
|
||||
#### 导入更新
|
||||
|
||||
```typescript
|
||||
// 原代码
|
||||
import { toastService } from "~/components/ui";
|
||||
|
||||
// 新代码
|
||||
import { toastService, messageService } from "~/components/ui";
|
||||
```
|
||||
|
||||
#### 更新位置: 删除模板 (Line 220-234)
|
||||
|
||||
**原代码** (使用 `confirm()`):
|
||||
```typescript
|
||||
if (confirm('确定要删除该模板吗?删除后无法恢复。')) {
|
||||
const formData = new FormData();
|
||||
formData.append('id', id);
|
||||
formData.append('intent', 'delete');
|
||||
fetcher.submit(formData, { method: 'post' });
|
||||
}
|
||||
```
|
||||
|
||||
**新代码** (使用 `messageService`):
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: "确定要删除该模板吗?删除后无法恢复。",
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: () => {
|
||||
const formData = new FormData();
|
||||
formData.append('id', id);
|
||||
formData.append('intent', 'delete');
|
||||
fetcher.submit(formData, { method: 'post' });
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. 入口模块管理模块 (entry-modules._index.tsx)
|
||||
|
||||
**文件路径**: `app/routes/entry-modules._index.tsx`
|
||||
|
||||
#### 导入更新
|
||||
|
||||
```typescript
|
||||
// 原代码
|
||||
import { toastService } from "~/components/ui/Toast";
|
||||
|
||||
// 新代码
|
||||
import { toastService } from "~/components/ui/Toast";
|
||||
import { messageService } from "~/components/ui/MessageModal";
|
||||
```
|
||||
|
||||
#### 更新位置: 删除入口模块 (Line 215-250)
|
||||
|
||||
**原代码** (使用 `confirm()`):
|
||||
```typescript
|
||||
if (confirm('确定要删除该入口模块吗?此操作不可撤销。')) {
|
||||
setIsDeleting(true);
|
||||
// 删除逻辑
|
||||
}
|
||||
```
|
||||
|
||||
**新代码** (使用 `messageService`):
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: "确定要删除该入口模块吗?此操作不可撤销。",
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: async () => {
|
||||
setIsDeleting(true);
|
||||
// 删除逻辑
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. 文档类型管理模块 (document-types._index.tsx)
|
||||
|
||||
**文件路径**: `app/routes/document-types._index.tsx`
|
||||
|
||||
#### 导入更新
|
||||
|
||||
```typescript
|
||||
// 原代码
|
||||
import { toastService } from "~/components/ui/Toast";
|
||||
|
||||
// 新代码
|
||||
import { toastService } from "~/components/ui/Toast";
|
||||
import { messageService } from "~/components/ui/MessageModal";
|
||||
```
|
||||
|
||||
#### 更新位置: 删除文档类型 (Line 204-239)
|
||||
|
||||
**原代码** (使用 `confirm()` 和 `alert()`):
|
||||
```typescript
|
||||
if (confirm('确定要删除该文档类型吗?此操作不会影响关联的评查点分组,但可能会影响使用该类型的文档评查。')) {
|
||||
setIsDeleting(true);
|
||||
// 删除逻辑
|
||||
if (result.success) {
|
||||
alert('删除成功!');
|
||||
} else {
|
||||
alert(`删除失败: ${result.error || '未知错误'}`);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**新代码** (使用 `messageService` 和 `toastService`):
|
||||
```typescript
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: "确定要删除该文档类型吗?此操作不会影响关联的评查点分组,但可能会影响使用该类型的文档评查。",
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // ✅ 新增
|
||||
onConfirm: async () => {
|
||||
setIsDeleting(true);
|
||||
// 删除逻辑
|
||||
if (result.success) {
|
||||
toastService.success('删除成功!');
|
||||
} else {
|
||||
toastService.error(`删除失败: ${result.error || '未知错误'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 基本用法
|
||||
|
||||
```typescript
|
||||
import { messageService } from "~/components/ui/MessageModal";
|
||||
|
||||
const handleDelete = (id: string, name: string) => {
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: `确定要删除"${name}"吗?`,
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // 4秒延迟
|
||||
onConfirm: () => {
|
||||
// 执行删除操作
|
||||
deleteItem(id);
|
||||
}
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
### 批量删除示例
|
||||
|
||||
```typescript
|
||||
const handleBatchDelete = () => {
|
||||
if (selectedIds.length === 0) {
|
||||
toastService.error('请至少选择一项');
|
||||
return;
|
||||
}
|
||||
|
||||
messageService.show({
|
||||
title: "确认批量删除",
|
||||
message: `确定要删除选中的 ${selectedIds.length} 项吗?此操作不可恢复。`,
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4,
|
||||
onConfirm: async () => {
|
||||
// 执行批量删除
|
||||
await batchDeleteItems(selectedIds);
|
||||
}
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 测试验证
|
||||
|
||||
### 测试清单
|
||||
|
||||
#### 1. 单个删除操作测试
|
||||
|
||||
- [ ] 文档删除 (`/documents`)
|
||||
- [ ] 评查点删除 (`/rules`)
|
||||
- [ ] 评查点分组删除 (`/rule-groups`)
|
||||
- [ ] 提示词模板删除 (`/prompts`)
|
||||
- [ ] 入口模块删除 (`/entry-modules`)
|
||||
- [ ] 文档类型删除 (`/document-types`)
|
||||
|
||||
#### 2. 批量删除操作测试
|
||||
|
||||
- [ ] 批量删除文档
|
||||
- [ ] 批量删除评查点
|
||||
- [ ] 批量删除评查点分组
|
||||
|
||||
### 测试要点
|
||||
|
||||
1. **倒计时功能**:
|
||||
- ✅ 弹窗打开后,确认按钮显示 "删除 (4s)"
|
||||
- ✅ 每秒递减: "删除 (3s)" → "删除 (2s)" → "删除 (1s)" → "删除"
|
||||
- ✅ 倒计时期间按钮不可点击
|
||||
|
||||
2. **视觉反馈**:
|
||||
- ✅ 倒计时期间按钮半透明 (opacity: 0.5)
|
||||
- ✅ 鼠标悬停显示禁用光标 (cursor: not-allowed)
|
||||
- ✅ 倒计时结束后按钮恢复正常样式
|
||||
|
||||
3. **交互行为**:
|
||||
- ✅ 点击取消按钮可以立即关闭弹窗
|
||||
- ✅ 点击遮罩层可以立即关闭弹窗
|
||||
- ✅ 按 ESC 键可以立即关闭弹窗
|
||||
- ✅ 倒计时结束后点击确认执行删除操作
|
||||
|
||||
4. **边界情况**:
|
||||
- ✅ 快速打开/关闭弹窗不会导致计时器泄漏
|
||||
- ✅ 多次打开弹窗,倒计时每次都重新开始
|
||||
|
||||
### 预期行为
|
||||
|
||||
**正常流程**:
|
||||
```
|
||||
用户点击删除 → 弹窗显示 → 确认按钮显示 "删除 (4s)"
|
||||
→ 倒计时 3秒 → 倒计时 2秒 → 倒计时 1秒 → "删除" 可点击
|
||||
→ 用户点击确认 → 执行删除 → 显示成功提示
|
||||
```
|
||||
|
||||
**取消流程**:
|
||||
```
|
||||
用户点击删除 → 弹窗显示 → 倒计时进行中
|
||||
→ 用户点击取消/遮罩层/ESC键 → 弹窗关闭 → 不执行删除
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 统计总结
|
||||
|
||||
### 更新统计
|
||||
|
||||
| 模块 | 文件名 | 删除操作数 | 导入变更 | 替换 confirm() |
|
||||
|------|--------|------------|----------|----------------|
|
||||
| 文档管理 | documents.list.tsx | 2 | - | - |
|
||||
| 评查点管理 | rules.list.tsx | 2 | - | - |
|
||||
| 评查点分组 | rule-groups._index.tsx | 2 | ✅ | ✅ |
|
||||
| 提示词模板 | prompts._index.tsx | 1 | ✅ | ✅ |
|
||||
| 入口模块 | entry-modules._index.tsx | 1 | ✅ | ✅ |
|
||||
| 文档类型 | document-types._index.tsx | 1 | ✅ | ✅ |
|
||||
| **总计** | **6 个文件** | **9 个操作** | **4 个文件** | **4 个文件** |
|
||||
|
||||
### 代码改动
|
||||
|
||||
- **新增代码**: MessageModal 组件增强 (~50 行)
|
||||
- **修改代码**: 9 个删除操作函数 (~200 行)
|
||||
- **导入变更**: 4 个文件添加 messageService 导入
|
||||
- **替换操作**: 4 个文件从 `confirm()` 迁移到 `messageService.show()`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 后续维护
|
||||
|
||||
### 新增删除操作开发规范
|
||||
|
||||
当开发人员需要添加新的删除功能时,请遵循以下规范:
|
||||
|
||||
```typescript
|
||||
// ✅ 正确做法
|
||||
import { messageService } from "~/components/ui/MessageModal";
|
||||
|
||||
const handleDelete = (id: string) => {
|
||||
messageService.show({
|
||||
title: "确认删除",
|
||||
message: "确定要删除该项吗?",
|
||||
type: "warning",
|
||||
confirmText: "删除",
|
||||
cancelText: "取消",
|
||||
confirmDelay: 4, // 必须添加
|
||||
onConfirm: () => {
|
||||
// 删除逻辑
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// ❌ 错误做法
|
||||
const handleDelete = (id: string) => {
|
||||
if (confirm("确定要删除吗?")) { // 不要使用原生 confirm
|
||||
// 删除逻辑
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### Code Review 检查点
|
||||
|
||||
在代码审查时,请确认:
|
||||
1. ✅ 所有删除操作都使用 `messageService.show()`
|
||||
2. ✅ 所有删除确认都包含 `confirmDelay: 4`
|
||||
3. ✅ 没有使用原生 `confirm()` 或 `alert()`
|
||||
4. ✅ 导入了正确的 `messageService`
|
||||
|
||||
---
|
||||
|
||||
## 📞 联系支持
|
||||
|
||||
如遇到问题,请联系开发团队。
|
||||
|
||||
**文档维护人**: Claude Code
|
||||
**最后更新**: 2025-11-25
|
||||
Reference in New Issue
Block a user