software copyright
This commit is contained in:
@@ -0,0 +1,297 @@
|
||||
/*
|
||||
* 自然写教学资源管理与内容分发系统软件 V1.0
|
||||
* controller/DotCodeController.java - 点阵码生成API
|
||||
* controller/AuditController.java - 内容审核API
|
||||
*/
|
||||
package com.writech.resource.controller;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* 点阵码生成控制器
|
||||
*
|
||||
* 提供点阵码资源的生成、查询、绑定等API接口。
|
||||
* 点阵码是自然写系统的核心技术资源。
|
||||
*/
|
||||
public class DotCodeController {
|
||||
|
||||
private static final Logger logger =
|
||||
Logger.getLogger(DotCodeController.class.getName());
|
||||
|
||||
/**
|
||||
* 生成点阵码资源包 POST /api/v1/dotcode/generate
|
||||
*
|
||||
* 为指定资源(字帖/试卷/课件)生成配套的点阵码。
|
||||
* 点阵码ID全局唯一分配,生成后可叠加到PDF模板上。
|
||||
*/
|
||||
public Map<String, Object> generateDotCode(Map<String, Object> request) {
|
||||
String resourceId = (String) request.get("resource_id");
|
||||
int pageCount = (int) request.getOrDefault("page_count", 1);
|
||||
double pageWidth = (double) request.getOrDefault("page_width", 210.0);
|
||||
double pageHeight = (double) request.getOrDefault("page_height", 297.0);
|
||||
boolean overlay = (boolean) request.getOrDefault("overlay_on_template", false);
|
||||
|
||||
logger.info(String.format(
|
||||
"点阵码生成请求: resource=%s, pages=%d, size=%.0fx%.0f, overlay=%b",
|
||||
resourceId, pageCount, pageWidth, pageHeight, overlay
|
||||
));
|
||||
|
||||
// 参数校验
|
||||
if (resourceId == null || resourceId.isEmpty()) {
|
||||
Map<String, Object> err = new HashMap<>();
|
||||
err.put("code", 400);
|
||||
err.put("message", "resource_id不能为空");
|
||||
return err;
|
||||
}
|
||||
if (pageCount < 1 || pageCount > 500) {
|
||||
Map<String, Object> err = new HashMap<>();
|
||||
err.put("code", 400);
|
||||
err.put("message", "页数须在1-500之间");
|
||||
return err;
|
||||
}
|
||||
|
||||
// 调用点阵码生成服务
|
||||
// DotCodeService.DotCodeGenerateRequest genReq = new DotCodeService.DotCodeGenerateRequest();
|
||||
// genReq.setResourceId(resourceId);
|
||||
// genReq.setPageCount(pageCount);
|
||||
// DotCodeService.DotCodeGenerateResult result = dotCodeService.generateDotCodes(genReq);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("message", "点阵码生成成功");
|
||||
result.put("data", Map.of(
|
||||
"resource_id", resourceId,
|
||||
"page_count", pageCount,
|
||||
"dot_code_ids", new ArrayList<>(),
|
||||
"output_file_url", ""
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询点阵码绑定信息 GET /api/v1/dotcode/binding/{dotCodeId}
|
||||
*
|
||||
* 根据点阵码ID查询其绑定的资源和页面信息。
|
||||
* 用于点阵笔采集到坐标后定位到具体页面。
|
||||
*/
|
||||
public Map<String, Object> queryBinding(long dotCodeId) {
|
||||
logger.info("查询点阵码绑定: dotCodeId=" + dotCodeId);
|
||||
|
||||
// DotCodeBinding binding = dotCodeService.queryBinding(dotCodeId);
|
||||
// if (binding == null) {
|
||||
// return errorResponse(404, "点阵码绑定信息不存在");
|
||||
// }
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("data", Map.of(
|
||||
"dot_code_id", dotCodeId,
|
||||
"resource_id", "",
|
||||
"page_index", 0,
|
||||
"area_type", "full_page",
|
||||
"area", Map.of("x", 0, "y", 0, "width", 210, "height", 297)
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询资源关联的所有点阵码 GET /api/v1/dotcode/resource/{resourceId}
|
||||
*/
|
||||
public Map<String, Object> queryByResource(String resourceId) {
|
||||
logger.info("查询资源点阵码: resource=" + resourceId);
|
||||
|
||||
// List<DotCodeBinding> bindings = dotCodeService.queryByResourceId(resourceId);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("data", Map.of(
|
||||
"resource_id", resourceId,
|
||||
"bindings", new ArrayList<>()
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 撤销点阵码绑定 DELETE /api/v1/dotcode/binding/{dotCodeId}
|
||||
*
|
||||
* 撤销后该点阵码ID可被重新分配。
|
||||
* 仅管理员可执行此操作。
|
||||
*/
|
||||
public Map<String, Object> revokeBinding(long dotCodeId, String operatorId) {
|
||||
logger.info(String.format(
|
||||
"撤销点阵码绑定: dotCodeId=%d, operator=%s", dotCodeId, operatorId
|
||||
));
|
||||
|
||||
// dotCodeService.revokeBinding(dotCodeId);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("message", "点阵码绑定已撤销");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 内容审核控制器
|
||||
*
|
||||
* 提供资源内容审核的完整流程API:
|
||||
* - 待审核资源列表查询
|
||||
* - 审核通过/驳回/退回操作
|
||||
* - 批量审核
|
||||
* - 审核记录查询
|
||||
* - 审核统计仪表盘
|
||||
*/
|
||||
class AuditController {
|
||||
|
||||
private static final Logger logger =
|
||||
Logger.getLogger(AuditController.class.getName());
|
||||
|
||||
/**
|
||||
* 获取待审核资源列表 GET /api/v1/resource/audit/pending
|
||||
*
|
||||
* 按上传时间排序,支持按类型和学科过滤。
|
||||
*/
|
||||
public Map<String, Object> getPendingList(
|
||||
String type,
|
||||
String subject,
|
||||
int page,
|
||||
int pageSize
|
||||
) {
|
||||
logger.info(String.format(
|
||||
"待审核列表: type=%s, subject=%s, page=%d", type, subject, page
|
||||
));
|
||||
|
||||
// 查询MySQL: status = 'PENDING'
|
||||
// List<Resource> pending = resourceMapper.selectByStatus("PENDING", type, subject, page, pageSize);
|
||||
// int total = resourceMapper.countByStatus("PENDING", type, subject);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("data", Map.of(
|
||||
"total", 0,
|
||||
"page", page,
|
||||
"items", new ArrayList<>()
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行审核操作 PUT /api/v1/resource/audit/{id}
|
||||
*
|
||||
* 审核通过后资源自动进入CDN分发,可被终端检索下载。
|
||||
* 驳回后通知上传者修改。
|
||||
*/
|
||||
public Map<String, Object> performAudit(
|
||||
String resourceId,
|
||||
Map<String, Object> auditData
|
||||
) {
|
||||
String action = (String) auditData.get("action");
|
||||
String comment = (String) auditData.get("comment");
|
||||
String auditorId = (String) auditData.get("auditor_id");
|
||||
|
||||
logger.info(String.format(
|
||||
"审核操作: resource=%s, action=%s, auditor=%s",
|
||||
resourceId, action, auditorId
|
||||
));
|
||||
|
||||
// 校验审核动作合法性
|
||||
Set<String> validActions = new HashSet<>(Arrays.asList(
|
||||
"APPROVE", "REJECT", "RETURN"
|
||||
));
|
||||
if (!validActions.contains(action)) {
|
||||
Map<String, Object> err = new HashMap<>();
|
||||
err.put("code", 400);
|
||||
err.put("message", "不合法的审核操作: " + action);
|
||||
return err;
|
||||
}
|
||||
|
||||
// 调用审核服务
|
||||
// AuditService.AuditRequest req = new AuditService.AuditRequest();
|
||||
// req.setResourceId(resourceId);
|
||||
// req.setAction(AuditService.AuditAction.valueOf(action));
|
||||
// req.setComment(comment);
|
||||
// req.setAuditorId(auditorId);
|
||||
// return auditService.performAudit(req);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("message", "审核操作成功");
|
||||
result.put("data", Map.of(
|
||||
"resource_id", resourceId,
|
||||
"action", action,
|
||||
"new_status", "APPROVE".equals(action) ? "APPROVED" : "REJECTED"
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量审核 POST /api/v1/resource/audit/batch
|
||||
*/
|
||||
public Map<String, Object> batchAudit(Map<String, Object> batchRequest) {
|
||||
List<String> resourceIds = (List<String>) batchRequest.get("resource_ids");
|
||||
String action = (String) batchRequest.get("action");
|
||||
String comment = (String) batchRequest.get("comment");
|
||||
String auditorId = (String) batchRequest.get("auditor_id");
|
||||
|
||||
logger.info(String.format(
|
||||
"批量审核: count=%d, action=%s", resourceIds.size(), action
|
||||
));
|
||||
|
||||
// return auditService.batchAudit(resourceIds, action, comment, auditorId);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("data", Map.of(
|
||||
"total", resourceIds.size(),
|
||||
"success", resourceIds.size(),
|
||||
"failed", 0
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询审核记录 GET /api/v1/resource/audit/records
|
||||
*/
|
||||
public Map<String, Object> getAuditRecords(
|
||||
String resourceId,
|
||||
String auditorId,
|
||||
int page,
|
||||
int pageSize
|
||||
) {
|
||||
logger.info(String.format(
|
||||
"审核记录查询: resource=%s, auditor=%s", resourceId, auditorId
|
||||
));
|
||||
|
||||
// return auditService.queryAuditRecords(resourceId, auditorId, page, pageSize);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("data", Map.of(
|
||||
"total", 0,
|
||||
"page", page,
|
||||
"items", new ArrayList<>()
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 审核统计仪表盘 GET /api/v1/resource/audit/stats
|
||||
*
|
||||
* 返回待审核数量、今日已审核数量、通过率等统计。
|
||||
*/
|
||||
public Map<String, Object> getAuditStats() {
|
||||
// return auditService.getAuditStats();
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("code", 0);
|
||||
result.put("data", Map.of(
|
||||
"pending_count", 0,
|
||||
"approved_today", 0,
|
||||
"rejected_today", 0,
|
||||
"approval_rate", 0.0,
|
||||
"avg_audit_hours", 0.0
|
||||
));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user