张世豪
昨天 8f8eed75beb5bb9b66f2a87de856f2dbf11e6ffe
src/xitongshezhi/banbenguanli.java
@@ -1,19 +1,19 @@
package xitongshezhi;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.*;
import java.net.*;
public class banbenguanli extends JFrame {
@SuppressWarnings("serial")
public class banbenguanli extends JDialog {
    private JPanel mainPanel;
    private JLabel titleLabel;
    private JButton closeButton;
    
    // 版本信息组件
    private JLabel currentVersionLabel;
    private JLabel versionDateLabel;
    private JLabel statusIconLabel;
    private JLabel statusTitleLabel;
    private JLabel statusMessageLabel;
    private JPanel latestVersionPanel;
@@ -28,10 +28,21 @@
    private JLabel progressPercentLabel;
    
    // 版本数据
    private String currentVersion = "V2.3.5";
    private String currentDate = "2023-10-15";
    private String latestVersion = "V2.4.0";
   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);
@@ -42,18 +53,19 @@
    private final Color TEXT_COLOR = new Color(224, 224, 224);
    private final Color TEXT_LIGHT_COLOR = new Color(160, 200, 255);
    public banbenguanli() {
   public banbenguanli(JFrame parent) {
      super(parent, "版本管理", true);
        initializeUI();
        setupEventListeners();
        updateVersionInfo();
    }
    private void initializeUI() {
        // 设置窗口属性 - 7寸竖屏 (480x800)
        setTitle("版本管理 - UWB人员定位卡发卡机管理系统");
      // 设置弹窗属性 - 7寸竖屏 (480x800)
      setTitle("版本管理");
        setSize(480, 800);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
      setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
      setLocationRelativeTo(getParent());
        setResizable(false);
        
        // 设置不透明背景
@@ -94,12 +106,6 @@
        headerPanel.setBackground(CARD_COLOR);
        headerPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        
        // 图标
        JLabel iconLabel = new JLabel("📋");
        iconLabel.setFont(new Font("Segoe UI Emoji", Font.PLAIN, 42));
        iconLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        iconLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 15, 0));
        // 标题
        JLabel titleLabel = new JLabel("版本管理");
        titleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 24));
@@ -113,7 +119,6 @@
        subtitleLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        subtitleLabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 25, 0));
        
        headerPanel.add(iconLabel);
        headerPanel.add(titleLabel);
        headerPanel.add(subtitleLabel);
        
@@ -132,16 +137,17 @@
        // 关闭按钮
        JButton closeBtn = new JButton("关闭");
        closeBtn.setFont(new Font("Microsoft YaHei", Font.BOLD, 15));
        closeBtn.setBackground(new Color(255, 255, 255, 20));
      closeBtn.setBackground(new Color(60, 60, 60));
        closeBtn.setForeground(TEXT_COLOR);
        closeBtn.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createLineBorder(new Color(255, 255, 255, 50), 1),
            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;
        
@@ -165,13 +171,14 @@
    private JPanel createCurrentVersionPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBackground(new Color(15, 28, 48, 150));
      panel.setBackground(new Color(20, 35, 55));
        panel.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createLineBorder(new Color(255, 255, 255, 12), 1),
            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);
@@ -188,12 +195,16 @@
        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);
@@ -205,30 +216,28 @@
    private JPanel createStatusPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBackground(new Color(15, 28, 48, 150));
      panel.setBackground(new Color(20, 35, 55));
        panel.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createLineBorder(new Color(255, 255, 255, 12), 1),
            BorderFactory.createLineBorder(new Color(80, 80, 80), 1),
            BorderFactory.createEmptyBorder(20, 20, 20, 20)
        ));
        panel.setAlignmentX(Component.CENTER_ALIGNMENT);
        panel.setMaximumSize(new Dimension(400, 200));
      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(15, 28, 48, 0));
      contentPanel.setBackground(new Color(20, 35, 55));
        contentPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        // 状态图标
        statusIconLabel = new JLabel("✅");
        statusIconLabel.setFont(new Font("Segoe UI Emoji", Font.PLAIN, 48));
        statusIconLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
        statusIconLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
      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("您的系统运行的是最新稳定版本,所有功能正常运行。");
