package com.yeqifu.bus.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeqifu.bus.entity.Customer;
import com.yeqifu.bus.service.ICustomerService;
import com.yeqifu.bus.vo.CustomerVo;
import com.yeqifu.sys.common.Constast;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
*
* InnoDB free: 9216 kB 前端控制器
*
*
* @author luoyi-
* @since 2019-12-05
*/
/*
* CustomerController类在整个基于Spring Boot(通常配合Spring MVC)构建的Web项目架构中扮演着至关重要的角色,它充当了客户端与后端业务逻辑层之间的桥梁,
* 负责接收、解析来自客户端(如浏览器、移动端应用等通过HTTP协议发起的请求)的各种与客户相关的请求,并根据请求类型及携带的参数等信息,
* 调用相应的业务逻辑方法进行处理,最后将处理结果以合适的格式(如JSON格式等,因为使用了@RestController注解)返回给客户端,完成一次请求响应交互过程。
*
* @RestController注解是Spring 4.0之后引入的一个组合注解,它相当于同时添加了@Controller和@ResponseBody注解,
* 意味着这个类中的所有请求处理方法返回的数据都会直接写入HTTP响应体中(而不是返回视图名称等,常用于构建RESTful API),并且会根据返回值类型进行相应的序列化操作,
* 例如返回一个Java对象时,会自动将其转换为JSON格式(如果项目中配置了合适的JSON序列化器,如Jackson等)返回给客户端,方便客户端直接解析使用。
*
* @RequestMapping("/customer")注解用于对该控制器类下的所有请求处理方法进行统一的请求路径映射管理,规定了所有与客户相关的请求路径都要以"/customer"为前缀,
* 例如,后续可能会有"/customer/getById"用于根据客户ID获取客户信息的请求路径、"/customer/save"用于保存新客户信息的请求路径等,
* 这样的路径规划方式有助于构建清晰、规范的API接口体系,便于客户端开发人员理解和调用,也方便后端进行接口的维护与扩展。
*
* @Autowired注解用于实现Spring框架中的依赖注入功能,在这里它将ICustomerService接口的实现类自动装配到customerService属性上。
* ICustomerService作为一个定义了客户业务逻辑的接口,其具体的实现类(可能由其他开发人员编写,实现了接口中规定的诸如保存客户、更新客户、删除客户、查询客户等各种方法)
* 承载着实际的客户业务处理逻辑,比如与数据库交互进行数据的持久化操作、进行业务规则验证(如客户信息格式是否合法等)等功能。
* 通过注入这个接口的实现类,CustomerController就能在各个请求处理方法中方便地调用这些业务逻辑方法,将客户端的请求转化为具体的业务操作,
* 进而完成整个客户相关业务的请求响应流程,实现前后端的数据交互与业务协同,确保整个项目中客户相关功能的正常运作。
*/
@RestController
@RequestMapping("/customer")
public class CustomerController {
// 通过Spring框架提供的@Autowired注解,让Spring容器自动查找并注入ICustomerService接口的实现类到此处的customerService属性,
// 这是一种解耦的设计方式,使得控制器类不需要关心具体的业务逻辑实现细节,只需要调用接口定义的方法即可,方便后续的代码维护、替换业务逻辑实现类等操作。
@Autowired
private ICustomerService customerService;
/**
* 查询所有的客户
* @param customerVo
* @return
*/
@RequestMapping("loadAllCustomer")
/*
* 此方法用于处理名为"loadAllCustomer"的请求(通常是HTTP请求,基于Spring MVC或Spring Boot的Web应用场景下),
* 其主要功能是根据传入的查询条件(通过CustomerVo对象传递),分页查询并返回所有符合条件的客户信息,最终以DataGridView对象的形式返回结果,
* 该对象包含了查询到的客户数据以及总记录数等信息,方便前端进行展示和分页操作等处理。
*
* 接收一个CustomerVo类型的参数customerVo,CustomerVo应该是一个用于封装客户查询相关条件的视图对象,包含了如页码、每页显示数量、客户姓名、联系人姓名、电话号码等可能用于筛选客户的信息。
*/
public DataGridView loadAllCustomer(CustomerVo customerVo) {
// 1. 声明分页page对象
/*
* 创建一个IPage类型的分页对象page,使用传入的CustomerVo对象中的页码(customerVo.getPage())和每页显示的记录数(customerVo.getLimit())进行初始化。
* IPage接口通常是由一些持久化框架(如MyBatis-Plus等)提供的,用于实现分页功能,它会在后续与数据库交互查询客户信息时,按照设定的页码和每页记录数来获取相应的数据。
*/
IPage page = new Page(customerVo.getPage(), customerVo.getLimit());
// 2. 声明queryWrapper
/*
* 创建一个QueryWrapper对象queryWrapper,QueryWrapper是一种用于构建查询条件的工具类(同样常见于MyBatis-Plus等框架中)。
* 它可以方便地通过链式调用的方式添加各种查询条件,用于在后续查询客户数据时,从数据库中筛选出符合特定条件的客户记录。
*/
QueryWrapper queryWrapper = new QueryWrapper();
// 根据传入的CustomerVo对象中客户姓名是否不为空(StringUtils.isNotBlank用于判断字符串非空且非空白字符),
// 如果不为空,则添加一个模糊查询条件到queryWrapper中,按照客户姓名("customername"字段)进行模糊匹配查询,匹配的值为customerVo.getCustomername()。
// 这样在查询数据库时,就能筛选出客户姓名包含指定关键字的客户记录,实现根据客户姓名进行模糊查询的功能。
queryWrapper.like(StringUtils.isNotBlank(customerVo.getCustomername()), "customername", customerVo.getCustomername());
// 类似地,根据传入的CustomerVo对象中联系人姓名是否不为空,若不为空则添加模糊查询条件,按照联系人姓名("connectionpersion"字段)进行模糊匹配查询,
// 以此来筛选出联系人姓名包含指定关键字的客户记录,满足按照联系人姓名进行模糊查询的业务需求。
queryWrapper.like(StringUtils.isNotBlank(customerVo.getConnectionpersion()), "connectionpersion", customerVo.getConnectionpersion());
// 按照同样的逻辑,针对传入的CustomerVo对象中的电话号码字段,如果电话号码不为空,就添加模糊查询条件,以电话号码("phone"字段)进行模糊匹配查询,
// 便于从数据库中查找出电话号码包含指定内容的客户记录,实现根据电话号码进行模糊查询的功能。
queryWrapper.like(StringUtils.isNotBlank(customerVo.getPhone()), "phone", customerVo.getPhone());
// 调用customerService的page方法,将前面创建并设置好的分页对象page和查询条件封装对象queryWrapper传入。
// customerService应该是一个实现了与客户业务逻辑相关的服务层接口(例如实现了ICustomerService接口等),
// 其内部的page方法会基于传入的分页和查询条件,与数据库进行交互(可能借助MyBatis-Plus等持久化框架),执行实际的分页查询操作,
// 将查询到的符合条件的客户记录填充到page对象中,并同时更新page对象中的总记录数等相关属性。
customerService.page(page, queryWrapper);
// 创建一个DataGridView对象并返回,将page对象中的总记录数(page.getTotal())和当前页查询到的客户记录列表(page.getRecords())作为参数传入。
// DataGridView对象大概率是用于向前端传递数据的一种视图模型,它整合了总记录数和具体的客户数据,方便前端进行分页展示、数据渲染等操作,
// 从而将查询到的所有符合条件的客户信息以及总记录数等关键数据返回给前端,完成整个查询并返回数据的业务流程。
return new DataGridView(page.getTotal(), page.getRecords());
}
/**
* 添加一个客户
* @param customerVo
* @return
*/
@RequestMapping("addCustomer")
/*
* 此方法用于处理名为"addCustomer"的请求(通常在基于Spring MVC或Spring Boot构建的Web应用场景下,处理来自客户端的HTTP请求),
* 其核心功能是将传入的客户相关信息(通过CustomerVo对象封装)添加到数据库中,实现新增客户的业务操作。
* 最后根据操作执行情况返回对应的结果对象ResultObj,用于告知客户端添加操作是成功还是出现了错误。
*
* 接收一个CustomerVo类型的参数customerVo,CustomerVo应该是一个用于承载要添加的客户各种信息的视图对象,它包含了如客户姓名、联系方式、地址等客户相关属性信息,
* 这些信息会被传递到后续的业务逻辑层用于构建完整的客户实体并保存到数据库中。
*/
public ResultObj addCustomer(CustomerVo customerVo) {
try {
// 调用customerService的save方法,尝试将传入的customerVo对象所封装的客户信息保存到数据库中。
// customerService应该是一个实现了与客户业务逻辑相关的服务层接口(例如实现了ICustomerService接口等),
// 其内部的save方法会对传入的CustomerVo对象进行必要的处理(可能包括数据校验、转换为对应的Customer实体对象等操作),
// 然后借助相关的持久化框架(如MyBatis、MyBatis-Plus等)将客户信息持久化到数据库中,完成新增客户的实际操作。
customerService.save(customerVo);
// 如果保存操作顺利完成,没有抛出异常,就返回ResultObj.ADD_SUCCESS,表示客户信息添加成功的结果对象,
// 该对象应该是一个预定义的、用于统一返回结果格式的枚举类型或者普通类实例(具体取决于项目中的实现方式),方便前端根据返回值判断操作是否成功。
return ResultObj.ADD_SUCCESS;
} catch (Exception e) {
// 如果在保存客户信息的过程中出现了任何异常情况(比如数据库连接异常、数据格式不符合约束条件等),
// 会进入到catch块中进行异常处理。
e.printStackTrace();
// 在这里先打印出异常的堆栈信息,方便开发人员在调试时查看具体的出错原因和出错位置,
// 然后返回ResultObj.ADD_ERROR,表示客户信息添加失败的结果对象,告知客户端添加操作出现了错误,
// 以便前端进行相应的提示或者后续的错误处理操作。
return ResultObj.ADD_ERROR;
}
}
/**
* 修改一个客户
* @param customerVo
* @return
*/
@RequestMapping("updateCustomer")
/*
* 此方法用于处理名为"updateCustomer"的请求,在基于Spring MVC或Spring Boot构建的Web应用场景下,主要负责接收客户端发送的更新客户信息的请求。
* 其核心业务逻辑是依据传入的CustomerVo对象(该对象封装了需要更新的客户相关信息以及用于定位客户记录的关键标识,比如客户ID等),
* 调用相关业务服务层的方法来更新数据库中对应的客户记录,最终根据更新操作的执行情况,返回相应的结果对象ResultObj,以告知客户端更新操作是成功还是失败。
*
* 接收的参数CustomerVo customerVo是一个视图对象,它包含了要更新的客户各项信息,例如客户姓名、联系方式、地址等,同时也应该包含了能唯一确定要更新哪条客户记录的标识信息(通常是客户ID),
* 这些信息会传递给后续的业务逻辑层进行具体的更新操作处理。
*/
public ResultObj updateCustomer(CustomerVo customerVo) {
try {
// 调用customerService的updateById方法,尝试根据传入的CustomerVo对象所携带的信息来更新数据库中对应的客户记录。
// customerService大概率是实现了与客户业务逻辑相关的服务层接口(比如ICustomerService接口等)的一个具体实现类实例,
// 其内部的updateById方法会先从CustomerVo对象中提取关键的更新信息以及用于定位客户记录的标识(例如ID属性),
// 然后借助相应的持久化框架(如MyBatis、MyBatis-Plus等)构建合适的更新语句(例如SQL的UPDATE语句等),
// 依据这些信息去数据库中查找并更新对应的客户记录,将CustomerVo中包含的新的客户信息替换原记录中的旧信息,完成实际的更新操作。
customerService.updateById(customerVo);
// 如果更新操作顺利完成,没有抛出任何异常,就返回ResultObj.UPDATE_SUCCESS,表示客户信息更新成功的结果对象。
// ResultObj应该是项目中预先定义好的用于统一表示操作结果的一种数据结构(可能是枚举类型或者普通类等形式),方便前端开发人员依据此返回值来判断更新操作是否成功,
// 进而在前端界面上做出相应的提示或者进行后续的业务处理。
return ResultObj.UPDATE_SUCCESS;
} catch (Exception e) {
// 如果在执行更新客户记录的过程中出现了任何异常情况,比如数据库连接异常、违反数据约束条件(如唯一性约束等)、数据格式错误等,
// 就会进入到catch块中进行异常处理。
e.printStackTrace();
// 在这里先打印出异常的堆栈信息,这有助于开发人员在调试阶段快速定位问题所在,查看具体是哪个环节出现了错误以及错误的详细情况,
// 然后返回ResultObj.UPDATE_ERROR,表示客户信息更新失败的结果对象,以便告知客户端此次更新操作出现了问题,
// 使得前端可以做出相应的提示给用户或者进行其他的错误处理逻辑,比如提示用户重新尝试更新等操作。
return ResultObj.UPDATE_ERROR;
}
}
/**
* 删除一个客户
* @param id 客户的ID
* @return
*/
// 使用Swagger相关的注解@ApiOperation来描述这个接口方法的功能,向使用接口文档的人员(如前端开发人员、其他后端对接人员等)说明此方法是用于删除一个客户的操作。
// 同时,通过notes属性进一步补充说明信息,这里同样强调了是执行删除一个客户的功能。
@ApiOperation(value = "删除一个客户", notes = "删除一个客户")
// @ApiImplicitParams注解用于详细定义接口方法的隐含参数信息,这里使用@ApiImplicitParam注解定义了一个名为"id"的参数。
// 说明该参数代表客户ID,是必须要传入的(required = true),参数传递方式为query(即通过URL的查询参数形式传递,例如?id=123这种形式),
// 并且其数据类型为Integer,表示该参数接收的是整型数据,以此向接口文档使用者清晰展示参数的要求和相关属性。
@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "客户ID", required = true, paramType = "query", dataType = "Integer")})
// 使用@RequestMapping注解来映射HTTP请求,将这个方法与"deleteCustomer"这个请求路径进行关联,并且指定请求方法为DELETE,
// 表明此接口是用于接收并处理DELETE类型的HTTP请求,符合RESTful风格的接口设计,专门用于执行删除客户的操作。
@RequestMapping(value = "deleteCustomer", method = RequestMethod.DELETE)
public ResultObj deleteCustomer(Integer id) {
try {
// 调用customerService的deleteCustomerById方法,尝试依据传入的客户ID(参数id)来删除数据库中对应的客户记录。
// customerService应该是一个实现了与客户业务逻辑相关服务的类实例,其内部的deleteCustomerById方法会按照既定的业务规则和持久化机制(可能借助数据库框架等),
// 先根据传入的ID在数据库中查找并确认对应的客户记录,然后执行删除操作,比如构建SQL的DELETE语句等方式来从数据库中移除该客户记录,完成实际的删除客户的业务逻辑。
customerService.deleteCustomerById(id);
// 如果删除操作顺利完成,没有抛出任何异常,就返回ResultObj.DELETE_SUCCESS,表示客户删除成功的结果对象。
// ResultObj大概率是项目中预先定义好的用于统一表示各种操作结果的一种数据结构(可能是枚举类型或者特定的类等形式),
// 方便前端或其他调用此接口的地方依据返回值来判断删除操作是否成功,进而进行后续的业务处理,比如前端给出相应的提示信息告知用户客户已成功删除等。
return ResultObj.DELETE_SUCCESS;
} catch (Exception e) {
// 如果在执行删除客户记录的过程中出现了任何异常情况,例如数据库连接异常、违反外键约束(若客户记录与其他数据表存在关联关系时)、权限不足等问题,
// 就会进入到catch块中进行异常处理。
e.printStackTrace();
// 在这里先打印出异常的堆栈信息,这有助于开发人员在调试阶段快速定位问题所在,查看具体是哪个环节出现了错误以及错误的详细情况,
// 然后返回ResultObj.DELETE_ERROR,表示客户删除失败的结果对象,以便告知客户端或者其他调用此接口的地方此次删除操作出现了问题,
// 使得前端可以做出相应的提示给用户(如提示用户删除失败,请稍后再试等)或者进行其他的错误处理逻辑。
return ResultObj.DELETE_ERROR;
}
}
/**
* 加载所有客户的下拉列表
* @return
*/
@RequestMapping("loadAllCustomerForSelect")
/*
* 此方法用于处理名为"loadAllCustomerForSelect"的请求(通常在基于Spring MVC或Spring Boot构建的Web应用场景下,处理来自客户端的HTTP请求),
* 其核心功能是从数据库中查询出所有可用的客户信息,并以特定的视图格式(DataGridView)返回给客户端,方便前端进行展示或者供其他业务逻辑使用,例如用于下拉框选择等场景展示可用客户列表。
*/
public DataGridView loadAllCustomerForSelect() {
// 创建一个QueryWrapper对象queryWrapper,QueryWrapper是一种常用于构建查询条件的工具类(常见于MyBatis-Plus等框架中),
// 它可以通过链式调用的方式方便地添加各种查询条件,用于后续从数据库中筛选出符合特定要求的客户记录。
QueryWrapper queryWrapper = new QueryWrapper();
// 使用queryWrapper的eq方法添加一个相等性的查询条件,即查询数据库中"available"字段值等于Constast.AVAILABLE_TRUE的客户记录。
// 这里的Constast.AVAILABLE_TRUE应该是一个常量(可能在Constast类中定义),代表客户处于可用状态的标识值,通过这个条件可以筛选出所有可用的客户,
// 过滤掉那些不可用的客户记录,满足只获取可用客户信息的业务需求。
queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
// 调用customerService的list方法,将构建好的查询条件封装对象queryWrapper传入。
// customerService应该是一个实现了与客户业务逻辑相关的服务层接口(例如实现了ICustomerService接口等)的具体实现类实例,
// 其内部的list方法会依据传入的查询条件,借助相关的持久化框架(如MyBatis、MyBatis-Plus等)与数据库进行交互,执行实际的查询操作,
// 从数据库中查找出所有满足条件(即"available"字段值等于指定可用状态值)的客户记录,并将这些客户记录封装成一个List集合返回。
List list = customerService.list(queryWrapper);
// 创建一个DataGridView对象并返回,将查询到的包含所有可用客户信息的List集合作为参数传入。
// DataGridView对象大概率是用于向前端传递数据的一种视图模型,它接收客户数据列表,方便前端进行展示、数据渲染等操作,
// 从而将所有可用客户的信息以合适的格式返回给前端,完成整个查询并返回可用客户数据的业务流程。
return new DataGridView(list);
}
}
//git提交测试