From 3049ceb9f928873e8b73cf3e871b9e546b02f717 Mon Sep 17 00:00:00 2001 From: tzdwindows 7 <3076584115@qq.com> Date: Tue, 11 Feb 2025 22:14:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(register):=20=E9=87=8D=E6=9E=84=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=B3=A8=E5=86=8C=E9=80=BB=E8=BE=91=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=AE=BE=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重新设计了工具分类和工具项的注册流程 - 增加了插件管理和基础设置功能- 添加了主题颜色和字体选择功能 - 优化了CUDA设置和AI推理库加载逻辑 - 新增了ToolsRegistrationError异常类 --- .../java/com/axis/innovators/box/Main.java | 242 +++++++++++++++--- .../axis/innovators/box/gui/MainWindow.java | 5 + .../innovators/box/plugins/PluginLoader.java | 2 - .../box/register/RegistrationTool.java | 87 ++++++- .../box/register/ToolsRegistrationError.java | 13 + src/main/java/org/tzd/lm/LM.java | 6 +- 6 files changed, 306 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/axis/innovators/box/register/ToolsRegistrationError.java diff --git a/src/main/java/com/axis/innovators/box/Main.java b/src/main/java/com/axis/innovators/box/Main.java index 50d9afb..9411c22 100644 --- a/src/main/java/com/axis/innovators/box/Main.java +++ b/src/main/java/com/axis/innovators/box/Main.java @@ -5,16 +5,21 @@ import com.axis.innovators.box.events.SettingsLoadEvents; import com.axis.innovators.box.events.StartupEvent; import com.axis.innovators.box.events.SubscribeEvent; import com.axis.innovators.box.gui.*; +import com.axis.innovators.box.plugins.PluginDescriptor; import com.axis.innovators.box.plugins.PluginLoader; import com.axis.innovators.box.register.RegistrationTool; import com.axis.innovators.box.tools.LibraryLoad; import com.axis.innovators.box.tools.SystemInfoUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.tzd.lm.LM; import javax.swing.*; +import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.ActionEvent; +import java.util.Enumeration; +import java.util.List; /** * 主类 @@ -46,6 +51,7 @@ public class Main { static { try { LibraryLoad.loadLibrary("FridaNative"); + LM.loadLibrary(LM.CUDA); } catch (Exception e) { logger.error("Failed to load the 'FridaNative' library", e); throw new RuntimeException(e); @@ -97,10 +103,202 @@ public class Main { @SubscribeEvent public void onSettingsLoad(SettingsLoadEvents event) { - JLabel placeholder = new JLabel("设置功能开发中...", SwingConstants.CENTER); - placeholder.setFont(new Font("微软雅黑", Font.PLAIN, 24)); - placeholder.setForeground(new Color(127, 140, 153)); - event.content().add(placeholder, BorderLayout.CENTER); + JTabbedPane tabbedPane = new JTabbedPane(); + + JPanel pluginPanel = createPluginSettingsPanel(); + tabbedPane.addTab("插件", null, pluginPanel, "插件管理"); + + JPanel generalPanel = createGeneralSettingsPanel(); + tabbedPane.addTab("基础设置", null, generalPanel, "外观设置"); + + JPanel aboutPanel = createAboutPanel(); + tabbedPane.addTab("关于", null, aboutPanel, "版本信息"); + + event.content().add(tabbedPane, BorderLayout.CENTER); + } + + private JPanel createAboutPanel() { + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); + + JTextArea infoArea = new JTextArea(); + infoArea.setEditable(false); + infoArea.setLineWrap(true); + infoArea.setWrapStyleWord(true); + infoArea.append("软件版本: " + Main.VERSIONS + "\n\n"); + infoArea.append("开发作者:\n"); + for (String author : Main.AUTHOR) { + infoArea.append("• " + author + "\n"); + } + + panel.add(new JScrollPane(infoArea), BorderLayout.CENTER); + return panel; + } + + // 字体选择器内部类 + private static class FontChooser extends JPanel { + private final JComboBox fontFamilyCombo; + private final JSpinner fontSizeSpinner; + + public FontChooser(Font currentFont) { + setLayout(new GridLayout(2, 2, 5, 5)); + + // 字体族选择 + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + String[] fontFamilies = ge.getAvailableFontFamilyNames(); + fontFamilyCombo = new JComboBox<>(fontFamilies); + fontFamilyCombo.setSelectedItem(currentFont.getFamily()); + + // 字体大小选择 + SpinnerNumberModel sizeModel = new SpinnerNumberModel( + currentFont.getSize(), 8, 48, 1 + ); + fontSizeSpinner = new JSpinner(sizeModel); + + add(new JLabel("字体:")); + add(fontFamilyCombo); + add(new JLabel("大小:")); + add(fontSizeSpinner); + } + + public Font getSelectedFont() { + return new Font( + (String) fontFamilyCombo.getSelectedItem(), + Font.PLAIN, + (Integer) fontSizeSpinner.getValue() + ); + } + } + + // 应用主题颜色 + private void applyThemeColor(Color color) { + // 更新全局颜色设置 + UIManager.put("Panel.background", color); + UIManager.put("TabbedPane.background", color); + + // 更新现有界面 + SwingUtilities.updateComponentTreeUI(Main.getMain().getMainWindow()); + } + + private JPanel createPluginSettingsPanel() { + JPanel panel = new JPanel(new BorderLayout()); + + // 表格列配置 + String[] columns = {"插件名称", "版本支持", "描述"}; + DefaultTableModel model = new DefaultTableModel(columns, 0) { + @Override + public boolean isCellEditable(int row, int column) { + return false; // 禁止编辑 + } + }; + + // 从PluginLoader获取插件数据 + List plugins = PluginLoader.getLoadedPlugins(); + for (PluginDescriptor plugin : plugins) { + model.addRow(new Object[]{ + plugin.getName(), + String.join(", ", plugin.getSupportedVersions()), + plugin.getDescription() + }); + } + + JTable table = new JTable(model); + table.setRowHeight(30); + table.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 14)); + + // 添加滚动面板 + JScrollPane scrollPane = new JScrollPane(table); + scrollPane.setBorder(BorderFactory.createTitledBorder("已加载插件列表")); + panel.add(scrollPane, BorderLayout.CENTER); + + return panel; + } + + private JPanel createGeneralSettingsPanel() { + JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); + gbc.anchor = GridBagConstraints.WEST; + + // 颜色选择组件 + gbc.gridx = 0; + gbc.gridy = 0; + panel.add(new JLabel("界面主题颜色:"), gbc); + + JButton colorBtn = new JButton("选择颜色"); + colorBtn.addActionListener(e -> { + Color color = JColorChooser.showDialog(panel, "选择主题颜色", Color.WHITE); + if (color != null) { + applyThemeColor(color); + } + }); + gbc.gridx = 1; + panel.add(colorBtn, gbc); + + // 字体选择组件 + gbc.gridy++; + gbc.gridx = 0; + panel.add(new JLabel("界面字体:"), gbc); + + JButton fontBtn = new JButton("选择字体"); + fontBtn.addActionListener(e -> { + Font currentFont = UIManager.getFont("Label.font"); + FontChooser fontChooser = new FontChooser(currentFont); + int result = JOptionPane.showConfirmDialog( + panel, + fontChooser, + "选择字体", + JOptionPane.OK_CANCEL_OPTION + ); + + if (result == JOptionPane.OK_OPTION) { + applyUIFont(fontChooser.getSelectedFont()); + } + }); + gbc.gridx = 1; + panel.add(fontBtn, gbc); + + // 添加CUDA选项 + gbc.gridy++; + gbc.gridx = 0; + panel.add(new JLabel("AI推理时使用CUDA:"), gbc); + + JCheckBox cudaCheckBox = new JCheckBox("启用CUDA加速", LM.CUDA); + cudaCheckBox.addActionListener(e -> { + boolean useCUDA = cudaCheckBox.isSelected(); + LM.CUDA = useCUDA; + logger.info("CUDA加速设置已更新: " + (useCUDA ? "启用" : "禁用")); + + try { + LM.loadLibrary(useCUDA); + logger.info("AI推理库已重新加载"); + } catch (Exception ex) { + logger.error("无法重新加载AI推理库", ex); + JOptionPane.showMessageDialog(panel, "无法重新加载AI推理库,请检查CUDA环境", "错误", JOptionPane.ERROR_MESSAGE); + } + }); + gbc.gridx = 1; + panel.add(cudaCheckBox, gbc); + + return panel; + } + + // 应用全局字体 + private void applyUIFont(Font font) { + Enumeration keys = UIManager.getLookAndFeelDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof Font) { + Font derived = font.deriveFont(((Font)value).getStyle()); + UIManager.put(key, derived); + } + } + + // 更新所有窗口 + for (Window window : Window.getWindows()) { + SwingUtilities.updateComponentTreeUI(window); + } } public static void main(String[] args) { @@ -146,42 +344,6 @@ public class Main { } public void runWindow() { - int id = 0; - MainWindow.ToolCategory debugCategory = new MainWindow.ToolCategory("调试工具", - "debug/debug.png", - "用于调试指定Windows工具的一个分类"); - - debugCategory.addTool(new MainWindow.ToolItem("Frida注入工具", "debug/frida/frida_main.png", - "使用frida注入目标进程的脚本程序 " + - "\n作者:tzdwindows 7", ++id, new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - Window owner = SwingUtilities.windowForComponent((Component) e.getSource()); - FridaWindow fridaWindow = new FridaWindow(owner); - fridaWindow.setVisible(true); - } - })); - - ex.addToolCategory(debugCategory); - - MainWindow.ToolCategory aICategory = new MainWindow.ToolCategory("AI工具", - "ai/ai.png", - "人工智能/大语言模型"); - - aICategory.addTool(new MainWindow.ToolItem("本地AI执行工具", "ai/local/local_main.png", - "在本机对开源大语言模型进行推理" + - "\n作者:tzdwindows 7", ++id, new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - Window owner = SwingUtilities.windowForComponent((Component) e.getSource()); - LocalWindow dialog = new LocalWindow(owner); - dialog.setVisible(true); - } - })); - - ex.addToolCategory(aICategory); - - // 主任务2:加载工具栏 progressBarManager.updateMainProgress(++completedTasks); if (!registrationTool.getToolCategories().isEmpty()) { diff --git a/src/main/java/com/axis/innovators/box/gui/MainWindow.java b/src/main/java/com/axis/innovators/box/gui/MainWindow.java index 6de9dfc..cff3d3c 100644 --- a/src/main/java/com/axis/innovators/box/gui/MainWindow.java +++ b/src/main/java/com/axis/innovators/box/gui/MainWindow.java @@ -396,6 +396,7 @@ public class MainWindow extends JFrame { private final String icon; private final ImageIcon iconImage; private final String description; + private final UUID id = UUID.randomUUID(); private final List tools = new ArrayList<>(); /** @@ -445,6 +446,10 @@ public class MainWindow extends JFrame { public ImageIcon getIconImage() { return iconImage; } + + public UUID getId() { + return id; + } } // 工具项数据类 diff --git a/src/main/java/com/axis/innovators/box/plugins/PluginLoader.java b/src/main/java/com/axis/innovators/box/plugins/PluginLoader.java index bfc7315..17d6935 100644 --- a/src/main/java/com/axis/innovators/box/plugins/PluginLoader.java +++ b/src/main/java/com/axis/innovators/box/plugins/PluginLoader.java @@ -6,8 +6,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.net.*; import java.util.*; import java.util.jar.*; diff --git a/src/main/java/com/axis/innovators/box/register/RegistrationTool.java b/src/main/java/com/axis/innovators/box/register/RegistrationTool.java index 18cca7b..212a190 100644 --- a/src/main/java/com/axis/innovators/box/register/RegistrationTool.java +++ b/src/main/java/com/axis/innovators/box/register/RegistrationTool.java @@ -1,12 +1,18 @@ package com.axis.innovators.box.register; import com.axis.innovators.box.Main; +import com.axis.innovators.box.gui.FridaWindow; +import com.axis.innovators.box.gui.LocalWindow; import com.axis.innovators.box.gui.MainWindow; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; +import java.util.UUID; /** * 负责注册Registration项(限定时机,在执行.run之前可设置) @@ -16,23 +22,100 @@ public class RegistrationTool { private static final Logger logger = LogManager.getLogger(RegistrationTool.class); private final List toolCategories = new ArrayList<>(); private final Main main; + private final List uuidList = new ArrayList<>(); + private final List registeredNameList = new ArrayList<>(); - public RegistrationTool(Main mainWindow){ + public RegistrationTool(Main mainWindow) { this.main = mainWindow; + int id = 0; + MainWindow.ToolCategory debugCategory = new MainWindow.ToolCategory("调试工具", + "debug/debug.png", + "用于调试指定Windows工具的一个分类"); + + debugCategory.addTool(new MainWindow.ToolItem("Frida注入工具", "debug/frida/frida_main.png", + "使用frida注入目标进程的脚本程序 " + + "\n作者:tzdwindows 7", ++id, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Window owner = SwingUtilities.windowForComponent((Component) e.getSource()); + FridaWindow fridaWindow = new FridaWindow(owner); + fridaWindow.setVisible(true); + } + })); + + MainWindow.ToolCategory aICategory = new MainWindow.ToolCategory("AI工具", + "ai/ai.png", + "人工智能/大语言模型"); + + aICategory.addTool(new MainWindow.ToolItem("本地AI执行工具", "ai/local/local_main.png", + "在本机对开源大语言模型进行推理" + + "\n作者:tzdwindows 7", ++id, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Window owner = SwingUtilities.windowForComponent((Component) e.getSource()); + LocalWindow dialog = new LocalWindow(owner); + dialog.setVisible(true); + } + })); + + addToolCategory(debugCategory, "system:debugTools"); + addToolCategory(aICategory,"system:fridaTools"); } /** * 注册ToolCategory * @param toolCategory ToolCategory */ - public void addToolCategory(MainWindow.ToolCategory toolCategory){ + public void addToolCategory(MainWindow.ToolCategory toolCategory, + String registeredName) { if (!main.isWindow()) { + if (registeredNameList.contains(registeredName)) { + throw new ToolsRegistrationError(registeredName + " duplicate registered names"); + } + uuidList.add(toolCategory.getId()); + registeredNameList.add(registeredName); toolCategories.add(toolCategory); } else { logger.warn("Wrong time to add tools"); } } + /** + * 根据UUID获取ToolCategory + * @param id UUID + * @return ToolCategory对象 + */ + public MainWindow.ToolCategory getToolCategory(UUID id) { + if (!main.isWindow()) { + for (MainWindow.ToolCategory toolCategory : toolCategories) { + if (toolCategory.getId().equals(id)) { + return toolCategory; + } + } + } else { + logger.warn("Wrong time to operation tools"); + } + return null; + } + + /** + * 根据注册名获取UUID + * @param registeredName 注册名 + * @return UUID + */ + public UUID getUUID(String registeredName){ + if (!main.isWindow()) { + for (int i = 0; i < registeredNameList.size(); i++) { + if (registeredNameList.get(i).equals(registeredName)) { + return uuidList.get(i); + } + } + } else { + logger.warn("Wrong time to operation tools"); + } + return null; + } + public List getToolCategories() { return toolCategories; } diff --git a/src/main/java/com/axis/innovators/box/register/ToolsRegistrationError.java b/src/main/java/com/axis/innovators/box/register/ToolsRegistrationError.java new file mode 100644 index 0000000..da117eb --- /dev/null +++ b/src/main/java/com/axis/innovators/box/register/ToolsRegistrationError.java @@ -0,0 +1,13 @@ +package com.axis.innovators.box.register; + +/** + * 当工具注册失败时抛出此错误 + * @author tzdwindows 7 + */ +public class ToolsRegistrationError extends Error{ + public ToolsRegistrationError(String message) { + super(message); + } + + +} diff --git a/src/main/java/org/tzd/lm/LM.java b/src/main/java/org/tzd/lm/LM.java index df1844c..ef21063 100644 --- a/src/main/java/org/tzd/lm/LM.java +++ b/src/main/java/org/tzd/lm/LM.java @@ -14,11 +14,7 @@ public class LM { public final static String DEEP_SEEK = FolderCreator.getModelFolder() + "\\DeepSeek-R1-Distill-Qwen-1.5B-Q8_0.gguf"; private static final Logger logger = LogManager.getLogger(LM.class); - static { - loadLibrary(CUDA); - } - - private static void loadLibrary(boolean cuda){ + public static void loadLibrary(boolean cuda){ if (!cuda) { logger.warn("The cpu will be used for inference"); try {