高端网站设计公司名单,网站备案多久可以注销,wordpress怎样弄pdf,wordpress激活码注册插件这是博主自己在使用的一套easyui前端框架的后台管理系统模版#xff0c;包含了后端的Java代码#xff0c;已经实现了菜单控制、权限控制功能#xff0c;可以直接拿来使用。
springboot mybatis mybatis-plus实现的增删查改完整项目#xff0c;前端使用了easyui前端框架。…这是博主自己在使用的一套easyui前端框架的后台管理系统模版包含了后端的Java代码已经实现了菜单控制、权限控制功能可以直接拿来使用。
springboot mybatis mybatis-plus实现的增删查改完整项目前端使用了easyui前端框架。https://gitee.com/he-yunlin/easyui-crud.git 目录
功能介绍
一、菜单管理
菜单列表
角色-菜单列表
二、权限管理
权限列表
角色-权限列表
三、用户管理
用户列表
用户-角色列表
四、歌曲管理
歌曲列表
五、系统功能
系统设置
初始化权限
代码介绍
响应状态码
统一响应实体类
全局异常处理类
统一数据格式处理类
datagrid数据格式对象
获取用户登录信息的工具类
基于easyui的表格过滤插件功能实现
基础的分页器
基础的排序器 功能介绍 这是对本系统的一些简单的功能介绍。 一、菜单管理
菜单列表 点击表格头部工具栏的【添加】按钮会添加一条模板数据
/*** 添加*/
function insert() {requestUrl /menu/insert;ajaxPost(requestUrl, {type: 1,name: xxx,url: /html/xxx_list.html,icon: icon-script}, function (response) {showMsg(response.message);$(#menu_list).datagrid(reload);}, error);
} 修改功能是基于easyui的表格行内编辑完成的鼠标选择一行数据点击头部工具栏的【修改】按钮会开启该行的编辑。 点击保存会向后台控制器提交修改后的数据点击取消则只会取消行内编辑。 通过给表格添加结束编辑事件当表格行结束编辑也就是调用了endEdit方法时触发事件会把data修改为修改后的行数据。 let data {};/*** 保存*/
function save() {if (editingId ! null) {let datagrid $(#menu_list);// 只有结束编辑才能获取到最新的值datagrid.datagrid(endEdit, editingId);ajaxPost(requestUrl, data, function () {editingId null;datagrid.datagrid(reload);}, error);}
}$(document).ready(function() { $(#menu_list).datagrid({url: /menu/selectByPage,method: get,height: 680,fitColumns: true,pagination: true,onAfterEdit: function (index, row, changes) {data {id: row.id,type: row.type,parentId: row.parentId,url: changes.url ? changes.url : row.url,name: changes.name ? changes.name : row.name,icon: changes.icon ? changes.icon : row.icon};},.....};};
删除功能比较简单就不介绍了~ 角色-菜单列表
就是对角色的菜单进行管理目前只是基于父级菜单实现只需要给角色添加对应的父类菜单即可让该角色获得该菜单下的所有子菜单的权限。 二、权限管理
权限列表
对系统资源权限也就是控制器接口权限进行管理 父级权限的编号格式为为服务名_控制器名子级权限的编号为服务名_控制器名_方法名。 权限初始化功能一键自动完成权限的初始化功能会先删除原来的权限然后扫描控制器类的包获取所有控制器接口信息并保存到数据库。 涉及的后端代码 Overridepublic void resources() throws ClassNotFoundException {// 删除原来的权限permissionMapper.delete(null);// 扫描路径String basePackage cn.edu.sgu.www.controller;// 获取扫描结果ListPermission permissions resourceScanner.scan(basePackage);for (Permission permission : permissions) {permissionMapper.insert(permission);}}
扫描工具类的代码
package cn.edu.sgu.www.util;import cn.edu.sgu.www.EasyuiCrud;
import cn.edu.sgu.www.annotation.AnonymityAccess;
import cn.edu.sgu.www.entity.Permission;
import cn.edu.sgu.www.enums.RequestMethod;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;/*** 接口资源扫描工具类* author heyunlin* version 1.0*/
Component
public class ResourceScanner {/*** 服务名*/Value(${spring.application.name})private String SERVICE_NAME;private static ListString classPaths new ArrayList();private static final ListPermission resources new ArrayList();/*** 扫描controller包下的目录生成权限* param basePackage controller包* return ListPermission* throws ClassNotFoundException 类找不到时抛出异常*/public ListPermission scan(String basePackage) throws ClassNotFoundException {// 删除掉上一次的数据if (!resources.isEmpty()) {resources.clear();}if (!classPaths.isEmpty()) {classPaths.clear();}String classpath EasyuiCrud.class.getResource(/).getPath();String searchPath classpath basePackage.replace(., /);classpath classpath.replaceFirst(/, );classPaths getClassPaths(new File(searchPath));for(String classPath : classPaths) {// 得到类的全限定名classPath classPath.replace(classpath.replace(/, \\).replaceFirst(\\\\, ), ).replace(\\, .).replace(.class, );classpath classPath.substring(classPath.indexOf(basePackage));// 通过反射获取类的信息Class? cls Class.forName(classpath);// 获取标注在类上的RequestMapping注解RequestMapping requestMapping cls.getAnnotation(RequestMapping.class);// 构建父权限Permission parent new Permission();// 控制器类上的路径String prefix ;if(requestMapping ! null) {// path或者valueprefix requestMapping.value().length 0 ? requestMapping.value()[0] : requestMapping.path()[0];parent.setType(0);parent.setUrl(prefix);parent.setId(SERVICE_NAME _ cls.getSimpleName());// 设置nameif (cls.isAnnotationPresent(Api.class)) {Api api cls.getAnnotation(Api.class);if (api ! null) {// 类的接口文档Api注解的tags属性值String name api.tags()[0];parent.setName(name);}}resources.add(parent);}Method[] methods cls.getDeclaredMethods();for (Method method : methods) {getClassAnnotation(method, prefix, cls.getSimpleName(), parent.getId());}}return resources;}/*** 得到类上面的注解信息* param method Method* param prefix String 控制器类上RequestMapping注解指定的路径* param controllerName 控制器名称* param parentId String 父级权限ID*/public void getClassAnnotation(Method method, String prefix, String controllerName, String parentId) {// 构建子权限Permission permission new Permission();String url null;// 获取urlif (method.isAnnotationPresent(RequestMapping.class)) {RequestMapping requestMapping method.getAnnotation(RequestMapping.class);url prefix (requestMapping.value().length 0 ? requestMapping.value()[0] : requestMapping.path()[0]);String requestMethod requestMapping.method().length 0 ? requestMapping.method()[0].name() : get;permission.setMethod(RequestMethod.getValueByName(requestMethod));} else if (method.isAnnotationPresent(GetMapping.class)) {GetMapping getMapping method.getAnnotation(GetMapping.class);url prefix getMapping.value()[0];permission.setMethod(RequestMethod.GET.getValue());} else if (method.isAnnotationPresent(PostMapping.class)) {PostMapping postMapping method.getAnnotation(PostMapping.class);url prefix postMapping.value()[0];permission.setMethod(RequestMethod.POST.getValue());}// 处理URLif(url ! null url.endsWith(/)) {url url.substring(0, url.length() - 1);}permission.setUrl(url);// 设置valueif (method.isAnnotationPresent(ApiOperation.class)) {ApiOperation operation method.getAnnotation(ApiOperation.class);if (operation ! null) {String name operation.value();permission.setName(name);}}// 默认值0permission.setAnonymity(0);if (method.isAnnotationPresent(AnonymityAccess.class)) {AnonymityAccess annotation method.getAnnotation(AnonymityAccess.class);if (annotation ! null) {permission.setAnonymity(annotation.value() ? 1 : 0);}}permission.setType(1);permission.setParentId(parentId);permission.setId(SERVICE_NAME _ controllerName _ method.getName());resources.add(permission);}private ListString getClassPaths(File path) {if (path.isDirectory()) {File[] files path.listFiles();if (files ! null) {for (File file : files) {getClassPaths(file);}}} else {if (path.getName().endsWith(.class)) {classPaths.add(path.getPath());}}return classPaths;}} 角色-权限列表
角色权限的维护包括简单的增删改和基于easyui树实现的授权功能以及超管账户的权限初始化功能。 授权功能通过简单的复选框勾选/取消勾选来给角色分配权限 权限初始化功能其实非常简单就是查询所有的资源权限然后分配给超管用户。 Overridepublic void init(String userId) {// 删除用当前户所有角色的权限rolePermissionMapper.deleteByUserId(userId);// 查询全部子权限ListPermission list permissionMapper.selectByType(PermissionType.ZQX.getValue());list.forEach(permission - {RolePermission rolePermission new RolePermission();rolePermission.setId(null);rolePermission.setRoleId(1);rolePermission.setPermissionId(permission.getId());rolePermissionMapper.insert(rolePermission);});} 三、用户管理
因为这个部分的功能很简单只有简单的crud不做过多介绍。
用户列表 用户-角色列表 四、歌曲管理
歌曲列表
歌曲的维护、歌单导入/导出功能。 五、系统功能
系统设置
鼠标移动到右上方的下拉菜单点击【系统设置】打开系统设置窗口。 修改密码功能 对密码进行加密存储 Overridepublic void updatePassword(UserPassUpdateDTO userPassUpdateDTO) {// 用户名String username userPassUpdateDTO.getUsername();// 旧密码String oldPass userPassUpdateDTO.getOldPass();// 新密码String password userPassUpdateDTO.getPassword();// 验证两次输入的密码是否相等if (password.equals(userPassUpdateDTO.getRePass())) {// 查询用户信息String encodedPassword selectByUsername(username).getPassword();// 验证输入的旧密码是否正确if (PasswordEncoder.matches(oldPass, encodedPassword)) {UpdateWrapperUser wrapper new UpdateWrapper();wrapper.eq(username, username);wrapper.set(password, PasswordEncoder.encode(password));userMapper.update(wrapper.getEntity(), wrapper);} else {throw new GlobalException(ResponseCode.FORBIDDEN, 输入的密码不正确);}} else {throw new GlobalException(ResponseCode.FORBIDDEN, 两次输入的密码不一样);}} 菜单控制功能就是控制左侧菜单的显示勾选/取消勾选对应的菜单然后点击窗口右下角的【确定】按钮提交修改。 初始化权限
这个按钮的功能和权限列表的【初始化】按钮是一样的。 代码介绍
前面已经对这个系统做了一些简单的介绍接下来介绍一下博主经过多次实践产出的一部分公共的Java代码可以直接使用。 响应状态码
在枚举中自定义了几种响应状态码
package cn.edu.sgu.www.restful;/*** 响应状态码* author heyunlin* version 1.0*/
public enum ResponseCode {/*** 请求成功*/OK(200),/*** 失败的请求*/BAD_REQUEST(400),/*** 未授权*/UNAUTHORIZED(401),/*** 禁止访问*/FORBIDDEN(403),/*** 找不到*/NOT_FOUND(404),/*** 不可访问*/NOT_ACCEPTABLE(406),/*** 冲突*/CONFLICT(409),/*** 服务器发生异常*/ERROR(500);private final Integer value;ResponseCode(Integer value) {this.value value;}public Integer getValue() {return value;}} 统一响应实体类
包含提示信息、响应数据和响应状态码的web响应实体类。
package cn.edu.sgu.www.restful;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;import java.io.Serializable;/*** 响应实体类* param T* author heyunlin* version 1.0*/
Data
public class JsonResultT implements Serializable {private static final long serialVersionUID 18L;/*** 响应数据*/private T data;/*** 响应状态码*/private Integer code;/*** 响应提示信息*/private String message;/*** 成功提示*/private static final String successMessage 请求成功;public static JsonResultVoid success() {return success(successMessage);}public static JsonResultVoid success(String message) {return success(message, null);}public static T JsonResultT success(String message, T data) {JsonResultT jsonResult new JsonResult();jsonResult.setCode(ResponseCode.OK.getValue());jsonResult.setMessage(message);jsonResult.setData(data);return jsonResult;}public static JsonResultVoid error(String message) {JsonResultVoid jsonResult new JsonResult();jsonResult.setCode(ResponseCode.ERROR.getValue());jsonResult.setMessage(message);return jsonResult;}public static JsonResultVoid error(ResponseCode responseCode, Throwable e) {return error(responseCode, e.getMessage() ! null ? e.getMessage() : 系统发生异常请联系管理员);}public static JsonResultVoid error(ResponseCode responseCode, String message) {JsonResultVoid jsonResult new JsonResult();jsonResult.setCode(responseCode.getValue());jsonResult.setMessage(message);return jsonResult;}public static T JsonResultJsonPageT restPage(PageT page) {JsonPageT jsonPage JsonPage.restPage(page);return success(successMessage, jsonPage);}} 全局异常处理类
package cn.edu.sgu.www.restful.handler;import cn.edu.sgu.www.exception.GlobalException;
import cn.edu.sgu.www.restful.JsonResult;
import cn.edu.sgu.www.restful.ResponseCode;
import cn.edu.sgu.www.util.UserUtils;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletResponse;
import java.util.Objects;/*** 全局异常处理类* author heyunlin* version 1.0*/
RestControllerAdvice
public class GlobalExceptionHandler {/*** 处理GlobalException* param e GlobalException* return JsonResultVoid*/ExceptionHandlerpublic JsonResultVoid handleGlobalException(GlobalException e) {printMessage(e);HttpServletResponse response UserUtils.getResponse();response.setStatus(e.getResponseCode().getValue());return JsonResult.error(e.getResponseCode(), e);}/*** 处理BindException* param e BindException* return JsonResultVoid*/ExceptionHandlerResponseStatus(HttpStatus.BAD_REQUEST)public JsonResultVoid handleBindException(BindException e) {printMessage(e);BindingResult bindingResult e.getBindingResult();FieldError fieldError bindingResult.getFieldError();String defaultMessage Objects.requireNonNull(fieldError).getDefaultMessage();return JsonResult.error(ResponseCode.BAD_REQUEST, defaultMessage);}/*** 处理Exception* param e Exception* return JsonResultVoid*/ExceptionHandlerResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public JsonResultVoid handleException(Exception e) {printMessage(e);return JsonResult.error(ResponseCode.ERROR, e);}private void printMessage(Exception e) {e.printStackTrace();}} 统一数据格式处理类
这个类需要注意的是knife4j的接口路径不能被处理否则接口文档的页面内容不能正常显示。
# 配置统一数据格式返回处理类忽略的路径
response:ignore:- /error- /v2/api-docs- /swagger-resources
package cn.edu.sgu.www.restful.handler;import cn.edu.sgu.www.config.property.ResponseProperties;
import cn.edu.sgu.www.restful.JsonResult;
import cn.edu.sgu.www.util.UserUtils;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.util.List;/*** 统一数据格式返回处理类* author heyunlin* version 1.0*/
Slf4j
RestControllerAdvice
public class GlobalResponseHandler implements ResponseBodyAdvice {private final ListString ignore;Autowiredpublic GlobalResponseHandler(ResponseProperties responseProperties) {ignore responseProperties.getIgnore();}Overridepublic boolean supports(MethodParameter parameter, Class type) {return true;}Overridepublic Object beforeBodyWrite(Object body, MethodParameter parameter, MediaType mediaType, Class type, ServerHttpRequest request, ServerHttpResponse response) {// 返回值类型为JsonResult则直接返回if (body instanceof JsonResult) {return body;}// 忽略的请求地址String requestURI UserUtils.getRequest().getRequestURI();if (ignore.contains(requestURI)) {return body;}log.debug(接口{}的返回值为{}, requestURI, body.toString());// 将返回值类型修改为JsonResultJsonResultObject jsonResult JsonResult.success(null, body);if (body instanceof String) {return JSON.toJSONString(jsonResult);}return jsonResult;}} datagrid数据格式对象
基于easyui的datagrid组件要求返回的数据格式封装成的对象。
package cn.edu.sgu.www.restful;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;import java.io.Serializable;
import java.util.List;/*** easyui datagrid数据格式对象* param T* author heyunlin* version 1.0*/
Data
public class JsonPageT implements Serializable {private static final long serialVersionUID 18L;/*** 总记录数*/private Long total;/*** 查询结果*/private ListT rows;/*** 页脚数据*/private T footer;public static T JsonPageT restPage(PageT page) {JsonPageT jsonPage new JsonPage();jsonPage.setTotal(page.getTotal());jsonPage.setRows(page.getRecords());return jsonPage;}}获取用户登录信息的工具类
基于shiro的获取用户登录信息的工具类
package cn.edu.sgu.www.util;import cn.edu.sgu.www.entity.User;
import cn.edu.sgu.www.exception.GlobalException;
import cn.edu.sgu.www.restful.ResponseCode;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 获取用户信息的工具类* author heyunlin* version 1.0*/
public class UserUtils {/*** 得到Subject对象* return Subject*/public static Subject getSubject() {return SecurityUtils.getSubject();}/*** 获取登录的用户信息* return User*/public static User getUserInfo() {Object object getSubject().getPrincipal();if (object null) {throw new GlobalException(ResponseCode.BAD_REQUEST, 获取登录信息失败当前没有用户登录。);}return (User) object;}/*** 获取登录用户的ID* return String*/public static String getUserId() {return getUserInfo().getId();}/*** 获取登录的用户名* return String*/public static String getLoginUsername() {return getUserInfo().getUsername();}public static HttpServletRequest getRequest() {RequestAttributes attributes RequestContextHolder.getRequestAttributes();if (attributes ! null ) {return ((ServletRequestAttributes) attributes).getRequest();}throw new GlobalException(ResponseCode.ERROR, 获取request对象失败);}public static HttpServletResponse getResponse() {RequestAttributes attributes RequestContextHolder.getRequestAttributes();if (attributes ! null ) {return ((ServletRequestAttributes) attributes).getResponse();}throw new GlobalException(ResponseCode.ERROR, 获取response对象失败);}} 基于easyui的表格过滤插件功能实现
package cn.edu.sgu.www.base;import lombok.Data;import java.io.Serializable;/*** 过滤规则* author heyunlin* version 1.0*/
Data
public class FilterRule implements Serializable {private static final long serialVersionUID 18L;/*** 字段名*/private String field;/*** 比较符*/private Operator op;/*** 字段值*/private String value;
}
package cn.edu.sgu.www.base;/*** 比较符* author heyunlin* version 1.0*/
public enum Operator {/*** 包含*/contains,/*** 等于*/equal,/*** 不等于*/notequal,/*** 以...开始*/beginwith,/*** 以...结尾*/endwith,/*** 小于*/less,/*** 小于或等于*/lessorequal,/*** 大于*/greater,/*** 大于或等于*/greaterorequal
} 基础的分页器
提供了分页的功能需要分页功能的接口的参数类型只需要集成该类即可将自动获得分页功能。
package cn.edu.sgu.www.base;import cn.edu.sgu.www.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.List;/*** 基础分页参数对象包含页数和每页的记录数* author heyunlin* version 1.0*/
EqualsAndHashCode(callSuper true)
Data
public class PagerT extends Sorter implements Serializable {private static final long serialVersionUID 18L;/*** 页数*/private Integer page 1;/*** 每页记录数*/private Integer rows 10;/*** 过滤规则*/private ListFilterRule filterRules;/*** 根据Pager创建Page对象* param pager Pager* return Page*/public static T PageT ofPage(PagerT pager) {return new Page(pager.getPage(), pager.getRows());}/*** 根据Pager创建QueryWrapper对象* param pager Pager* return QueryWrapperT*/public static T QueryWrapperT getQueryWrapper(PagerT pager, boolean enableSort) {QueryWrapperT wrapper new QueryWrapper();ListFilterRule filterRules pager.getFilterRules();if (filterRules ! null !filterRules.isEmpty()) {for (FilterRule filterRule : filterRules) {// 字段名转为小写字母下划线的格式String field StringUtils.toLower(filterRule.getField());// 字段值String value filterRule.getValue();if (StringUtils.isNotEmpty(value)) {switch (filterRule.getOp()) {case less:wrapper.lt(field, value);break;case equal:wrapper.eq(field, value);break;case greater:wrapper.gt(field, value);break;case notequal:wrapper.ne(field, value);break;case lessorequal:wrapper.le(field, value);break;case greaterorequal:wrapper.ge(field, value);break;case beginwith:wrapper.likeLeft(field, value);break;case endwith:wrapper.likeRight(field, value);break;case contains:wrapper.like(field, value);break;default:break;}}}}if (enableSort) {// 得到order by语句String statement getOrderByStatement(pager);if (StringUtils.isNotEmpty(statement)) {wrapper.last(statement);}}return wrapper;}} 基础的排序器
因为前端的基础分页器Pager已经继承了Sorter所以开启了分页功能后自动获得排序功能。
package cn.edu.sgu.www.base;import cn.edu.sgu.www.exception.GlobalException;
import cn.edu.sgu.www.restful.ResponseCode;
import cn.edu.sgu.www.util.StringUtils;
import lombok.Data;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;/*** 基础排序对象包含排序字段和排序方式* author heyunlin* version 1.0*/
Data
public class Sorter implements Serializable {private static final long serialVersionUID 18L;/*** 空字符串*/private static final String EMPTY_STR ;/*** 分割符*/private static final String SEPARATOR ,;/*** 排序方式*/private static final ListString ORDER_STYLES new ArrayList(2);static {ORDER_STYLES.add(asc);ORDER_STYLES.add(desc);}/*** 排序字段*/private String sort;/*** 排序方式asc/desc*/private String order;/*** 根据查询条件拼接得到order by语句* param sorter 分页查询条件* return String*/public static String getStatement(Sorter sorter) {String sort;String sortColumn sorter.getSort();// 处理排序字段String[] sortArray {};if (StringUtils.isNotEmpty(sortColumn)) {// 驼峰命名转为下划线sort StringUtils.toLower(sortColumn);if (sort.contains(SEPARATOR)) {sortArray sort.split(SEPARATOR);}} else {return EMPTY_STR;}// 处理排序方式String[] orderArray {};String order sorter.getOrder();if (StringUtils.isNotEmpty(order)) {if (order.contains(SEPARATOR)) {orderArray order.split(SEPARATOR);}} else {return EMPTY_STR;}StringBuilder statement new StringBuilder();if (sortArray.length 0 orderArray.length 0) {int length sortArray.length;for (int i 0; i length; i) {String pagerSort sortArray[i];String pagerOrder orderArray[i];boolean result validate(pagerSort, pagerOrder);if (result) {statement.append(pagerSort);statement.append( );statement.append(pagerOrder);if (i length - 1 ) {statement.append(, );}}}} else {// #{sort} #{order}“statement.append(sort);statement.append( );statement.append(order);}return statement.toString();}/*** 根据查询条件拼接得到order by语句* param sorter 分页查询条件* return String*/public static String getOrderByStatement(Sorter sorter) {String statement getStatement(sorter);if (StringUtils.isNotEmpty(statement)) {return order by statement;} else {return EMPTY_STR;}}/*** 往Pager的排序字段中添加排序* param pager Pager Pager对象* param sort String 排序字段* param order String 排序方式* return Pager? 返回重新设置排序字段和排序方式后的Pager对象*/public static Pager? append(Pager? pager, String sort, String order) {boolean result validatePager(pager);if (result) {String pagerSort pager.getSort();String pagerOrder pager.getOrder();pager.setSort(pagerSort.concat(SEPARATOR).concat(sort));pager.setOrder(pagerOrder.concat(SEPARATOR).concat(order));return pager;}return null;}/*** 验证Pager对象的sort和order的值是否合法* param pager Pager?* return boolean*/private static boolean validatePager(Pager? pager) {String sort pager.getSort();String order pager.getOrder();return validate(sort, order);}/*** 验证sort和order的值是否合法* param sort 排序字段* param order 排序方式* return boolean*/private static boolean validate(String sort, String order) {if (StringUtils.isEmpty(sort)) {throw new GlobalException(ResponseCode.FORBIDDEN, 排序字段不允许为空);} else if (StringUtils.isEmpty(order)) {throw new GlobalException(ResponseCode.FORBIDDEN, 排序方式不允许为空);} else if(!ORDER_STYLES.contains(order.toLowerCase())) {throw new GlobalException(ResponseCode.FORBIDDEN, 排序方式不合法);}return true;}} 好了文章就分享到这里了自己的一个小成果分享给大家希望对大家有所帮助~