• JavaFx通用查询、跳转创建、修改页面、关闭舞台工具类


    背景:每次创建新的界面,都需要重写初始化表格组件、初始化分页组件、获取组件数值查询、跳转修改界面、跳转新建界面、关闭舞台场景、刷新、删除等功能,很繁琐,感觉写代码意义,所以总结出一套代码,是要这些通用的功能;

    使用框架:SpringBoot+Jpa+JavaFx

    实现功能:

      1.实现表格组件、分页组件初始化和联动,默认每页显示50条;

      2.实现通用分页多条件查询功能,多条件查询会根绝规则获取组件数值作为查询条件;

      3.实现通用跳转新建页面功能;

      4.实现通用跳转修改页面功能;

      5.实现通用删除功能;

      6.实现通用关闭弹出界面功能;

       7.允许另外设置表格组件列宽;

    PageContext:页面上下文

    import com.maxinhai.world.WorldApplication;
    import com.maxinhai.world.component.MsgAlert;
    import com.maxinhai.world.entity.ClientMsg;
    import com.maxinhai.world.service.CommonService;
    import javafx.application.Platform;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Node;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    import javafx.stage.StageStyle;
    import javafx.util.Callback;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.context.ConfigurableApplicationContext;
    
    import java.io.IOException;
    import java.util.*;
    import java.util.concurrent.ConcurrentHashMap;
    
    /**
     * @program: world
     * @description: 页面上下文
     * @author: XinHai.Ma
     * @create: 2021-09-29 13:42
     */
    @SuppressWarnings("all")
    public class PageContext<T> {
    
        /**
         * 实现功能:
         * 1. 根据固定参数初始化表格和分页组件,实现多条件、分页查询;
         * 2. 实现跳转新增、修改页面;
         * 3. 实现批量删除功能;
         * 4. 实现关闭二级页面功能;
         * 5. 实现弹窗功能;
         *
         * 前置条件:
         * 1. 使用PageContext类里面提供的功能;
         * 2. 业务层实现CommonService接口;
         * 3. 作为查询条件的组件值,在放入PageContext组件时,key规则为condition-code,
         *    这样框架可以识别该组件的值是要作为查询条件的;
         * 4. 框架默认给tableView里的数据列设置宽度,有个性化需要可以使用setColumnWidth()方法
         *    为每个页面的tableView数据列设置列宽;
         */
    
        private ConfigurableApplicationContext springContext;
    
        private Map<String, Integer> pageParams = new HashMap<>();
    
        /**
         * 页面上下文(页面->页面组件(组件名称->组件实体类))
         */
        private static ConcurrentHashMap<String, Map<String, Object>> context = new ConcurrentHashMap<>();
    
        /**
         * 页面表格列宽集合(页面->列宽(列名->宽度))
         */
        private static ConcurrentHashMap<String, Map<String, Double>> columnWidthMap = new ConcurrentHashMap<>();
    
        /**
         * 设置页面table梅列宽度
         * @param pageName
         * @param widthMap
         */
        public void setColumnWidth(String pageName, Map<String, Double> widthMap) {
            columnWidthMap.put(pageName, widthMap);
        }
    
        /**
         * 设置默认初始页码
         * @param pageIndex
         */
        public void setPageIndex(Integer pageIndex) {
            if(pageIndex == null || pageIndex < 0) {
                pageIndex = 0;
            }
            pageParams.put("pageIndex", pageIndex);
        }
    
        /**
         * 设置默认显示行数
         * @param pageCount
         */
        public void setPageCount(Integer pageCount) {
            if(pageCount == null || pageCount < 0) {
                pageCount = 50;
            }
            pageParams.put("pageSize", pageCount);
        }
    
        /**
         * 封装好通用查询,新增、修改、删除方法
         */
    
        public void initPage(String pageName, Map<String, Object> moduleMap) {
            if(context.containsKey(pageName)) {
                throw new RuntimeException("pageName[" + pageName + "]已存在!");
            }
            context.put(pageName, moduleMap);
        }
    
    
        /**
         * 初始化表格(有分页组件)
         * @param pageName
         * @param columns
         * @param delList
         * @param updList
         * @param commonService
         */
        public void initTable(String pageName, LinkedHashMap<String, String> columns, List<Long> delList, List<Long> updList, CommonService commonService) {
            // 获取页面组件
            Map<String, Object> page = context.get(pageName);
            TableView<T> tableView = (TableView<T>)page.get("tableView");
            HBox parent = (HBox)page.get("parent");
            Pagination pagination = (Pagination)page.get("pagination");
    
            // 获取用户设置的其他列宽数据
            Map<String, Double> widthMap = columnWidthMap.get(pageName);
            if(null != widthMap && widthMap.size() > 0) { ModuleUtils.getDefaultWidthMap().putAll(widthMap); }
    
            List<TableColumn> columnList = ModuleUtils.createColumnByAutoBaseEntity(true, columns, delList, updList);
            HashMap<String, Object> params = new HashMap<>();
            params.put("pageIndex", 0);
            params.put("pageSize", 50);
            Map<String, Object> result = commonService.search(params);
            List<ClientMsg> dataList = (List<ClientMsg>)result.get("data");
            ModuleUtils.createDynamicTable(parent, tableView, columnList, dataList);
    
            // 初始化分页插件
            pagination.setCurrentPageIndex(0);
            pagination.setPageCount(Integer.valueOf(result.get("total").toString()));
            pagination.setPageFactory(new Callback<Integer, Node>() {
                @Override
                public Node call(Integer pageIndex) {
                    return createPage(pageName, pageIndex, commonService);
                }
            });
            // 分页插件宽度(不设置分页插件宽度表格宽度也无法随窗口变化)
            WorldApplication.getScene().widthProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    pagination.setPrefWidth(newValue.doubleValue());
                }
            });
        }
    
    
        /**
         * 表格分页切换
         * @param pageIndex
         * @return
         */
        private TableView<T> createPage(String pageName, int pageIndex, CommonService commonService) {
            // 获取页面组件
            Map<String, Object> page = context.get(pageName);
            TableView<T> tableView = (TableView<T>)page.get("tableView");
    
            HashMap<String, Object> params = new HashMap<>();
            params.put("pageIndex", pageIndex);
            params.put("pageSize", 50);
            Map<String, Object> result = commonService.search(params);
            List<T> dataList = (List)result.get("data");
            ObservableList<T> items = FXCollections.observableArrayList(dataList);
            tableView.setItems(items);
            return tableView;
        }
    
    
        /**
         * 通用查询方法
         * @param pageName
         * @param commonService
         */
        public void select(String pageName, CommonService commonService) {
            // 获取页面组件
            Map<String, Object> page = context.get(pageName);
            TableView<T> tableView = (TableView<T>)page.get("tableView");
            Pagination pagination = (Pagination)page.get("pagination");
    
            HashMap<String, Object> params = new HashMap<>();
            page.forEach((k,v) -> {
                if(k.startsWith("condition")) {
                    if(v instanceof TextArea) {
                        TextArea textArea = (TextArea)v;
                        if(StringUtils.isNotEmpty(textArea.getText())) {
                            params.put(k.split("-")[1], textArea.getText());
                        }
                    }
                    if(v instanceof TextField) {
                        TextField textField = (TextField)v;
                        if(StringUtils.isNotEmpty(textField.getText())) {
                            params.put(k.split("-")[1], textField.getText());
                        }
                    }
                    if(v instanceof DatePicker) {
                        DatePicker datePicker = (DatePicker)v;
                        if(null != datePicker.getValue()) {
                            params.put(k.split("-")[1], datePicker.getValue());
                        }
                    }
                    if(v instanceof ComboBox) {
                        ComboBox<String> comboBox = (ComboBox<String>)v;
                        if(StringUtils.isNotEmpty(comboBox.getValue())) {
                            params.put(k.split("-")[1], comboBox.getValue());
                        }
                    }
                    if(v instanceof ChoiceBox) {
                        ChoiceBox<String> choiceBox = (ChoiceBox<String>)v;
                        if(StringUtils.isNotEmpty(choiceBox.getValue())) {
                            params.put(k.split("-")[1], choiceBox.getValue());
                        }
                    }
                }
            });
            params.put("pageIndex", 0);
            params.put("pageSize", 50);
            Map<String, Object> result = commonService.search(params);
            List<T> dataList = (List<T>)result.get("data");
            ObservableList<T> items = FXCollections.observableArrayList(dataList);
            tableView.setItems(items);
            pagination.setPageCount(Integer.valueOf(result.get("total").toString()));
        }
    
        /**
         * 根据pageName跳转创建页面
         * @param pageName
         */
        public void toCreate(String pageName, String toPageName) {
            // 获取页面组件
            Map<String, Object> page = context.get(pageName);
            TableView<T> tableView = (TableView<T>)page.get("tableView");
            Pagination pagination = (Pagination)page.get("pagination");
            // 创建
            Map<String, Object> pageData = new HashMap<>();
            pageData.put("isSave", "0");
            pageData.put("tableView", tableView);
            pageData.put("pagination", pagination);
            CacheManager.putPageData(toPageName, pageData);
            toPage(toPageName, "0");
        }
    
    
        /**
         * 根据pageName和dis跳转修改页面
         * @param pageName
         * @param ids
         */
        public void toEdit(String pageName, String toPageName, List<Long> ids) {
            if(null != ids && ids.size() > 0) {
                throw new RuntimeException("请选择一条数据修改!");
            }
            // 获取页面组件
            Map<String, Object> page = context.get(pageName);
            TableView<T> tableView = (TableView<T>)page.get("tableView");
            Pagination pagination = (Pagination)page.get("pagination");
    
            if (ids.size() != 1) {
                MsgAlert.alert("请选择单条修改数据!");
                return;
            }
            Map<String, Object> pageData = new HashMap<>();
            pageData.put("isSave", "1");
            pageData.put("tableView", tableView);
            pageData.put("pagination", pagination);
            pageData.put("gid", ids.get(0));
            CacheManager.putPageData(toPageName, pageData);
            toPage(toPageName, "1");
        }
    
    
        /**
         * 根据isSave确定跳转修改或新增页面
         *
         * @param filePath fxml文件
         * @param isSave   修改或保存标志
         */
        protected void toPage(String filePath, String isSave) {
            Platform.runLater(() -> {
                try {
                    String title = "添加数据";
                    if (isSave.equals("1")) {
                        title = "编辑数据";
                    }
                    Stage stage = CacheManager.getStage(filePath);
                    if (Objects.isNull(stage)) {
                        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(filePath));
                        fxmlLoader.setControllerFactory(springContext::getBean);
                        Parent pane = fxmlLoader.load();
                        Scene scene = new Scene(pane);
                        stage = new Stage();
                        stage.setScene(scene);
                        stage.setTitle(title);
                        stage.initStyle(StageStyle.TRANSPARENT);
                        stage.show();
                        // 新增保存场景,编辑保存场景
                        if ("0".equals(isSave) || "1".equals(isSave)) {
                            CacheManager.putStage(filePath, stage);
                        }
                    }
                    stage.show();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    
    
        /**
         * 方法描述:刷新
         */
        public void refresh(String pageName, CommonService commonService) {
            Map<String, Object> data = CacheManager.getPageData(pageName);
            TableView<T> tableView = (TableView<T>) data.get("tableView");
            ObservableList<T> items = tableView.getItems();
            items.removeAll(items);
            HashMap<String, Object> params = new HashMap<>();
            params.put("pageIndex", 0);
            params.put("pageSize", 50);
            Map<String, Object> result = commonService.search(params);
            List<T> dataList = (List<T>)result.get("data");
            items.addAll(dataList);
    
            Pagination pagination = (Pagination) data.get("pagination");
            pagination.setPageCount(Integer.valueOf(result.get("total").toString()));
        }
    
    
        /**
         * 关闭页面
         * @param pageName
         */
        public void cancel(String pageName) {
            // 清除组件里的数据
            Map<String, Object> page = context.get(pageName);
            page.forEach((k, v) -> {
                if(v instanceof ComboBox) {
                    ComboBox<String> comboBox = (ComboBox<String>)v;
                    comboBox.setValue(null);
                }
                if(v instanceof ChoiceBox) {
                    ChoiceBox<String> choiceBox = (ChoiceBox<String>)v;
                    choiceBox.setValue(null);
                }
                if(v instanceof TextField) {
                    TextField textField = (TextField)v;
                    textField.setText(null);
                }
                if(v instanceof TextArea) {
                    TextArea textArea = (TextArea)v;
                    textArea.setText(null);
                }
            });
    
            // 关闭舞台
            Map<String, Object> pageData = CacheManager.getPageData(pageName);
            String isSave = pageData.get("isSave").toString();
            Stage stage = CacheManager.getStage(pageName);
            // 编辑
            if (isSave.equals("1") && Objects.nonNull(stage)) {
                stage.close();
                CacheManager.clearStage(pageName);
            }
            // 新增,直接关闭舞台
            if (isSave.equals("0") && Objects.nonNull(stage)) {
                stage.close();
            }
        }
    
    
        /**
         * 批量删除(未完成)
         * @param pageName
         * @param ids
         * @param commonService
         */
        public void remove(String pageName, List<Long> ids, CommonService<T> commonService) {
            if (ids != null && ids.size() > 0) {
                commonService.remove(ids);
                refresh(pageName, commonService);
            } else {
                // 请选择要删除的数据
                MsgAlert.alert("请选择要删除的数据!");
            }
        }
    
        /**
         * springContext在类里面注入不进去,改用赋值方式
         * @param springContext
         */
        public PageContext(ConfigurableApplicationContext springContext) {
            this.springContext = springContext;
        }
    }
    

     

    ModuleUtils:组件初始化工具类

    import com.maxinhai.world.WorldApplication;
    import com.maxinhai.world.component.IDCell;
    import com.maxinhai.world.component.MsgAlert;
    import com.maxinhai.world.entity.AutoBaseEntity;
    import com.maxinhai.world.entity.BaseEntity;
    import com.maxinhai.world.entity.ClientLoginRecord;
    import javafx.beans.property.ReadOnlyObjectWrapper;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Pos;
    import javafx.scene.control.*;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.input.ClipboardContent;
    import javafx.scene.input.DataFormat;
    import javafx.scene.input.Dragboard;
    import javafx.scene.input.TransferMode;
    import javafx.scene.layout.Pane;
    import javafx.scene.media.Media;
    import javafx.scene.media.MediaPlayer;
    import javafx.scene.text.Text;
    import javafx.stage.DirectoryChooser;
    import javafx.stage.FileChooser;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    import javafx.util.Duration;
    import javafx.util.StringConverter;
    import org.apache.commons.lang3.StringUtils;
    
    import java.io.File;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.*;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * 组件工具类
     */
    @SuppressWarnings("all")
    public class ModuleUtils {
    
        //====================================================对tableView代码提取===========================================
    
        /**
         * 根据columnList(表头集合)、dataList(数据集合)初始化tableView
         *
         * @param tableView  tableView对象
         * @param columnList 表格字段集合
         * @param dataList   表格数据集合
         */
        public static void createTable(TableView tableView, List<TableColumn> columnList, List dataList) {
            AssertUtils.assertTrue(Objects.isNull(tableView), "Component is Null!");
            // 设置表格可编辑
            tableView.setEditable(true);
            // 设置多选
            tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
            // 去掉空白多于列
            tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            // 设置表头
            tableView.getColumns().addAll(columnList);
            // 更新表格数据
            ObservableList<ClientLoginRecord> data = FXCollections.observableArrayList(dataList);
            tableView.setItems(data);
            // 使tableView随窗口变化而变化
            WorldApplication.getScene().heightProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    tableView.setPrefHeight(newValue.doubleValue());
                }
            });
            WorldApplication.getScene().widthProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    tableView.setPrefWidth(newValue.doubleValue());
                }
            });
        }
    
    
        /**
         * 方法描述:根据columnList(表头集合)、dataList(数据集合)初始化tableView
         * 注意:设置TableView的宽高去适应界面的大小行不通,只能设置父元素的大小,让TableView自适应
         *
         * @param parentNode  父容器
         * @param tableView  tableView对象
         * @param columnList 表格字段集合
         * @param dataList   表格数据集合
         */
        public static void createDynamicTable(Pane parentNode, TableView tableView, List<TableColumn> columnList, List dataList) {
            AssertUtils.assertTrue(Objects.isNull(tableView), "Component is Null!");
            // 设置表格可编辑
            tableView.setEditable(true);
            // 设置多选
            tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
            // 去掉空白多于列
            tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            // 设置表头
            tableView.getColumns().addAll(columnList);
            // 更新表格数据
            ObservableList<ClientLoginRecord> data = FXCollections.observableArrayList(dataList);
            tableView.setItems(data);
            // 拖动行
            tableView.setRowFactory(value -> {
                TableRow<ObservableList<String>> row = new TableRow<>();
                row.setOnMouseClicked(event -> {
                    if(event.getClickCount() == 2 && !row.isEmpty()) {
                        ObservableList items = tableView.getItems();
                        int rowIndex = row.getIndex();
                        System.out.println("行数据:" + items.get(rowIndex));
                    }
                });
                row.setOnDragDetected(event -> {
                    if (!row.isEmpty()) {
                        Integer index = row.getIndex();
                        Dragboard db = row.startDragAndDrop(TransferMode.MOVE);
                        db.setDragView(row.snapshot(null, null));
                        ClipboardContent cc = new ClipboardContent();
                        cc.put(DataFormat.PLAIN_TEXT, index);
                        db.setContent(cc);
                        event.consume();
                    }
                });
                row.setOnDragOver(event -> {
                    Dragboard db = event.getDragboard();
                    if (db.hasContent(DataFormat.PLAIN_TEXT)) {
                        if (row.getIndex() != ((Integer) db.getContent(DataFormat.PLAIN_TEXT)).intValue()) {
                            event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
                            event.consume();
                        }
                    }
                });
                row.setOnDragDropped(event -> {
                    Dragboard db = event.getDragboard();
                    if (db.hasContent(DataFormat.PLAIN_TEXT)) {
                        int draggedIndex = (Integer) db.getContent(DataFormat.PLAIN_TEXT);
                        ObservableList<String> draggedPerson = (ObservableList<String>)tableView.getItems().remove(draggedIndex);
                        int dropIndex;
                        if (row.isEmpty()) {
                            dropIndex = tableView.getItems().size();
                        } else {
                            dropIndex = row.getIndex();
                        }
                        tableView.getItems().add(dropIndex, draggedPerson);
                        event.setDropCompleted(true);
                        tableView.getSelectionModel().select(dropIndex);
                        event.consume();
                    }
                });
                return row;
            });
    
            // 使tableView随窗口变化而变化
            WorldApplication.getScene().heightProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    parentNode.setPrefHeight(newValue.doubleValue());
                }
            });
            WorldApplication.getScene().widthProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    tableView.setPrefWidth(newValue.doubleValue());
                }
            });
        }
    
    
        /**
         * 根据isCheckBox、columns创建表格表头(BaseEntity)
         *
         * @param isCheckBox 是否创建多选列
         * @param columns    bean字段对应中文集合
         * @return
         */
        public static List<TableColumn> createColumn(boolean isCheckBox, LinkedHashMap<String, String> columns, List<String> delList, List<String> updList) {
            List<TableColumn> columnList = new ArrayList<>();
            // 多选框
            if (isCheckBox) {
                TableColumn<BaseEntity, CheckBox> checkCol = new TableColumn("单选框");
                checkCol.setMinWidth(50);
                checkCol.setPrefWidth(50);
                checkCol.setResizable(false);
                checkCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<BaseEntity, CheckBox>, ObservableValue<CheckBox>>() {
                    @Override
                    public ObservableValue<CheckBox> call(TableColumn.CellDataFeatures<BaseEntity, CheckBox> param) {
                        CheckBox checkBox = new CheckBox();
                        // 设置checkBox居中,貌似没用
                        checkBox.setAlignment(Pos.CENTER);
                        checkBox.setOnAction(event -> {
                            boolean selected = checkBox.isSelected();
                            String gid = param.getValue().getGid();
                            if (selected) {
                                delList.add(gid);
                                updList.removeAll(updList);
                                updList.add(gid);
                                System.out.println("选中: " + gid);
                            } else {
                                delList.remove(gid);
                                updList.remove(gid);
                                System.out.println("取消选中: " + gid);
                            }
                        });
                        return new ReadOnlyObjectWrapper<CheckBox>(checkBox);
                    }
                });
                columnList.add(checkCol);
            }
    
            // 序号列
            TableColumn seqCol = new TableColumn("序号");
            seqCol.setMinWidth(50);
            seqCol.setPrefWidth(50);
            seqCol.setResizable(false);
            seqCol.setCellFactory(new IDCell<>());
            columnList.add(seqCol);
    
            Map<String, Double> defaultWidthMap = getDefaultWidthMap();
    
            // 创建其他表头
            columns.forEach((k, v) -> {
                TableColumn column = new TableColumn(v);
                if ("gid".equals(k)) {
                    column.setVisible(false);
                }
                if (getDateColSet().contains(k)) {
                    formatDateTimeCol(column);
                }
                if (Objects.isNull(defaultWidthMap.get(k))) {
                    // 没有默认长度,设置100宽度
                    column.setMinWidth(100);
                    column.setPrefWidth(100);
                } else {
                    column.setMinWidth(defaultWidthMap.get(k));
                    column.setPrefWidth(defaultWidthMap.get(k));
                }
                column.setResizable(false);
                column.setCellValueFactory(new PropertyValueFactory<BaseEntity, String>(k));
                columnList.add(column);
            });
            return columnList;
        }
    
    
        /**
         * 根据isCheckBox、columns创建表格表头(AutoBaseEntity)
         *
         * @param isCheckBox 是否创建多选列
         * @param columns    bean字段对应中文集合
         * @return
         */
        public static List<TableColumn> createColumnByAutoBaseEntity(boolean isCheckBox, LinkedHashMap<String, String> columns, List<Long> delList, List<Long> updList) {
            List<TableColumn> columnList = new ArrayList<>();
            // 多选框
            if (isCheckBox) {
                TableColumn<AutoBaseEntity, CheckBox> checkCol = new TableColumn("单选框");
                checkCol.setMinWidth(50);
                checkCol.setPrefWidth(50);
                checkCol.setResizable(false);
                checkCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<AutoBaseEntity, CheckBox>, ObservableValue<CheckBox>>() {
                    @Override
                    public ObservableValue<CheckBox> call(TableColumn.CellDataFeatures<AutoBaseEntity, CheckBox> param) {
                        CheckBox checkBox = new CheckBox();
                        // 设置checkBox居中,貌似没用
                        checkBox.setAlignment(Pos.CENTER);
                        checkBox.setOnAction(event -> {
                            boolean selected = checkBox.isSelected();
                            Long gid = param.getValue().getGid();
                            if (selected) {
                                delList.add(gid);
                                updList.removeAll(updList);
                                updList.add(gid);
                                System.out.println("选中: " + gid);
                            } else {
                                delList.remove(gid);
                                updList.remove(gid);
                                System.out.println("取消选中: " + gid);
                            }
                        });
                        return new ReadOnlyObjectWrapper<CheckBox>(checkBox);
                    }
                });
                columnList.add(checkCol);
            }
    
            // 序号列
            TableColumn seqCol = new TableColumn("序号");
            seqCol.setMinWidth(50);
            seqCol.setPrefWidth(50);
            seqCol.setCellFactory(new IDCell<>());
            seqCol.setResizable(false);
            columnList.add(seqCol);
    
            Map<String, Double> defaultWidthMap = getDefaultWidthMap();
    
            // 创建其他表头
            columns.forEach((k, v) -> {
                TableColumn column = new TableColumn(v);
                if ("gid".equals(k)) {
                    column.setVisible(false);
                }
                if (getDateColSet().contains(k)) {
                    formatDateTimeCol(column);
                }
                if (Objects.isNull(defaultWidthMap.get(k))) {
                    // 没有默认长度,设置100宽度
                    column.setMinWidth(150);
                    column.setPrefWidth(150);
                } else {
                    column.setMinWidth(defaultWidthMap.get(k));
                    column.setPrefWidth(defaultWidthMap.get(k));
                }
                column.setResizable(false);
                column.setCellValueFactory(new PropertyValueFactory<AutoBaseEntity, String>(k));
    //            column.setCellFactory(col -> {
    //                TableCell<Music, String> cell = new TableCell<>();
    //                Text text = new Text();
    //                cell.setGraphic(text);
    //                text.wrappingWidthProperty().bind(column.widthProperty());
    //                text.textProperty().bind(cell.textProperty());
    //                return cell;
    //            });
                columnList.add(column);
            });
            return columnList;
        }
    
    
        /**
         * 格式化时间字段(Java8)
         *
         * @param column
         */
        public static void formatDateTimeCol(TableColumn column) {
            DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            column.setCellFactory(data -> {
                TableCell<Object, LocalDateTime> cell = new TableCell<Object, LocalDateTime>() {
                    @Override
                    protected void updateItem(LocalDateTime item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setText(null);
                        } else {
                            if (item != null)
                                this.setText(format.format(item));
                        }
                    }
                };
                return cell;
            });
        }
    
    
        /**
         * 格式化时间字段(Java7)
         *
         * @param column
         */
        public static void formatDateCol(TableColumn column) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            column.setCellFactory(data -> {
                TableCell<Object, Date> cell = new TableCell<Object, Date>() {
                    @Override
                    protected void updateItem(Date item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setText(null);
                        } else {
                            if (item != null)
                                this.setText(format.format(item));
                        }
                    }
                };
                return cell;
            });
        }
    
    
        /**
         * 获取时间字段集合
         *
         * @return
         */
        public static Set<String> getDateColSet() {
            Set<String> colSet = new HashSet<>();
            colSet.add("createTime");
            colSet.add("editTime");
            return colSet;
        }
    
    
        /**
         * 刷新tableView
         *
         * @param tableView
         * @param dataList
         */
        public static void refresh(TableView tableView, List dataList) {
            ObservableList items = tableView.getItems();
            items.removeAll(items);
            items.addAll(dataList);
            tableView.refresh();
        }
    
        private static Map<String, Double> columnWidthMap = new HashMap<>();
        static {
            columnWidthMap.put("gid", 350.00);
            columnWidthMap.put("account", 100.00);
            columnWidthMap.put("code", 100.00);
            columnWidthMap.put("name", 100.00);
            columnWidthMap.put("description", 100.00);
            columnWidthMap.put("remark", 100.00);
            columnWidthMap.put("createBy", 100.00);
            columnWidthMap.put("createTime", 200.00);
            columnWidthMap.put("editBy", 100.00);
            columnWidthMap.put("editTime", 200.00);
            columnWidthMap.put("username", 200.00);
            columnWidthMap.put("password", 200.00);
        }
    
        /**
         * 获取默认字段对应长度集合
         *
         * @return
         */
        public static Map<String, Double> getDefaultWidthMap() {
            return columnWidthMap;
        }
    
        //====================================================对tableView代码提取===========================================
    
    
        /**
         * 初始化下拉框
         *
         * @param choiceBox 下拉框对象
         * @param dataList  下拉框数据
         */
        public static void createChoiceBox(ChoiceBox choiceBox, List dataList) {
            dataList.add("");
            AssertUtils.assertTrue(Objects.isNull(choiceBox), "Component is Null!");
            // 下拉框数据
            ObservableList observableList = FXCollections.observableArrayList(dataList);
            // 装填数据
            choiceBox.setItems(observableList);
            // 选择监听事件
            choiceBox.getSelectionModel().selectedIndexProperty().addListener((ObservableValue<? extends Number> ov, Number old_val, Number new_val) -> {
                //System.out.println("选择了: " + dataList.get(new_val.intValue()));
            });
        }
    
        /**
         * 初始化下拉框
         *
         * @param choiceBox 下拉框对象
         * @param dataList  下拉框数据
         */
        public static void createChomboBox(ComboBox choiceBox, List dataList) {
            dataList.add("");
            AssertUtils.assertTrue(Objects.isNull(choiceBox), "Component is Null!");
            // 下拉框数据
            ObservableList observableList = FXCollections.observableArrayList(dataList);
            // 装填数据
            choiceBox.setItems(observableList);
            // 选择监听事件
            choiceBox.getSelectionModel().selectedIndexProperty().addListener((ObservableValue<? extends Number> ov, Number old_val, Number new_val) -> {
                //System.out.println("选择了: " + dataList.get(new_val.intValue()));
            });
        }
    
    
        /**
         * 根据dataList、config初始化listView组件
         *
         * @param listView listView组件
         * @param dataList 数据
         * @param config   组件配置
         */
        public static void createListView(ListView<String> listView, List<String> dataList, Map<String, Object> config) {
            AssertUtils.assertTrue(Objects.isNull(listView), "Component is Null!");
            // 设置组件宽高
            Object width = config.get("width");
            Object height = config.get("height");
            if (Objects.nonNull(width)) {
                double widthValue = Double.parseDouble(width.toString());
                listView.setPrefWidth(widthValue);
            }
            if (Objects.nonNull(height)) {
                double heightValue = Double.parseDouble(height.toString());
                listView.setPrefHeight(heightValue);
            }
            // 装填数据
            ObservableList<String> items = FXCollections.observableArrayList(dataList);
            listView.setItems(items);
            // 绑定选中事件
            listView.getSelectionModel().selectedItemProperty().addListener((ObservableValue<? extends String> ov, String old_val, String new_val) -> {
                System.out.println(new_val);
            });
        }
    
    
        //====================================================对fileChooser代码提取=========================================
    
    
        /**
         * 创建文件选择器
         *
         * @param stage
         * @param fileChooser
         * @return
         */
        public static File createFileChoose(Stage stage, FileChooser fileChooser) {
            AssertUtils.assertTrue(Objects.isNull(fileChooser), "Component is Null!");
            fileChooser.setTitle("Open Resource File");
            File file = fileChooser.showOpenDialog(stage);
            return file;
        }
    
    
        /**
         * 创建多文件选择器
         *
         * @param stage
         * @param fileChooser
         * @return
         */
        public static List<File> createMultipleFileChooser(Stage stage, FileChooser fileChooser) {
            AssertUtils.assertTrue(Objects.isNull(fileChooser), "Component is Null!");
            fileChooser.setTitle("Open Resource File");
            List<File> fileList = fileChooser.showOpenMultipleDialog(stage);
            return fileList;
        }
    
    
        /**
         * 创建文件夹选择器
         *
         * @param stage
         * @param directoryChooser
         * @return
         */
        public static File createDirectoryChooser(Stage stage, DirectoryChooser directoryChooser) {
            AssertUtils.assertTrue(Objects.isNull(directoryChooser), "Component is Null!");
            directoryChooser.setTitle("Open Resource File");
            File file = directoryChooser.showDialog(stage);
            return file;
        }
    
    
        //====================================================对DatePicker代码提取==========================================
    
    
        /**
         * 初始化日期选择器
         *
         * @param datePicker
         */
        public static void createDatePicker(DatePicker datePicker) {
            AssertUtils.assertTrue(Objects.isNull(datePicker), "Component is Null!");
            String pattern = "yyyy-MM-dd";
            StringConverter<LocalDate> converter = new StringConverter<LocalDate>() {
                DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(pattern);
    
                @Override
                public String toString(LocalDate date) {
                    if (date != null) {
                        return dateFormatter.format(date);
                    } else {
                        return "";
                    }
                }
    
                @Override
                public LocalDate fromString(String string) {
                    if (string != null && !string.isEmpty()) {
                        return LocalDate.parse(string, dateFormatter);
                    } else {
                        return null;
                    }
                }
            };
            datePicker.setConverter(converter);
            datePicker.setPromptText(pattern.toLowerCase());
        }
    
    
        /**
         * 监听日期选择器(开始时间选择后结束时间不能超过开始时间)
         *
         * @param beginTime
         * @param endTime
         */
        public static void enableRange(DatePicker beginTime, DatePicker endTime) {
            if(Objects.isNull(beginTime.getValue())) {
                beginTime.setValue(LocalDate.now().minusDays(1));
            }
            if(Objects.isNull(endTime.getValue())) {
                endTime.setValue(LocalDate.now());
            }
            Callback<DatePicker, DateCell> endTimeCallback = new Callback<DatePicker, DateCell>() {
                @Override
                public DateCell call(DatePicker param) {
                    return new DateCell() {
                        @Override
                        public void updateItem(LocalDate item, boolean empty) {
                            super.updateItem(item, empty);
                            if(Objects.nonNull(beginTime)) {
                                if(item.isBefore(beginTime.getValue().plusDays(1))) {
                                    setDisable(true);
                                }
                            }
                        }
                    };
                }
            };
    
            Callback<DatePicker, DateCell> beginTimeCallback = new Callback<DatePicker, DateCell>() {
                @Override
                public DateCell call(DatePicker param) {
                    return new DateCell() {
                        @Override
                        public void updateItem(LocalDate item, boolean empty) {
                            super.updateItem(item, empty);
                            if(Objects.nonNull(endTime)) {
                                if(item.isAfter(endTime.getValue().minusDays(1))) {
                                    setDisable(true);
                                }
                            }
                        }
                    };
                }
            };
    
            beginTime.setDayCellFactory(beginTimeCallback);
            endTime.setDayCellFactory(endTimeCallback);
    
            // 时间选择器监听器,监听用户选择日期
            beginTime.valueProperty().addListener(new ChangeListener<LocalDate>() {
                @Override
                public void changed(ObservableValue<? extends LocalDate> observable, LocalDate oldValue, LocalDate newValue) {
                    LocalDate endTimeValue = endTime.getValue();
                    if(Objects.nonNull(endTimeValue)) {
                        if(newValue.isAfter(endTimeValue) || newValue.isEqual(endTimeValue)) {
                            MsgAlert.alert("选择时间不能大于等于结束时间!");
                        }
                    }
                }
            });
            endTime.valueProperty().addListener(new ChangeListener<LocalDate>() {
                @Override
                public void changed(ObservableValue<? extends LocalDate> observable, LocalDate oldValue, LocalDate newValue) {
                    LocalDate beginTimeValue = beginTime.getValue();
                    if(Objects.nonNull(beginTimeValue)) {
                        if(newValue.isBefore(beginTimeValue) || newValue.isEqual(beginTimeValue)) {
                            MsgAlert.alert("选择时间不能小于等于开始时间!");
                        }
                    }
                }
            });
        }
    
    
        //======================================================对进度条代码提取============================================
    
        private static ReentrantLock lock = new ReentrantLock();
    
        /**
         * 初始化进度条
         *
         * @param progressBar
         */
        public static void createProgressBar(ProgressBar progressBar) {
            progressBar.progressProperty().unbind();
            progressBar.progressProperty().bind(null);
        }
    
    
        /**
         * 更新进度条
         *
         * @param progressBar
         */
        public static void updateVal(ProgressBar progressBar) {
            lock.lock();
            try {
                progressBar.setProgress(1);
            } finally {
                lock.unlock();
            }
        }
    
    
        /**
         * 清空进度条
         *
         * @param progressBar
         */
        public static void clear(ProgressBar progressBar) {
            progressBar.setProgress(0);
        }
    
    
        /**
         * 方法描述:初始化视频、音乐播放器
         * @param filePath          播放文件
         * @param mediaPlayer       播放器(没有这个参数)
         * @param videoSlider       视频、音乐进度条
         * @param volumeSlider      音量进度条
         * @param playBtn           播放、暂停按钮
         * @param currentTimeLabel  当前时间
         * @param totalTimeLabel    视频、音乐总时间
         * @param HashMap           播放器配置(宽、高、初始化音量)
         */
        public static void initMediaPlayer(String filePath, Slider videoSlider, Slider volumeSlider, Button playBtn, Label currentTimeLabel, Label totalTimeLabel, HashMap<String, String> config) {
            // 初始化播放器
            String url = new File("E:\CloudMusic\陈光荣 - Lost Good Things.mp3").getAbsoluteFile().toURI().toString();
            Media media = new Media(url);
            MediaPlayer mediaPlayer = new MediaPlayer(media);
    
            // 音量监听器
            mediaPlayer.volumeProperty().bind(volumeSlider.valueProperty().divide(100));
    
            // 进度条改变,音乐播放进度也改变
            videoSlider.valueProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    if(videoSlider.isValueChanging()) {
                        mediaPlayer.seek(mediaPlayer.getTotalDuration().multiply(videoSlider.getValue() / 100));
                    }
                }
            });
    
            // 播放按钮绑定事件
            playBtn.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    // 设置音乐总时间
                    double seconds = mediaPlayer.getTotalDuration().toSeconds();
                    Long value = null;
                    try {
                        value = new Double(seconds).longValue();
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                    }
                    totalTimeLabel.setText(formatDateTime(value));
    
                    String text = playBtn.getText();
                    if("暂停".equals(text)) {
                        playBtn.setText("播放");
                        mediaPlayer.pause();
                    }
                    if("播放".equals(text)) {
                        // 开始播放音乐
                        playBtn.setText("暂停");
                        mediaPlayer.play();
                        // 设置播放进度条
                        videoSlider.setMin(0.0);
                        videoSlider.setMax(mediaPlayer.getTotalDuration().toSeconds());
                        mediaPlayer.currentTimeProperty().addListener(new ChangeListener<Duration>() {
                            @Override
                            public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
                                videoSlider.setValue(newValue.toSeconds());
                                // 更新当前时间
                                double currentSecond = newValue.toSeconds();
                                long currentValue = new Double(currentSecond).longValue();
                                currentTimeLabel.setText(formatDateTime(currentValue));
                            }
                        });
    
                        // 进度条改变,播放进度也改变
                        videoSlider.valueProperty().addListener(new ChangeListener<Number>() {
                            @Override
                            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                                if(videoSlider.isValueChanging()) {
                                    mediaPlayer.seek(mediaPlayer.getTotalDuration().multiply(videoSlider.getValue() / 100));
                                }
                            }
                        });
                    }
                }
            });
    
        }
    
    
        private static String formatDateTime(long mss) {
            String time = null;
            long minutes = (mss % ( 60 * 60)) /60;
            long seconds = mss % 60;
            String minutesValue = null;
            if(String.valueOf(minutes).length() > 1) {
                minutesValue = String.valueOf(minutes);
            } else {
                minutesValue = String.valueOf("0" + minutes);
            }
            String secondsValue= null;
            if(String.valueOf(seconds).length() > 1) {
                secondsValue = String.valueOf(seconds);
            } else {
                secondsValue = String.valueOf("0" + seconds);
            }
            time = minutesValue + ":" + secondsValue;
            return time;
        }
    
    }
    

      

    ClientMusicController:使用示例

    import com.maxinhai.world.entity.Music;
    import com.maxinhai.world.service.impl.ClientMusicServiceImpl;
    import com.maxinhai.world.utils.PageContext;
    import de.felixroske.jfxsupport.FXMLController;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.*;
    import javafx.scene.layout.HBox;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ConfigurableApplicationContext;
    
    import java.net.URL;
    import java.util.*;
    
    /**
     * 辅助密码设置控制器
     */
    @FXMLController
    public class ClientMusicController extends BaseController implements Initializable {
    
        @FXML
        private TextField codeField;
    
        @FXML
        private TextField nameFiled;
    
        @FXML
        private TableView<Music> tableView;
    
        @FXML
        private Pagination pagination;
    
        @Autowired
        private ClientMusicServiceImpl musicService;
    
        @FXML
        private HBox parent;
    
        // 删除集合
        private List<Long> deleteList = new ArrayList<>();
        // 编辑集合
        private List<Long> updateList = new ArrayList<>();
    
        @Autowired
        private ConfigurableApplicationContext springContext;
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
            PageContext<Music> pageContext = new PageContext<>(springContext);
            Map<String, Object> moduleMap = new HashMap<>();
            moduleMap.put("condition-code", codeField);
            moduleMap.put("condition-name", nameFiled);
            moduleMap.put("tableView", tableView);
            moduleMap.put("pagination", pagination);
            moduleMap.put("parent", parent);
            pageContext.initPage("/fxml/client_music.fxml", moduleMap);
    
            // 设置列宽
            Map<String, Double> widthMap = new HashMap<>();
            widthMap.put("fileHash", 300.00);
            widthMap.put("SQFileHash", 300.00);
            widthMap.put("HQFileHash", 300.00);
            widthMap.put("networkUrl", 300.00);
            widthMap.put("coverUrl", 300.00);
            pageContext.setColumnWidth("/fxml/client_music.fxml", widthMap);
    
            // 初始化表格
            LinkedHashMap<String, String> columns = new LinkedHashMap<>();
            columns.put("code", "歌曲编号");
            columns.put("name", "歌曲名称");
            columns.put("author", "作者");
            columns.put("fileHash", "标准Hash");
            columns.put("fileSize", "标准大小");
            columns.put("SQFileHash", "高品质Hash");
            columns.put("sqFileSize", "高品质大小");
            columns.put("HQFileHash", "超品质Hash");
            columns.put("hqFileSize", "超品质大小");
            columns.put("networkUrl", "网络地址");
            columns.put("coverUrl", "封面地址");
            columns.put("createBy", "创建者");
            columns.put("createTime", "创建时间");
            columns.put("editBy", "编辑者");
            columns.put("editTime", "编辑时间");
            pageContext.initTable("/fxml/client_music.fxml", columns, deleteList, updateList, musicService);
        }
    
    
        /**
         * 查询
         */
        @FXML
        public void select() {
            PageContext<Music> pageContext = new PageContext<>(springContext);
            pageContext.select("/fxml/client_music.fxml", musicService);
        }
    
    
        /**
         * 保存辅助密码
         */
        @FXML
        public void create() {
            PageContext<Music> pageContext = new PageContext<>(springContext);
            pageContext.toCreate("/fxml/client_music.fxml", "/fxml/client_music_item.fxml");
        }
    
        /**
         * 保存辅助密码
         */
        @FXML
        public void edit() {
            PageContext<Music> pageContext = new PageContext<>(springContext);
            pageContext.toEdit("/fxml/client_music.fxml","/fxml/client_music_item.fxml", updateList);
        }
    
        /**
         * 保存辅助密码
         */
        @FXML
        public void remove() {
    //        PageContext<Music> pageContext = new PageContext<>(springContext);
    //        pageContext.remove("/fxml/client_music.fxml", deleteList, musicService);
        }
    
        /**
         * 取消
         */
        @FXML
        public void cancel() {
            PageContext<Music> pageContext = new PageContext<>(springContext);
            pageContext.cancel("/fxml/client_music_item.fxml");
        }
    
    }
    

      

    CommonService:通用业务层接口

    必须实现这个接口,PageContext是根据多态去寻找CommonService接口实现类;

    package com.maxinhai.world.service;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Optional;
    
    /**
     * 业务层通用方法
     */
    public interface CommonService<T> {
    
        JpaRepository<T, Long> getRepository();
    
        /**
         * 根据条件查询数据
         * @param params
         * @return
         */
        Map<String, Object> search(Map<String, Object> params);
    
        /**
         * 根据参数创建记录
         * @param params
         * @return
         */
        Map<String, Object> create(Map<String, Object> params);
    
        /**
         * 根据参数修改记录
         * @param params
         * @return
         */
        Map<String, Object> modify(Map<String, Object> params);
    
        /**
         * 根据ids删除多条数据
         * @param ids
         * @return
         */
        Map<String, Object> remove(List<Long> ids);
    
        /**
         * 根据id查询唯一一条数据
         * @param id
         * @return
         */
        Optional<T> selectById(Long id);
    
        /**
         * 根据ids查询多条数据
         * @param ids
         * @return
         */
        List<T> selectByIds(List<Long> ids);
    
    }
    

     

    ClientMusicServiceImpl:业务层实现类 

    package com.maxinhai.world.service.impl;
    
    import com.maxinhai.world.entity.Music;
    import com.maxinhai.world.repository.ClientMusicRepository;
    import com.maxinhai.world.service.CommonService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Sort;
    import org.springframework.data.jpa.domain.Specification;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import javax.persistence.criteria.CriteriaBuilder;
    import javax.persistence.criteria.CriteriaQuery;
    import javax.persistence.criteria.Predicate;
    import javax.persistence.criteria.Root;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.*;
    import java.util.stream.Collectors;
    
    /**
     * @program: world
     * @description: 系统消息业务层
     * @author: XinHai.Ma
     * @create: 2021-09-26 16:46
     */
    @Transactional
    @Service
    public class ClientMusicServiceImpl extends BaseService implements CommonService {
    
        @Autowired
        private ClientMusicRepository musicRepository;
    
        /**
         * 获取dao层
         * @return
         */
        @Override
        public JpaRepository getRepository() {
            return musicRepository;
        }
    
        @Override
        public Map<String, Object> search(Map params) {
            String pageIndex = params.get("pageIndex").toString();
            String pageSize = params.get("pageSize").toString();
            PageRequest page = PageRequest.of(Integer.valueOf(pageIndex), Integer.valueOf(pageSize), Sort.Direction.DESC, "createTime", "code");
            Page<Music> recordPage = musicRepository.findAll(new Specification<Music>() {
                @Override
                public Predicate toPredicate(Root<Music> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    List<Predicate> condition = new ArrayList<Predicate>();
                    condition.add(criteriaBuilder.equal(root.get("isDelete").as(Integer.class), 0));
                    condition.add(criteriaBuilder.equal(root.get("isActive").as(Integer.class), 0));
                    // 编码
                    if (Objects.nonNull(params.get("code"))) {
                        condition.add(criteriaBuilder.equal(root.get("code").as(String.class), params.get("code").toString()));
                    }
                    // 名称
                    if (Objects.nonNull(params.get("name"))) {
                        condition.add(criteriaBuilder.equal(root.get("name").as(String.class), params.get("name").toString()));
                    }
                    // 开始、结束时间
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                    if (Objects.nonNull(params.get("beginTime")) && Objects.nonNull(params.get("endTime"))) {
                        // 开始时间和结束时间之内
                        String beginTime = params.get("beginTime").toString() + " 00:00:00";
                        String endTime = params.get("endTime").toString() + " 23:59:59";
                        condition.add(criteriaBuilder.between(root.<LocalDateTime>get("createTime"), LocalDateTime.parse(beginTime, formatter), LocalDateTime.parse(endTime, formatter)));
                    } else if (Objects.nonNull(params.get("beginTime"))) {
                        // 大于开始时间
                        String beginTime = params.get("beginTime").toString() + " 00:00:00";
                        condition.add(criteriaBuilder.greaterThanOrEqualTo(root.<LocalDateTime>get("createTime"), LocalDateTime.parse(beginTime, formatter)));
                    } else if (Objects.nonNull(params.get("endTime"))) {
                        // 小于结束时间
                        String beginTime = params.get("endTime").toString() + " 23:59:59";
                        condition.add(criteriaBuilder.lessThanOrEqualTo(root.<LocalDateTime>get("createTime"), LocalDateTime.parse(beginTime, formatter)));
                    }
                    Predicate[] p = new Predicate[condition.size()];
                    return criteriaBuilder.and(condition.toArray(p));
                }
            }, page);
            Map<String, Object> result = new HashMap<>();
            result.put("data", recordPage.get().collect(Collectors.toList()));
            result.put("total", recordPage.getTotalPages());
            return result;
        }
    
        @Override
        public Map<String, Object> create(Map params) {
            Map<String, Object> result = new HashMap<>();
            try {
                String code = Objects.isNull(params.get("code")) ? "" : params.get("code").toString();
                String name = Objects.isNull(params.get("name")) ? "" : params.get("name").toString();
    //            String sender = Objects.isNull(params.get("sender")) ? "" : params.get("sender").toString();
    //            String receiver = Objects.isNull(params.get("receiver")) ? "" : params.get("receiver").toString();
    //            String sourceId = Objects.isNull(params.get("sourceId")) ? "" : params.get("sourceId").toString();
    //            String sourceModule = Objects.isNull(params.get("sourceModule")) ? "" : params.get("sourceModule").toString();
    //            String sourceFunction = Objects.isNull(params.get("sourceFunction")) ? "" : params.get("sourceFunction").toString();
    //            String clientId = Objects.isNull(params.get("clientId")) ? "" : params.get("clientId").toString();
                Music music = new Music();
                music.setCode(code);
                music.setName(name);
                musicRepository.save(music);
                result.put("code", 200);
                result.put("msg", "创建成功");
            } catch (Exception e) {
                result.put("code", 500);
                result.put("msg", "创建失败!" + e.getMessage());
            }
            return result;
        }
    
        @Override
        public Map<String, Object> modify(Map params) {
            return null;
        }
    
        @Override
        public Map<String, Object> remove(List ids) {
            Map<String, Object> result = new HashMap<>();
            try {
                List<Music> musicList = selectByIds(ids);
                for (Music music : musicList) {
                    music.setIsDelete(1);
                    music.setEditTime(LocalDateTime.now());
                }
                musicRepository.saveAll(musicList);
                result.put("code", 200);
                result.put("msg", "删除成功");
            } catch (Exception e) {
                result.put("code", 500);
                result.put("msg", "删除失败!" + e.getMessage());
            }
            return result;
        }
    
        @Override
        public Optional selectById(Long id) {
            return musicRepository.findById(id);
        }
    
        @Override
        public List selectByIds(List ids) {
            List<Music> msgList = musicRepository.findAllById(ids);
            return msgList;
        }
    }
    

      

  • 相关阅读:
    ES6的Generator函数
    2017年要学习的三个CSS新特性
    移动端H5页面遇到的问题总结
    移动端布局解决方案+神器
    利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖
    JavaScript 中 for 循环
    HTML DOM对象的属性和方法介绍(原生JS方法)
    初识JSON
    让你的WizFi250适应各种气候
    JAVA复习2 JAVA开发环境配置
  • 原文地址:https://www.cnblogs.com/mxh-java/p/15357657.html
Copyright © 2020-2023  润新知