feat(login): 优化登录界面交互体验

- 调整抖音和美团爬虫服务的浏览器视口宽度从1600px为1680px
- 移除未使用的导入类,清理冗余代码- 登录按钮点击后增加加载指示器并禁用按钮防止重复提交
- 将登录请求移至子线程执行避免阻塞UI线程
- 增加异常处理确保网络异常时界面可恢复正常状态
This commit is contained in:
wangchunxiang
2025-10-14 15:20:48 +08:00
parent a9b3ea942b
commit d808047c1c
3 changed files with 69 additions and 41 deletions

View File

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.fantaibao.config.GlobalConfig; import com.fantaibao.config.GlobalConfig;
import com.fantaibao.model.LoginUserDTO; import com.fantaibao.model.LoginUserDTO;
import com.fantaibao.model.LoginUserVO; import com.fantaibao.model.LoginUserVO;
import javafx.application.Platform;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.geometry.Pos; import javafx.geometry.Pos;
import javafx.scene.Scene; import javafx.scene.Scene;
@@ -13,6 +14,7 @@ import javafx.scene.control.Alert;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.PasswordField; import javafx.scene.control.PasswordField;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.stage.Stage; import javafx.stage.Stage;
@@ -54,39 +56,79 @@ public class LoginView {
// 设置鼠标悬停时为手型光标 // 设置鼠标悬停时为手型光标
loginButton.setCursor(javafx.scene.Cursor.HAND); loginButton.setCursor(javafx.scene.Cursor.HAND);
// 创建加载指示器(默认隐藏)
ProgressIndicator progressIndicator = new ProgressIndicator();
progressIndicator.setPrefSize(30, 30);
progressIndicator.setVisible(false);
// 添加登录按钮事件处理 // 添加登录按钮事件处理
loginButton.setOnAction(e -> { loginButton.setOnAction(e -> {
// 获取用户输入的账号和密码 // 获取用户输入的账号和密码
String account = accountField.getText(); String account = accountField.getText();
String password = passwordField.getText(); String password = passwordField.getText();
LoginUserDTO loginUserDTO = new LoginUserDTO();
loginUserDTO.setAccount(account); // 显示加载指示器,禁用登录按钮
loginUserDTO.setPassword(password); progressIndicator.setVisible(true);
String result = HttpUtil.post(GlobalConfig.loginInterfaceAddress, JSON.toJSONString(loginUserDTO)); loginButton.setDisable(true);
// 解析返回结果 loginButton.setText("登录中...");
JSONObject jsonResultObject = JSON.parseObject(result);
if (jsonResultObject.getInteger("code") != 200) { // 在新线程中执行登录操作
// 显示错误提示弹窗 new Thread(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR); try {
alert.setTitle("登录失败"); LoginUserDTO loginUserDTO = new LoginUserDTO();
alert.setHeaderText(null); loginUserDTO.setAccount(account);
alert.setContentText(jsonResultObject.getString("msg")); loginUserDTO.setPassword(password);
alert.showAndWait(); String result = HttpUtil.post(GlobalConfig.loginInterfaceAddress, JSON.toJSONString(loginUserDTO));
return; // 解析返回结果
} JSONObject jsonResultObject = JSON.parseObject(result);
LoginUserVO loginUserVO = jsonResultObject.getObject("data", LoginUserVO.class); // 在JavaFX主线程中更新UI
// 网络地址 Platform.runLater(() -> {
GlobalConfig.tenantId = loginUserVO.getTenantId(); // 隐藏加载指示器,启用登录按钮
GlobalConfig.mtDianPingInterfaceAddress = loginUserVO.getMtDianPingInterfaceAddress(); progressIndicator.setVisible(false);
GlobalConfig.mtDaZhInterfaceAddress = loginUserVO.getMtDaZhInterfaceAddress(); loginButton.setDisable(false);
GlobalConfig.dyPingJiaInterfaceAddress = loginUserVO.getDyPingJiaInterfaceAddress(); loginButton.setText("登 录");
GlobalConfig.mtLoginPage = loginUserVO.getMtLoginPage();
GlobalConfig.dyLoginPage = loginUserVO.getDyLoginPage(); if (jsonResultObject.getInteger("code") != 200) {
navigateToPlatformSelection(primaryStage); // 显示错误提示弹窗
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("登录失败");
alert.setHeaderText(null);
alert.setContentText(jsonResultObject.getString("msg"));
alert.showAndWait();
return;
}
LoginUserVO loginUserVO = jsonResultObject.getObject("data", LoginUserVO.class);
// 网络地址
GlobalConfig.tenantId = loginUserVO.getTenantId();
GlobalConfig.mtDianPingInterfaceAddress = loginUserVO.getMtDianPingInterfaceAddress();
GlobalConfig.mtDaZhInterfaceAddress = loginUserVO.getMtDaZhInterfaceAddress();
GlobalConfig.dyPingJiaInterfaceAddress = loginUserVO.getDyPingJiaInterfaceAddress();
GlobalConfig.mtLoginPage = loginUserVO.getMtLoginPage();
GlobalConfig.dyLoginPage = loginUserVO.getDyLoginPage();
navigateToPlatformSelection(primaryStage);
});
} catch (Exception ex) {
// 发生异常时也要恢复UI状态
Platform.runLater(() -> {
progressIndicator.setVisible(false);
loginButton.setDisable(false);
loginButton.setText("登 录");
// 显示错误提示弹窗
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("登录失败");
alert.setHeaderText(null);
alert.setContentText("登录过程中发生错误: " + ex.getMessage());
alert.showAndWait();
});
}
}).start();
}); });
// 添加组件到主容器 // 添加组件到主容器
root.getChildren().addAll(titleLabel, infoLabel, new Label("账号"), accountField, root.getChildren().addAll(titleLabel, infoLabel, new Label("账号"), accountField,
new Label("密码"), passwordField, loginButton); new Label("密码"), passwordField, loginButton, progressIndicator);
// 设置场景并显示窗口 // 设置场景并显示窗口
Scene scene = new Scene(root, 400, 600); Scene scene = new Scene(root, 400, 600);
primaryStage.setScene(scene); primaryStage.setScene(scene);

