Files
schoolNews/schoolNewsWeb/backend-api-implementation.md
2025-11-12 19:16:50 +08:00

9.5 KiB

后端新增接口实现文档

接口说明

更新数据采集项状态接口,用于在创建资源后更新采集项的状态和关联的资源ID。


1. Controller层

文件路径: schoolNewsServ/crontab/src/main/java/org/xyzh/crontab/controller/DataCollectionItemController.java

package org.xyzh.crontab.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.xyzh.api.crontab.DataCollectionItemService;
import org.xyzh.common.domain.ResultDomain;
import org.xyzh.common.dto.crontab.TbDataCollectionItem;

import java.util.Date;

/**
 * 数据采集项Controller
 */
@RestController
@RequestMapping("/crontab/collection/item")
public class DataCollectionItemController {

    @Autowired
    private DataCollectionItemService dataCollectionItemService;

    /**
     * 更新数据采集项状态
     * PUT /api/crontab/collection/item/{itemId}/status
     *
     * @param itemId 采集项ID
     * @param request 更新请求体
     * @return 更新结果
     */
    @PutMapping("/{itemId}/status")
    public ResultDomain<String> updateCollectionItemStatus(
            @PathVariable String itemId,
            @RequestBody UpdateStatusRequest request) {

        try {
            // 参数校验
            if (itemId == null || itemId.trim().isEmpty()) {
                return ResultDomain.fail("采集项ID不能为空");
            }

            if (request.getResourceId() == null || request.getResourceId().trim().isEmpty()) {
                return ResultDomain.fail("资源ID不能为空");
            }

            // 查询采集项
            TbDataCollectionItem item = dataCollectionItemService.getById(itemId);
            if (item == null) {
                return ResultDomain.fail("采集项不存在");
            }

            // 更新采集项状态
            item.setStatus(request.getStatus() != null ? request.getStatus() : 1); // 默认为已转换
            item.setResourceId(request.getResourceId());
            item.setProcessTime(new Date());

            // 如果传入了处理人,也更新
            if (request.getProcessor() != null) {
                item.setProcessor(request.getProcessor());
            }

            // 保存更新
            boolean success = dataCollectionItemService.updateById(item);

            if (success) {
                return ResultDomain.success("更新成功", request.getResourceId());
            } else {
                return ResultDomain.fail("更新失败");
            }

        } catch (Exception e) {
            e.printStackTrace();
            return ResultDomain.fail("更新失败: " + e.getMessage());
        }
    }

    /**
     * 更新状态请求体
     */
    public static class UpdateStatusRequest {
        /** 状态: 0-未处理 1-已转换 2-已忽略 */
        private Integer status;
        /** 资源ID */
        private String resourceId;
        /** 处理人 */
        private String processor;

        public Integer getStatus() {
            return status;
        }

        public void setStatus(Integer status) {
            this.status = status;
        }

        public String getResourceId() {
            return resourceId;
        }

        public void setResourceId(String resourceId) {
            this.resourceId = resourceId;
        }

        public String getProcessor() {
            return processor;
        }

        public void setProcessor(String processor) {
            this.processor = processor;
        }
    }
}

2. Service层 (如果需要)

文件路径: schoolNewsServ/api/api-crontab/src/main/java/org/xyzh/api/crontab/DataCollectionItemService.java

如果Service接口中没有 getByIdupdateById 方法,需要添加:

package org.xyzh.api.crontab;

import org.xyzh.common.dto.crontab.TbDataCollectionItem;

/**
 * 数据采集项Service接口
 */
public interface DataCollectionItemService {

    /**
     * 根据ID查询采集项
     * @param itemId 采集项ID
     * @return 采集项数据
     */
    TbDataCollectionItem getById(String itemId);

    /**
     * 更新采集项
     * @param item 采集项数据
     * @return 是否成功
     */
    boolean updateById(TbDataCollectionItem item);

    // ... 其他方法
}

3. Service实现层

文件路径: schoolNewsServ/crontab/src/main/java/org/xyzh/crontab/service/impl/DataCollectionItemServiceImpl.java

package org.xyzh.crontab.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.xyzh.api.crontab.DataCollectionItemService;
import org.xyzh.common.dto.crontab.TbDataCollectionItem;
import org.xyzh.crontab.mapper.DataCollectionItemMapper;

/**
 * 数据采集项Service实现
 */
@Service
public class DataCollectionItemServiceImpl implements DataCollectionItemService {

    @Autowired
    private DataCollectionItemMapper dataCollectionItemMapper;

