# ResourceCategory 移除清单

## 📝 概述

本文档记录了 `ResourceCategory` 相关功能的完整移除过程。原资源分类功能已完全迁移到标签系统（`tb_tag` 的 `tag_type=1`）。

---

## ✅ 已完成的操作

### 1. 数据库层面

#### 已注释的建表语句
**文件：** `.bin\mysql\sql\createTableResource.sql`

```sql
-- 资源分类表（已废弃，使用 tb_tag 表的 tag_type=1 代替）
-- DROP TABLE IF EXISTS `tb_resource_category`;
-- CREATE TABLE `tb_resource_category` (
--   ...
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资源分类表';
-- 
-- ⚠️ 注意：资源分类功能已迁移到 tb_tag 表中，使用 tag_type=1 表示文章分类标签
```

#### 已注释的初始化数据
**文件：** `.bin\mysql\sql\initAllData.sql`

```sql
-- 插入资源分类数据（已废弃，使用下方的 tb_tag 数据代替）
-- INSERT INTO `tb_resource_category` (id, category_id, name, description, order_num, creator, create_time) VALUES
-- ('1', 'party_history', '党史学习', '党史学习相关资源', 1, '1', now()),
-- ...
```

### 2. Java 代码层面

#### 已删除的文件（共7个）

1. **实体类**
   - ❌ `common\common-dto\src\main\java\org\xyzh\common\dto\resource\TbResourceCategory.java`

2. **Service 层**
   - ❌ `api\api-news\src\main\java\org\xyzh\api\news\category\ResourceCategoryService.java`
   - ❌ `news\src\main\java\org\xyzh\news\service\NCResourceCategoryService.java`
   - ❌ `news\src\main\java\org\xyzh\news\service\impl\NCResourceCategoryServiceImpl.java`

3. **Controller 层**
   - ❌ `news\src\main\java\org\xyzh\news\controller\ResourceCategoryController.java`

4. **Mapper 层**
   - ❌ `news\src\main\java\org\xyzh\news\mapper\ResourceCategoryMapper.java`
   - ❌ `news\src\main\resources\mapper\ResourceCategoryMapper.xml`

#### 已修改的文件（共2个）

1. **ResourceVO.java**
   - 删除了 `resourceCategory` 字段及其 getter/setter
   - 保留 `tags` 字段用于存储标签列表（包含文章分类标签）

**修改前：**
```java
public class ResourceVO {
    private TbResource resource;
    private TbResourceCategory resourceCategory;  // ❌ 已删除
    private List<TbTag> tags;
}
```

**修改后：**
```java
public class ResourceVO {
    private TbResource resource;
    // ✅ 资源标签列表（包含文章分类标签 tag_type=1）
    private List<TbTag> tags;
}
```

2. **ResourceCenterController.java**
   - 修改 import 语句，移除 `TbResourceCategory`，添加 `TbTag`
   - 修改返回类型：`ResultDomain<TbResourceCategory>` → `ResultDomain<TbTag>`
   - 更新 TODO 注释，说明使用 `TagService.getTagsByType(1)`

**关键修改：**
```java
// 修改前
import org.xyzh.common.dto.resource.TbResourceCategory;
public ResultDomain<TbResourceCategory> getSpecialCategories() { ... }

// 修改后
import org.xyzh.common.dto.resource.TbTag;
public ResultDomain<TbTag> getSpecialCategories() {
    // TODO: 使用 TagService.getTagsByType(1) 获取文章分类标签
}
```

---

## 🔄 迁移映射关系

### API 接口映射

| 原接口 (ResourceCategory) | 新接口 (Tag) | 说明 |
|---------------------------|--------------|------|
| `GET /news/categorys/list` | `GET /news/tags/type/1` | 获取所有文章分类标签 |
| `GET /news/categorys/category/{id}` | `GET /news/tags/tag/{tagID}` | 获取单个标签详情 |
| `POST /news/categorys/category` | `POST /news/tags/tag` | 创建标签（需指定 tagType=1） |
| `PUT /news/categorys/category` | `PUT /news/tags/tag` | 更新标签 |
| `DELETE /news/categorys/category/{id}` | `DELETE /news/tags/tag/{tagID}` | 删除标签 |
| `GET /news/categorys/tree` | `GET /news/tags/type/1` | 获取分类树（可通过标签列表构建） |

### 数据字段映射

| ResourceCategory 字段 | Tag 字段 | 说明 |
|----------------------|----------|------|
| `tagID` | `tagID` | 唯一标识 |
| `name` | `name` | 名称 |
| `description` | `description` | 描述 |
| `icon` | - | 图标（Tag中无此字段，可扩展） |
| `orderNum` | - | 排序号（可通过创建时间排序） |
| `parentID` | - | 父分类（Tag为扁平结构） |
| - | `tagType` | 标签类型（固定为1） |
| - | `color` | 标签颜色（新增字段） |

