diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index e2a08bbbc3..33be0b7fc4 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -2,8 +2,6 @@ package com.fr.design; import com.fr.common.report.ReportState; import com.fr.design.backup.EnvBackupHelper; -import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard; -import com.fr.design.plugin.remind.PluginErrorDesignReminder; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -52,7 +50,6 @@ import com.fr.workspace.engine.base.FineObjectPool; import com.fr.workspace.engine.channel.http.FunctionalHttpRequest; import com.fr.workspace.engine.exception.WorkspaceConnectionException; import com.fr.workspace.engine.rpc.WorkspaceProxyPool; -import static javax.swing.JOptionPane.QUESTION_MESSAGE; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; @@ -68,9 +65,10 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Optional; -import java.util.Properties; import java.util.Set; +import static javax.swing.JOptionPane.QUESTION_MESSAGE; + public class EnvChangeEntrance { private static final String BRANCH_TAG = "#"; private static final String BRANCH_BEGIN = "-"; @@ -158,11 +156,11 @@ public class EnvChangeEntrance { } /** - * 由云端运维,触发切换埋点 - * 内部空实现 - * 见 实现 + * 异步提交埋点 + * */ private void triggerSwitchMetric() { + EnvSwitcherSubmitTask.asyncSubmit(); } /** diff --git a/designer-base/src/main/java/com/fr/design/EnvSwitcherSubmitTask.java b/designer-base/src/main/java/com/fr/design/EnvSwitcherSubmitTask.java new file mode 100644 index 0000000000..33edfc66cb --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/EnvSwitcherSubmitTask.java @@ -0,0 +1,214 @@ +package com.fr.design; + +import com.fr.concurrent.FineExecutors; +import com.fr.concurrent.NamedThreadFactory; +import com.fr.design.mainframe.SiteCenterToken; +import com.fr.design.metric.AbstractDesignerMetric; +import com.fr.general.CloudCenter; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; +import com.fr.workspace.Workspace; +import com.fr.workspace.WorkspaceSwitchProcess; +import com.fr.workspace.WorkspaceSwitchStatics; +import com.fr.workspace.switcher.WorkspaceSwitchHistory; +import org.jetbrains.annotations.NotNull; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeSet; +import java.util.concurrent.ExecutorService; + +/** + * 设计器环境切换埋点提交 + * + * @author Bruce.Deng + * @since 11.0 + * Created on 2024/9/5 + */ +public class EnvSwitcherSubmitTask extends AbstractDesignerMetric { + + private static final String TAG_MODULE = "module"; + private static final String TAG_SELF_USED = "selfUsed"; + private static final String TAG_SUB = "sub"; + private static final String WORK_DIRECTORY_TYPE_BEFORE_SWITCHING = "workDirectoryTypeBeforeSwitching"; + private static final String WORK_DIRECTORY_TYPE_AFTER_SWITCHING = "workDirectoryTypeAfterSwitching"; + private static final String SWITCH_COMPLETED = "switchCompleted"; + private static final String EXCHANGE_TIME = "exchangeTime"; + private static final String START_SLOW_MODULE_NAME = "startSlowModuleName"; + private static final String STOP_SLOW_MODULE_NAME = "stopSlowModuleName"; + private static final int MIN_LIMIT = 100; + private static final String SWITCH_TABLE_SUFFIX = "record_of_fbp_remoteSwitch/single"; + private final ExecutorService service; + + private EnvSwitcherSubmitTask() { + service = FineExecutors.newSingleThreadExecutor(new NamedThreadFactory("DesignEnvSwitchMetricSubmit")); + } + + /** + * 异步提交环境切换的埋点 + */ + public static void asyncSubmit() { + new EnvSwitcherSubmitTask().run(); + } + + /** + * 执行任务 + */ + private void run() { + + WorkspaceSwitchHistory.consume(workspaceSwitchProcesses -> { + Iterator workspaceSwitchProcessIterator = workspaceSwitchProcesses.descendingIterator(); + while (workspaceSwitchProcessIterator.hasNext()) { + WorkspaceSwitchProcess next = workspaceSwitchProcessIterator.next(); + // 过滤掉 source 为空的启动过程 + if (next != null && next.getSource() != null) { + submitProcess(next); + } + // 提交之后要移除掉 + workspaceSwitchProcessIterator.remove(); + } + }); + } + + private void submitProcess(WorkspaceSwitchProcess process) { + service.submit(new Runnable() { + @Override + public void run() { + collectAndSubmit(process); + } + }); + } + + private void collectAndSubmit(WorkspaceSwitchProcess process) { + Map para = new HashMap<>(); + para.put("token", SiteCenterToken.generateToken()); + para.put("content", collect(process)); + try { + HttpToolbox.post(getUrl(), para); + FineLoggerFactory.getLogger().debug("[EnvSwitcher] submit env switcher metric to cloud."); + } catch (Throwable t) { + FineLoggerFactory.getLogger().debug(t,"[EnvSwitcher] failed to submit env switcher metric to cloud."); + } + } + + private JSONObject collect(WorkspaceSwitchProcess process) { + JSONObject info = new JSONObject(); + addDefaultMetric(info); + addMeta(info, process); + addStatics(info, process.getStatics()); + return info; + } + + private static void addMeta(JSONObject info, WorkspaceSwitchProcess process) { + Workspace source = process.getSource(); + info.put(WORK_DIRECTORY_TYPE_BEFORE_SWITCHING, workspaceType(source)); + Workspace target = process.getTarget(); + info.put(WORK_DIRECTORY_TYPE_AFTER_SWITCHING, workspaceType(target)); + info.put(SWITCH_COMPLETED, switchCompleted(process)); + } + + @NotNull + private static String switchCompleted(WorkspaceSwitchProcess process) { + + return process.isSwitchSuccess() ? "yes" : "no"; + } + + @NotNull + private static String workspaceType(Workspace workspace) { + + return workspace.isLocal() ? "local" : "remote"; + } + + private void addStatics(JSONObject info, WorkspaceSwitchStatics statics) { + info.put(EXCHANGE_TIME, statics.getElapsed()); + JSONObject startSlowModuleName = convert2CloudModel(statics.getStartModuleUsed()); + info.put(START_SLOW_MODULE_NAME, startSlowModuleName); + JSONObject stopSlowModuleName = convert2CloudModel(statics.getStopModuleUsed()); + info.put(STOP_SLOW_MODULE_NAME, stopSlowModuleName); + } + + /* convert */ + + @NotNull + private JSONObject convert2CloudModel(JSONObject moduleUsedJO) { + + TreeSet entries = convert2SortSet(moduleUsedJO); + return convert2JO(entries); + } + + @NotNull + private static JSONObject convert2JO(TreeSet startEntries) { + + JSONObject moduleNames = new JSONObject(); + startEntries.stream() + .filter((e) -> e.getSelfUsed() > MIN_LIMIT) + .forEach((e) -> moduleNames.put(e.getModuleName(), e.getSelfUsed())); + return moduleNames; + } + + @NotNull + private TreeSet convert2SortSet(JSONObject moduleUsedJO) { + + TreeSet entries = new TreeSet<>(Comparator.comparingInt(Entry::getSelfUsed)); + sortBySelfUsed(moduleUsedJO, entries); + return entries; + } + + /** + * 循环处理 JSON, 并降序排序 + * + * @param moduleUsed 模块用时 {@link com.fr.module.engine.FineModule} + * @param entries 降序排序的树集合 + */ + private void sortBySelfUsed(JSONObject moduleUsed, TreeSet entries) { + + if (moduleUsed == null || moduleUsed.isEmpty()) { + return; + } + + String moduleName = moduleUsed.optString(TAG_MODULE); + int selfUsed = moduleUsed.optInt(TAG_SELF_USED); + entries.add(new Entry(moduleName, selfUsed)); + + JSONArray subModules = moduleUsed.optJSONArray(TAG_SUB); + if (subModules != null) { + int length = subModules.length(); + for (int i = 0; i < length; i++) { + JSONObject subModuleUsed = subModules.optJSONObject(i); + sortBySelfUsed(subModuleUsed, entries); + } + } + } + + private String getUrl() { + String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint"); + String url = (StringUtils.isNotEmpty(monitorEntry) ? monitorEntry : DEFAULT_MONITOR_URL) + + SWITCH_TABLE_SUFFIX; + return url; + } + + private static class Entry { + + private final String moduleName; + + private final Integer selfUsed; + + public Entry(String moduleName, Integer selfUsed) { + this.moduleName = moduleName; + this.selfUsed = selfUsed; + } + + public String getModuleName() { + return moduleName; + } + + public Integer getSelfUsed() { + return selfUsed; + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java index 792ab91365..b47b8d94f9 100644 --- a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java +++ b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java @@ -4,7 +4,6 @@ package com.fr.design.constants; import com.fine.theme.icon.LazyIcon; -import com.fr.base.svg.IconUtils; import com.fr.base.svg.SVGLoader; import com.fr.general.IOUtils; import com.fr.stable.Constants; @@ -27,7 +26,6 @@ import java.awt.image.BufferedImage; */ public interface UIConstants { - public static final Icon CPT_ICON = IOUtils.readIcon("/com/fr/base/images/oem/cpt.png"); public static final Icon BLACK_ICON = IOUtils.readIcon("/com/fr/base/images/cell/blank.gif"); public static final String EMPTY_ICON = StringUtils.EMPTY; @@ -153,67 +151,17 @@ public interface UIConstants { public static final Color CHECK_BOX_TIP_FONT_COLOR = new Color(51, 51, 52, (int)Math.round(0.5 * 255)); public static final BufferedImage DRAG_BAR = IOUtils.readImage("com/fr/design/images/control/bar.png"); - public static final BufferedImage DRAG_BAR_LIGHT = IOUtils.readImage("com/fr/design/images/control/bar-light.png"); public static final Image ARROW_NORTH = SVGLoader.load("/com/fr/design/standard/arrowlinear/up_arrow.svg"); public static final Image ARROW_SOUTH = SVGLoader.load("/com/fr/design/standard/arrowlinear/down_arrow.svg"); public static final Image ARROW_EAST = SVGLoader.load("/com/fr/design/standard/arrowlinear/east_arrow.svg"); public static final Image ARROW_WEST = SVGLoader.load("/com/fr/design/standard/arrowlinear/west_arrow.svg"); - - public static final BufferedImage DRAG_BAR_RIGHT = IOUtils.readImage("com/fr/design/images/control/barm.png"); - public static final BufferedImage DRAG_BAR_LEFT = IOUtils.readImage("com/fr/design/images/control/barl.png"); - public static final Image DRAG_UP_NORMAL = SVGLoader.load("/com/fr/design/standard/triangle.arrow/up_normal.svg"); - public static final Image DRAG_UP_PRESS = SVGLoader.load("/com/fr/design/standard/triangle.arrow/up_hover.svg"); - public static final Image DRAG_DOWN_NORMAL = SVGLoader.load("/com/fr/design/standard/triangle.arrow/down_normal.svg"); - public static final Image DRAG_DOWN_PRESS = SVGLoader.load("/com/fr/design/standard/triangle.arrow/down_hover.svg"); - public static final Image DRAG_RIGHT_NORMAL = SVGLoader.load("/com/fr/design/standard/drag/right_normal.svg"); - public static final Image DRAG_RIGHT_PRESS = SVGLoader.load("/com/fr/design/standard/drag/right_pressed.svg"); - public static final Image DRAG_LEFT_NORMAL = SVGLoader.load("/com/fr/design/standard/drag/left_normal.svg"); - public static final Image DRAG_LEFT_PRESS = SVGLoader.load("/com/fr/design/standard/drag/left_pressed.svg"); public static final BufferedImage DRAG_DOT = IOUtils.readImage("com/fr/design/images/control/dot.png"); - public static final Image DRAG_LINE = SVGLoader.load("/com/fr/design/standard/dot_line_normal.svg"); - public static final BufferedImage ACCESSIBLE_EDITOR_DOT = IOUtils.readImage("com/fr/design/images/control/dot.png"); - public static final BufferedImage DRAG_DOT_VERTICAL = IOUtils.readImage("com/fr/design/images/control/dotv.png"); - public static final Image POP_BUTTON_DOWN = SVGLoader.load("/com/fr/design/standard/poparrow/pop_down_arrow.svg"); - public static final Image POP_BUTTON_UP = SVGLoader.load("/com/fr/design/standard/poparrow/pop_up_arrow.svg"); - public static final BufferedImage DRAG_DOWN_SELECTED_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/downSelected.png"); - public static final BufferedImage DRAG_LEFT_NORMAL_SMALL = IOUtils.readImage("com/fr/design/images/buttonicon/leftNormal.png"); public static final BufferedImage WATERMARK_BACKGROUND = IOUtils.readImage("/com/fr/design/images/dialog/watermark/" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_WaterMark_Background_Icon_File_Name")); public static final int MODEL_NORMAL = 0; public static final int MODEL_PRESS = 1; - public static final Icon ARROW_DOWN_ICON = IconUtils.readIcon("/com/fr/design/standard/arrowlinear/down_arrow.svg"); - public static final Icon ARROW_UP_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/arrowup.png"); - public static final Icon YES_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/yes.png"); - public static final Icon CHOOSEN_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/select_item.png"); - public static final Icon PRE_WIDGET_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/prewidget.png"); - public static final Icon PRE_WIDGET_NORMAL_ICON = IconUtils.readIcon("com/fr/design/images/buttonicon/prewidget"); - public static final Icon EDIT_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/edit"); - public static final Icon EDIT_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/edit_pressed.svg"); - public static final Icon HIDE_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/hide"); - public static final Icon HIDE_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/hide_pressed.svg"); - public static final Icon VIEW_NORMAL_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/view"); - //public static final Icon VIEW_PRESSED_ICON = IconUtils.readIcon("/com/fr/design/standard/uimode/view"); - - public static final Icon RUN_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/run24.svg"); - public static final Icon RUN_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/runs.svg"); - public static final Icon PAGE_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/pageb24.svg"); - public static final Icon WRITE_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/writeb24.svg"); - public static final Icon ANA_BIG_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/anab24.svg"); - public static final Icon PAGE_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/pages.svg"); - public static final Icon WRITE_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/writes.svg"); - public static final Icon ANA_SMALL_ICON = IconUtils.readIcon("/com/fr/design/standard/preview/anas.svg"); - - public static final Icon REFRESH_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/refresh.png"); - public static final Icon FONT_ICON = IOUtils.readIcon("/com/fr/design/images/gui/color/foreground.png"); - public static final Icon AUTO_FONT_ICON = IOUtils.readIcon("/com/fr/design/images/gui/color/autoForeground.png"); - public static final Icon HISTORY_ICON = IOUtils.readIcon("com/fr/design/images/buttonicon/history.png"); - public static final Icon DELETE_ICON = IOUtils.readIcon("com/fr/design/images/m_file/close.png"); - public static final Icon EDIT_ICON = IOUtils.readIcon("com/fr/design/images/m_file/edit.png"); - public static final Icon SEARCH_ICON = IOUtils.readIcon("/com/fr/design/images/data/search.png"); - public static final Icon BLACK_SEARCH_ICON = IOUtils.readIcon("/com/fr/design/images/data/black_search.png"); - public static final Icon CLEAR_ICON = IOUtils.readIcon("/com/fr/design/images/data/source/delete.png"); - public static final Icon LIST_EDIT_ICON = IOUtils.readIcon("/com/fr/design/images/control/edit.png"); - public static final Icon LIST_EDIT_WHITE_ICON = IOUtils.readIcon("/com/fr/design/images/control/edit_white.png"); + public static final Icon ARROW_DOWN_ICON = new LazyIcon("down_arrow"); + public static final Icon ARROW_UP_ICON = new LazyIcon("up_arrow"); public static final Color PRESSED_DARK_GRAY = new Color(127, 127, 127); public static final Color GRDIENT_DARK_GRAY = new Color(45, 45, 45); public static final Color BARNOMAL = new Color(232, 232, 233); @@ -222,7 +170,6 @@ public interface UIConstants { public static final int BUTTON_GROUP_ARC = 0; public static final int LARGEARC = 6; public static final Stroke BS = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 2f, new float[]{3, 1}, 0); - public static final Icon PREVIEW_DOWN = IconUtils.readIcon("/com/fr/design/standard/preview_down_icon"); public static final int CLOSE_AUTHORITY_HEIGHT_AND_WIDTH = 24; public static final Icon CLOSE_OF_AUTHORITY = new LazyIcon("platform_close", CLOSE_AUTHORITY_HEIGHT_AND_WIDTH).disabled(); public static final Icon CLOSE_OVER_AUTHORITY = new LazyIcon("platform_close", CLOSE_AUTHORITY_HEIGHT_AND_WIDTH); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java index 50bbc1440d..2438e4a3fb 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIPreviewButton.java @@ -1 +1 @@ -package com.fr.design.gui.ibutton; import com.fr.design.constants.UIConstants; import com.fr.stable.Constants; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * Author : daisy * Date: 13-8-1 * Time: 下午3:41 */ public class UIPreviewButton extends JPanel { private static final int START_X = -7; protected UIButton upButton; protected UIButton downButton; protected void upButtonClickEvent() { // do nothing } protected void downButtonClickEvent() { // do nothing } public UIPreviewButton() { this(new UIButton(), new UIButton()); } public UIPreviewButton(UIButton up, UIButton down) { upButton = up; downButton = down; upButton.setRoundBorder(true, Constants.CENTER); downButton.setRoundBorder(true, Constants.CENTER); upButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { downButton.getModel().setPressed(true); downButton.getModel().setSelected(true); downButton.repaint(); } @Override public void mouseReleased(MouseEvent e) { downButton.getModel().setPressed(false); downButton.getModel().setSelected(false); downButton.repaint(); } @Override public void mouseClicked(MouseEvent e) { upButtonClickEvent(); } }); downButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { upButton.getModel().setPressed(true); upButton.getModel().setSelected(true); upButton.repaint(); } @Override public void mouseReleased(MouseEvent e) { upButton.getModel().setPressed(false); upButton.getModel().setSelected(false); upButton.repaint(); } @Override public void mouseClicked(MouseEvent e) { downButtonClickEvent(); } }); this.setLayout(new FlowLayout(FlowLayout.CENTER,5,0)); this.add(upButton); this.add(downButton); } public UIPreviewButton(Icon left, Icon right) { this(); upButton.setIcon(left); downButton.setIcon(right); } public UIButton getUpButton() { return upButton; } public void setExtraPainted(boolean isExtraPainted) { if (!isExtraPainted) { upButton.setBackground(null); downButton.setBackground(null); upButton.setOpaque(false); downButton.setOpaque(false); } } public UIButton getDownButton() { return downButton; } public void set4Toolbar() { upButton.setNormalPainted(false); downButton.setNormalPainted(false); upButton.setBorderPaintedOnlyWhenPressed(true); downButton.setBorderPaintedOnlyWhenPressed(true); } protected void showPopWindow(JPopupMenu menu) { GUICoreUtils.showPopupMenu(menu, this, START_X, getY() + getHeight() - 3); } public static void main(String... args) { JFrame jf = new JFrame("test"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel content = (JPanel) jf.getContentPane(); content.setLayout(null); UIPreviewButton bb = new UIPreviewButton(UIConstants.PAGE_BIG_ICON, UIConstants.PREVIEW_DOWN); bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); content.add(bb); GUICoreUtils.centerWindow(jf); jf.setSize(100, 100); jf.setVisible(true); } } \ No newline at end of file +package com.fr.design.gui.ibutton; import com.fr.design.constants.UIConstants; import com.fr.stable.Constants; import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * Author : daisy * Date: 13-8-1 * Time: 下午3:41 */ public class UIPreviewButton extends JPanel { private static final int START_X = -7; protected UIButton upButton; protected UIButton downButton; protected void upButtonClickEvent() { // do nothing } protected void downButtonClickEvent() { // do nothing } public UIPreviewButton() { this(new UIButton(), new UIButton()); } public UIPreviewButton(UIButton up, UIButton down) { upButton = up; downButton = down; upButton.setRoundBorder(true, Constants.CENTER); downButton.setRoundBorder(true, Constants.CENTER); upButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { downButton.getModel().setPressed(true); downButton.getModel().setSelected(true); downButton.repaint(); } @Override public void mouseReleased(MouseEvent e) { downButton.getModel().setPressed(false); downButton.getModel().setSelected(false); downButton.repaint(); } @Override public void mouseClicked(MouseEvent e) { upButtonClickEvent(); } }); downButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { upButton.getModel().setPressed(true); upButton.getModel().setSelected(true); upButton.repaint(); } @Override public void mouseReleased(MouseEvent e) { upButton.getModel().setPressed(false); upButton.getModel().setSelected(false); upButton.repaint(); } @Override public void mouseClicked(MouseEvent e) { downButtonClickEvent(); } }); this.setLayout(new FlowLayout(FlowLayout.CENTER,5,0)); this.add(upButton); this.add(downButton); } public UIPreviewButton(Icon left, Icon right) { this(); upButton.setIcon(left); downButton.setIcon(right); } public UIButton getUpButton() { return upButton; } public void setExtraPainted(boolean isExtraPainted) { if (!isExtraPainted) { upButton.setBackground(null); downButton.setBackground(null); upButton.setOpaque(false); downButton.setOpaque(false); } } public UIButton getDownButton() { return downButton; } public void set4Toolbar() { upButton.setNormalPainted(false); downButton.setNormalPainted(false); upButton.setBorderPaintedOnlyWhenPressed(true); downButton.setBorderPaintedOnlyWhenPressed(true); } protected void showPopWindow(JPopupMenu menu) { GUICoreUtils.showPopupMenu(menu, this, START_X, getY() + getHeight() - 3); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index b3d6e054d5..00c708baec 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -54,6 +54,7 @@ public class UIEastResizableContainer extends JPanel { private static final int DRAG_GAP_SIZE = 10; private Point dragPoint; + private boolean dragging; public UIEastResizableContainer() { this(new JPanel(), new JPanel()); @@ -71,12 +72,20 @@ public class UIEastResizableContainer extends JPanel { public void mousePressed(MouseEvent e) { if (isEnableDrag(e)) { dragPoint = e.getPoint(); + dragging = true; } } @Override public void mouseDragged(MouseEvent e) { - resizePanel(e); + if (dragging) { + resizePanel(e); + } + } + + @Override + public void mouseReleased(MouseEvent e) { + dragging = false; } }; diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java index fba8bfd7f4..376338358d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UICheckBoxMenuItem.java @@ -1,5 +1,6 @@ package com.fr.design.gui.imenu; +import com.fine.theme.icon.LazyIcon; import com.fr.design.constants.UIConstants; public class UICheckBoxMenuItem extends UIMenuItem { @@ -19,7 +20,7 @@ public class UICheckBoxMenuItem extends UIMenuItem { public void setSelected(boolean b) { super.setSelected(b); if (this.isSelected()) { - setIcon(UIConstants.CHOOSEN_ICON); + setIcon(new LazyIcon("checkbox_checked")); } else { setIcon(UIConstants.BLACK_ICON); } diff --git a/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java b/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java index b3cc839a34..9ffeebd10e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java +++ b/designer-base/src/main/java/com/fr/design/gui/itextfield/UISearchTextField.java @@ -1,6 +1,7 @@ package com.fr.design.gui.itextfield; +import com.fine.theme.icon.LazyIcon; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; @@ -25,8 +26,8 @@ import java.awt.geom.RoundRectangle2D; */ public class UISearchTextField extends UITextField { - private UILabel iconLabel = new UILabel(UIConstants.BLACK_SEARCH_ICON); - private UILabel clearLabel = new UILabel(UIConstants.CLEAR_ICON); + private UILabel iconLabel = new UILabel(new LazyIcon("search")); + private UILabel clearLabel = new UILabel(new LazyIcon("clear")); private UILabel infoLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Search")); private Dimension iconSize; private Dimension infoSize; @@ -268,29 +269,4 @@ public class UISearchTextField extends UITextField { this.showClearIcon = showClearIcon; this.repaint(); } - - public static void main(String[] args) { - JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT)); - UISearchTextField comp = new UISearchTextField(20); - p.add(comp); - comp = new UISearchTextField(20); - comp.setShowClearIcon(false); - p.add(comp); - comp = new UISearchTextField(20); - comp.setIconPosition(SwingConstants.RIGHT); - p.add(comp); - comp = new UISearchTextField(20); - comp.setShowClearIcon(false); - comp.setIconPosition(SwingConstants.RIGHT); - p.add(comp); - p.add(new JTextField(20)); - JFrame frame = new JFrame(); - frame.setTitle("UITextField"); - frame.setContentPane(p); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(300, 200); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - } - } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java index 20d7843034..aca6ad2409 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java @@ -2,9 +2,9 @@ package com.fr.design.mainframe.vcs.ui; import com.fine.theme.icon.LazyIcon; import com.fine.theme.light.ui.FineRoundBorder; +import com.fine.theme.utils.FineUIScale; import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.ScaledEmptyBorder; -import com.fr.base.svg.IconUtils; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ilable.UILabel; @@ -121,11 +121,11 @@ public class RecyclePane extends AbstractSupportSelectTablePane if (isNeedSearch()) { searchTextField = new UITextField(); searchTextField.setPlaceholder(Toolkit.i18nText("Fine-Design_Vcs_Start_Search")); - searchTextField.setColumns(COLUMNS_COUNT); + searchTextField.setPreferredSize(new Dimension(FineUIScale.scale(150), super.getPreferredSize().height)); UILabel searchLabel = new UILabel(ICON_SEARCH); searchLabel.setBorder(new ScaledEmptyBorder(0, 4, 0, 4)); searchTextField.setBorder(null); - leftPane = row(cell(searchLabel), cell(searchTextField).weight(1)).with(it -> { + leftPane = row(cell(searchLabel), cell(searchTextField)).with(it -> { it.setBorder(new FineRoundBorder()); it.setOpaque(true); it.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); diff --git a/designer-base/src/main/java/com/fr/design/metric/AbstractDesignerMetric.java b/designer-base/src/main/java/com/fr/design/metric/AbstractDesignerMetric.java new file mode 100644 index 0000000000..97c9cfac48 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/metric/AbstractDesignerMetric.java @@ -0,0 +1,39 @@ +package com.fr.design.metric; + +import com.fanruan.carina.Carina; +import com.fanruan.config.bbs.FineBBSConfigProvider; +import com.fr.config.MarketConfig; +import com.fr.design.DesignerEnvManager; +import com.fr.general.GeneralUtils; +import com.fr.json.JSONObject; +import org.jetbrains.annotations.NotNull; + +/** + * 设计器埋点抽象 + * + * @author Bruce.Deng + * @since 11.0 + * Created on 2024/9/10 + */ +public abstract class AbstractDesignerMetric { + + public static final String TIME = "time"; + + public static final String DESIGNER_ID = "designerId"; + + public static final String DESIGNER_VERSION = "designerVersion"; + + public static final String USERID = "userId"; + + public static final String APPID = "appId"; + + public static final String DEFAULT_MONITOR_URL = "https://cloud.fanruan.com/api/monitor/"; + + protected void addDefaultMetric(@NotNull JSONObject info) { + info.put(TIME, System.currentTimeMillis()); + info.put(DESIGNER_ID, DesignerEnvManager.getEnvManager().getUUID()); + info.put(DESIGNER_VERSION, GeneralUtils.getVersion()); + info.put(USERID, Carina.config(FineBBSConfigProvider.class).getBbsUid()); + info.put(APPID, MarketConfig.getInstance().getCloudOperationMaintenanceId()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java index d68113bed2..f74dd10e75 100644 --- a/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java +++ b/designer-base/src/main/java/com/fr/design/report/fit/BaseFitAttrPane.java @@ -82,8 +82,6 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { protected void initComponents() { //添加以下设置 initItemChoose(); - //服务器配置-PC端自适应属性面板中需要添加提示 - initPrompt(); this.setLayout(new BorderLayout()); this.add(contentJPanel); } @@ -112,8 +110,6 @@ public abstract class BaseFitAttrPane extends BasicBeanPane { } - protected void initPrompt() { - } protected void refresh() { validate(); diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java index 743dc4a754..92aeebe9ab 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java @@ -33,6 +33,8 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; +import static com.fine.theme.utils.FineUIScale.scale; + /** * Author : daisy * Time: 下午3:32 @@ -48,7 +50,7 @@ public class RoleTree extends UserObjectRefreshJTree { this.setCellRenderer(roleTreeRenderer); this.setEnabled(true); this.setEditable(true); - this.setRowHeight(20); + this.setRowHeight(scale(20)); this.setDigIn(true); Handler handler = createHandlerForRoleTree(); this.replaceMouseListener(this, handler, 0); diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java index 0f6631073d..cf63669c0a 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java +++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDetailPane.java @@ -78,7 +78,6 @@ public class ColorSelectDetailPane extends BasicPane { // 颜色选择器面板 selectedPanel = new JColorChooser(this.color); - selectedPanel.setPreferredSize(new Dimension(selectedPanel.getWidth(), FineUIScale.scale(SELECT_PANEL_HEIGHT))); selectedPanel.setPreviewPanel(new JPanel()); swatchChooserPanel = new SwatchChooserPanel(); @@ -130,12 +129,11 @@ public class ColorSelectDetailPane extends BasicPane { column( 2, cell(new UILabel(i18nText("Fine-Design_Basic_Preview"))), - cell(previewPanel).with(it -> { + cell(previewPanel).weight(1).with(it -> { it.setBorder(new FineRoundBorder()); - it.setPreferredSize(new Dimension(this.getPreferredSize().width, FineUIScale.scale(120))); it.setBackground(FlatUIUtils.getUIColor("background.normal", Color.WHITE)); }) - )).with(it -> it.setBorder(new ScaledEmptyBorder(0, 10, 0, 10))) + ).weight(1)).weight(1).with(it -> it.setBorder(new ScaledEmptyBorder(0, 10, 0, 10))) ).getComponent(); } diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java index e9ee892bf0..6e87e6a12c 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java +++ b/designer-base/src/main/java/com/fr/design/style/color/ColorSelectDialog.java @@ -16,6 +16,8 @@ import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; import static com.fine.theme.utils.FineUIScale.scale; @@ -86,8 +88,7 @@ public class ColorSelectDialog extends MiddleChartDialog{ private void initComponent() { this.setLayout(new BorderLayout()); - this.add(pane,BorderLayout.NORTH); - this.setBasicDialogSize(scale(545),scale(500)); + this.setBasicDialogSize(545,500); this.setResizable(false); this.applyClosingAction(); @@ -95,8 +96,6 @@ public class ColorSelectDialog extends MiddleChartDialog{ JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); - this.add(buttonPane, BorderLayout.SOUTH); - ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_OK")); cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Button_Cancel")); @@ -121,6 +120,7 @@ public class ColorSelectDialog extends MiddleChartDialog{ } }); + this.add(column(10, cell(pane).weight(1), cell(buttonPane)).getComponent()); this.setTitle(pane.title4PopupWindow()); GUICoreUtils.setWindowCenter(getOwner(), this); } diff --git a/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java b/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java index d6b2df3023..26ca6bb61f 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java +++ b/designer-base/src/main/java/com/fr/design/style/color/CustomChooserPanel.java @@ -599,7 +599,7 @@ class CustomChooserPanel extends AbstractColorChooserPanel implements ColorSelec protected void buildChooser() { setLayout(new BorderLayout(10, 0)); setPreferredSize(new Dimension((int) this.getPreferredSize().getWidth(), scale(180))); - add(buildRightPanel(), BorderLayout.CENTER); + Container rightPane = buildRightPanel(); JPanel container = new JPanel(); container.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); @@ -628,7 +628,7 @@ class CustomChooserPanel extends AbstractColorChooserPanel implements ColorSelec slider.setSize(scale(new Dimension(12, 180))); trackPanel.setSize(scale(new Dimension(12, 180))); - add(container, BorderLayout.WEST); + add(row(cell(container).weight(1), cell(rightPane).weight(1)).getComponent()); slider.addChangeListener(new SliderChangeListener()); updateTextFields(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java index 056be99452..2edcfc13b4 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java @@ -1,15 +1,14 @@ package com.fr.design.chart.series.PlotSeries; +import com.fine.theme.icon.LazyIcon; import com.fr.chart.base.MapSvgXMLHelper; import com.fr.design.constants.LayoutConstants; -import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.UIDialog; import com.fr.design.event.ChangeEvent; import com.fr.design.event.ChangeListener; import com.fr.design.gui.frpane.UIExtensionPane; -import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; @@ -33,8 +32,6 @@ import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -50,8 +47,6 @@ import java.util.List; * 可收缩的面板,只有两层 */ public class UIGroupExtensionPane extends BasicPane { - public static final String EDIT = "edit"; - public static final String DELETE = "delete"; private static final int BUTTONWIDTH = 16; private static final int DIALOG_WIDTH = 140; private static final int DIALOG_HEIGHT = 100; @@ -350,8 +345,8 @@ public class UIGroupExtensionPane extends BasicPane { JComponent c = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Border border = null; c.setBorder(border); - UILabel editLabel = new UILabel(UIConstants.EDIT_ICON); - UILabel deleteLabel = new UILabel(UIConstants.DELETE_ICON); + UILabel editLabel = new UILabel(new LazyIcon("edit")); + UILabel deleteLabel = new UILabel(new LazyIcon("remove")); JPanel editPane = GUICoreUtils.createFlowPane(new Component[]{editLabel, deleteLabel}, FlowLayout.LEFT, LayoutConstants.HGAP_LARGE); editPane.setBackground(isSelected ? c.getBackground() : null); @@ -548,40 +543,4 @@ public class UIGroupExtensionPane extends BasicPane { } } } - - /** - * 测试程序 - * @param args 参数 - */ - public static void main(String[] args) { - JFrame f = new JFrame(); - f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - Container c = f.getContentPane(); - c.setBackground(Color.WHITE); - c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS)); - final UIGroupExtensionPane g = new UIGroupExtensionPane(new String[]{"title1", "title2", "title3"}); - c.add(g, BorderLayout.CENTER); - JPanel pp = new JPanel(new FlowLayout()); - c.add(pp, BorderLayout.SOUTH); - UIButton test = new UIButton("add1"); - - test.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - g.addData("test111", 0); - } - }); - pp.add(test); - UIButton test2 = new UIButton("add2"); - test2.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - g.addData("test222", 1); - } - }); - pp.add(test2); - f.setSize(360, 500); - f.setLocation(200, 100); - f.setVisible(true); - } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java index 0715be73a4..960d19f9b6 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java @@ -33,6 +33,7 @@ public class ChartImageCheckOutPane extends BasicPane implements UIObserver { private static final int ICON_WIDTH = 56; private static final int ICON_HEIGHT = 50; private final ArrayList changeListeners = new ArrayList(); + private static final String CHART_ICON_PREFIX = "icon_"; public ChartImageCheckOutPane(CustomPlotType type){ this(type, false); @@ -66,8 +67,13 @@ public class ChartImageCheckOutPane extends BasicPane implements UIObserver { this.add(row(flex(), cell(checkBox)).getComponent(), BorderLayout.NORTH); } + /** + * 图表iconId注册时设置为"icon_" + 图表类型 + * @param customPlotType + * @return + */ private String getIconId(CustomPlotType customPlotType) { - return CustomPlotFactory.getTypeIconId(customPlotType); + return CHART_ICON_PREFIX + customPlotType.getType(); } public JCheckBox getCheckBox() { diff --git a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java index d655e511f1..cfc29edad3 100644 --- a/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java +++ b/designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvChooseComponent.java @@ -1,8 +1,6 @@ package com.fanruan.boot.env; -import com.fr.design.ConfigHelper; import com.fanruan.boot.key.StartupArgsShell; -import com.fr.design.mem.MemConfigRepositoryBuilder; import com.fanruan.carina.Carina; import com.fanruan.carina.annotions.FineComponent; import com.fanruan.carina.annotions.Start; @@ -15,15 +13,18 @@ import com.fanruan.config.realm.local.LocalConfigRepositoryBuilder; import com.fr.base.operator.org.OrganizationOperator; import com.fr.base.rpc.encrypt.EncryptOperator; import com.fr.decision.service.context.ServiceContext; +import com.fr.design.ConfigHelper; import com.fr.design.DesignerEnvManager; import com.fr.design.EnvChangeEntrance; import com.fr.design.PluginClassRefreshManager; +import com.fr.design.backup.DesignContext; import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.editlock.ConnectionLockChangeChecker; import com.fr.design.editlock.ServerTableDataLockChangeChecker; import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mem.MemConfigRepositoryBuilder; import com.fr.design.plugin.remind.PluginErrorDesignReminder; import com.fr.env.utils.WorkspaceUtils; import com.fr.event.Event; @@ -36,12 +37,12 @@ import com.fr.report.lock.DefaultLockInfoOperator; import com.fr.report.lock.LocalLockInfoOperator; import com.fr.report.lock.LockInfoOperator; import com.fr.report.lock.ServerLockInfoOperator; -import com.fr.design.backup.DesignContext; import com.fr.start.module.StartupArgs; import com.fr.value.NotNullLazyValue; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; +import com.fr.workspace.WorkspaceSwitchProcess; import com.fr.workspace.base.WorkspaceKey; import com.fr.workspace.pool.WorkRPCRegister; import com.fr.workspace.pool.WorkRPCType; @@ -101,6 +102,8 @@ import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanOperator; import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService; import org.jetbrains.annotations.NotNull; +import java.util.Optional; + /** * 环境选择模块 * @@ -118,10 +121,20 @@ public class DesignEnvChooseComponent extends ResourceAffiliate { BootstrapFactory.get().reboot("design_env_prepare"); // 环境切换后,等到模块重启更新一下当前的系统信息 WorkplaceConstants.updateBean(); + recordModuleStartStop(); } catch (Exception e) { throw new RuntimeException(e); } } + + private void recordModuleStartStop() { + + WorkspaceSwitchProcess process = WorkContext.getSwitcher().getProcess(); + Optional.ofNullable(process) + .ifPresent((e) -> e.recordModuleStartUsed(() -> BootstrapFactory.get().profileStart("design_env_prepare"))); + Optional.ofNullable(process) + .ifPresent((e) -> e.recordModuleStopUsed(() -> BootstrapFactory.get().profileStop("design_env_prepare"))); + } }; private Listener beforeSwitch4Max = new Listener(Integer.MAX_VALUE) { diff --git a/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java b/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java index 06459b8fe3..d77bafc3b4 100644 --- a/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java +++ b/designer-realize/src/main/java/com/fanruan/boot/pre/DesignPreStartComponent.java @@ -23,6 +23,7 @@ import com.fr.base.function.UITerminator; import com.fr.carina.util.CarinaResourceUtils; import com.fr.carina.util.provider.CarinaResourceProvider; import com.fr.design.DesignerEnvManager; +import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.deeplink.DeepLinkManager; import com.fr.design.fun.OemProcessor; import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector; @@ -236,6 +237,7 @@ public class DesignPreStartComponent { PreLoadService.getInstance().addUIFuture(initLookAndFeel); showSplash(); + DesignerLaunchStatus.setStatusAndAsyncFire(DesignerLaunchStatus.UI_PRE_INIT_COMPLETE); } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java index c0679a7053..7e1853c09e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/AuthorityToolBarPane.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; import com.fine.theme.utils.FineUIScale; +import com.formdev.flatlaf.util.ScaledEmptyBorder; import com.fr.common.inputevent.InputEventBaseOnOS; import com.fr.design.beans.BasicBeanPane; import com.fr.design.file.HistoryTemplateListPane; @@ -37,7 +38,10 @@ import java.awt.event.MouseListener; import java.util.List; import static com.fine.swing.ui.layout.Layouts.cell; +import static com.fine.swing.ui.layout.Layouts.column; +import static com.fine.swing.ui.layout.Layouts.flex; import static com.fine.swing.ui.layout.Layouts.row; +import static com.fine.theme.utils.FineUIScale.scale; /** * Author : daisy @@ -134,14 +138,14 @@ public class AuthorityToolBarPane extends BasicBeanPane extends BasicBeanPane exportPane) { - tabPaneBuilder.addTab(new ImageExportPane().getTitle(), new ImageExportPane()); - paneList.add(new ImageExportPane()); + tabPaneBuilder.addTab(exportPane.getTitle(), exportPane); + paneList.add(exportPane); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java index 33da70327f..4e7944c98e 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/ServerFitAttrPane.java @@ -79,15 +79,6 @@ public class ServerFitAttrPane extends BaseFitAttrPane { }; } - /** - * 服务器配置-PC端自适应属性面板中需要添加提示 - */ - @Override - protected void initPrompt() { - UILabel uiLabel = new UILabel(Toolkit.i18nText("Fine-Designer_Fit_Attr_Pane_Hint")); - FineUIStyle.setStyle(uiLabel, FineUIStyle.LABEL_TIP); - uiLabel.setBorder(new ScaledEmptyBorder(5, 5, 5, 0)); - contentJPanel.add(uiLabel); - } + } diff --git a/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java b/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java index 5e44ed8425..775eaf06fa 100644 --- a/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/CarinaDesigner.java @@ -10,11 +10,9 @@ import com.fanruan.gui.UiInspector; import com.fr.base.StateHubContext; import com.fr.design.backup.DesignContext; import com.fr.design.carton.SwitchForSwingChecker; - import com.fr.design.carton.latency.DesignerLatencyMetric; import com.fr.design.mainframe.DesignerUIModeConfig; import com.fr.log.FineLoggerFactory; - import com.fr.runtime.FineRuntime; import com.fr.start.common.DesignerStartupContext; import com.fr.start.module.StartupArgs; @@ -65,6 +63,7 @@ public class CarinaDesigner extends MainDesigner{ FineLoggerFactory.getLogger().info("Designer started.Time used {} ms", DesignerStartupContext.getRecorder().getTime(TimeUnit.MILLISECONDS)); DesignerStartupContext.getRecorder().stop(); + DesignerStartupMetric.getInstance().asyncSubmit(); SwitchForSwingChecker.initThreadMonitoring(); DesignerLatencyMetric.getInstance().start(); } diff --git a/designer-realize/src/main/java/com/fr/start/DesignerStartupMetric.java b/designer-realize/src/main/java/com/fr/start/DesignerStartupMetric.java new file mode 100644 index 0000000000..2dc2712799 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/start/DesignerStartupMetric.java @@ -0,0 +1,94 @@ +package com.fr.start; + +import com.fr.concurrent.FineExecutors; +import com.fr.concurrent.NamedThreadFactory; +import com.fr.design.mainframe.SiteCenterToken; +import com.fr.design.metric.AbstractDesignerMetric; +import com.fr.general.CloudCenter; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSONObject; +import com.fr.json.revise.EmbedJson; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; +import com.fr.start.common.DesignerStartupContext; +import com.fr.startup.metric.DesignerMetrics; +import com.fr.startup.metric.DesignerStartupModel; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * fbp设计器启动埋点提交 + * + * @author Bruce.Deng + * @since 11.0 + * Created on 2024/9/5 + */ +public class DesignerStartupMetric extends AbstractDesignerMetric { + + private static final String LANDING_TIME = "landingTime"; + private static final String STARTING_TIME = "startingTime"; + private static final String MODE = "mode"; + private static final String INFO = "info"; + private static volatile DesignerStartupMetric instance = new DesignerStartupMetric(); + private static final String DESIGNER_START_TABLE_SUFFIX = "record_of_fbp_designerStartTime/single"; + + private DesignerStartupMetric() { + } + + /** + * 获取单例 + */ + public static DesignerStartupMetric getInstance() { + return instance; + } + + /** + * 延迟5分钟提交埋点数据 + * + */ + public void asyncSubmit() { + ScheduledExecutorService scheduledExecutorService = FineExecutors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DesignerStartupMetricSubmit")); + scheduledExecutorService.schedule(new Runnable() { + @Override + public void run() { + collectAndSubmit(); + } + }, 5, TimeUnit.MINUTES); + scheduledExecutorService.shutdown(); + } + + private void collectAndSubmit() { + Map para = new HashMap<>(); + para.put("token", SiteCenterToken.generateToken()); + para.put("content", collect()); + try { + HttpToolbox.post(getUrl(), para); + FineLoggerFactory.getLogger().debug("[DesignerStartup] submit designer startup metric to cloud."); + } catch (Throwable t) { + FineLoggerFactory.getLogger().debug(t,"[DesignerStartup] failed to submit designer startup metric to cloud."); + } + } + + private String getUrl() { + String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint"); + String url = (StringUtils.isNotEmpty(monitorEntry) ? monitorEntry : DEFAULT_MONITOR_URL) + + DESIGNER_START_TABLE_SUFFIX; + return url; + } + + private JSONObject collect() { + JSONObject info = new JSONObject(); + DesignerMetrics designerMetrics = DesignerStartupContext.getInstance().getDesignerMetrics(); + DesignerStartupModel model = designerMetrics.getModel(); + info.put(LANDING_TIME, model.getLandingTime()); + info.put(STARTING_TIME, model.getStartingTime()); + info.put(MODE, model.getMode()); + info.put(INFO, EmbedJson.encode(model.getInfo())); + addDefaultMetric(info); + return info; + } + +}