diff --git a/src/main/java/com/example/demo/common/typography/BaseController.java b/src/main/java/com/example/demo/common/typography/BaseController.java index 06e3951..5029347 100644 --- a/src/main/java/com/example/demo/common/typography/BaseController.java +++ b/src/main/java/com/example/demo/common/typography/BaseController.java @@ -7,10 +7,15 @@ import com.example.demo.common.domain.BaseVO; import com.example.demo.common.exception.BusinessException; import com.example.demo.common.wrapper.WrapMapper; import com.example.demo.common.wrapper.Wrapper; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestBody; +import org.slf4j.Logger; +import org.springframework.web.multipart.MultipartFile; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 统一 Controller 接口 @@ -24,8 +29,7 @@ import java.util.List; * @version 1.0.0 */ @SuppressWarnings("all") -@Slf4j -public abstract class BaseController< +public interface BaseController< SERVICE extends BaseService, DTO extends BaseDTO, QueryDTO extends BaseQueryDTO, @@ -39,7 +43,7 @@ public abstract class BaseController< * * @return 服务层实例,继承自BaseService */ - abstract protected SERVICE getService(); + public SERVICE getService(); /** * 获取操作名称 @@ -49,7 +53,17 @@ public abstract class BaseController< * * @return 操作名称,如"用户"、"角色"等 */ - abstract protected String getOperationName(); + public String getOperationName(); + + /** + * 获取操作名称 + *

+ * 子类必须实现此方法,返回当前操作的中文名称,用于日志记录和错误信息提示 + *

+ * + * @return 操作名称,如"用户"、"角色"等 + */ + public Logger getLog(); /** * 创建对象的通用方法 @@ -57,14 +71,14 @@ public abstract class BaseController< * @param dto 数据传输对象 * @return 操作结果包装对象 */ - protected Wrapper create(DTO dto) { + default public Wrapper create(DTO dto) { try { return (Wrapper) WrapMapper.ok(getService().create(dto)); } catch (BusinessException e) { - log.error("{}创建失败: {}", getOperationName(), e.getMessage(), e); + getLog().error("{}创建失败: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error(e.getMessage()); } catch (Exception e) { - log.error("{}创建异常: {}", getOperationName(), e.getMessage(), e); + getLog().error("{}创建异常: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error(getOperationName() + "创建失败"); } } @@ -75,17 +89,17 @@ public abstract class BaseController< * @param dto 数据传输对象 * @return 操作结果包装对象 */ - protected Wrapper update(DTO dto) { + default public Wrapper update(DTO dto) { try { getService().update(dto); // 假设DTO有getId方法 VO result = (VO) getService().detail(getIdFromDto(dto)); return WrapMapper.ok(result); } catch (BusinessException e) { - log.error("{}更新失败: {}", getOperationName(), e.getMessage(), e); + getLog().error("{}更新失败: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error(e.getMessage()); } catch (Exception e) { - log.error("{}更新异常: {}", getOperationName(), e.getMessage(), e); + getLog().error("{}更新异常: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error(getOperationName() + "更新失败"); } } @@ -96,15 +110,15 @@ public abstract class BaseController< * @param id 对象ID * @return 操作结果包装对象 */ - protected Wrapper delete(String id) { + default public Wrapper delete(String id) { try { getService().delete(id); return WrapMapper.ok(); } catch (BusinessException e) { - log.error("{}删除失败: {}", getOperationName(), e.getMessage(), e); + getLog().error("{}删除失败: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error(e.getMessage()); } catch (Exception e) { - log.error("{}删除异常: {}", getOperationName(), e.getMessage(), e); + getLog().error("{}删除异常: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error(getOperationName() + "删除失败"); } } @@ -115,15 +129,15 @@ public abstract class BaseController< * @param id 对象ID * @return 操作结果包装对象 */ - protected Wrapper detail(String id) { + default public Wrapper detail(String id) { try { VO result = (VO) getService().detail(id); return WrapMapper.ok(result); } catch (BusinessException e) { - log.error("获取{}详情失败: {}", getOperationName(), e.getMessage(), e); + getLog().error("获取{}详情失败: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error(e.getMessage()); } catch (Exception e) { - log.error("获取{}详情异常: {}", getOperationName(), e.getMessage(), e); + getLog().error("获取{}详情异常: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error("获取" + getOperationName() + "详情失败"); } } @@ -134,12 +148,12 @@ public abstract class BaseController< * @param queryDTO 查询数据传输对象 * @return 操作结果包装对象 */ - protected Wrapper> pageList(QueryDTO queryDTO) { + default public Wrapper> pageList(QueryDTO queryDTO) { try { SearchResult result = getService().pageList(queryDTO); return WrapMapper.ok(result); } catch (Exception e) { - log.error("查询{}列表异常: {}", getOperationName(), e.getMessage(), e); + getLog().error("查询{}列表异常: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error("查询" + getOperationName() + "列表失败"); } } @@ -150,16 +164,47 @@ public abstract class BaseController< * @param queryDTO 查询数据传输对象 * @return 操作结果包装对象 */ - protected Wrapper> optionsList(QueryDTO queryDTO) { + default public Wrapper> optionsList(QueryDTO queryDTO) { try { List result = getService().option(queryDTO); return WrapMapper.ok(result); } catch (Exception e) { - log.error("获取所有{}异常: {}", getOperationName(), e.getMessage(), e); + getLog().error("获取所有{}异常: {}", getOperationName(), e.getMessage(), e); return WrapMapper.error("获取所有" + getOperationName() + "失败"); } } + /** + * 导入JSONL数据的通用方法 + * + * @param file JSONL文件 + * @return 操作结果包装对象 + */ + default public Map importJSONLData(MultipartFile file) { + Map result = new HashMap<>(); + try { + // 读取文件内容 + String content = new String(file.getBytes(), StandardCharsets.UTF_8); + // 调用服务层导入数据 + result.putAll(getService().importJSONLData(content)); + } catch (Exception e) { + result.put("error", "导入失败"); + } + return result; + } + + /** + * 导出JSONL数据的通用方法 + * + * @param ids 数据主键ID + * @return 操作结果包装对象 + */ + default Map exportJSONLData(HttpServletResponse response, List ids) { + // 调用服务层导入数据 + getService().exportJSONLData(response, ids); + return null; + } + /** * 从DTO中获取ID * 默认实现,子类可以重写此方法以适应不同的DTO结构 @@ -167,13 +212,13 @@ public abstract class BaseController< * @param dto 数据传输对象 * @return 对象ID */ - protected String getIdFromDto(Object dto) { + default public String getIdFromDto(Object dto) { try { // 尝试通过反射获取id属性 java.lang.reflect.Method getIdMethod = dto.getClass().getMethod("getId"); return (String) getIdMethod.invoke(dto); } catch (Exception e) { - log.warn("无法从DTO中获取ID,使用默认实现", e); + getLog().warn("无法从DTO中获取ID,使用默认实现", e); return null; } } diff --git a/src/main/java/com/example/demo/common/typography/BaseService.java b/src/main/java/com/example/demo/common/typography/BaseService.java index affbea3..cbe6713 100644 --- a/src/main/java/com/example/demo/common/typography/BaseService.java +++ b/src/main/java/com/example/demo/common/typography/BaseService.java @@ -6,8 +6,10 @@ import com.example.demo.common.domain.BaseEntity; import com.example.demo.common.domain.BaseQueryDTO; import com.example.demo.common.domain.BaseVO; import com.mybatisflex.core.service.IService; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; +import java.util.Map; /** * 统一 Service 接口 @@ -60,9 +62,34 @@ public interface BaseService importJSONLData(String content); + + /** + * 导出JSONL数据 + * @param ids ID列表,可以导出多条数据 + */ + void exportJSONLData(HttpServletResponse response, List ids); + }