From 306664b3dfc52b09b09a7326ae19111d2d06eef9 Mon Sep 17 00:00:00 2001 From: peng Date: Wed, 27 Oct 2021 20:02:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=9C=8D=E5=8A=A1=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=B8=8E=E6=8E=A5=E5=8F=A3=E7=9A=84=E5=A2=9E?= =?UTF-8?q?=E5=88=A0=E6=94=B9=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/config.json | 22 +++ src/com/dayrain/ApplicationStarter.java | 22 +-- src/com/dayrain/entity/ConfigHolder.java | 18 +++ src/com/dayrain/entity/Server.java | 19 ++- src/com/dayrain/entity/ServerConfig.java | 3 + src/com/dayrain/entity/ServerUrl.java | 7 +- src/com/dayrain/handle/AddUrlHandler.java | 112 +++++++++++++ src/com/dayrain/handle/DeleteUrlHandler.java | 44 +++++ .../dayrain/handle/StartServerHandler.java | 54 +++++++ .../handle/UpdateServerConfigHandler.java | 77 +++++++++ src/com/dayrain/handle/UpdateUrlHandler.java | 95 +++++++++++ src/com/dayrain/server/ServerThread.java | 21 +++ src/com/dayrain/utils/FileUtils.java | 59 +++++++ src/com/dayrain/utils/ListViewHelper.java | 24 +++ src/com/dayrain/views/HomePage.java | 150 +++++++++++++++--- src/resources/config.json | 0 16 files changed, 686 insertions(+), 41 deletions(-) create mode 100644 out/production/http-server-simulator/resources/config.json create mode 100644 src/com/dayrain/entity/ConfigHolder.java create mode 100644 src/com/dayrain/handle/AddUrlHandler.java create mode 100644 src/com/dayrain/handle/DeleteUrlHandler.java create mode 100644 src/com/dayrain/handle/StartServerHandler.java create mode 100644 src/com/dayrain/handle/UpdateServerConfigHandler.java create mode 100644 src/com/dayrain/handle/UpdateUrlHandler.java create mode 100644 src/com/dayrain/server/ServerThread.java create mode 100644 src/com/dayrain/utils/FileUtils.java create mode 100644 src/com/dayrain/utils/ListViewHelper.java create mode 100644 src/resources/config.json diff --git a/out/production/http-server-simulator/resources/config.json b/out/production/http-server-simulator/resources/config.json new file mode 100644 index 0000000..73b26df --- /dev/null +++ b/out/production/http-server-simulator/resources/config.json @@ -0,0 +1,22 @@ +{ + "projectName" : null, + "width" : 1200, + "height" : 800, + "serverConfigs" : [ { + "serverName" : "测试接口", + "port" : 8080, + "serverUrls" : [ { + "urlName" : "登出", + "url" : "/logout", + "requestType" : "GET", + "responseBody" : "{\n \"username\": \"admin\",\n \"password\": \"123\"\n}", + "headerMap" : null + }, { + "urlName" : "查询1", + "url" : "/list1", + "requestType" : null, + "responseBody" : "{\n\t\"taskNo\": \"123\"\n}", + "headerMap" : null + } ] + } ] +} \ No newline at end of file diff --git a/src/com/dayrain/ApplicationStarter.java b/src/com/dayrain/ApplicationStarter.java index 114f90a..668a225 100644 --- a/src/com/dayrain/ApplicationStarter.java +++ b/src/com/dayrain/ApplicationStarter.java @@ -2,30 +2,20 @@ package com.dayrain; import com.dayrain.entity.Configuration; import com.dayrain.entity.RequestType; -import com.dayrain.entity.Server; import com.dayrain.entity.ServerConfig; import com.dayrain.entity.ServerUrl; +import com.dayrain.utils.FileUtils; import com.dayrain.views.HomePage; import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.control.Label; -import javafx.scene.control.TitledPane; import javafx.stage.Stage; +import java.io.IOException; import java.util.ArrayList; -import java.util.List; + public class ApplicationStarter extends Application { - Configuration configuration = configInit(); + public static void main(String[] args) { - - -// List serverConfigs = configuration.getServerConfigs(); -// for (ServerConfig serverConfig : serverConfigs) { -// Server server = new Server(serverConfig); -// Thread thread = new Thread(server); -// thread.start(); -// } launch(args); } @@ -40,7 +30,7 @@ public class ApplicationStarter extends Application { " \"password\": \"123\"\n" + "}")); - add(new ServerUrl("登录", "/logout", RequestType.GET, "{\n" + + add(new ServerUrl("登出", "/logout", RequestType.GET, "{\n" + " \"username\": \"admin\",\n" + " \"password\": \"123\"\n" + "}")); @@ -56,6 +46,6 @@ public class ApplicationStarter extends Application { @Override public void start(Stage primaryStage) throws Exception { - new HomePage(primaryStage, configuration).start(); + new HomePage(primaryStage).start(); } } diff --git a/src/com/dayrain/entity/ConfigHolder.java b/src/com/dayrain/entity/ConfigHolder.java new file mode 100644 index 0000000..60abba0 --- /dev/null +++ b/src/com/dayrain/entity/ConfigHolder.java @@ -0,0 +1,18 @@ +package com.dayrain.entity; + +import com.dayrain.utils.FileUtils; + +public class ConfigHolder { + private static Configuration configuration; + + private ConfigHolder(){} + + public synchronized static Configuration init() { + configuration = FileUtils.load(); + return configuration; + } + + public static void save() { + FileUtils.saveConfig(configuration); + } +} diff --git a/src/com/dayrain/entity/Server.java b/src/com/dayrain/entity/Server.java index efb15ed..64e72cf 100644 --- a/src/com/dayrain/entity/Server.java +++ b/src/com/dayrain/entity/Server.java @@ -15,21 +15,36 @@ public class Server implements Runnable { private final ServerConfig serverConfig; + private HttpServer httpServer; + public Server(ServerConfig serverConfig) { this.serverConfig = serverConfig; } + @Override public void run() { try { - HttpServer httpServer = HttpServer.create(new InetSocketAddress(serverConfig.getPort()), 0); + this.httpServer = HttpServer.create(new InetSocketAddress(serverConfig.getPort()), 0); httpServer.setExecutor(Executors.newCachedThreadPool()); for (ServerUrl serverUrl : serverConfig.getServerUrls()) { - httpServer.createContext(serverUrl.getUrl(), new RequestHandler(serverUrl)); + addContext(serverUrl); } httpServer.start(); + System.out.println("【" +serverConfig.getServerName() + "】服务已开启..."); } catch (IOException e) { e.printStackTrace(); } } + + public void stop() { + if(httpServer != null) { + System.out.println("【" + serverConfig.getServerName() + "】服务已关闭..."); + httpServer.stop(0); + } + } + + public void addContext(ServerUrl serverUrl) { + httpServer.createContext(serverUrl.getUrl(), new RequestHandler(serverUrl)); + } } diff --git a/src/com/dayrain/entity/ServerConfig.java b/src/com/dayrain/entity/ServerConfig.java index 6c1aa52..22ed586 100644 --- a/src/com/dayrain/entity/ServerConfig.java +++ b/src/com/dayrain/entity/ServerConfig.java @@ -16,6 +16,9 @@ public class ServerConfig { */ private ListserverUrls; + public ServerConfig() { + } + public ServerConfig(String serverName, int port, ListserverUrls) { this.serverName = serverName; this.port = port; diff --git a/src/com/dayrain/entity/ServerUrl.java b/src/com/dayrain/entity/ServerUrl.java index b6247fc..8c346da 100644 --- a/src/com/dayrain/entity/ServerUrl.java +++ b/src/com/dayrain/entity/ServerUrl.java @@ -26,11 +26,14 @@ public class ServerUrl { */ private Map headerMap; - public ServerUrl(String urlName, String url, RequestType requestType, String requestBody) { + public ServerUrl() { + } + + public ServerUrl(String urlName, String url, RequestType requestType, String responseBody) { this.urlName = urlName; this.url = url; this.requestType = requestType; - this.responseBody = requestBody; + this.responseBody = responseBody; } public String getUrlName() { diff --git a/src/com/dayrain/handle/AddUrlHandler.java b/src/com/dayrain/handle/AddUrlHandler.java new file mode 100644 index 0000000..9266d78 --- /dev/null +++ b/src/com/dayrain/handle/AddUrlHandler.java @@ -0,0 +1,112 @@ +package com.dayrain.handle; + +import com.dayrain.entity.ConfigHolder; +import com.dayrain.entity.ServerConfig; +import com.dayrain.entity.ServerUrl; +import com.dayrain.server.ServerThread; +import com.dayrain.utils.ListViewHelper; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ListView; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.util.HashMap; +import java.util.List; + +/** + * 添加路径 + * @author peng + * @date 2021/10/27 + */ +public class AddUrlHandler implements EventHandler { + + private final ServerConfig serverConfig; + + private final ListView serverUrlListView; + + private final HashMap threadMap; + + private final Stage primaryStage; + + public AddUrlHandler(ServerConfig serverConfig, ListView serverUrlListView, HashMap threadMap, Stage primaryStage) { + this.serverConfig = serverConfig; + this.serverUrlListView = serverUrlListView; + this.threadMap = threadMap; + this.primaryStage = primaryStage; + } + + @Override + public void handle(ActionEvent event) { + Stage stage = new Stage(); + Label nameLabel = new Label("接口名称:"); + nameLabel.setPrefWidth(80); + TextField nameField = new TextField(); + Label urlLabel = new Label("接口地址:"); + TextField urlField = new TextField(); + urlField.setPrefWidth(80); + + Label respLabel = new Label("返回结果:"); + TextArea textArea = new TextArea(); + textArea.setPrefWidth(80); + + HBox btnHBox = new HBox(); + Button saveButton = new Button("保存"); + btnHBox.getChildren().add(saveButton); + btnHBox.setAlignment(Pos.CENTER_RIGHT); + + GridPane gridPane = new GridPane(); + gridPane.add(nameLabel, 0, 0); + gridPane.add(nameField, 1, 0); + gridPane.add(urlLabel, 0, 1); + gridPane.add(urlField, 1, 1); + gridPane.add(respLabel, 0, 2); + gridPane.add(textArea, 1, 2); + gridPane.add(btnHBox, 1, 3); + gridPane.setAlignment(Pos.CENTER); + gridPane.setHgap(20d); + gridPane.setVgap(10d); + + stage.setWidth(500); + stage.setHeight(400); + stage.initOwner(primaryStage); + stage.initModality(Modality.WINDOW_MODAL); + stage.setScene(new Scene(gridPane)); + stage.show(); + + saveButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + String name = nameField.getText(); + List serverUrls = serverConfig.getServerUrls(); + for (ServerUrl serverUrl : serverUrls) { + if(serverUrl.getUrlName().equals(name)) { + return; + } + } + String url = urlField.getText(); + String resp = textArea.getText(); + + ServerUrl serverUrl = new ServerUrl(name, url, null, resp); + + serverUrls.add(serverUrl); + ServerThread serverThread = threadMap.getOrDefault(serverConfig.getServerName(), null); + if(serverThread != null) { + serverThread.addContext(serverUrl); + } + ListViewHelper.addAndRefresh(serverUrl, serverUrlListView); + ConfigHolder.save(); + stage.close(); + } + }); + } + +} diff --git a/src/com/dayrain/handle/DeleteUrlHandler.java b/src/com/dayrain/handle/DeleteUrlHandler.java new file mode 100644 index 0000000..31b47fe --- /dev/null +++ b/src/com/dayrain/handle/DeleteUrlHandler.java @@ -0,0 +1,44 @@ +package com.dayrain.handle; + +import com.dayrain.entity.ConfigHolder; +import com.dayrain.entity.ServerConfig; +import com.dayrain.entity.ServerUrl; +import com.dayrain.server.ServerThread; +import com.dayrain.utils.ListViewHelper; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.ListView; + +import java.util.HashMap; +import java.util.List; + +/** + * 删除路径 + * @author peng + * @date 2021/10/27 + */ +public class DeleteUrlHandler implements EventHandler { + + private final ServerConfig serverConfig; + + private final ListView serverUrlListView; + + private final HashMap threadMap; + + private final ServerUrl serverUrl; + + public DeleteUrlHandler(ServerUrl serverUrl, ServerConfig serverConfig, ListView serverUrlListView, HashMap threadMap) { + this.serverUrl = serverUrl; + this.serverConfig = serverConfig; + this.serverUrlListView = serverUrlListView; + this.threadMap = threadMap; + } + + @Override + public void handle(ActionEvent event) { + List serverUrls = serverConfig.getServerUrls(); + serverUrls.remove(serverUrl); + ConfigHolder.save(); + ListViewHelper.deleteAndRefresh(serverUrl, serverUrlListView); + } +} diff --git a/src/com/dayrain/handle/StartServerHandler.java b/src/com/dayrain/handle/StartServerHandler.java new file mode 100644 index 0000000..bdaba6f --- /dev/null +++ b/src/com/dayrain/handle/StartServerHandler.java @@ -0,0 +1,54 @@ +package com.dayrain.handle; + +import com.dayrain.entity.Server; +import com.dayrain.entity.ServerConfig; +import com.dayrain.server.ServerThread; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.Button; +import javafx.scene.paint.Color; +import javafx.scene.shape.Circle; + +import java.util.HashMap; +/** + * 服务启动与关闭控制器 + * @author peng + * @date 2021/10/27 + */ +public class StartServerHandler implements EventHandler { + + private final Button openButton; + + private final Circle statusCircle; + + private final ServerConfig serverConfig; + + private final HashMap threadMap; + + public StartServerHandler(Button openButton, Circle statusCircle, ServerConfig serverConfig, HashMap threadMap) { + this.openButton = openButton; + this.statusCircle = statusCircle; + this.serverConfig = serverConfig; + this.threadMap = threadMap; + } + + @Override + public void handle(ActionEvent event) { + String serverName = serverConfig.getServerName(); + if(threadMap.containsKey(serverName)) { + ServerThread serverThread = threadMap.get(serverName); + if(serverThread != null) { + serverThread.stopServer(); + } + threadMap.remove(serverName); + openButton.setText("开启服务"); + statusCircle.setFill(Color.RED); + }else { + ServerThread serverThread = new ServerThread(new Server(serverConfig)); + serverThread.start(); + threadMap.put(serverName, serverThread); + openButton.setText("关闭服务"); + statusCircle.setFill(Color.GREEN); + } + } +} diff --git a/src/com/dayrain/handle/UpdateServerConfigHandler.java b/src/com/dayrain/handle/UpdateServerConfigHandler.java new file mode 100644 index 0000000..86168e4 --- /dev/null +++ b/src/com/dayrain/handle/UpdateServerConfigHandler.java @@ -0,0 +1,77 @@ +package com.dayrain.handle; + +import com.dayrain.entity.ConfigHolder; +import com.dayrain.entity.ServerConfig; +import com.dayrain.utils.ListViewHelper; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.stage.Modality; +import javafx.stage.Stage; + +public class UpdateServerConfigHandler implements EventHandler { + + private final ServerConfig serverConfig; + + private final Stage primaryStage; + + public UpdateServerConfigHandler(ServerConfig serverConfig, Stage primaryStage) { + this.serverConfig = serverConfig; + this.primaryStage = primaryStage; + } + + @Override + public void handle(ActionEvent event) { + Stage stage = new Stage(); + Label serverName = new Label("服务名称:"); + serverName.setPrefWidth(80); + TextField nameField = new TextField(serverConfig.getServerName()); + Label portLabel = new Label("端口:"); + TextField portField = new TextField(String.valueOf(serverConfig.getPort())); + portField.setPrefWidth(80); + + HBox btnHBox = new HBox(); + Label saveTips = new Label("重启后生效"); + saveTips.setStyle("-fx-background-color: #ff0000"); + Button saveButton = new Button("保存"); + btnHBox.getChildren().addAll(saveTips, saveButton); + btnHBox.setAlignment(Pos.CENTER_RIGHT); + btnHBox.setSpacing(20d); + + GridPane gridPane = new GridPane(); + gridPane.add(serverName, 0, 0); + gridPane.add(nameField, 1, 0); + gridPane.add(portLabel, 0, 1); + gridPane.add(portField, 1, 1); + + gridPane.add(btnHBox, 1, 3); + gridPane.setAlignment(Pos.CENTER); + gridPane.setHgap(20d); + gridPane.setVgap(10d); + + stage.setWidth(400); + stage.setHeight(300); + stage.initOwner(primaryStage); + stage.initModality(Modality.WINDOW_MODAL); + stage.setScene(new Scene(gridPane)); + stage.show(); + + saveButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + String name = nameField.getText(); + int port = Integer.parseInt(portField.getText()); + serverConfig.setPort(port); + serverConfig.setServerName(name); + ConfigHolder.save(); + stage.close(); + } + }); + } +} diff --git a/src/com/dayrain/handle/UpdateUrlHandler.java b/src/com/dayrain/handle/UpdateUrlHandler.java new file mode 100644 index 0000000..ef9ec34 --- /dev/null +++ b/src/com/dayrain/handle/UpdateUrlHandler.java @@ -0,0 +1,95 @@ +package com.dayrain.handle; + +import com.dayrain.entity.ConfigHolder; +import com.dayrain.entity.ServerConfig; +import com.dayrain.entity.ServerUrl; +import com.dayrain.server.ServerThread; +import com.dayrain.utils.ListViewHelper; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ListView; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.util.HashMap; + +public class UpdateUrlHandler implements EventHandler { + + private final ListView serverUrlListView; + + private final ServerUrl serverUrl; + + private final Stage primaryStage; + + public UpdateUrlHandler(ServerUrl serverUrl, ListView serverUrlListView, Stage primaryStage) { + this.serverUrl = serverUrl; + this.serverUrlListView = serverUrlListView; + this.primaryStage = primaryStage; + } + + @Override + public void handle(ActionEvent event) { + Stage stage = new Stage(); + Label nameLabel = new Label("接口名称:"); + nameLabel.setPrefWidth(80); + TextField nameField = new TextField(serverUrl.getUrlName()); + Label urlLabel = new Label("接口地址:"); + TextField urlField = new TextField(serverUrl.getUrl()); + urlField.setPrefWidth(80); + + Label respLabel = new Label("返回结果:"); + TextArea textArea = new TextArea(serverUrl.getResponseBody()); + textArea.setPrefWidth(80); + + HBox btnHBox = new HBox(); + Label saveTips = new Label("重启后生效"); + saveTips.setStyle("-fx-background-color: #ff0000"); + Button saveButton = new Button("保存"); + btnHBox.getChildren().addAll(saveTips, saveButton); + btnHBox.setAlignment(Pos.CENTER_RIGHT); + btnHBox.setSpacing(20d); + + GridPane gridPane = new GridPane(); + gridPane.add(nameLabel, 0, 0); + gridPane.add(nameField, 1, 0); + gridPane.add(urlLabel, 0, 1); + gridPane.add(urlField, 1, 1); + gridPane.add(respLabel, 0, 2); + gridPane.add(textArea, 1, 2); + gridPane.add(btnHBox, 1, 3); + gridPane.setAlignment(Pos.CENTER); + gridPane.setHgap(20d); + gridPane.setVgap(10d); + + stage.setWidth(500); + stage.setHeight(400); + stage.initOwner(primaryStage); + stage.initModality(Modality.WINDOW_MODAL); + stage.setScene(new Scene(gridPane)); + stage.show(); + + saveButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + String name = nameField.getText(); + String url = urlField.getText(); + String resp = textArea.getText(); + serverUrl.setUrlName(name); + serverUrl.setUrl(url); + serverUrl.setResponseBody(resp); + + ListViewHelper.refresh(serverUrlListView); + ConfigHolder.save(); + stage.close(); + } + }); + } +} diff --git a/src/com/dayrain/server/ServerThread.java b/src/com/dayrain/server/ServerThread.java new file mode 100644 index 0000000..3c9cdb7 --- /dev/null +++ b/src/com/dayrain/server/ServerThread.java @@ -0,0 +1,21 @@ +package com.dayrain.server; + +import com.dayrain.entity.Server; +import com.dayrain.entity.ServerUrl; + +public class ServerThread extends Thread { + private final Server server; + + public ServerThread(Server server) { + super(server); + this.server = server; + } + + public void stopServer() { + server.stop(); + } + + public void addContext(ServerUrl serverUrl) { + server.addContext(serverUrl); + } +} diff --git a/src/com/dayrain/utils/FileUtils.java b/src/com/dayrain/utils/FileUtils.java new file mode 100644 index 0000000..25cc726 --- /dev/null +++ b/src/com/dayrain/utils/FileUtils.java @@ -0,0 +1,59 @@ +package com.dayrain.utils; + +import com.dayrain.entity.Configuration; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +public class FileUtils{ + + private static String configPath = Thread.currentThread().getContextClassLoader().getResource("resources/config.json").getFile(); + + public static void saveConfig(Configuration configuration){ + FileWriter fileWriter = null; + try { + fileWriter = new FileWriter(configPath); + String config = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(configuration); + fileWriter.write(config); + fileWriter.flush(); + } catch (IOException e) { + e.printStackTrace(); + }finally { + try { + if(fileWriter != null) { + fileWriter.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + public static Configuration load() { + BufferedReader bufferedReader = null; + try { + StringBuilder configStr = new StringBuilder(); + bufferedReader = new BufferedReader(new FileReader(configPath)); + String buf = null; + while ((buf = bufferedReader.readLine()) != null) { + configStr.append(buf); + } + return new ObjectMapper().readValue(configStr.toString(), Configuration.class); + } catch (IOException e) { + e.printStackTrace(); + }finally { + try { + if(bufferedReader != null) { + bufferedReader.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } +} diff --git a/src/com/dayrain/utils/ListViewHelper.java b/src/com/dayrain/utils/ListViewHelper.java new file mode 100644 index 0000000..f6487d8 --- /dev/null +++ b/src/com/dayrain/utils/ListViewHelper.java @@ -0,0 +1,24 @@ +package com.dayrain.utils; + +import com.dayrain.entity.ServerUrl; +import javafx.collections.ObservableList; +import javafx.scene.control.ListView; + +public class ListViewHelper { + + public static void addAndRefresh(ServerUrl serverUrl, ListViewserverUrls) { + serverUrls.getItems().add(serverUrl); + refresh(serverUrls); + } + + public static void deleteAndRefresh(ServerUrl serverUrl, ListViewserverUrls) { + serverUrls.getItems().remove(serverUrl); + refresh(serverUrls); + } + + public static void refresh(ListViewserverUrls) { + ObservableList items = serverUrls.getItems(); + serverUrls.setItems(null); + serverUrls.setItems(items); + } +} diff --git a/src/com/dayrain/views/HomePage.java b/src/com/dayrain/views/HomePage.java index 2f41af9..01ba83a 100644 --- a/src/com/dayrain/views/HomePage.java +++ b/src/com/dayrain/views/HomePage.java @@ -1,27 +1,60 @@ package com.dayrain.views; +import com.dayrain.entity.ConfigHolder; import com.dayrain.entity.Configuration; +import com.dayrain.entity.Server; +import com.dayrain.entity.ServerConfig; +import com.dayrain.entity.ServerUrl; +import com.dayrain.handle.AddUrlHandler; +import com.dayrain.handle.DeleteUrlHandler; +import com.dayrain.handle.StartServerHandler; +import com.dayrain.handle.UpdateServerConfigHandler; +import com.dayrain.handle.UpdateUrlHandler; +import com.dayrain.server.ServerThread; +import com.dayrain.utils.FileUtils; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; import javafx.scene.control.TitledPane; -import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; +import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.scene.shape.Circle; import javafx.stage.Stage; +import javafx.stage.WindowEvent; +import javafx.util.Callback; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; public class HomePage { - private Stage primaryStage; - private Configuration configuration; - public HomePage(Stage primaryStage, Configuration configuration) { + private Stage primaryStage; + + private final Configuration configuration = ConfigHolder.init(); + + private HashMap threadMap = new HashMap<>(); + + private List> listViews = new ArrayList<>(); + + public HomePage(Stage primaryStage) { this.primaryStage = primaryStage; - this.configuration = configuration; } public void start() { @@ -41,28 +74,103 @@ public class HomePage { menuBar.getMenus().addAll(menu1, menu2, menu3); borderPane.setTop(menuBar); + //渲染服务列表 + VBox serverContainer = new VBox(); - //服务列表 - VBox serverBox = new VBox(); + List serverConfigs = configuration.getServerConfigs(); - HBox urlBox = new HBox(); - Label nameLabel = new Label("登录"); - Label urlLabel = new Label("/wms/login"); - Button configButton = new Button("配置"); - Button deleteButton = new Button("删除"); - urlBox.setSpacing(20d); - urlBox.setAlignment(Pos.CENTER_LEFT); - urlBox.getChildren().addAll(nameLabel, urlLabel, configButton, deleteButton); - - TitledPane titledPane = new TitledPane("众华WMS", urlBox); - titledPane.setPrefWidth(600d); - serverBox.getChildren().addAll(titledPane); - - borderPane.setLeft(serverBox); + for (ServerConfig serverConfig : serverConfigs) { + drawServerPanel(serverContainer, serverConfig, primaryStage); + } + borderPane.setLeft(serverContainer); primaryStage.setScene(new Scene(borderPane)); primaryStage.setWidth(configuration.getWidth()); primaryStage.setHeight(configuration.getHeight()); primaryStage.show(); + primaryStage.setOnCloseRequest(new EventHandler() { + @Override + public void handle(WindowEvent event) { + FileUtils.saveConfig(configuration); + } + }); } + + public void drawServerPanel(VBox serverContainer, ServerConfig serverConfig, Stage primaryStage) { + + VBox vBox = new VBox(); + HBox headBox = new HBox(); + Button editButton = new Button("配置参数"); + Button openButton = new Button("开启服务"); + Button addButton = new Button("添加接口"); + Circle statusCircle = new Circle(); + statusCircle.setRadius(10); + statusCircle.setFill(Color.RED); + //设置服务启动与关闭 + openButton.setOnAction(new StartServerHandler(openButton, statusCircle, serverConfig, threadMap)); + editButton.setOnAction(new UpdateServerConfigHandler(serverConfig, primaryStage)); + headBox.getChildren().addAll(openButton, editButton, addButton, statusCircle); + HBox.setMargin(statusCircle, new Insets(0,0,0,30)); + headBox.setSpacing(20d); + headBox.setAlignment(Pos.CENTER); + //添加url + ListView serverUrlListView = drawUrlPanel(serverConfig.getServerUrls(), serverConfig); + addButton.setOnAction(new AddUrlHandler(serverConfig, serverUrlListView, threadMap, primaryStage)); + vBox.getChildren().addAll(headBox, serverUrlListView); + + vBox.setSpacing(10d); + VBox.setMargin(headBox, new Insets(10, 0, 0, 0)); + vBox.setPadding(Insets.EMPTY); + TitledPane titledPane = new TitledPane(serverConfig.getServerName(), vBox); + titledPane.setPrefWidth(600d); + serverContainer.getChildren().add(titledPane); + } + + public ListView drawUrlPanel(List serverUrls, ServerConfig serverConfig) { + ObservableList urlList = FXCollections.observableArrayList(serverUrls); + ListView serverListViews = new ListView<>(urlList); + listViews.add(serverListViews); + serverListViews.setCellFactory(new Callback, ListCell>() { + @Override + public ListCell call(ListView param) { + ListCell listCell =new ListCell() { + @Override + protected void updateItem(ServerUrl item, boolean empty) { + super.updateItem(item, empty); + + if(empty || item == null) { + setText(null); + setGraphic(null); + }else { + BorderPane urlPane = new BorderPane(); + + HBox labelBox = new HBox(); + Label nameLabel = new Label(item.getUrlName()); + nameLabel.setPrefWidth(100d); + Label urlLabel = new Label(item.getUrl()); + labelBox.getChildren().addAll(nameLabel, urlLabel); + labelBox.setAlignment(Pos.CENTER_LEFT); + + HBox btnBox = new HBox(); + Button configButton = new Button("配置"); + Button deleteButton = new Button("删除"); + btnBox.setSpacing(15d); + btnBox.getChildren().addAll(configButton, deleteButton); + + deleteButton.setOnAction(new DeleteUrlHandler(item, serverConfig, serverListViews, threadMap)); + configButton.setOnAction(new UpdateUrlHandler(item, serverListViews, primaryStage)); + + urlPane.setLeft(labelBox); + urlPane.setRight(btnBox); + this.setGraphic(urlPane); + } + } + }; + return listCell; + } + }); + + return serverListViews; + } + } diff --git a/src/resources/config.json b/src/resources/config.json new file mode 100644 index 0000000..e69de29