### 代码调用映射

**修改前：**
```java
// 使用 ResourceCategoryService
ResourceCategoryService categoryService;
ResultDomain<TbResourceCategory> result = categoryService.getAllCategories();
```

**修改后：**
```java
// 使用 TagService
TagService tagService;
ResultDomain<TbTag> result = tagService.getTagsByType(1);  // 1 = 文章分类标签
```

---

## ⚠️ 数据迁移注意事项

### 如果数据库中已有 tb_resource_category 数据

需要执行以下迁移 SQL：

```sql
-- 1. 将 tb_resource_category 数据迁移到 tb_tag
INSERT INTO tb_tag (id, tag_id, name, description, tag_type, creator, create_time)
SELECT 
    id,
    category_id AS tag_id,
    name,
    description,
    1 AS tag_type,  -- 文章分类标签
    creator,
    create_time
FROM tb_resource_category
WHERE deleted = 0;

-- 2. 确认迁移成功后，删除旧表（可选）
-- DROP TABLE IF EXISTS tb_resource_category;
```

### tb_resource 表的 category_id 字段

`tb_resource` 表中的 `category_id` 字段仍然保留，但现在应该：
- 存储的是 `tb_tag` 表中 `tag_type=1` 的标签的 `tag_id`
- 或者改为使用 `tb_resource_tag` 关联表来管理资源与分类标签的关系

**推荐方案：** 使用 `tb_resource_tag` 关联表
```sql
-- 迁移资源分类关系到资源标签关联表
INSERT INTO tb_resource_tag (id, resource_id, tag_id, create_time)
SELECT 
    CONCAT('rt_', UUID()) AS id,
    resource_id,
    category_id AS tag_id,
    NOW() AS create_time
FROM tb_resource
WHERE category_id IS NOT NULL AND category_id != '';
```

---

## 📊 影响范围评估

### 前端影响
- ❌ 需要修改前端代码中调用 `/news/categorys` 的接口
- ✅ 改为调用 `/news/tags/type/1` 接口
- ✅ 数据结构基本一致，只需修改接口地址和字段映射

### 后端影响
- ✅ 已完全移除 ResourceCategory 相关代码
- ✅ 所有功能已迁移到 TagService
- ⚠️ 如有其他模块引用了 ResourceCategory，需要同步修改

### 数据库影响
- ✅ 建表语句已注释，不会创建 `tb_resource_category` 表
- ⚠️ 如果数据库中已存在该表，需要手动迁移数据
- ⚠️ 建议保留旧表一段时间作为备份

---

## ✅ 验证清单

完成以下验证以确保迁移成功：

### 1. 编译验证
- [ ] Maven 编译无错误
- [ ] 无 `TbResourceCategory` 相关的编译错误
- [ ] 无 `ResourceCategoryService` 相关的导入错误

### 2. 功能验证
- [ ] 创建文章分类标签（tagType=1）
- [ ] 获取文章分类标签列表
- [ ] 为资源添加分类标签
- [ ] 查询资源的分类标签
- [ ] 删除文章分类标签

### 3. 接口验证
```bash
# 1. 获取文章分类标签
curl http://localhost:8080/news/tags/type/1

# 2. 创建文章分类标签
curl -X POST http://localhost:8080/news/tags/tag \
  -H "Content-Type: application/json" \
  -d '{"name":"党史学习","tagType":1,"color":"#ff6b6b"}'

# 3. 为资源添加分类标签
curl -X POST http://localhost:8080/news/tags/resource/{resourceID}/tag/{tagID}
```

### 4. 数据验证
```sql
-- 检查标签数据
SELECT * FROM tb_tag WHERE tag_type = 1;

-- 检查资源标签关联
SELECT r.title, t.name 
FROM tb_resource r
LEFT JOIN tb_resource_tag rt ON r.resource_id = rt.resource_id
LEFT JOIN tb_tag t ON rt.tag_id = t.tag_id
WHERE t.tag_type = 1;
```

---

## 🎯 总结

### 移除内容
- ✅ 7个 Java 文件（实体、Service、Controller、Mapper）
- ✅ 1个 Mapper XML 文件
- ✅ SQL 建表语句（已注释）
- ✅ SQL 初始化数据（已注释）

### 修改内容
- ✅ 2个 Java 文件（ResourceVO、ResourceCenterController）
- ✅ 更新迁移文档

### 替代方案
- ✅ 使用 `tb_tag` (tag_type=1) 替代 `tb_resource_category`
- ✅ 使用 `TagService.getTagsByType(1)` 获取文章分类标签
- ✅ 接口从 `/news/categorys` 迁移到 `/news/tags/type/1`

### 优势
- ✅ 代码更简洁，减少7个文件
- ✅ 数据结构更统一
- ✅ 功能更灵活，易于扩展
- ✅ 维护成本降低

移除操作已全部完成！🎉

