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);
+
}