实现服务的配置与接口的增删改查
This commit is contained in:
22
out/production/http-server-simulator/resources/config.json
Normal file
22
out/production/http-server-simulator/resources/config.json
Normal file
@@ -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
|
||||||
|
} ]
|
||||||
|
} ]
|
||||||
|
}
|
||||||
@@ -2,30 +2,20 @@ package com.dayrain;
|
|||||||
|
|
||||||
import com.dayrain.entity.Configuration;
|
import com.dayrain.entity.Configuration;
|
||||||
import com.dayrain.entity.RequestType;
|
import com.dayrain.entity.RequestType;
|
||||||
import com.dayrain.entity.Server;
|
|
||||||
import com.dayrain.entity.ServerConfig;
|
import com.dayrain.entity.ServerConfig;
|
||||||
import com.dayrain.entity.ServerUrl;
|
import com.dayrain.entity.ServerUrl;
|
||||||
|
import com.dayrain.utils.FileUtils;
|
||||||
import com.dayrain.views.HomePage;
|
import com.dayrain.views.HomePage;
|
||||||
import javafx.application.Application;
|
import javafx.application.Application;
|
||||||
import javafx.scene.Scene;
|
|
||||||
import javafx.scene.control.Label;
|
|
||||||
import javafx.scene.control.TitledPane;
|
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class ApplicationStarter extends Application {
|
public class ApplicationStarter extends Application {
|
||||||
Configuration configuration = configInit();
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
|
||||||
// List<ServerConfig> serverConfigs = configuration.getServerConfigs();
|
|
||||||
// for (ServerConfig serverConfig : serverConfigs) {
|
|
||||||
// Server server = new Server(serverConfig);
|
|
||||||
// Thread thread = new Thread(server);
|
|
||||||
// thread.start();
|
|
||||||
// }
|
|
||||||
launch(args);
|
launch(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +30,7 @@ public class ApplicationStarter extends Application {
|
|||||||
" \"password\": \"123\"\n" +
|
" \"password\": \"123\"\n" +
|
||||||
"}"));
|
"}"));
|
||||||
|
|
||||||
add(new ServerUrl("登录", "/logout", RequestType.GET, "{\n" +
|
add(new ServerUrl("登出", "/logout", RequestType.GET, "{\n" +
|
||||||
" \"username\": \"admin\",\n" +
|
" \"username\": \"admin\",\n" +
|
||||||
" \"password\": \"123\"\n" +
|
" \"password\": \"123\"\n" +
|
||||||
"}"));
|
"}"));
|
||||||
@@ -56,6 +46,6 @@ public class ApplicationStarter extends Application {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Stage primaryStage) throws Exception {
|
public void start(Stage primaryStage) throws Exception {
|
||||||
new HomePage(primaryStage, configuration).start();
|
new HomePage(primaryStage).start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
src/com/dayrain/entity/ConfigHolder.java
Normal file
18
src/com/dayrain/entity/ConfigHolder.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,21 +15,36 @@ public class Server implements Runnable {
|
|||||||
|
|
||||||
private final ServerConfig serverConfig;
|
private final ServerConfig serverConfig;
|
||||||
|
|
||||||
|
private HttpServer httpServer;
|
||||||
|
|
||||||
public Server(ServerConfig serverConfig) {
|
public Server(ServerConfig serverConfig) {
|
||||||
this.serverConfig = serverConfig;
|
this.serverConfig = serverConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
HttpServer httpServer = HttpServer.create(new InetSocketAddress(serverConfig.getPort()), 0);
|
this.httpServer = HttpServer.create(new InetSocketAddress(serverConfig.getPort()), 0);
|
||||||
httpServer.setExecutor(Executors.newCachedThreadPool());
|
httpServer.setExecutor(Executors.newCachedThreadPool());
|
||||||
for (ServerUrl serverUrl : serverConfig.getServerUrls()) {
|
for (ServerUrl serverUrl : serverConfig.getServerUrls()) {
|
||||||
httpServer.createContext(serverUrl.getUrl(), new RequestHandler(serverUrl));
|
addContext(serverUrl);
|
||||||
}
|
}
|
||||||
httpServer.start();
|
httpServer.start();
|
||||||
|
System.out.println("【" +serverConfig.getServerName() + "】服务已开启...");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ public class ServerConfig {
|
|||||||
*/
|
*/
|
||||||
private List<ServerUrl>serverUrls;
|
private List<ServerUrl>serverUrls;
|
||||||
|
|
||||||
|
public ServerConfig() {
|
||||||
|
}
|
||||||
|
|
||||||
public ServerConfig(String serverName, int port, List<ServerUrl>serverUrls) {
|
public ServerConfig(String serverName, int port, List<ServerUrl>serverUrls) {
|
||||||
this.serverName = serverName;
|
this.serverName = serverName;
|
||||||
this.port = port;
|
this.port = port;
|
||||||
|
|||||||
@@ -26,11 +26,14 @@ public class ServerUrl {
|
|||||||
*/
|
*/
|
||||||
private Map<String, String> headerMap;
|
private Map<String, String> 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.urlName = urlName;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.requestType = requestType;
|
this.requestType = requestType;
|
||||||
this.responseBody = requestBody;
|
this.responseBody = responseBody;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUrlName() {
|
public String getUrlName() {
|
||||||
|
|||||||
112
src/com/dayrain/handle/AddUrlHandler.java
Normal file
112
src/com/dayrain/handle/AddUrlHandler.java
Normal file
@@ -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<ActionEvent> {
|
||||||
|
|
||||||
|
private final ServerConfig serverConfig;
|
||||||
|
|
||||||
|
private final ListView<ServerUrl> serverUrlListView;
|
||||||
|
|
||||||
|
private final HashMap<String, ServerThread> threadMap;
|
||||||
|
|
||||||
|
private final Stage primaryStage;
|
||||||
|
|
||||||
|
public AddUrlHandler(ServerConfig serverConfig, ListView<ServerUrl> serverUrlListView, HashMap<String, ServerThread> 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<ActionEvent>() {
|
||||||
|
@Override
|
||||||
|
public void handle(ActionEvent event) {
|
||||||
|
String name = nameField.getText();
|
||||||
|
List<ServerUrl> 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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
44
src/com/dayrain/handle/DeleteUrlHandler.java
Normal file
44
src/com/dayrain/handle/DeleteUrlHandler.java
Normal file
@@ -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<ActionEvent> {
|
||||||
|
|
||||||
|
private final ServerConfig serverConfig;
|
||||||
|
|
||||||
|
private final ListView<ServerUrl> serverUrlListView;
|
||||||
|
|
||||||
|
private final HashMap<String, ServerThread> threadMap;
|
||||||
|
|
||||||
|
private final ServerUrl serverUrl;
|
||||||
|
|
||||||
|
public DeleteUrlHandler(ServerUrl serverUrl, ServerConfig serverConfig, ListView<ServerUrl> serverUrlListView, HashMap<String, ServerThread> threadMap) {
|
||||||
|
this.serverUrl = serverUrl;
|
||||||
|
this.serverConfig = serverConfig;
|
||||||
|
this.serverUrlListView = serverUrlListView;
|
||||||
|
this.threadMap = threadMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(ActionEvent event) {
|
||||||
|
List<ServerUrl> serverUrls = serverConfig.getServerUrls();
|
||||||
|
serverUrls.remove(serverUrl);
|
||||||
|
ConfigHolder.save();
|
||||||
|
ListViewHelper.deleteAndRefresh(serverUrl, serverUrlListView);
|
||||||
|
}
|
||||||
|
}
|
||||||
54
src/com/dayrain/handle/StartServerHandler.java
Normal file
54
src/com/dayrain/handle/StartServerHandler.java
Normal file
@@ -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<ActionEvent> {
|
||||||
|
|
||||||
|
private final Button openButton;
|
||||||
|
|
||||||
|
private final Circle statusCircle;
|
||||||
|
|
||||||
|
private final ServerConfig serverConfig;
|
||||||
|
|
||||||
|
private final HashMap<String, ServerThread> threadMap;
|
||||||
|
|
||||||
|
public StartServerHandler(Button openButton, Circle statusCircle, ServerConfig serverConfig, HashMap<String, ServerThread> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
77
src/com/dayrain/handle/UpdateServerConfigHandler.java
Normal file
77
src/com/dayrain/handle/UpdateServerConfigHandler.java
Normal file
@@ -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<ActionEvent> {
|
||||||
|
|
||||||
|
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<ActionEvent>() {
|
||||||
|
@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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
95
src/com/dayrain/handle/UpdateUrlHandler.java
Normal file
95
src/com/dayrain/handle/UpdateUrlHandler.java
Normal file
@@ -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<ActionEvent> {
|
||||||
|
|
||||||
|
private final ListView<ServerUrl> serverUrlListView;
|
||||||
|
|
||||||
|
private final ServerUrl serverUrl;
|
||||||
|
|
||||||
|
private final Stage primaryStage;
|
||||||
|
|
||||||
|
public UpdateUrlHandler(ServerUrl serverUrl, ListView<ServerUrl> 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<ActionEvent>() {
|
||||||
|
@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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/com/dayrain/server/ServerThread.java
Normal file
21
src/com/dayrain/server/ServerThread.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
59
src/com/dayrain/utils/FileUtils.java
Normal file
59
src/com/dayrain/utils/FileUtils.java
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
24
src/com/dayrain/utils/ListViewHelper.java
Normal file
24
src/com/dayrain/utils/ListViewHelper.java
Normal file
@@ -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, ListView<ServerUrl>serverUrls) {
|
||||||
|
serverUrls.getItems().add(serverUrl);
|
||||||
|
refresh(serverUrls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteAndRefresh(ServerUrl serverUrl, ListView<ServerUrl>serverUrls) {
|
||||||
|
serverUrls.getItems().remove(serverUrl);
|
||||||
|
refresh(serverUrls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void refresh(ListView<ServerUrl>serverUrls) {
|
||||||
|
ObservableList<ServerUrl> items = serverUrls.getItems();
|
||||||
|
serverUrls.setItems(null);
|
||||||
|
serverUrls.setItems(items);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +1,60 @@
|
|||||||
package com.dayrain.views;
|
package com.dayrain.views;
|
||||||
|
|
||||||
|
import com.dayrain.entity.ConfigHolder;
|
||||||
import com.dayrain.entity.Configuration;
|
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.geometry.Pos;
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
import javafx.scene.control.Button;
|
import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.Label;
|
||||||
|
import javafx.scene.control.ListCell;
|
||||||
|
import javafx.scene.control.ListView;
|
||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuBar;
|
import javafx.scene.control.MenuBar;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
|
import javafx.scene.control.TextArea;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
import javafx.scene.control.TitledPane;
|
import javafx.scene.control.TitledPane;
|
||||||
import javafx.scene.input.MouseEvent;
|
|
||||||
import javafx.scene.layout.BorderPane;
|
import javafx.scene.layout.BorderPane;
|
||||||
|
import javafx.scene.layout.GridPane;
|
||||||
import javafx.scene.layout.HBox;
|
import javafx.scene.layout.HBox;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
|
import javafx.scene.paint.Color;
|
||||||
|
import javafx.scene.shape.Circle;
|
||||||
import javafx.stage.Stage;
|
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 {
|
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<String, ServerThread> threadMap = new HashMap<>();
|
||||||
|
|
||||||
|
private List<ListView<ServerUrl>> listViews = new ArrayList<>();
|
||||||
|
|
||||||
|
public HomePage(Stage primaryStage) {
|
||||||
this.primaryStage = primaryStage;
|
this.primaryStage = primaryStage;
|
||||||
this.configuration = configuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
@@ -41,28 +74,103 @@ public class HomePage {
|
|||||||
menuBar.getMenus().addAll(menu1, menu2, menu3);
|
menuBar.getMenus().addAll(menu1, menu2, menu3);
|
||||||
borderPane.setTop(menuBar);
|
borderPane.setTop(menuBar);
|
||||||
|
|
||||||
|
//渲染服务列表
|
||||||
|
VBox serverContainer = new VBox();
|
||||||
|
|
||||||
//服务列表
|
List<ServerConfig> serverConfigs = configuration.getServerConfigs();
|
||||||
VBox serverBox = new VBox();
|
|
||||||
|
|
||||||
HBox urlBox = new HBox();
|
for (ServerConfig serverConfig : serverConfigs) {
|
||||||
Label nameLabel = new Label("登录");
|
drawServerPanel(serverContainer, serverConfig, primaryStage);
|
||||||
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);
|
|
||||||
|
|
||||||
|
borderPane.setLeft(serverContainer);
|
||||||
primaryStage.setScene(new Scene(borderPane));
|
primaryStage.setScene(new Scene(borderPane));
|
||||||
primaryStage.setWidth(configuration.getWidth());
|
primaryStage.setWidth(configuration.getWidth());
|
||||||
primaryStage.setHeight(configuration.getHeight());
|
primaryStage.setHeight(configuration.getHeight());
|
||||||
primaryStage.show();
|
primaryStage.show();
|
||||||
|
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
|
||||||
|
@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<ServerUrl> 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<ServerUrl> drawUrlPanel(List<ServerUrl> serverUrls, ServerConfig serverConfig) {
|
||||||
|
ObservableList<ServerUrl> urlList = FXCollections.observableArrayList(serverUrls);
|
||||||
|
ListView<ServerUrl> serverListViews = new ListView<>(urlList);
|
||||||
|
listViews.add(serverListViews);
|
||||||
|
serverListViews.setCellFactory(new Callback<ListView<ServerUrl>, ListCell<ServerUrl>>() {
|
||||||
|
@Override
|
||||||
|
public ListCell<ServerUrl> call(ListView<ServerUrl> param) {
|
||||||
|
ListCell<ServerUrl> listCell =new ListCell<ServerUrl>() {
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
0
src/resources/config.json
Normal file
0
src/resources/config.json
Normal file
Reference in New Issue
Block a user