View File

@@ -1,18 +1,12 @@
package com.fantaibao.service; package com.fantaibao.service;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fantaibao.base.FtbCrawlNetBase; import com.fantaibao.base.FtbCrawlNetBase;
import com.fantaibao.config.GlobalConfig; import com.fantaibao.config.GlobalConfig;
import com.fantaibao.model.UpdateUserCookieDTO;
import com.microsoft.playwright.*; import com.microsoft.playwright.*;
import com.microsoft.playwright.options.Cookie;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@@ -29,7 +23,7 @@ public class FtbCrawlNetDy extends AbstractFtbCrawlNetBase implements FtbCrawlNe
try (Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) { try (Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) {
// 设置浏览器窗口大小为1920x1080 // 设置浏览器窗口大小为1920x1080
Browser.NewContextOptions contextOptions = new Browser.NewContextOptions() Browser.NewContextOptions contextOptions = new Browser.NewContextOptions()
.setViewportSize(1600, 900); .setViewportSize(1680, 900);
BrowserContext context = browser.newContext(contextOptions); BrowserContext context = browser.newContext(contextOptions);
Page page = context.newPage(); Page page = context.newPage();
AtomicBoolean dyCookie = new AtomicBoolean(false); AtomicBoolean dyCookie = new AtomicBoolean(false);

View File

@@ -1,20 +1,12 @@
package com.fantaibao.service; package com.fantaibao.service;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fantaibao.base.FtbCrawlNetBase; import com.fantaibao.base.FtbCrawlNetBase;
import com.fantaibao.config.GlobalConfig; import com.fantaibao.config.GlobalConfig;
import com.fantaibao.model.UpdateUserCookieDTO;
import com.microsoft.playwright.*; import com.microsoft.playwright.*;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@@ -31,7 +23,7 @@ public class FtbCrawlNetMt extends AbstractFtbCrawlNetBase implements FtbCrawlNe
try (Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) { try (Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false))) {
// 设置浏览器窗口大小为1920x1080 // 设置浏览器窗口大小为1920x1080
Browser.NewContextOptions contextOptions = new Browser.NewContextOptions() Browser.NewContextOptions contextOptions = new Browser.NewContextOptions()
.setViewportSize(1600, 900); .setViewportSize(1680, 900);
BrowserContext context = browser.newContext(contextOptions); BrowserContext context = browser.newContext(contextOptions);
// 美团cookie // 美团cookie
AtomicBoolean mtCookie = new AtomicBoolean(false); AtomicBoolean mtCookie = new AtomicBoolean(false);