简介:
在智慧医疗系统中,各个模块通常需要实现对不同实体的管理,例如用户、疾病种类、药品信息等。为了避免重复编写相似的增删改查代码,并保证代码的一致性和可维护性,我们设计了一个通用的基础控制器 BaseController
。该控制器通过泛型支持不同类型的实体对象,利用依赖注入和通用的服务层方法,提供了标准的保存、删除等操作,同时处理了请求、响应和会话管理等常见问题。
实现内容:
1、save
方法用于保存传入的对象 obj
,并调用通用的服务层方法 service.save(obj)
完成保存操作。在保存成功或失败后,返回相应的响应结果。
@ResponseBody
@PostMapping("save")
public RespResult save(T obj) {
if (Assert.isEmpty(obj)) {
return RespResult.fail("保存对象不能为空");
}
obj = service.save(obj);
return RespResult.success("保存成功", obj);
}
2、delete
方法用于根据传入的主键 ID 删除对象。在删除前会检查 ID 的有效性,如果删除成功则返回成功的响应,否则返回失败或数据不存在的响应。
@ResponseBody
@PostMapping("/delete")
public RespResult delete(Integer id) {
if (Assert.isEmpty(id)) {
return RespResult.fail("删除ID不能为空");
}
if (service.delete(id) == 0) {
T t = service.get(id);
if (Assert.isEmpty(t)) {
return RespResult.notFound("数据不存在");
}
return RespResult.fail("删除失败");
}
return RespResult.success("删除成功");
}
3、setReqAndRes
方法用于在每个子类方法调用之前设置请求、响应和会话对象,以及当前登录用户和疾病种类列表等常用信息,方便后续方法调用时使用。
@ModelAttribute
public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
this.session = request.getSession(true);
loginUser = (User) session.getAttribute("loginUser");
session.setAttribute("kindList", illnessKindService.findList());
}
完整实现代码:
package com.SmartMed_Connect.controller;
import com.SmartMed_Connect.dto.RespResult;
import com.SmartMed_Connect.entity.IllnessKind;
import com.SmartMed_Connect.entity.User;
import com.SmartMed_Connect.service.*;
import com.SmartMed_Connect.utils.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.SmartMed_Connect.component.EmailClient;
import com.SmartMed_Connect.service.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
/**
* BaseController 类为其他控制器类提供基础功能,包含常用的服务和处理请求、响应、会话的常用操作。
*
* @param <T> 泛型类型,用于支持不同的实体类型
*/
public class BaseController<T> {
// 自动注入常用服务对象,提供业务逻辑处理
@Autowired
protected ApiService apiService;
@Autowired
protected UserService userService;
@Autowired
protected IllnessKindService illnessKindService;
@Autowired
protected IllnessMedicineService illnessMedicineService;
@Autowired
protected IllnessService illnessService;
@Autowired
protected MedicalNewsService medicalNewsService;
@Autowired
protected MedicineService medicineService;
@Autowired
protected HistoryService historyService;
@Autowired
protected FeedbackService feedbackService;
// 自动注入通用的基础服务对象,处理泛型类型的实体对象
@Autowired
protected BaseService<T> service;
// 自动注入EmailClient对象,用于发送邮件
@Autowired
protected EmailClient emailClient;
// 定义用于处理请求、响应和会话的对象
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
protected User loginUser;
protected List<IllnessKind> kindList;
/**
* 保存、修改
*
* @param obj 目标对象
* @return 响应结果
*/
@ResponseBody//将控制器方法的返回值直接写入 HTTP 响应体中,而不是将其解析为一个视图名称。
@PostMapping("save")
public RespResult save(T obj) {
// 检查对象是否为空
if (Assert.isEmpty(obj)) {
return RespResult.fail("保存对象不能为空");
}
// 调用服务层的保存方法保存对象
obj = service.save(obj);
// 返回保存成功的响应结果
return RespResult.success("保存成功", obj);
}
/**
* 删除
*
* @param id 主键ID
* @return 响应结果
*/
@ResponseBody
@PostMapping("/delete")
public RespResult delete(Integer id) {
// 检查ID是否为空
if (Assert.isEmpty(id)) {
return RespResult.fail("删除ID不能为空");
}
// 调用服务层的删除方法删除对象
if (service.delete(id) == 0) {
T t = service.get(id);
// 检查对象是否存在
if (Assert.isEmpty(t)) {
return RespResult.notFound("数据不存在");
}
return RespResult.fail("删除失败");
}
// 返回删除成功的响应结果
return RespResult.success("删除成功");
}
/**
* 在每个子类方法调用之前先调用
* @param request HTTP 请求对象,包含请求的相关信息
* @param response HTTP 响应对象,包含响应的相关信息
*/
@ModelAttribute
public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) {
// 将传入的请求对象赋值给当前类的 request 属性,以便在其他方法中使用
this.request = request;
// 将传入的响应对象赋值给当前类的 response 属性,以便在其他方法中使用
this.response = response;
// 获取当前请求的会话对象,如果不存在则创建新的会话对象,并将其赋值给当前类的 session 属性
this.session = request.getSession(true);
// 从会话中获取存储的登录用户信息,并将其赋值给当前类的 loginUser 属性
loginUser = (User) session.getAttribute("loginUser");
// 从 IllnessKindService 中获取疾病分类列表,并将其存储在会话中,方便在其他地方使用
session.setAttribute("kindList", illnessKindService.findList());
}
}