Skip to content

Commit 0619e67

Browse files
committed
snapshot
1 parent d64e9dc commit 0619e67

6 files changed

Lines changed: 223 additions & 9 deletions

File tree

file_classification_core/src/service/file_group.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,13 @@ pub fn select_file_groups_by_conditions(
7070
crate::internal::file_group::select_file_groups_by_conditions(conn, condition, limit)
7171
}
7272

73+
// NOTE: 这个方法在core里不应该有用法
74+
// 要暴露给用户使用的话 应当改为先select再delete_by_id
75+
// 防止引用计算问题
7376
pub fn delete_file_groups_by_conditions(
7477
conn: &mut SqliteConnection,
7578
condition: Vec<FileGroupCondition>,
7679
) -> Result<usize, Error> {
80+
// TODO: 减少文件和组的引用计数
7781
crate::internal::file_group::delete_file_groups_by_conditions(conn, condition)
7882
}

file_classification_core/src/service/files.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,14 @@ pub fn update_files_by_conditions(
148148
internal::files::update_files_by_conditions(conn, conditions, update_set)
149149
}
150150

151+
// NOTE: 这个方法在core里不应该有用法
152+
// 要暴露给用户使用的话 应当改为先select再delete_by_id
153+
// 防止引用计算问题
151154
pub fn delete_files_by_conditions(
152155
conn: &mut SqliteConnection,
153156
conditions: Vec<FileCondition>,
154157
) -> Result<usize, diesel::result::Error> {
158+
// TODO: 减少文件的引用计数
155159
internal::files::delete_files_by_conditions(conn, conditions)
156160
}
157161

file_classification_core/src/service/group_tag.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use super::database::SqliteConnection;
22
use crate::internal::groups::{decrease_group_reference_count, find_group_by_id, increase_group_reference_count};
33
use crate::internal::tags::{decrease_tag_reference_count, find_tag_by_id, increase_tag_reference_count};
4-
use crate::internal::{group_tag as group_tags, group_tag};
54
use crate::model::models::{GroupTagCondition, GroupTagDTO};
65
use crate::service::AppError;
76
use diesel::result::Error;
@@ -23,7 +22,7 @@ pub fn create_group_tag(
2322
increase_tag_reference_count(conn, group_tag_dto.tag_id)?;
2423

2524
// 调用数据访问层执行插入操作
26-
group_tag::insert_group_tag(conn, &group_tag_dto)?;
25+
crate::internal::group_tag::insert_group_tag(conn, &group_tag_dto)?;
2726
Ok(())
2827
})?;
2928

@@ -46,7 +45,7 @@ pub fn delete_group_tag_by_id(
4645
decrease_tag_reference_count(conn, group_tag_dto.tag_id)?;
4746

4847
// 调用数据访问层执行删除操作
49-
let deleted_count = group_tag::delete_group_tag_by_id(conn, &group_tag_dto)?;
48+
let deleted_count = crate::internal::group_tag::delete_group_tag_by_id(conn, &group_tag_dto)?;
5049

5150
Ok(deleted_count)
5251
})?;
@@ -60,12 +59,16 @@ pub fn select_group_tags_by_conditions(
6059
condition: Vec<GroupTagCondition>,
6160
limit: Option<i64>,
6261
) -> Result<Vec<GroupTagDTO>, diesel::result::Error> {
63-
group_tags::select_group_tags_by_conditions(conn, condition, limit)
62+
crate::internal::group_tag::select_group_tags_by_conditions(conn, condition, limit)
6463
}
6564

65+
// NOTE: 这个方法在core里不应该有用法
66+
// 要暴露给用户使用的话 应当改为先select再delete_by_id
67+
// 防止引用计算问题
6668
pub fn delete_group_tags_by_conditions(
6769
conn: &mut SqliteConnection,
6870
condition: Vec<GroupTagCondition>,
6971
) -> Result<usize, Error> {
70-
group_tags::delete_group_tags_by_conditions(conn, condition)
72+
// TODO: 减少组和标签的引用计数
73+
crate::internal::group_tag::delete_group_tags_by_conditions(conn, condition)
7174
}

