利用周末时间,对自己的项目进行了升级,原来使用的是tkmybatis,改为mybatis plus。但是返回数据的格式变了,导致前端页面自带的字段排序失效了,需要刷新表格才会排序,于是决定在服务端实现排序。

easyui的数据表格datagrid支持多字段排序,可以控制是否通过服务器排序,核心代码如下。

role_list.html文件:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>角色列表</title><link rel="stylesheet" href="/css/themes/icon.css"/><link rel="stylesheet" href="/css/themes/default/easyui.css" /></head><body>       <table id="role_list"></table><script src="/js/public/public.js"></script><script src="/js/public/jquery.min.js"></script><script src="/js/public/jquery.easyui.min.js"></script><script src="/js/public/easyui-lang-zh_CN.js"></script><script src="/js/role_account/role_list.js"></script></body>
</html>

role_list.js文件:

let pageList = [10, 20, 50, 100];$(document).ready(function() {// 角色数据表格$("#role_list").datagrid({url: '/role_account/selectByPage',striped: true,multiSort: true,fitColumns: true,remoteSort: true,singleSelect: true,height: table_height,pagination: true,pageList: pageList,pageSize: pageList[0],loadFilter: function(result){if (result.code === 200){return result.data;} else {return null;}},toolbar: [{iconCls: 'icon-add',text: '添加',handler: function() {handleAdd();}}, '-', {iconCls: 'icon-edit',text: '修改',handler: function() {handleUpdate();}}, '-', {iconCls: 'icon-set',text: '加点',handler: function() {handleJiadian();}}, '-', {iconCls: 'icon-shield',text: '属性',handler: function() {handleAttribute();}}, '-', {iconCls: 'icon-search',text: '查看',handler: function() {handleView();}}, '-', {iconCls: 'icon-tip',text: '关于',handler: function() {handleTip();}}],columns: [[{field: 'id', title: '角色ID', align: "center", sortable: true, width:100},{field: 'name', title: '角色名', align: "center", width: 120},{field: 'modelingId', title: '角色造型', align: "center", width: 80, formatter: function(value, rowData, rowIndex) {get("/role_modeling/selectById", {id: value}, function(result) {$("#modeling_" + rowIndex).attr("src", result.image).attr("title", result.name);}, error);return "<img width='" + size + "' id='modeling_" + rowIndex + "' />";}},{field: 'grade', title: '等级', align: "center", sortable: true, width: 80, formatter: function(value) {let group; // 组别if(value >= 0 && value <= 69) { // [0, 69]精锐组group = "精锐组";} else if(value >= 70 && value <= 89) { // [70, 89]勇武组group = "勇武组";} else if(value >= 90) { // [90, 115]神威组group = "神威组";} else { // [-∞, 0) ∪ (115, +∞)group = "等级不合法";}return "<span title='" + group + "'>" + value+ "级</span>";}},{field: 'score', title: '人物评分', align: "center", sortable: true, width: 80},{field: 'schoolId', title: '门派', align: "center", width: 80, formatter: function(value, rowData, rowIndex) {get("/school/selectById", {id: value}, function(result) {$("#school_" + rowIndex).attr("src", result.image).attr("title", result.name).width(size);}, error);return "<img width='" + size + "' id='school_" + rowIndex + "' />";}},{field: 'jinbi', title: '金币', align: "center", sortable: true, width: 80},{field: 'accountId', title: '账号', align: "center", width: 200, formatter: function(value, rowData, rowIndex) {get("/account/selectAccountById", {id: value}, function(response) {$("#account_" + rowIndex).html(response.data);}, error);return "<div id='account_" + rowIndex + "'></div>";}},{field: "lastUpdateTime", title: "最后一次修改时间", align: "center", sortable: true, width: 125},{field: 'right', title: '操作', align: "center", formatter: function(value, rowData, rowIndex) {return '<a href="javascript:;" '+ 'onclick="handleDelete(' + rowData.id + ')">'+ '<img title="删除" src="/css/themes/icons/delete.png" /></a>';}}]]});});

其中multiSort设置为true表示允许多字段排序,remoteSort表示是否从服务器排序,设置为true,我们接下来在后台接口处理字段排序。

以上是easyui官网的相关截图,当多字段排序时,传递给后台的参数中通过逗号拼接。

【例如】:通过评分score升序和等级grade降序排序时,后台接收到的参数为:

{

"sort": "score,grade"

"order": "asc,desc"

}

controller层:RoleAccountController.java

@RestController
@RequestMapping(path = "/role_account", produces="application/json; charset=utf-8")
public class RoleAccountController {private final IRoleAccountService service;@Autowiredpublic RoleAccountController(IRoleAccountService service) {this.service = service;}@ApiOperation("分页查询角色列表")@RequestMapping(value = "/selectByPage", method = RequestMethod.POST)public JsonResult<PageResult<RoleAccount>> selectByPage(RoleAccountPager pager) {Page<RoleAccount> page = service.selectByPage(pager);return JsonResult.restPage(page);}}

service层:RoleAccountServiceImpl.java

@Service
public class RoleAccountServiceImpl implements RoleAccountService {@Overridepublic Page<RoleAccount> selectByPage(RoleAccountPager pager) {Page<RoleAccount> page = new Page<>(pager.getPage(), pager.getRows());QueryWrapper<RoleAccount> wrapper = new QueryWrapper<>();wrapper.eq(!StringUtils.isEmpty(pager.getId()),"id", pager.getId());wrapper.like(!StringUtils.isEmpty(pager.getName()),"name", pager.getName());wrapper.eq(pager.getSchoolId() != null,"school_id", pager.getSchoolId());wrapper.eq(pager.getModelingId() != null,"modeling_id", pager.getModelingId());wrapper.eq(!StringUtils.isEmpty(pager.getAccountId()),"account_id", pager.getAccountId());// 得到order by语句String statement = Pager.getOrderByStatement(pager);wrapper.last(statement);return mapper.selectPage(page, wrapper);}}

mapper层:RoleAccountMapper.java

@Repository
public interface RoleAccountMapper extends BaseMapper<RoleAccount> {}

RoleAccount.java

@Data
public class RoleAccount {@TableId("id")private String id;/*** 角色名*/private String name;/*** 等级*/private Integer grade;/*** 人物评分*/private Integer score;/*** 金币*/private Integer jinbi;/*** 账号id*/private String accountId;/*** 门派id*/private Integer schoolId;/*** 服务器id*/private Integer serverId;/*** 角色造型id*/private Integer modelingId;/*** 账号创建时间*/@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime birthday;/*** 最后一次修改时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime lastUpdateTime;
}

RoleAccountPager.java

@Data
@EqualsAndHashCode(callSuper = true)
public class RoleAccountPager extends Pager {/*** 角色id*/private String id;/*** 角色名*/private String name;/*** 等级*/private Integer grade;/*** 账号id*/private String accountId;/*** 门派id*/private Integer schoolId;/*** 角色造型id*/private Integer modelingId;
}

Pager.java

/*** 基础分页对象,包含页数和每页的记录数*/
@Data
@EqualsAndHashCode(callSuper = true)
public class Pager extends Sorter {/*** 页数*/private Integer page = 1;/*** 每页记录数*/private Integer rows = 10;
}

Sorter.java

/*** 基础排序对象,包含排序字段和排序方式*/
@Data
public class Sorter {/*** 排序字段*/private String sort;/*** 排序方式:asc/desc*/private String order;/*** 根据查询条件拼接得到order by语句* @param sorter 分页查询条件* @return String*/public static String getStatement(Sorter sorter) {String sort;String[] sortArray = {};String[] orderArray = {};String order = sorter.getOrder();String sortColumn = sorter.getSort();StringBuilder statement = new StringBuilder();// 多字段排序if (StringUtils.isNotEmpty(sortColumn)) {// 驼峰命名转为下划线sort = StringUtils.toLowerCase(sortColumn);if (sort.contains(",")) {sortArray = sort.split(",");}} else {return "";}if (StringUtils.isNotEmpty(order)) {if (order.contains(",")) {orderArray = order.split(",");}} else {return "";}if (sortArray.length > 0 && orderArray.length > 0) {int length = sortArray.length;for (int i = 0; i < length; i++) {statement.append(sortArray[i]);statement.append(" ");statement.append(orderArray[i]);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 statement;}}}

因为排序的字段名是驼峰命名,需要转为小写字母+下划线命名,转换的方法抽象到了StringUtils工具类中,代码如下。

public class StringUtils {/*** 判断字符串是否为null或""* 符串为""或null返回true,否则返回false* @param str 要判断的字符串* @return boolean*/public static boolean isEmpty(String str) {return str == null || str.isEmpty();}/*** 判断字符串是否为""或null* 符串为""或null返回false,否则返回true* @param str 要判断的字符串* @return boolean*/public static boolean isNotEmpty(String str) {return !isEmpty(str);}/*** 判断字符串是否为null或""* 符串为""或null返回true,否则返回false* @param str 要判断的字符串* @return boolean*/public static boolean isNullOrEmpty(String str) {return str == null || str.isEmpty();}/*** 检查字符串是否包含空白字符* 如果不包含空格返回true,否则返回false* @param str 需要比较的字符串* @return boolean*/public boolean check(String str) {// 去除空白字符后字符串的长度int realLength = str.replaceAll("\\s", "").length();int originalLength = str.length(); // 字符串原来的长度return realLength == originalLength;}/*** 根据当前时间生成UUID* @return String*/public static String uuid() {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");LocalDateTime localDate = LocalDateTime.now();return localDate.format(formatter);}/*** 通过文件名获取文件类型* @param fileName 文件名*/public static String getFileType(String fileName) {// 得到文件名中最后一次出现"."的位置int index = fileName.lastIndexOf('.');return fileName.substring(index);}/*** 获取文件名* @param file MultipartFile对象* @return String 由当前时间生成的新文件名*/public static String getFileName(MultipartFile file) {// 得到上传文件的原始文件名String filename = file.getOriginalFilename();// 判断文件名是否为空if (isNullOrEmpty(filename)) {throw new RuntimeException("获取文件名失败!");}// 返回uuid.文件类型,如:20220618131456.jpgreturn uuid() + getFileType(filename);}/*** 功能:驼峰命名转下划线命名* 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写* @param str 待转换的字符串* @return String*/public static String toLowerCase(String str) {str = str.replaceAll("([a-z])([A-Z])", "$1_$2");return str.toLowerCase();}/*** 功能:下划线命名转驼峰命名* 将下划线替换为空格,将字符串根据空格分割成数组,再将每个单词首字母大写* @param str 待转换的字符串* @return String*/private static String toUpperCase(String str) {StringBuilder under= new StringBuilder();str = str.toLowerCase().replace("_", " ");String[] array = str.split(" ");for (String s : array) {String letter = s.substring(0, 1).toUpperCase() + s.substring(1);under.append(letter);}return under.toString();}}

文章到此结束,感谢阅读~

MyBatis Plus实现动态字段排序相关推荐

  1. Mybatis Xml 传入动态字段 排序

    太原  2019.6-28 主要思路是 使用${} , #{}传过来的参数带单引号'',而${}传过来的参数不带单引号. 下面是Mybatis中Xml格式的写法 #{}  ${} 可以混用,  好像不 ...

  2. java动态字段排序_JAVA 列表动态增加字段显示和任意字段排序

    需求是用户可以在页面管理展示的字段,并且对字段的展示顺序自定义排序,控制所有字段显示隐藏,表中有默认基础字段是不可以删除的 这边全部都是后端实现: 思路: 数据表设定一个字段专门存放动态字段,字段内容 ...

  3. java动态字段排序_Java8对多个字段排序

    Java8对多个字段排序 创建User对象 public class Users { private Long id; private String name; private String code ...

  4. mybatis 操作动态表+动态字段+存储过程

    mybatis 操作动态表+动态字段+存储过程 存储过程   statementType="CALLABLE" <!-- 计算金额存储过程-->     <upd ...

  5. jquery easyui dataGrid动态改变排序字段名

    2019独角兽企业重金招聘Python工程师标准>>> jquery easyui dataGrid 动态改变排序字段名,一般情况下,在使用的时候,我们会点击相应字段进行排序, 这里 ...

  6. mybatis 动态字段与表中不一样_mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题...

    创建用户: /** * 创建一个或多个新用户 insert 字段和表名不确定时动态添加 */ @Test public void createAccount() { String lineColumn ...

  7. 【mybatis】mybatis自定义动态字段查询,mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段...

    mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段 先看一下 怎么实现动态的自定义字段查询: 例如: 而field 就是数据表中的某一个字段 String f ...

  8. mybatis多字段排序_解决mybatis中order by排序无效问题

    1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111&qu ...

  9. 按任意字段排序的分页存储过程

    CREATE PROCEDURE GetRecordFromPage      @tblName       varchar(255),        -- 表名      @fldName      ...

最新文章

  1. matlab 和python读取csv文件速度_matlab读取csv文件数据并绘图
  2. leetcode算法题--使序列递增的最小交换次数★
  3. windows 技术篇-将本地主机加入域的方法实例演示
  4. vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件
  5. jquery导入数据_Web技术——简单的数据库编程
  6. 排除“使用主题 css 文件要求页上有标头控件。(例如 head runat=server /)”错误...
  7. Memory Translation and Segmentation(内存转换与段)
  8. [Firefox] 方便实用的firefox 插件
  9. loj10147. 「一本通 5.1 例 1」石子合并
  10. Starling 动画功能
  11. 车载语音识别问题多 车主都说不靠谱
  12. HSRP热备份路由协议 、 STP生成树协议 、 总结和答疑
  13. JavaScript知识梳理总结
  14. 海思Hi3716M高清广电平移和低端IPTV解决方案芯片产品简介
  15. 如何用CSS3制作一个平面正方体和立体正方体
  16. 《大数据日知录》读书笔记 + 回顾补充(20190716 - 2019MMdd)
  17. 免费思维导图mindmanager2020下载安装(附序列号)
  18. 计算机显卡怎样安装方法,电脑装机小知识,新手如何正确安装好独立显卡
  19. flex effect
  20. linux乱码文件删不掉,linux删除乱码文件或文件夹

热门文章

  1. 制定游戏机计算机配置清单,求吃鸡游戏电脑配置清单
  2. SQL-DDL语句DQL语句
  3. python 训练识别验证码_python使用tensorflow深度学习识别验证码
  4. 入职鹅厂一周年...
  5. 车辆灯具E-mark认证流程
  6. 数字藏品交易平台开发教程
  7. python GUI-Tkinter编程
  8. linux蓝屏修复工具,linux 开机蓝屏怎么处理
  9. 关于获取上传图片的长和宽
  10. 微信LV项目(全流程)