From e5a5b3a8122090b28b651000ad12f00a92530b0a Mon Sep 17 00:00:00 2001 From: liwen Date: Mon, 8 Feb 2021 12:28:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=BA=9B=E7=BB=86?= =?UTF-8?q?=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- falsework-client/pom.xml | 10 +++ .../main/java/com/fx/client/AppStartup.java | 17 ++-- .../uicomponents/login/LoginController.java | 17 ++-- falsework-client/src/test/java/TestSvg.java | 15 +++- .../src/test/java/TigerExample.java | 39 ++++++++ falsework-client/src/test/resources/idea.svg | 71 ++++++++++++--- falsework-client/src/test/resources/test.svg | 13 +++ .../com/fx/server/mapper/ElementMapper.java | 5 ++ .../websocket/WebSocketMessageHandler.java | 90 ++++++++++++------- .../main/resources/mapper/ElementMapper.xml | 1 + 11 files changed, 211 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index ab4cc77..c4516ae 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # fx-falsework 基于javafx、spring boot 开发的客户端与服务端系统开发脚手架。本项目目的是帮助快速构建javafx系统,前后端分离,客户端UI提供明暗两种主题,与服务端通信用的是OpenFeign。服务端是标准的spring-boot工程。 +#qq交流群:114697782 + # 说明: 1.当前数据库为达梦数据库,可自行换其它数据库,在server端引入所用数据库jar,并修改server端application.yml相应配置即可 @@ -16,7 +18,7 @@ 6.用户名:admin 密码:111111 7.提供明色和暗色两个主题 - + # 界面: 登录 diff --git a/falsework-client/pom.xml b/falsework-client/pom.xml index 970d0b2..def5598 100644 --- a/falsework-client/pom.xml +++ b/falsework-client/pom.xml @@ -170,6 +170,16 @@ lombok 1.18.16 + + + + + + + org.jetbrains.kotlin + kotlin-compiler + 1.0.6 + diff --git a/falsework-client/src/main/java/com/fx/client/AppStartup.java b/falsework-client/src/main/java/com/fx/client/AppStartup.java index 466468c..db4fc37 100644 --- a/falsework-client/src/main/java/com/fx/client/AppStartup.java +++ b/falsework-client/src/main/java/com/fx/client/AppStartup.java @@ -27,7 +27,7 @@ import java.io.InputStream; /** - * @description: + * @description: 应用启动类 * @className: AppStartup * @author: liwen * @date: 2019-08-26 16:24 @@ -55,17 +55,12 @@ public class AppStartup extends Application { @Override public void start(Stage stage) throws Exception { - String keyPrefix = ""; -// //全局样式 -// setUserAgentStylesheet(null); -// StyleManager.getInstance().addUserAgentStylesheet("css/app-light.css"); new Thread(() -> { try { SVGGlyphLoader.loadGlyphsFont(AppStartup.class.getResourceAsStream("/fonts/icon_font/iconfont.svg"), ApplicatonStore.ICON_FONT_KEY); -// SVGGlyphLoader.loadGlyphsFont(AppStartup.class.getResourceAsStream("/fonts/icon_font/icon-font-solid.svg"), -// "IconFontSolid.svg"); + } catch (IOException ioExc) { ioExc.printStackTrace(); } @@ -83,15 +78,13 @@ public class AppStartup extends Application { wfxDecorator.setCustomMaximize(true); wfxDecorator.setGraphic(new SVGGlyph("")); - - Scene scene = new Scene(wfxDecorator, 1000, 750); stage.setTitle("JavaFX Welcome"); scene.setFill(Color.TRANSPARENT); stage.setScene(scene); stage.show(); - + /*全局样式*/ scene.getStylesheets().addAll(JFoenixResources.load("/css/app-fonts.css").toExternalForm(), AppStartup.class.getResource("/css/login.css").toExternalForm(), AppStartup.class.getResource("/css/app-light.css").toExternalForm()); } @@ -101,4 +94,8 @@ public class AppStartup extends Application { WSClient.getInstance().close(); } + + public static void main(String[] args) { + launch(args); + } } diff --git a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java index b2241af..9a3b987 100644 --- a/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java +++ b/falsework-client/src/main/java/com/fx/client/gui/uicomponents/login/LoginController.java @@ -77,10 +77,10 @@ public class LoginController { @FXML private StackPane centerPane; - //正面视图 + /*正面视图*/ @FXML public HBox loginPane; - //反面视图 + /*反面视图*/ @FXML public HBox registeredPane; @FXML @@ -113,11 +113,11 @@ public class LoginController { private JFXPasswordField rePwd2TextField; @FXML private RegexValidator regexValidatorPwd2; - //翻转角度 + /*翻转角度*/ private DoubleProperty angleProperty = new SimpleDoubleProperty(Math.PI / 2); - //正面翻转特效 + /*正面翻转特效*/ private PerspectiveTransform frontEffect = new PerspectiveTransform(); - //反面翻转特效 + /*反面翻转特效*/ private PerspectiveTransform backEffect = new PerspectiveTransform(); private Timeline frontTimeLine = new Timeline(); private Timeline backTimeLine = new Timeline(); @@ -128,9 +128,6 @@ public class LoginController { private DoubleProperty imageHeiht = new SimpleDoubleProperty(); -// @Inject -// private WebSocketManagement webSocketManagement; - @FXML @ActionTrigger("login") private JFXButton loginBut; @@ -261,7 +258,7 @@ public class LoginController { logBack.fitWidthProperty().bind(imageWidth); imagePane.getChildren().add(new Label("", logBack)); - String imgUrl=this.getClass().getClassLoader().getResource("").toURI().getPath()+"images/login"; + String imgUrl = this.getClass().getClassLoader().getResource("").toURI().getPath() + "images/login"; System.err.println(imgUrl); List files = Arrays.asList(new File(imgUrl).listFiles()); @@ -408,7 +405,7 @@ public class LoginController { ObjectRestResponse rel = Request.connector(LoginFeign.class).login(jwtAuthenticationRequest); if (rel.getStatus() == 200) { WSClient.getInstance().addHeader("Authorization", rel.getData()); - WSClient.getInstance().addHeader("userName",userNameTextField.getText()); + WSClient.getInstance().addHeader("userName", userNameTextField.getText()); WSClient.getInstance().connect(); } diff --git a/falsework-client/src/test/java/TestSvg.java b/falsework-client/src/test/java/TestSvg.java index 04615e0..a9d0204 100644 --- a/falsework-client/src/test/java/TestSvg.java +++ b/falsework-client/src/test/java/TestSvg.java @@ -1,9 +1,16 @@ -package PACKAGE_NAME;/** +import javafx.application.Application; +import javafx.stage.Stage; + +/** * @version: 0.0.1 - * @description: - * + * @description: * @className: TestSvg * @author: liwen * @date: 2021/2/5 09:42 - */public class TestSvg { + */ +public class TestSvg extends Application { + @Override + public void start(Stage primaryStage) throws Exception { + + } } diff --git a/falsework-client/src/test/java/TigerExample.java b/falsework-client/src/test/java/TigerExample.java index e69de29..4d25147 100644 --- a/falsework-client/src/test/java/TigerExample.java +++ b/falsework-client/src/test/java/TigerExample.java @@ -0,0 +1,39 @@ +import com.intellij.openapi.util.IconLoader; +import javafx.application.Application; +import javafx.embed.swing.SwingNode; +import javafx.scene.Scene; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; + +import javax.swing.*; +import java.io.InputStream; +import java.net.MalformedURLException; + + +public class TigerExample extends Application { + + public static void main(String[] args) { + launch(args); + } + + + @Override + public void start(Stage primaryStage) throws MalformedURLException { + primaryStage.setTitle("SVG Display sample"); + + // load the sample svg file + InputStream svgFile = + getClass().getResourceAsStream("/test.svg"); + Icon icon = IconLoader.getIcon("/test.svg"); + + SwingNode svgImage = new SwingNode(); + JLabel label=new JLabel(icon); + label.setText(""); + svgImage.setContent(label); + + StackPane stackPane=new StackPane(svgImage); + Scene scene = new Scene(stackPane); + primaryStage.setScene(scene); + primaryStage.show(); + } +} \ No newline at end of file diff --git a/falsework-client/src/test/resources/idea.svg b/falsework-client/src/test/resources/idea.svg index fd65195..38da511 100644 --- a/falsework-client/src/test/resources/idea.svg +++ b/falsework-client/src/test/resources/idea.svg @@ -1,13 +1,60 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/falsework-client/src/test/resources/test.svg b/falsework-client/src/test/resources/test.svg index e69de29..fd65195 100644 --- a/falsework-client/src/test/resources/test.svg +++ b/falsework-client/src/test/resources/test.svg @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/fx/server/mapper/ElementMapper.java b/falsework-sever/src/main/java/com/fx/server/mapper/ElementMapper.java index 82a6f50..38cb9ee 100644 --- a/falsework-sever/src/main/java/com/fx/server/mapper/ElementMapper.java +++ b/falsework-sever/src/main/java/com/fx/server/mapper/ElementMapper.java @@ -25,4 +25,9 @@ public interface ElementMapper { List selectAuthorityElementByUserId(@Param("userId") String userId); + + + + + } \ No newline at end of file diff --git a/falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java b/falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java index eae1c97..bba19e6 100644 --- a/falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java +++ b/falsework-sever/src/main/java/com/fx/server/websocket/WebSocketMessageHandler.java @@ -19,6 +19,14 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +/** + * @author liwen + * @Description: WebSocketMessageHandler + * @param: + * @return: + * @auther: liwen + * @date: 2021/2/4 9:27 下午 + */ @Slf4j @Component public class WebSocketMessageHandler extends TextWebSocketHandler { @@ -28,8 +36,10 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { */ private static ConcurrentHashMap WEBSOCKET_MAP = new ConcurrentHashMap<>(); - //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 - private static AtomicInteger onlineNum = new AtomicInteger(); + /** + * 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 + */ + private static final AtomicInteger ONLINE_NUM = new AtomicInteger(); @Autowired private SysLoginInfoService sysLoginInfoService; @@ -39,17 +49,19 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { log.info("建立连接成功"); - String userId = (String) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_ID);//将在拦截器中保存的用户的名字取出来,然后作为 key 存到 map 中 + /* 将在拦截器中保存的用户的名字取出来,然后作为 key 存到 map 中 */ + String userId = (String) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_ID); SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); if (userId != null) { - WEBSOCKET_MAP.put(userId, session);//保存当前的连接和用户之间的关系 - // 在线数加1 + /* 保存当前的连接和用户之间的关系 */ + WEBSOCKET_MAP.put(userId, session); + /* 在线数加1 */ addOnlineCount(); - log.info("客户端" + sysLoginInfor.getLoginName() + "加入,当前在线数为:" + onlineNum.get()); + log.info("客户端" + sysLoginInfor.getLoginName() + "加入,当前在线数为:" + ONLINE_NUM.get()); sendMessageToUser(userId, new TextMessage(userId + "WebSocket连接成功")); } - // 这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户 + /* 这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户 */ } @@ -76,16 +88,20 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { } /** - * 给某个用户发送消息 - * - * @param userId - * @param message + * @Description: 给某个用户发送消息 + * @param: [userId, message] + * @return: void + * @auther: liwen + * @date: 2021/2/4 9:27 下午 */ public void sendMessageToUser(String userId, TextMessage message) { - WebSocketSession webSocketSession = WEBSOCKET_MAP.get(userId);//根据接收方的名字找到对应的连接 - if (webSocketSession != null && webSocketSession.isOpen()) {//如果没有离线,如果离线,请根据实际业务需求来处理,可能会需要保存离线消息 + /* 根据接收方的名字找到对应的连接 */ + WebSocketSession webSocketSession = WEBSOCKET_MAP.get(userId); + //如果没有离线,如果离线,请根据实际业务需求来处理,可能会需要保存离线消息 + if (webSocketSession != null && webSocketSession.isOpen()) { try { - webSocketSession.sendMessage(message);//发送消息 + /* 发送消息 */ + webSocketSession.sendMessage(message); } catch (IOException e) { log.error(e.getMessage(), e); } @@ -93,14 +109,17 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { } /** - * 给所有在线用户发送消息,此处以文本消息为例子 - * - * @param message + * @Description: 给所有在线用户发送消息, 此处以文本消息为例子 + * @param: [message] + * @return: void + * @auther: liwen + * @date: 2021/2/4 9:29 下午 */ public void sendMessageToUsers(TextMessage message) { - for (Map.Entry webSocketSessionEntry : WEBSOCKET_MAP.entrySet()) {//获取所有的连接 - - WebSocketSession session = webSocketSessionEntry.getValue();//找到每个连接 + /* 获取所有的连接 */ + for (Map.Entry webSocketSessionEntry : WEBSOCKET_MAP.entrySet()) { + /* 找到每个连接 */ + WebSocketSession session = webSocketSessionEntry.getValue(); if (session != null && session.isOpen()) { try { session.sendMessage(message); @@ -126,9 +145,9 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { } log.error("WebSocket发生错误"); - - WEBSOCKET_MAP.remove(userId);//移除连接 - // 在线数减1 + /* 移除连接 */ + WEBSOCKET_MAP.remove(userId); + /* 在线数减1 */ subOnlineCount(); SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); @@ -146,17 +165,18 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { */ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { - String userId = (String) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_ID);//找到用户对应的连接 + /* 找到用户对应的连接 */ + String userId = (String) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_ID); - // 从map中删除 + /* 从map中删除 */ WEBSOCKET_MAP.remove(userId); - // 在线数减1 + /* 在线数减1 */ subOnlineCount(); SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); sysLoginInfor.setStatus("1"); sysLoginInfor.setMsg("退出登录"); sysLoginInfoService.addSysJobLog(sysLoginInfor); - log.info("[" + sysLoginInfor.getLoginName() + "]连接关闭,当前在线数为:" + onlineNum.get()); + log.info("[" + sysLoginInfor.getLoginName() + "]连接关闭,当前在线数为:" + ONLINE_NUM.get()); } @Override @@ -169,15 +189,15 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { * 有人上线时在线人数加一 */ private static synchronized void addOnlineCount() { - onlineNum.incrementAndGet(); + ONLINE_NUM.incrementAndGet(); } /** * 有人下线时在线人数减一 */ private static void subOnlineCount() { - if (onlineNum.get() > 0) { - onlineNum.decrementAndGet(); + if (ONLINE_NUM.get() > 0) { + ONLINE_NUM.decrementAndGet(); } } @@ -185,9 +205,10 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { public List getOnlineUsers() { List onlineUsers = new ArrayList<>(); - for (Map.Entry webSocketSessionEntry : WEBSOCKET_MAP.entrySet()) {//获取所有的连接 - - WebSocketSession session = webSocketSessionEntry.getValue();//找到每个连接 + /* 获取所有的连接 */ + for (Map.Entry webSocketSessionEntry : WEBSOCKET_MAP.entrySet()) { + /* 找到每个连接 */ + WebSocketSession session = webSocketSessionEntry.getValue(); if (session != null && session.isOpen()) { SysLoginInfor sysLoginInfor = (SysLoginInfor) session.getAttributes().get(CommonConstants.WEB_SOCKET_USER_LIST); onlineUsers.add(sysLoginInfor); @@ -197,7 +218,8 @@ public class WebSocketMessageHandler extends TextWebSocketHandler { } public boolean retreat(String userId) { - WebSocketSession webSocketSession = WEBSOCKET_MAP.get(userId);//根据接收方的名字找到对应的连接 + /* 根据接收方的名字找到对应的连接 */ + WebSocketSession webSocketSession = WEBSOCKET_MAP.get(userId); try { webSocketSession.close(); return true; diff --git a/falsework-sever/src/main/resources/mapper/ElementMapper.xml b/falsework-sever/src/main/resources/mapper/ElementMapper.xml index f416369..aa3fa97 100644 --- a/falsework-sever/src/main/resources/mapper/ElementMapper.xml +++ b/falsework-sever/src/main/resources/mapper/ElementMapper.xml @@ -321,4 +321,5 @@ where menu_id = #{menuId,jdbcType=INTEGER} + \ No newline at end of file