file_classification_core/src/service/groups.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::database::SqliteConnection;
22
use crate::model::models::{FileCondition, FileGroupCondition, GroupCondition, GroupTagCondition, UpdateGroupDTO};
3-
use crate::service::{file_group, files, group_tag, AppError};
3+
use crate::service::AppError;
44
use crate::{internal::groups, model::models::{CreateGroupDTO, Group, GroupFilter}};
55
use diesel::result::Error;
66
use diesel::Connection;
@@ -27,15 +27,15 @@ pub fn delete_group(
2727
conn.transaction::<usize, Error, _>(|conn| {
2828
let group = groups::find_group_by_id(conn, group_id)?.ok_or(AppError::GroupNotFound)?;
2929
if group.is_primary {
30-
files::delete_files_by_conditions(conn, vec![
30+
crate::internal::files::delete_files_by_conditions(conn, vec![
3131
FileCondition::GroupId(group_id)
3232
])?;
3333
} else {
34-
file_group::delete_file_groups_by_conditions(conn, vec![
34+
crate::internal::file_group::delete_file_groups_by_conditions(conn, vec![
3535
FileGroupCondition::GroupId(group_id)
3636
])?;
3737
}
38-
group_tag::delete_group_tags_by_conditions(conn, vec![
38+
crate::internal::group_tag::delete_group_tags_by_conditions(conn, vec![
3939
GroupTagCondition::GroupId(group_id)
4040
])?;
4141
groups::delete_group(conn, group_id)
@@ -68,10 +68,14 @@ pub fn update_groups_by_conditions(
6868
}
6969

7070

71+
// NOTE: 这个方法在core里不应该有用法
72+
// 要暴露给用户使用的话 应当改为先select再delete_by_id
73+
// 防止引用计算问题
7174
pub fn delete_groups_by_conditions(
7275
conn: &mut SqliteConnection,
7376
conditions: Vec<GroupCondition>,
7477
) -> Result<usize, Error> {
78+
// TODO: 减少组的引用计数
7579
groups::delete_groups_by_conditions(conn, conditions)
7680
}
7781

file_classification_core/src/service/tags.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,13 @@ pub fn update_tags_by_conditions(
3939
}
4040

4141

42+
// NOTE: 这个方法在core里不应该有用法
43+
// 要暴露给用户使用的话 应当改为先select再delete_by_id
44+
// 防止引用计算问题
4245
pub fn delete_tags_by_conditions(
4346
conn: &mut SqliteConnection,
4447
conditions: Vec<TagCondition>,
4548
) -> Result<usize, diesel::result::Error> {
49+
// TODO: 减少标签的引用计数
4650
tags::delete_tags_by_conditions(conn, conditions)
4751
}

project_structure.md

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
# FileClassificationSolutions 项目结构
2+
3+
这是一个基于 Rust 的文件分类解决方案,采用模块化架构设计,包含核心库、命令行界面和 Web API 等多个组件。
4+
5+
## 项目整体结构
6+
7+
```
8+
FileClassificationSolutions/
9+
├── .github/ # GitHub 相关配置
10+
│ └── workflows/ # CI/CD 工作流配置
11+
├── file_classification_cli/ # 命令行界面应用
12+
│ ├── src/bin/ # 各个独立的命令行工具
13+
│ └── Cargo.toml # CLI 包配置
14+
├── file_classification_core/ # 核心库
15+
│ ├── src/
16+
│ │ ├── internal/ # 数据访问层
17+
│ │ ├── model/ # 数据模型和数据库模式
18+
│ │ ├── service/ # 业务逻辑层
19+
│ │ └── utils/ # 工具函数
20+
│ └── Cargo.toml # 核心库包配置
21+
├── file_classification_webapi/ # Web API (旧版)
22+
│ ├── src/bin/ # 各个独立的API端点
23+
│ └── Cargo.toml # Web API 包配置
24+
├── file_classification_webapi2/ # Web API (新版)
25+
│ ├── src/
26+
│ │ ├── handlers/ # 请求处理函数
27+
│ │ └── utils/ # Web API 工具函数
28+
│ └── Cargo.toml # Web API2 包配置
29+
├── migrations/ # 数据库迁移脚本
30+
└── nix/ # Nix 包管理配置
31+
```
32+
33+
34+
## 核心模块详解
35+
36+
### file_classification_core (核心库)
37+
38+
这是整个项目的业务逻辑核心,包含了数据模型、数据库访问层和业务服务。
39+
40+
#### 目录结构
41+
```
42+
file_classification_core/
43+
├── src/
44+
│ ├── internal/ # 数据访问层 (DAO)
45+
│ │ ├── file_group.rs # 文件组关联数据访问
46+
│ │ ├── files.rs # 文件数据访问
47+
│ │ ├── group_tag.rs # 组标签关联数据访问
48+
│ │ ├── groups.rs # 组数据访问
49+
│ │ └── tags.rs # 标签数据访问
50+
│ ├── model/ # 数据模型
51+
│ │ ├── models.rs # 所有数据结构定义
52+
│ │ └── schema.rs # 数据库模式 (由 Diesel 生成)
53+
│ ├── service/ # 业务逻辑层
54+
│ │ ├── file_group.rs # 文件组关联业务逻辑
55+
│ │ ├── files.rs # 文件业务逻辑
56+
│ │ ├── group_tag.rs # 组标签关联业务逻辑
57+
│ │ ├── groups.rs # 组业务逻辑
58+
│ │ └── tags.rs # 标签业务逻辑
59+
│ └── utils/ # 工具函数
60+
│ ├── database.rs # 数据库连接管理
61+
│ └── errors.rs # 错误处理
62+
└── Cargo.toml # 包配置文件
63+
```
64+
65+
66+
### file_classification_cli (命令行界面)
67+
68+
提供命令行工具来操作文件分类系统。
69+
70+
#### 目录结构
71+
```
72+
file_classification_cli/
73+
├── src/bin/ # 各个独立的命令行工具
74+
│ ├── create_file_group.rs # 创建文件组关联
75+
│ ├── create_group.rs # 创建组
76+
│ ├── create_group_tag.rs # 创建组标签关联
77+
│ ├── create_tag.rs # 创建标签
78+
│ ├── delete_file.rs # 删除文件
79+
│ ├── delete_file_group.rs # 删除文件组关联
80+
│ ├── delete_group.rs # 删除组
81+
│ ├── delete_group_tag.rs # 删除组标签关联
82+
│ ├── delete_tag.rs # 删除标签
83+
│ ├── list_file_groups_by_conditions.rs # 条件查询文件组关联
84+
│ ├── list_files.rs # 列出文件
85+
│ ├── list_files_by_conditions.rs # 条件查询文件
86+
│ ├── list_group_tags_by_conditions.rs # 条件查询组标签关联
87+
│ ├── list_groups.rs # 列出组
88+
│ ├── list_groups_by_conditions.rs # 条件查询组
89+
│ ├── list_tags.rs # 列出标签
90+
│ ├── list_tags_by_conditions.rs # 条件查询标签
91+
│ ├── update_files_by_conditions.rs # 条件更新文件
92+
│ ├── update_groups_by_conditions.rs # 条件更新组
93+
│ └── update_tags_by_conditions.rs # 条件更新标签
94+
└── Cargo.toml # 包配置文件
95+
```
96+
97+
98+
### file_classification_webapi2 (Web API - 新版)
99+
100+
基于 Actix-web 框架构建的 RESTful API 服务。
101+
102+
#### 目录结构
103+
```
104+
file_classification_webapi2/
105+
├── src/
106+
│ ├── handlers/ # API 请求处理函数
107+
│ │ ├── file_groups.rs # 文件组关联 API 处理
108+
│ │ ├── files.rs # 文件 API 处理
109+
│ │ ├── group_tags.rs # 组标签关联 API 处理
110+
│ │ ├── groups.rs # 组 API 处理
111+
│ │ ├── mod.rs # 模块声明
112+
│ │ └── tags.rs # 标签 API 处理
113+
│ ├── utils/ # Web API 工具函数
114+
│ │ ├── database.rs # 数据库连接池
115+
│ │ ├── mod.rs # 模块声明
116+
│ │ └── models.rs # API 数据传输对象
117+
│ └── main.rs # 应用入口点
118+
└── Cargo.toml # 包配置文件
119+
```
120+
121+
122+
### 数据库迁移
123+
124+
```
125+
migrations/
126+
└── 2024-10-01-193345_FileClassification/
127+
├── up.sql # 数据库表创建脚本
128+
└── down.sql # 数据库表删除脚本
129+
```
130+
131+
132+
数据库包含以下表:
133+
- `files`: 存储文件信息
134+
- `groups`: 存储文件组信息
135+
- `file_groups`: 文件和组的多对多关联关系
136+
- `tags`: 存储标签信息
137+
- `group_tags`: 组和标签的多对多关联关系
138+
139+
### 数据模型关系
140+
141+
```mermaid
142+
erDiagram
143+
files ||--o{ file_groups : has
144+
groups ||--o{ file_groups : has
145+
groups ||--o{ group_tags : has
146+
tags ||--o{ group_tags : has
147+
148+
files {
149+
int id PK
150+
string type
151+
string path
152+
int reference_count
153+
int group_id FK
154+
}
155+
156+
groups {
157+
int id PK
158+
string name
159+
int reference_count
160+
boolean is_primary
161+
int click_count
162+
int share_count
163+
timestamp create_time
164+
timestamp modify_time
165+
}
166+
167+
file_groups {
168+
int file_id PK,FK
169+
int group_id PK,FK
170+
}
171+
172+
tags {
173+
int id PK
174+
string name
175+
int reference_count
176+
}
177+
178+
group_tags {
179+
int group_id PK,FK
180+
int tag_id PK,FK
181+
}
182+
```
183+
184+
185+
## 架构特点
186+
187+
1. **分层架构**: 项目采用清晰的分层架构,将数据访问、业务逻辑和表示层分离
188+
2. **模块化设计**: 不同的功能模块被组织在独立的 crate 中
189+
3. **多种访问方式**: 提供 CLI 和 Web API 两种访问方式
190+
4. **强类型安全**: 利用 Rust 的类型系统保证代码安全
191+
5. **错误处理**: 统一的错误处理机制
192+
6. **数据库抽象**: 使用 Diesel ORM 进行数据库操作
193+
7. **可扩展性**: 易于添加新的功能模块和访问接口
194+
195+
这个项目结构设计支持对文件进行分类管理,通过组和标签的方式组织文件,并提供多种访问接口以适应不同使用场景。

0 commit comments

Comments
 (0)