    @Override
    public TbDataCollectionItem getById(String itemId) {
        QueryWrapper<TbDataCollectionItem> wrapper = new QueryWrapper<>();
        wrapper.eq("id", itemId);
        return dataCollectionItemMapper.selectOne(wrapper);
    }

    @Override
    public boolean updateById(TbDataCollectionItem item) {
        int rows = dataCollectionItemMapper.updateById(item);
        return rows > 0;
    }

    // ... 其他方法实现
}

4. 数据库表结构确认

确保 tb_data_collection_item 表有以下字段:

-- 如果没有这些字段,需要添加
ALTER TABLE tb_data_collection_item
ADD COLUMN IF NOT EXISTS resource_id VARCHAR(50) COMMENT '转换后的资源ID';

ALTER TABLE tb_data_collection_item
ADD COLUMN IF NOT EXISTS process_time DATETIME COMMENT '处理时间';

ALTER TABLE tb_data_collection_item
ADD COLUMN IF NOT EXISTS processor VARCHAR(50) COMMENT '处理人';

5. 接口测试

请求示例

请求URL: PUT http://localhost:8080/api/crontab/collection/item/{itemId}/status

请求Headers:

Content-Type: application/json
Authorization: Bearer {token}

请求Body:

{
  "status": 1,
  "resourceId": "resource_123456",
  "processor": "admin"
}

响应示例

成功响应:

{
  "success": true,
  "message": "更新成功",
  "data": "resource_123456",
  "code": 200
}

失败响应:

{
  "success": false,
  "message": "采集项不存在",
  "code": 500
}

6. 前端调用示例

前端已经在 src/apis/crontab/index.ts 中添加了调用方法:

/**
 * 更新采集项状态为已转换
 * @param itemId 采集项ID
 * @param resourceId 资源ID
 * @returns Promise<ResultDomain<string>>
 */
async updateCollectionItemStatus(itemId: string, resourceId: string): Promise<ResultDomain<string>> {
  const response = await api.put<string>(`${this.baseUrl}/collection/item/${itemId}/status`, {
    status: 1,  // 已转换
    resourceId
  });
  return response.data;
}

使用方式:

await crontabApi.updateCollectionItemStatus('item_123', 'resource_456');

7. 完整流程

1. 用户在 ArticleAdd 组件中编辑文章
   ↓
2. 点击"立即发布"
   ↓
3. 前端调用: POST /api/news/resources/resource
   创建资源,返回 resourceID
   ↓
4. 前端调用: PUT /api/crontab/collection/item/{itemId}/status
   传入参数:
   {
     "status": 1,
     "resourceId": "新创建的resourceID"
   }
   ↓
5. 后端更新 tb_data_collection_item:
   - status = 1 (已转换)
   - resource_id = resourceID
   - process_time = NOW()
   ↓
6. 前端刷新列表,采集项状态显示"已转换"

8. 注意事项

  1. 权限控制: 建议添加权限校验,只有管理员可以调用此接口
  2. 事务处理: 如果涉及多表操作,建议添加 @Transactional 注解
  3. 日志记录: 建议添加操作日志,记录谁在什么时间转换了哪个采集项
  4. 并发控制: 如果存在并发转换的情况,建议添加乐观锁
  5. 参数校验: 可以使用 @Valid@NotBlank 等注解进行参数校验

9. 可选:添加操作日志

/**
 * 更新数据采集项状态
 */
@PutMapping("/{itemId}/status")
@Log(title = "更新采集项状态", businessType = BusinessType.UPDATE)
public ResultDomain<String> updateCollectionItemStatus(
        @PathVariable String itemId,
        @RequestBody UpdateStatusRequest request) {
    // ... 实现代码
}

10. Mapper层 (如果使用MyBatis Plus)

文件路径: schoolNewsServ/crontab/src/main/java/org/xyzh/crontab/mapper/DataCollectionItemMapper.java

package org.xyzh.crontab.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.xyzh.common.dto.crontab.TbDataCollectionItem;

/**
 * 数据采集项Mapper
 */
@Mapper
public interface DataCollectionItemMapper extends BaseMapper<TbDataCollectionItem> {
    // MyBatis Plus 已经提供了 selectById, updateById 等方法
}

完成清单

  • 复制 Controller 代码到 DataCollectionItemController.java
  • 检查 Service 接口是否有 getByIdupdateById 方法
  • 如果没有,添加 Service 实现
  • 确认数据库表有 resource_id, process_time, processor 字段
  • 如果没有,执行 SQL 添加字段
  • 重启后端服务
  • 使用 Postman 或前端测试接口
  • 验证数据库数据是否正确更新

完成以上步骤后,前端的转换功能就可以正常工作了!