package xitongshezhi;
|
import javax.swing.*;
|
import java.awt.*;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.io.*;
|
import java.net.*;
|
|
@SuppressWarnings("serial")
|
public class banbenguanli extends JDialog {
|
private JPanel mainPanel;
|
private JButton closeButton;
|
|
// 版本信息组件
|
private JLabel currentVersionLabel;
|
private JLabel versionDateLabel;
|
private JLabel statusTitleLabel;
|
private JLabel statusMessageLabel;
|
private JPanel latestVersionPanel;
|
private JLabel latestVersionLabel;
|
|
// 按钮组件
|
private JButton checkUpdateButton;
|
private JButton updateButton;
|
|
// 进度条组件
|
private JProgressBar downloadProgressBar;
|
private JLabel progressPercentLabel;
|
|
// 版本数据
|
private String currentVersion = "V1.0.0";
|
private String currentDate = "2025-11-20";
|
private String latestVersion = "V1.0.1";
|
private boolean updateAvailable = false;
|
|
// API配置
|
private final String UPDATE_CHECK_URL = "http://39.106.210.13:8090/api/wx/findTbUpapp";
|
private final String LOGIN_URL = "http://39.106.210.13:8090/api/wx/login";
|
private final String APP_NAME = "发卡app";
|
private final String LOGIN_USERNAME = "王飞";
|
private final String LOGIN_PASSWORD = "admin";
|
|
private String downloadUrl = "";
|
private String releaseNotes = "";
|
private String loginToken = "";
|
|
// 颜色定义
|
private final Color BACKGROUND_COLOR = new Color(15, 28, 48);
|
private final Color CARD_COLOR = new Color(26, 43, 68);
|
private final Color PRIMARY_COLOR = new Color(52, 152, 219);
|
private final Color SECONDARY_COLOR = new Color(46, 204, 113);
|
private final Color WARNING_COLOR = new Color(243, 156, 18);
|
private final Color TEXT_COLOR = new Color(224, 224, 224);
|
private final Color TEXT_LIGHT_COLOR = new Color(160, 200, 255);
|
|
public banbenguanli(JFrame parent) {
|
super(parent, "版本管理", true);
|
initializeUI();
|
setupEventListeners();
|
updateVersionInfo();
|
}
|
|
private void initializeUI() {
|
// 设置弹窗属性 - 7寸竖屏 (480x800)
|
setTitle("版本管理");
|
setSize(480, 800);
|
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
setLocationRelativeTo(getParent());
|
setResizable(false);
|
|
// 设置不透明背景
|
getContentPane().setBackground(BACKGROUND_COLOR);
|
|
// 主面板
|
mainPanel = new JPanel();
|
mainPanel.setLayout(new BorderLayout());
|
mainPanel.setBackground(BACKGROUND_COLOR);
|
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
|
|
// 创建版本管理弹窗内容
|
JPanel versionPanel = createVersionPanel();
|
mainPanel.add(versionPanel, BorderLayout.CENTER);
|
|
add(mainPanel);
|
}
|
|
private JPanel createVersionPanel() {
|
JPanel panel = new JPanel();
|
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
panel.setBackground(CARD_COLOR);
|
panel.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(PRIMARY_COLOR, 1),
|
BorderFactory.createEmptyBorder(25, 25, 25, 25)
|
));
|
|
// 顶部渐变条
|
JPanel gradientBar = new JPanel();
|
gradientBar.setBackground(PRIMARY_COLOR);
|
gradientBar.setPreferredSize(new Dimension(400, 5));
|
gradientBar.setMaximumSize(new Dimension(400, 5));
|
gradientBar.setAlignmentX(Component.CENTER_ALIGNMENT);
|
|
// 标题区域
|
JPanel headerPanel = new JPanel();
|
headerPanel.setLayout(new BoxLayout(headerPanel, BoxLayout.Y_AXIS));
|
headerPanel.setBackground(CARD_COLOR);
|
headerPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
|
// 标题
|
JLabel titleLabel = new JLabel("版本管理");
|
titleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 24));
|
titleLabel.setForeground(TEXT_COLOR);
|
titleLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
|
// 副标题
|
JLabel subtitleLabel = new JLabel("UWB人员定位卡发卡机管理系统");
|
subtitleLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 14));
|
subtitleLabel.setForeground(TEXT_LIGHT_COLOR);
|
subtitleLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
subtitleLabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 25, 0));
|
|
headerPanel.add(titleLabel);
|
headerPanel.add(subtitleLabel);
|
|
// 当前版本卡片
|
JPanel currentVersionPanel = createCurrentVersionPanel();
|
|
// 更新状态区域
|
JPanel statusPanel = createStatusPanel();
|
|
// 下载进度
|
JPanel progressPanel = createProgressPanel();
|
|
// 按钮区域
|
JPanel buttonPanel = createButtonPanel();
|
|
// 关闭按钮
|
JButton closeBtn = new JButton("关闭");
|
closeBtn.setFont(new Font("Microsoft YaHei", Font.BOLD, 15));
|
closeBtn.setBackground(new Color(60, 60, 60));
|
closeBtn.setForeground(TEXT_COLOR);
|
closeBtn.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(new Color(100, 100, 100), 1),
|
BorderFactory.createEmptyBorder(12, 20, 12, 20)
|
));
|
closeBtn.setFocusPainted(false);
|
closeBtn.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
closeBtn.setAlignmentX(Component.CENTER_ALIGNMENT);
|
closeBtn.setMaximumSize(new Dimension(400, 45));
|
closeBtn.setOpaque(true);
|
|
closeButton = closeBtn;
|
|
// 组装所有组件
|
panel.add(gradientBar);
|
panel.add(Box.createRigidArea(new Dimension(0, 20)));
|
panel.add(headerPanel);
|
panel.add(currentVersionPanel);
|
panel.add(Box.createRigidArea(new Dimension(0, 20)));
|
panel.add(statusPanel);
|
panel.add(Box.createRigidArea(new Dimension(0, 15)));
|
panel.add(progressPanel);
|
panel.add(Box.createRigidArea(new Dimension(0, 20)));
|
panel.add(buttonPanel);
|
panel.add(Box.createRigidArea(new Dimension(0, 15)));
|
panel.add(closeBtn);
|
|
return panel;
|
}
|
|
private JPanel createCurrentVersionPanel() {
|
JPanel panel = new JPanel();
|
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
panel.setBackground(new Color(20, 35, 55));
|
panel.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(new Color(80, 80, 80), 1),
|
BorderFactory.createEmptyBorder(20, 20, 20, 20)
|
));
|
panel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
panel.setMaximumSize(new Dimension(400, 150));
|
panel.setOpaque(true);
|
|
// 版本号标签
|
currentVersionLabel = new JLabel(currentVersion);
|
currentVersionLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 22));
|
currentVersionLabel.setForeground(Color.WHITE);
|
currentVersionLabel.setBackground(PRIMARY_COLOR);
|
currentVersionLabel.setOpaque(true);
|
currentVersionLabel.setBorder(BorderFactory.createEmptyBorder(10, 25, 10, 25));
|
currentVersionLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
|
// 版本描述
|
JLabel versionDescLabel = new JLabel("当前版本");
|
versionDescLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 14));
|
versionDescLabel.setForeground(TEXT_LIGHT_COLOR);
|
versionDescLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
versionDescLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0));
|
versionDescLabel.setOpaque(true);
|
versionDescLabel.setBackground(new Color(20, 35, 55));
|
|
// 更新日期
|
versionDateLabel = new JLabel("最后更新: " + currentDate);
|
versionDateLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 13));
|
versionDateLabel.setForeground(TEXT_LIGHT_COLOR);
|
versionDateLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
versionDateLabel.setOpaque(true);
|
versionDateLabel.setBackground(new Color(20, 35, 55));
|
|
panel.add(currentVersionLabel);
|
panel.add(versionDescLabel);
|
panel.add(versionDateLabel);
|
|
return panel;
|
}
|
|
private JPanel createStatusPanel() {
|
JPanel panel = new JPanel();
|
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
panel.setBackground(new Color(20, 35, 55));
|
panel.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(new Color(80, 80, 80), 1),
|
BorderFactory.createEmptyBorder(20, 20, 20, 20)
|
));
|
panel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
panel.setMaximumSize(new Dimension(400, 150));
|
panel.setOpaque(true);
|
|
JPanel contentPanel = new JPanel();
|
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
|
contentPanel.setBackground(new Color(20, 35, 55));
|
contentPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
contentPanel.setOpaque(true);
|
|
// 状态标题
|
statusTitleLabel = new JLabel("系统已是最新版本");
|
statusTitleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 18));
|
statusTitleLabel.setForeground(TEXT_COLOR);
|
statusTitleLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
statusTitleLabel.setOpaque(true);
|
statusTitleLabel.setBackground(new Color(20, 35, 55));
|
|
// 状态消息
|
statusMessageLabel = new JLabel("您的系统运行的是最新稳定版本,所有功能正常运行。");
|
statusMessageLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 13));
|
statusMessageLabel.setForeground(TEXT_LIGHT_COLOR);
|
statusMessageLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
statusMessageLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 15, 0));
|
statusMessageLabel.setOpaque(true);
|
statusMessageLabel.setBackground(new Color(20, 35, 55));
|
|
// 最新版本信息面板
|
latestVersionPanel = new JPanel();
|
latestVersionPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
|
latestVersionPanel.setBackground(new Color(60, 50, 30));
|
latestVersionPanel.setBorder(BorderFactory.createCompoundBorder(
|
BorderFactory.createLineBorder(WARNING_COLOR, 1),
|
BorderFactory.createEmptyBorder(10, 15, 10, 15)
|
));
|
latestVersionPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
latestVersionPanel.setMaximumSize(new Dimension(350, 40));
|
latestVersionPanel.setOpaque(true);
|
|
JLabel latestTextLabel = new JLabel("最新版本: ");
|
latestTextLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 14));
|
latestTextLabel.setForeground(WARNING_COLOR);
|
latestTextLabel.setOpaque(true);
|
latestTextLabel.setBackground(new Color(60, 50, 30));
|
|
latestVersionLabel = new JLabel(latestVersion);
|
latestVersionLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 15));
|
latestVersionLabel.setForeground(WARNING_COLOR);
|
latestVersionLabel.setOpaque(true);
|
latestVersionLabel.setBackground(new Color(60, 50, 30));
|
|
latestVersionPanel.add(latestTextLabel);
|
latestVersionPanel.add(latestVersionLabel);
|
latestVersionPanel.setVisible(false);
|
|
contentPanel.add(statusTitleLabel);
|
contentPanel.add(statusMessageLabel);
|
contentPanel.add(latestVersionPanel);
|
|
panel.add(contentPanel);
|
|
return panel;
|
}
|
|
private JPanel createProgressPanel() {
|
// 将创建的面板赋值给成员变量 progressPanel
|
progressPanel = new JPanel();
|
progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.Y_AXIS));
|
progressPanel.setBackground(CARD_COLOR);
|
progressPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
progressPanel.setMaximumSize(new Dimension(400, 60));
|
progressPanel.setVisible(false);
|
progressPanel.setOpaque(true);
|
|
// 进度信息
|
JPanel infoPanel = new JPanel(new BorderLayout());
|
infoPanel.setBackground(CARD_COLOR);
|
infoPanel.setMaximumSize(new Dimension(400, 25));
|
infoPanel.setOpaque(true);
|
|
JLabel downloadingLabel = new JLabel("下载更新...");
|
downloadingLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 13));
|
downloadingLabel.setForeground(TEXT_LIGHT_COLOR);
|
downloadingLabel.setOpaque(true);
|
downloadingLabel.setBackground(CARD_COLOR);
|
|
progressPercentLabel = new JLabel("0%");
|
progressPercentLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 13));
|
progressPercentLabel.setForeground(TEXT_LIGHT_COLOR);
|
progressPercentLabel.setOpaque(true);
|
progressPercentLabel.setBackground(CARD_COLOR);
|
|
infoPanel.add(downloadingLabel, BorderLayout.WEST);
|
infoPanel.add(progressPercentLabel, BorderLayout.EAST);
|
|
// 进度条 - 不透明
|
downloadProgressBar = new JProgressBar(0, 100);
|
downloadProgressBar.setValue(0);
|
downloadProgressBar.setBackground(Color.WHITE);
|
downloadProgressBar.setForeground(SECONDARY_COLOR);
|
downloadProgressBar.setBorder(BorderFactory.createLineBorder(new Color(200, 200, 200)));
|
downloadProgressBar.setMaximumSize(new Dimension(400, 12));
|
downloadProgressBar.setOpaque(true);
|
|
progressPanel.add(infoPanel);
|
progressPanel.add(Box.createRigidArea(new Dimension(0, 8)));
|
progressPanel.add(downloadProgressBar);
|
|
return progressPanel;
|
}
|
|
private JPanel createButtonPanel() {
|
JPanel panel = new JPanel();
|
panel.setLayout(new GridLayout(1, 2, 15, 0));
|
panel.setBackground(CARD_COLOR);
|
panel.setAlignmentX(Component.CENTER_ALIGNMENT);
|
panel.setMaximumSize(new Dimension(400, 50));
|
panel.setOpaque(true);
|
|
// 检查更新按钮
|
checkUpdateButton = new JButton("检查更新");
|
checkUpdateButton.setFont(new Font("Microsoft YaHei", Font.BOLD, 14));
|
checkUpdateButton.setBackground(PRIMARY_COLOR);
|
checkUpdateButton.setForeground(Color.WHITE);
|
checkUpdateButton.setBorder(BorderFactory.createEmptyBorder(12, 0, 12, 0));
|
checkUpdateButton.setFocusPainted(false);
|
checkUpdateButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
checkUpdateButton.setOpaque(true);
|
|
// 立即更新按钮
|
updateButton = new JButton("立即更新");
|
updateButton.setFont(new Font("Microsoft YaHei", Font.BOLD, 14));
|
updateButton.setBackground(new Color(128, 128, 128));
|
updateButton.setForeground(Color.WHITE);
|
updateButton.setBorder(BorderFactory.createEmptyBorder(12, 0, 12, 0));
|
updateButton.setFocusPainted(false);
|
updateButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
updateButton.setEnabled(false);
|
updateButton.setOpaque(true);
|
|
panel.add(checkUpdateButton);
|
panel.add(updateButton);
|
|
return panel;
|
}
|
|
private void setupEventListeners() {
|
// 关闭按钮
|
closeButton.addActionListener(e -> {
|
dispose();
|
});
|
|
// 检查更新按钮
|
checkUpdateButton.addActionListener(e -> {
|
checkForUpdates();
|
});
|
|
// 立即更新按钮
|
updateButton.addActionListener(e -> {
|
startUpdate();
|
});
|
}
|
|
private void updateVersionInfo() {
|
currentVersionLabel.setText(currentVersion);
|
versionDateLabel.setText("最后更新: " + currentDate);
|
latestVersionLabel.setText(latestVersion);
|
|
if (updateAvailable) {
|
showUpdateAvailable();
|
} else {
|
showUpToDate();
|
}
|
}
|
|
private void showUpToDate() {
|
statusTitleLabel.setText("系统已是最新版本");
|
statusMessageLabel.setText("您的系统运行的是最新稳定版本,所有功能正常运行。");
|
latestVersionPanel.setVisible(false);
|
updateButton.setEnabled(false);
|
updateButton.setBackground(new Color(128, 128, 128));
|
}
|
|
private void showUpdateAvailable() {
|
statusTitleLabel.setText("发现新版本");
|
statusMessageLabel.setText("有新版本可用,建议更新以获得更好的体验和功能。");
|
latestVersionPanel.setVisible(true);
|
updateButton.setEnabled(true);
|
updateButton.setBackground(SECONDARY_COLOR);
|
}
|
|
// 简单的 JSON 解析方法
|
private String extractJsonValue(String json, String key) {
|
try {
|
String searchKey = "\"" + key + "\":";
|
int startIndex = json.indexOf(searchKey);
|
if (startIndex == -1) return "";
|
|
startIndex += searchKey.length();
|
int endIndex = json.indexOf(",", startIndex);
|
if (endIndex == -1) endIndex = json.indexOf("}", startIndex);
|
if (endIndex == -1) return "";
|
|
String value = json.substring(startIndex, endIndex).trim();
|
// 去除引号
|
if (value.startsWith("\"") && value.endsWith("\"")) {
|
value = value.substring(1, value.length() - 1);
|
}
|
return value;
|
} catch (Exception e) {
|
return "";
|
}
|
}
|
|
private int extractJsonInt(String json, String key) {
|
try {
|
String value = extractJsonValue(json, key);
|
return Integer.parseInt(value);
|
} catch (Exception e) {
|
return -1;
|
}
|
}
|
|
private String normalizeVersion(String version) {
|
if (version == null || version.trim().isEmpty()) return "";
|
String normalized = version.trim();
|
if (!normalized.toUpperCase().startsWith("V")) {
|
normalized = "V" + normalized;
|
}
|
return normalized.replace("v", "V");
|
}
|
|
private void checkForUpdates() {
|
// 保存原始按钮状态
|
String originalText = checkUpdateButton.getText();
|
|
// 显示检查中状态
|
checkUpdateButton.setText("检查中...");
|
checkUpdateButton.setEnabled(false);
|
statusTitleLabel.setText("检查更新");
|
statusMessageLabel.setText("正在检查最新版本,请稍候...");
|
|
// 使用SwingWorker执行网络请求,避免阻塞UI
|
SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
|
@Override
|
protected Boolean doInBackground() throws Exception {
|
try {
|
// 构建请求URL
|
String urlStr = UPDATE_CHECK_URL + "?name=" + URLEncoder.encode(APP_NAME, "UTF-8");
|
URL url = new URL(urlStr);
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
connection.setRequestMethod("GET");
|
connection.setConnectTimeout(10000);
|
connection.setReadTimeout(15000);
|
|
int responseCode = connection.getResponseCode();
|
if (responseCode == 200) {
|
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
String inputLine;
|
StringBuilder response = new StringBuilder();
|
|
while ((inputLine = in.readLine()) != null) {
|
response.append(inputLine);
|
}
|
in.close();
|
|
// 解析JSON响应(使用简单字符串处理)
|
String jsonResponse = response.toString();
|
int code = extractJsonInt(jsonResponse, "code");
|
|
if (code == 0) {
|
// 提取data对象
|
int dataStart = jsonResponse.indexOf("\"data\":");
|
if (dataStart == -1) {
|
throw new Exception("响应中未找到data字段");
|
}
|
|
String serverVersionRaw = extractJsonValue(jsonResponse, "version");
|
String serverVersion = normalizeVersion(serverVersionRaw);
|
String currentVersionNormalized = normalizeVersion(currentVersion);
|
|
// 比较版本
|
boolean hasUpdate = !serverVersion.equals(currentVersionNormalized);
|
|
if (hasUpdate) {
|
latestVersion = serverVersion;
|
downloadUrl = extractJsonValue(jsonResponse, "address");
|
releaseNotes = extractJsonValue(jsonResponse, "info");
|
if (releaseNotes.isEmpty()) {
|
releaseNotes = "有新版本可用,建议更新以获得更好的体验和功能。";
|
}
|
|
String uptime = extractJsonValue(jsonResponse, "uptime");
|
if (!uptime.isEmpty()) {
|
currentDate = uptime;
|
}
|
}
|
|
return hasUpdate;
|
} else {
|
throw new Exception("服务器返回错误代码: " + code);
|
}
|
} else {
|
throw new Exception("HTTP错误代码: " + responseCode);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
throw e;
|
}
|
}
|
|
protected void done() {
|
try {
|
updateAvailable = get();
|
|
if (updateAvailable) {
|
showUpdateAvailable();
|
statusMessageLabel.setText("检查完成,发现新版本可用");
|
} else {
|
showUpToDate();
|
statusMessageLabel.setText("检查完成,系统已是最新版本");
|
}
|
|
// 恢复按钮状态
|
checkUpdateButton.setText(originalText);
|
checkUpdateButton.setEnabled(true);
|
|
// 3秒后恢复原消息
|
Timer restoreTimer = new Timer(3000, e2 -> {
|
if (updateAvailable) {
|
statusMessageLabel.setText(releaseNotes.isEmpty() ?
|
"有新版本可用,建议更新以获得更好的体验和功能。" : releaseNotes);
|
} else {
|
statusMessageLabel.setText("您的系统运行的是最新稳定版本,所有功能正常运行。");
|
}
|
});
|
restoreTimer.setRepeats(false);
|
restoreTimer.start();
|
} catch (Exception e) {
|
e.printStackTrace();
|
checkUpdateButton.setText(originalText);
|
checkUpdateButton.setEnabled(true);
|
statusTitleLabel.setText("检查失败");
|
statusMessageLabel.setText("检查更新失败,请检查网络后重试。");
|
|
JOptionPane.showMessageDialog(banbenguanli.this,
|
"检查更新失败: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
|
}
|
}
|
};
|
|
worker.execute();
|
}
|
|
private void requestLoginToken() {
|
SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
|
@Override
|
protected String doInBackground() throws Exception {
|
try {
|
URL url = new URL(LOGIN_URL);
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
connection.setRequestMethod("POST");
|
connection.setRequestProperty("Content-Type", "application/json");
|
connection.setConnectTimeout(10000);
|
connection.setReadTimeout(15000);
|
connection.setDoOutput(true);
|
|
// 构建登录数据
|
String loginData = "username=" + URLEncoder.encode(LOGIN_USERNAME, "UTF-8") +
|
"&password=" + URLEncoder.encode(LOGIN_PASSWORD, "UTF-8");
|
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
|
|
OutputStream os = connection.getOutputStream();
|
os.write(loginData.getBytes());
|
os.flush();
|
|
int responseCode = connection.getResponseCode();
|
if (responseCode == 200) {
|
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
String inputLine;
|
StringBuilder response = new StringBuilder();
|
|
while ((inputLine = in.readLine()) != null) {
|
response.append(inputLine);
|
}
|
in.close();
|
|
String jsonResponse = response.toString();
|
int code = extractJsonInt(jsonResponse, "code");
|
|
if (code == 0) {
|
String tokenType = extractJsonValue(jsonResponse, "tokentype");
|
String token = extractJsonValue(jsonResponse, "token");
|
return tokenType + " " + token;
|
} else {
|
throw new Exception("登录失败,错误代码: " + code);
|
}
|
} else {
|
throw new Exception("HTTP错误代码: " + responseCode);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
throw e;
|
}
|
}
|
|
@Override
|
protected void done() {
|
try {
|
loginToken = get();
|
statusMessageLabel.setText("正在下载最新安装包,请稍候...");
|
downloadPackage();
|
} catch (Exception e) {
|
e.printStackTrace();
|
handleDownloadError("获取授权失败,请稍后重试。");
|
}
|
}
|
};
|
|
worker.execute();
|
}
|
|
private void startUpdate() {
|
if (!updateAvailable || downloadUrl.isEmpty()) {
|
JOptionPane.showMessageDialog(this,
|
"无法更新:下载地址无效", "错误", JOptionPane.ERROR_MESSAGE);
|
return;
|
}
|
|
// 禁用按钮
|
checkUpdateButton.setEnabled(false);
|
updateButton.setEnabled(false);
|
updateButton.setText("更新中...");
|
|
// 显示下载进度
|
progressPanel.setVisible(true);
|
downloadProgressBar.setValue(0);
|
progressPercentLabel.setText("0%");
|
|
statusTitleLabel.setText("更新中");
|
statusMessageLabel.setText("正在准备下载,请稍候...");
|
|
// 请求登录token
|
requestLoginToken();
|
}
|
|
private void downloadPackage() {
|
SwingWorker<Void, Integer> downloadWorker = new SwingWorker<Void, Integer>() {
|
@Override
|
protected Void doInBackground() throws Exception {
|
System.out.println("开始下载,URL: " + downloadUrl);
|
System.out.println("使用的Token: " + loginToken);
|
try {
|
URL url = new URL(downloadUrl);
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
connection.setRequestMethod("GET");
|
|
|
// 添加认证头
|
if (!loginToken.isEmpty()) {
|
connection.setRequestProperty("Authorization", loginToken);
|
System.out.println("设置Authorization头: " + loginToken);
|
}
|
|
connection.setConnectTimeout(10000);
|
connection.setReadTimeout(30000);
|
|
int fileSize = connection.getContentLength();
|
|
// 创建下载目录
|
File downloadDir = new File("downloads");
|
if (!downloadDir.exists()) {
|
downloadDir.mkdirs();
|
}
|
|
// 创建输出文件
|
String fileName = "Issue_cards_" + latestVersion + ".apk";
|
File outputFile = new File(downloadDir, fileName);
|
|
try (InputStream inputStream = connection.getInputStream();
|
FileOutputStream outputStream = new FileOutputStream(outputFile)) {
|
|
byte[] buffer = new byte[4096];
|
int bytesRead;
|
long totalBytesRead = 0;
|
|
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
outputStream.write(buffer, 0, bytesRead);
|
totalBytesRead += bytesRead;
|
|
// 计算并发布进度
|
int progress = 0;
|
if (fileSize > 0) {
|
progress = (int) (totalBytesRead * 100 / fileSize);
|
} else {
|
// 如果无法获取文件大小,使用模拟进度
|
progress += (int) (Math.random() * 8);
|
if (progress >= 100) progress = 100;
|
}
|
|
publish(progress);
|
|
// 模拟下载速度
|
Thread.sleep(50);
|
|
if (isCancelled()) {
|
break;
|
}
|
}
|
}
|
|
connection.disconnect();
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
throw e;
|
}
|
|
return null;
|
}
|
|
@Override
|
protected void process(java.util.List<Integer> chunks) {
|
int progress = chunks.get(chunks.size() - 1);
|
downloadProgressBar.setValue(progress);
|
progressPercentLabel.setText(progress + "%");
|
}
|
|
@Override
|
protected void done() {
|
try {
|
get(); // 检查是否有异常
|
|
// 下载完成
|
downloadProgressBar.setValue(100);
|
progressPercentLabel.setText("100%");
|
|
// 更新完成
|
SwingUtilities.invokeLater(() -> {
|
finishUpdate();
|
});
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
handleDownloadError("下载失败,请检查网络后重试。");
|
}
|
}
|
};
|
|
downloadWorker.execute();
|
}
|
|
private void finishUpdate() {
|
// 隐藏进度条
|
progressPanel.setVisible(false);
|
|
updateButton.setText("更新完成");
|
updateButton.setBackground(new Color(149, 165, 166));
|
|
// 更新版本信息
|
currentVersion = latestVersion;
|
currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
|
updateAvailable = false;
|
updateVersionInfo();
|
|
// 显示成功消息
|
statusTitleLabel.setText("更新完成");
|
statusMessageLabel.setText("系统已成功更新到最新版本,所有功能已优化。");
|
|
// 重置状态
|
checkUpdateButton.setEnabled(true);
|
updateButton.setEnabled(false);
|
|
// 清理临时数据
|
downloadUrl = "";
|
releaseNotes = "";
|
loginToken = "";
|
|
JOptionPane.showMessageDialog(banbenguanli.this,
|
"更新完成!安装包已下载到 downloads 文件夹。",
|
"更新成功", JOptionPane.INFORMATION_MESSAGE);
|
}
|
|
private void handleDownloadError(String message) {
|
progressPanel.setVisible(false);
|
updateButton.setText("立即更新");
|
updateButton.setEnabled(updateAvailable);
|
checkUpdateButton.setEnabled(true);
|
|
statusTitleLabel.setText("更新失败");
|
statusMessageLabel.setText(message);
|
|
JOptionPane.showMessageDialog(this, message, "错误", JOptionPane.ERROR_MESSAGE);
|
}
|
|
// 进度面板引用
|
private JPanel progressPanel;
|
|
|
|
// 静态方法:显示版本管理对话框
|
public static void showVersionManagementDialog(JFrame parent) {
|
SwingUtilities.invokeLater(() -> {
|
banbenguanli dialog = new banbenguanli(parent);
|
dialog.setVisible(true);
|
});
|
}
|
|
}
|