@@ -236,35 +245,37 @@
        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(243, 156, 18, 38));
      latestVersionPanel.setBackground(new Color(60, 50, 30));
        latestVersionPanel.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createLineBorder(new Color(243, 156, 18, 75), 1),
            BorderFactory.createLineBorder(WARNING_COLOR, 1),
            BorderFactory.createEmptyBorder(10, 15, 10, 15)
        ));
        latestVersionPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        latestVersionPanel.setMaximumSize(new Dimension(350, 50));
        JLabel arrowLabel = new JLabel("⬆️");
        arrowLabel.setFont(new Font("Segoe UI Emoji", Font.PLAIN, 14));
      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(arrowLabel);
        latestVersionPanel.add(latestTextLabel);
        latestVersionPanel.add(latestVersionLabel);
        latestVersionPanel.setVisible(false);
        
        contentPanel.add(statusIconLabel);
        contentPanel.add(statusTitleLabel);
        contentPanel.add(statusMessageLabel);
        contentPanel.add(latestVersionPanel);
@@ -275,42 +286,50 @@
    }
    
    private JPanel createProgressPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBackground(CARD_COLOR);
        panel.setAlignmentX(Component.CENTER_ALIGNMENT);
        panel.setMaximumSize(new Dimension(400, 60));
        panel.setVisible(false);
      // 将创建的面板赋值给成员变量 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(new Color(255, 255, 255, 25));
      downloadProgressBar.setBackground(Color.WHITE);
        downloadProgressBar.setForeground(SECONDARY_COLOR);
        downloadProgressBar.setBorder(BorderFactory.createEmptyBorder());
        downloadProgressBar.setMaximumSize(new Dimension(400, 8));
      downloadProgressBar.setBorder(BorderFactory.createLineBorder(new Color(200, 200, 200)));
      downloadProgressBar.setMaximumSize(new Dimension(400, 12));
      downloadProgressBar.setOpaque(true);
        
        panel.add(infoPanel);
        panel.add(Box.createRigidArea(new Dimension(0, 8)));
        panel.add(downloadProgressBar);
      progressPanel.add(infoPanel);
      progressPanel.add(Box.createRigidArea(new Dimension(0, 8)));
      progressPanel.add(downloadProgressBar);
        
        return panel;
      return progressPanel;
    }
    
    private JPanel createButtonPanel() {
@@ -319,6 +338,7 @@
        panel.setBackground(CARD_COLOR);
        panel.setAlignmentX(Component.CENTER_ALIGNMENT);
        panel.setMaximumSize(new Dimension(400, 50));
      panel.setOpaque(true);
        
        // 检查更新按钮
        checkUpdateButton = new JButton("检查更新");
@@ -328,6 +348,7 @@
        checkUpdateButton.setBorder(BorderFactory.createEmptyBorder(12, 0, 12, 0));
        checkUpdateButton.setFocusPainted(false);
        checkUpdateButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
      checkUpdateButton.setOpaque(true);
        
        // 立即更新按钮
        updateButton = new JButton("立即更新");
@@ -338,6 +359,7 @@
        updateButton.setFocusPainted(false);
        updateButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
        updateButton.setEnabled(false);
      updateButton.setOpaque(true);
        
        panel.add(checkUpdateButton);
        panel.add(updateButton);
@@ -375,7 +397,6 @@
    }
    
    private void showUpToDate() {
        statusIconLabel.setText("✅");
        statusTitleLabel.setText("系统已是最新版本");
        statusMessageLabel.setText("您的系统运行的是最新稳定版本,所有功能正常运行。");
        latestVersionPanel.setVisible(false);
@@ -384,12 +405,52 @@
    }
    
    private void showUpdateAvailable() {
        statusIconLabel.setText("⚠️");
        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() {
@@ -399,68 +460,323 @@
        // 显示检查中状态
        checkUpdateButton.setText("检查中...");
        checkUpdateButton.setEnabled(false);
      statusTitleLabel.setText("检查更新");
      statusMessageLabel.setText("正在检查最新版本,请稍候...");
        
        // 模拟网络请求延迟
        Timer timer = new Timer(2000, e -> {
            // 随机决定是否有更新
            updateAvailable = Math.random() > 0.5;
      // 使用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);
            
            // 显示检查完成提示
            String originalMessage = statusMessageLabel.getText();
            statusMessageLabel.setText(updateAvailable ?
                "✓ 检查完成,发现新版本可用" :
                "✓ 检查完成,系统已是最新版本");
            // 3秒后恢复原消息
            Timer restoreTimer = new Timer(3000, e2 -> {
                if (updateAvailable) {
                    statusMessageLabel.setText("有新版本可用,建议更新以获得更好的体验和功能。");
                     statusMessageLabel.setText(releaseNotes.isEmpty() ?
                           "有新版本可用,建议更新以获得更好的体验和功能。" : releaseNotes);
                } else {
                    statusMessageLabel.setText("您的系统运行的是最新稳定版本,所有功能正常运行。");
                }
            });
            restoreTimer.setRepeats(false);
            restoreTimer.start();
        });
        timer.setRepeats(false);
        timer.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("更新中...");
        
        // 显示下载进度
        JPanel progressPanel = (JPanel) mainPanel.getComponent(0).getComponentAt(275, 500);
        progressPanel.setVisible(true);
      downloadProgressBar.setValue(0);
      progressPercentLabel.setText("0%");
        
        // 模拟下载进度
        Timer progressTimer = new Timer(100, null);
        progressTimer.addActionListener(new ActionListener() {
      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
            public void actionPerformed(ActionEvent e) {
                progress += (int) (Math.random() * 8);
                if (progress >= 100) {
                    progress = 100;
                    progressTimer.stop();
         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%");
                    
                    // 更新完成
                    Timer completionTimer = new Timer(500, e2 -> {
               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));
                        
@@ -471,33 +787,46 @@
                        updateVersionInfo();
                        
                        // 显示成功消息
                        statusIconLabel.setText("✅");
                        statusTitleLabel.setText("更新完成");
                        statusMessageLabel.setText("系统已成功更新到最新版本,所有功能已优化。");
                    });
                    completionTimer.setRepeats(false);
                    completionTimer.start();
      // 重置状态
      checkUpdateButton.setEnabled(true);
      updateButton.setEnabled(false);
      // 清理临时数据
      downloadUrl = "";
      releaseNotes = "";
      loginToken = "";
      JOptionPane.showMessageDialog(banbenguanli.this,
            "更新完成!安装包已下载到 downloads 文件夹。",
            "更新成功", JOptionPane.INFORMATION_MESSAGE);
                }
                
                downloadProgressBar.setValue(progress);
                progressPercentLabel.setText(progress + "%");
            }
        });
        progressTimer.start();
   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);
    }
    
    // 主方法测试
    public static void main(String[] args) {
        // 设置系统外观
        try {
            UIManager.setLookAndFeel(UIManager.getLookAndFeel());
        } catch (Exception e) {
            e.printStackTrace();
        }
   // 进度面板引用
   private JPanel progressPanel;
        
   // 静态方法:显示版本管理对话框
   public static void showVersionManagementDialog(JFrame parent) {
        SwingUtilities.invokeLater(() -> {
            banbenguanli frame = new banbenguanli();
            frame.setVisible(true);
         banbenguanli dialog = new banbenguanli(parent);
         dialog.setVisible(true);
        });
    }
}