# quick-lib-restlet **Repository Path**: archsh/quick-lib-restlet ## Basic Information - **Project Name**: quick-lib-restlet - **Description**: A RESTful lib - **Primary Language**: Java - **License**: Not specified - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-27 - **Last Updated**: 2021-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # quick-lib-restlet 基于Mybatis-Plus的基础RESTful增删改查接口实现。 基本宗旨是以最简单的方式实现数据的基础增删查改接口,同时保证一定的可扩展性。 ## 引用 ```xml io.github.extvos quick-lib-restlet 1.0.0 ``` ## 基础用法 ### `Entity` 定义 ```java package plus.extvos.example.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @TableName("students") @Data public class Student { @TableId(type = IdType.AUTO) private long id; private String name; private String gender; } ``` ### `Mapper`定义 ```java package plus.extvos.example.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import plus.extvos.example.entity.Student; public interface StudentMapper extends BaseMapper { } ``` ### `Service`定义 ```java package plus.extvos.example.service; import plus.extvos.example.entity.Student; import plus.extvos.restlet.service.BaseService; public interface StudentService extends BaseService { } ``` ### `ServiceImpl`定义 ```java package plus.extvos.example.service.impl; import plus.extvos.example.entity.Student; import plus.extvos.example.mapper.StudentMapper; import plus.extvos.example.service.StudentService; import plus.extvos.restlet.service.impl.BaseServiceImpl; import org.springframework.stereotype.Service; @Service public class StudentServiceImpl extends BaseServiceImpl implements StudentService { @Autowired private StudentMapper myMapper; @Override public StudentMapper getMapper() { return myMapper; } } ``` ### `Controller`定义 ```java package plus.extvos.example.controller; import plus.extvos.example.entity.Student; import plus.extvos.example.service.StudentService; import plus.extvos.restlet.controller.BaseController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/students") public class StudentController extends BaseController { @Autowired private StudentService studentService; @Override public StudentService getService() { return studentService; } } ``` ### 至此支持的API接口 - `GET` `/students?xx=xx&xx=xx` - `GET` `/students/{id}` - `POST` `/students` - `PUT` `/students?xx=xx&xx=xx` - `PUT` `/students/{id}` - `DELETE` `/students?xx=xx&xx=xx` - `DELETE` `/students/{id}` ### 常用返回数据样式(JSON) 接口通常返回的数据格式以以下格式为样例: ```JSON { "code": 20000, "msg": "", "data": null | {} | [], "total": NUM, "page": NUM, "pageSize": NUM } ``` - `code`: 接口执行结果。`20XXX` 为成功,`code`值除以`100`得数为HTTP的状态码,具体错误码以实际项目定义为基准; - `msg`: 错误消息。失败时返回的错误提示消息。成功时可以不包含该数据; - `data`:返回的数据内容。可以为单个对象或对象列表;无数据可以返回`null`; - `total`:当前查询条件下面的总记录数。(仅列表查询时可用) - `page`:当前返回的页码。(起始为0,仅列表查询时可用) - `pageSize`:每页的数量。(仅列表查询时可用) ### 接口Query参数使用规范 #### 特殊控制参数 - `__page`:分页查询页码控制,默认为`0`; - `__pageSize`:分页查询每页大小控制,默认为`20`或`50`; - `__orderBy`:字段排序控制,字段前面加`-`表示降序,否则为升序;多个控制之间以`,`分隔; - `__includes`:仅包含指定字段,多个字段以`,`分隔,表格主键与此参数无关,必须包含在输出里面; - `__excludes`: 排除指定字段,多个字段以`,`分隔,表格主键与此参数无关,必须包含在输出里面; **注:**`__includes`与`__excludes`是互斥的,`__includes`优先级高于`__excludes` 特殊控制参数可以在配置中指定,请参考 [配置说明](#配置说明) #### 一般查询条件参数 - `{fieldName}=VALUE` 字段值等于匹配,适用于多种类型字段,等同于: `WHERE fieldName = VALUE` - `{fieldName}__not=VALUE` 字段不等于匹配,适用于多种字段类型,等同于: `WHERE fieldName <> VALUE` - `{stringFieldName}__contains=VALUE` 字符型字段包含匹配,等同于: `WHERE stringFieldName LIKE %VALUE%` - `{stringFieldName}__startwith=VALUE` 字符型字段包含匹配,等同于: `WHERE stringFieldName LIKE VALUE%` - `{stringFieldName}__endwith=VALUE` 字符型字段包含匹配,等同于: `WHERE stringFieldName LIKE %VALUE` - `{numberFieldName}__gt=VALUE` 数值型字段大于匹配,等同于: `WHERE numberFieldName > VALUE` - `{numberFieldName}__gte=VALUE` 数值型字段大于等于匹配,等同于: `WHERE numberFieldName >= VALUE` - `{numberFieldName}__lt=VALUE` 数值型字段小于匹配,等同于: `WHERE numberFieldName < VALUE` - `{numberFieldName}__lte=VALUE` 数值型字段小于等于匹配,等同于: `WHERE numberFieldName <= VALUE` - `{numberFieldName}__range=VALUE1,VALUE2` - `{numberFieldName}__between=VALUE1,VALUE2` - `{numberFieldName}__in=VALUE1,VALUE2,VALUE3...` - `{fieldName}__notnull` - `{fieldName}__isnull` 以上数值型的特殊匹配方式,同样适用于日期、时间型数据字段。 #### `或`查询 在上述查询条件的方式基础上,可以添加`or`作为`或`条件查询,同样是以`__`方式,在字段名和操作符之间分隔,比如: - `{fieldName}__or` - `{fieldName}__or__lt` - `{fieldName}__or__gt` - `{fieldName}__or__in` - `{fieldName}__or__contains` 等等。 比如: `GET /students?age__lt=12&age__or__gt=16` 则等同于 `SELECT * FROM students WHERE (age < 12 OR age > 16)`。 ## 配置说明 `restlet`支持如下配置: ```yaml quick: restlet: log-trace: true page-key: __page page-size-key: __pageSize order-by-key: __orderBy includes-key: __includes excludes-key: __excludes default-page-size: 10 pretty-json: false delete-response-body: false ``` - `log-trace`:指定是否在日志中输出异常信息,默认为`false` - `page-key`:指定分页参数名,默认为`__page` - `page-size-key`:指定分页大小参数名,默认为`__pageSize` - `order-by-key`:指定排序参数名,默认为`__orderBy` - `includes-key`:指定包含字段参数名,默认为`__includes` - `excludes-key`:指定排除字段参数名,默认为`__excludes` - `default-page-size`:默认分页大小,默认为`50` - `pretty-json`:是否输出为整齐的`JSON`格式,默认为`false`则输出紧凑格式 - `delete-response-body`: 是否在删除成功后输出一个标准Result,默认情况下删除成功后返回`204`状态值不带任何Content。 ## 进阶 ### 自定义接口、自定义查询 #### 单独新增自定义查询条件 在`ServiceImpl`中重写下面这个方法: ```java public boolean parseQuery(String k,Object v,QueryWrapper wrapper){ return false; } ``` 注:重写方法里面仅处理自定义的查询条件,处理了的返回`true`,未处理则返回`false`。 #### 更复杂的 请跟着Mybatis + Mybatis-Plus走 ### 默认排除或包含字段 ```java public String[] defaultIncludes(); public String[] defaultExcludes(); ``` 在`Controller`中`Override`上面连个方法,可以添加默认在查询时要包含或排除的字段,具体规则仍然如`__includes`和`__excludes`。 ### 接口拦截处理 在`Controller`中`Override`下列方法: ```java public T preInsert(T entity)throws RestletException; public List preInsert(List entities)throws RestletException; public void postInsert(T entity)throws RestletException; public void postInsert(List entities)throws RestletException; public T preUpdate(Serializable id,T entity)throws RestletException; public T preUpdate(QuerySet qs,T entity)throws RestletException; public void postUpdate(Serializable id,T entity)throws RestletException; public void postUpdate(QuerySet qs,T entity)throws RestletException; public void preDelete(Serializable id)throws RestletException; public QuerySet preDelete(QuerySet qs)throws RestletException; public void postDelete(Serializable id)throws RestletException; public void postDelete(QuerySet qs)throws RestletException; public void preSelect(Serializable id)throws RestletException; public QuerySet preSelect(QuerySet qs)throws RestletException; public T postSelect(T entity)throws RestletException; public List postSelect(List entities)throws RestletException; ``` 以上任意方法的重写,皆可以对操作进行拦截处理或输出重写。 ### `plus.extvos.common.Assert`类 提供了一些基本的数据有效性断言,断言失败会抛出`RestletException`异常,亦可自定义异常。 例如: ```java @RestController @RequestMapping("/students") public class StudentController extends BaseController { @Override public Student preInsert(Student entity) throws RestletException { Assert.notEmpty(entity.getName(), RestletException.badRequest("name can not be null or empty")); return entity; } } ``` ### `plus.extvos.common.Code` 接口 定义了一个返回结果的Code接口,如`ResultCode`提供了一些基本的返回结果Code定义。如需扩展,请按照`ResultCode`的方式扩展,同时,保证`value()`返回的值除以`100`所得的数值为接口返回的`HTTP` 状态值,且满足`HTTP`的标准定义。 ### `plus.extvos.common.Result` 类 是`restlet`基础的接口返回数据类型。可以在其它自实现的Controller接口中使用,以保证返回数据的格式一致性。