diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 51b0ed2a7a..fdc0a46ae8 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -241,9 +241,9 @@ public class PreferencePane extends BasicPane { createLogPane(advancePane); createLanPane(generalPane); + + createStartupPagePane(generalPane); - // 先屏蔽下 - // createStartupPagePane(generalPane); createLengthPane(advancePane); createServerPane(advancePane); @@ -655,13 +655,13 @@ public class PreferencePane extends BasicPane { // ben:选择版本语言; JPanel startupPagePaneWrapper = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); - JPanel startupPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane("启动页配置"); + JPanel startupPane = FRGUIPaneFactory.createTopVerticalTitledBorderPane(Toolkit.i18nText("Fine-Design_Startup_Page_Config")); generalPane.add(startupPagePaneWrapper); startupPagePaneWrapper.add(startupPane); - startupPageEnabledCheckBox = new UICheckBox("启动设计器时,自动打开启动页"); + startupPageEnabledCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Startup_Page_Config_Check_Text")); startupPane.add(startupPageEnabledCheckBox); - UILabel descLabel = new UILabel("注意:若在远程环境下直接关闭,再次启动时,启动速度会变慢"); + UILabel descLabel = new UILabel(Toolkit.i18nText("Fine-Design_Startup_Page_Config_Desc")); descLabel.setForeground(new Color(51, 51, 52, (int)Math.round(0.5 * 255))); startupPane.add(descLabel); } @@ -854,7 +854,7 @@ public class PreferencePane extends BasicPane { previewResolutionBtnM.setEnabled(enabled); this.cloudAnalyticsDelayCheckBox.setSelected(designerEnvManager.isCloudAnalyticsDelay()); -// this.startupPageEnabledCheckBox.setSelected(designerEnvManager.isStartupPageEnabled()); + this.startupPageEnabledCheckBox.setSelected(designerEnvManager.isStartupPageEnabled()); } private int chooseCase(int sign) { @@ -921,7 +921,7 @@ public class PreferencePane extends BasicPane { vcsConfigManager.setVcsEnable(this.vcsEnableCheckBox.isSelected()); vcsConfigManager.setSaveCommit(this.saveCommitCheckBox.isSelected()); vcsConfigManager.setUseInterval(this.useIntervalCheckBox.isSelected()); -// designerEnvManager.setStartupPageEnabled(this.startupPageEnabledCheckBox.isSelected()); + designerEnvManager.setStartupPageEnabled(this.startupPageEnabledCheckBox.isSelected()); Configurations.update(new Worker() { @Override public void run() { diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignerPort.java b/designer-base/src/main/java/com/fr/design/utils/DesignerPort.java index 28ab5e4c14..b57c54fbcd 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignerPort.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignerPort.java @@ -4,7 +4,6 @@ import com.fr.common.report.ReportState; import com.fr.design.DesignerEnvManager; import com.fr.design.RestartHelper; import com.fr.design.dialog.TipDialog; -import com.fr.design.fun.DesignerPortProvider; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; @@ -18,16 +17,20 @@ import com.fr.general.IOUtils; import com.fr.process.engine.core.CarryMessageEvent; import com.fr.process.engine.core.FineProcessContext; import com.fr.stable.StringUtils; -import com.fr.stable.bridge.StableFactory; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLReadable; import com.fr.stable.xml.XMLWriter; import com.fr.stable.xml.XMLableReader; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; diff --git a/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java b/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java index 41ab4edff7..89aeedc602 100644 --- a/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java +++ b/designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java @@ -1,6 +1,7 @@ package com.fr.start.common; import com.fr.base.svg.IconUtils; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.gui.ilable.UILabel; @@ -55,6 +56,7 @@ public class DesignerOpenEmptyPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { DesignerFrame df = DesignerContext.getDesignerFrame(); + HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(null); df.addAndActivateJTemplate(); // 如果没有模板,则需要确认一下 MutilTempalteTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); diff --git a/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java b/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java index 5aae98f03e..d8caf035d3 100644 --- a/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java +++ b/designer-base/src/main/java/com/fr/start/common/DesignerStartupConfig.java @@ -20,7 +20,7 @@ public class DesignerStartupConfig implements XMLable { /** * 默认值是 false */ - private boolean enabled = false; + private boolean enabled = true; public boolean isEnabled() { return enabled; @@ -30,18 +30,17 @@ public class DesignerStartupConfig implements XMLable { this.enabled = enabled; } - @Override public Object clone() throws CloneNotSupportedException { DesignerStartupConfig config = new DesignerStartupConfig(); - config.setEnabled(true); + config.setEnabled(enabled); return config; } @Override public void readXML(XMLableReader reader) { if (reader.isAttr()) { - this.setEnabled(reader.getAttrAsBoolean("isEnabled", false)); + this.setEnabled(reader.getAttrAsBoolean("isEnabled", true)); } } diff --git a/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java b/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java index b996fbe4b7..a59711e28b 100644 --- a/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java +++ b/designer-base/src/main/java/com/fr/start/common/DesignerStartupContext.java @@ -4,6 +4,7 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceType; import com.fr.start.module.StartupArgs; +import com.fr.startup.metric.DesignerMetrics; import com.fr.startup.ui.StartupPageModel; import com.fr.third.guava.collect.Lists; import com.fr.third.org.apache.commons.lang3.time.StopWatch; @@ -28,6 +29,11 @@ public class DesignerStartupContext { */ private StartupPageModel startupPageModel; + /** + * 设计器启动埋点 + */ + private final DesignerMetrics designerMetrics = new DesignerMetrics(); + /** * 是否在起始页打开的等待过程中 */ @@ -75,6 +81,10 @@ public class DesignerStartupContext { return STOP_WATCH; } + public DesignerMetrics getDesignerMetrics() { + return designerMetrics; + } + /* 启动模式 */ /** diff --git a/designer-base/src/main/java/com/fr/startup/metric/DesignerMetrics.java b/designer-base/src/main/java/com/fr/startup/metric/DesignerMetrics.java new file mode 100644 index 0000000000..58c67079ea --- /dev/null +++ b/designer-base/src/main/java/com/fr/startup/metric/DesignerMetrics.java @@ -0,0 +1,22 @@ +package com.fr.startup.metric; + +/** + * created by Harrison on 2022/08/12 + **/ +public class DesignerMetrics { + + private DesignerStartupModel model = new DesignerStartupModel(); + + private DesignerStartupPageStatistic statistic = new DesignerStartupPageStatistic(); + + public DesignerMetrics() { + } + + public DesignerStartupModel getModel() { + return model; + } + + public DesignerStartupPageStatistic getStatistic() { + return statistic; + } +} diff --git a/designer-base/src/main/java/com/fr/startup/metric/DesignerStartupModel.java b/designer-base/src/main/java/com/fr/startup/metric/DesignerStartupModel.java new file mode 100644 index 0000000000..9c0c07315d --- /dev/null +++ b/designer-base/src/main/java/com/fr/startup/metric/DesignerStartupModel.java @@ -0,0 +1,193 @@ +package com.fr.startup.metric; + +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.manage.PluginManager; +import com.fr.stable.os.AbstractOperatingSystem; +import com.fr.stable.os.OperatingSystem; +import com.fr.start.common.DesignerStartupConfig; +import com.fr.workspace.WorkContext; + +import java.lang.management.ManagementFactory; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 设计器启动数据 + * + * created by Harrison on 2022/08/12 + **/ +public class DesignerStartupModel { + + /** + * landingTime:用户从双击图标/.bat启动等,到出现起始页的时间 + */ + private long landingTime; + + /** + * startingTime:用户从起始页进入设计器,完全可用的时间 + */ + private long startingTime; + + /** + * info:设计器环境的详细信息。记录环境信息、机器信息、远程or本地、插件信息。 + */ + private MachineInfo info; + + /** + * mode:模式,0-有设计器起动页;1-无设计器起始页 + */ + private int mode; + + public DesignerStartupModel() { + } + + public DesignerStartupModel(long landingTime, long startingTime, MachineInfo info, int mode) { + this.landingTime = landingTime; + this.startingTime = startingTime; + this.info = info; + this.mode = mode; + } + + public long getLandingTime() { + return landingTime; + } + + public void setLandingTime(long landingTime) { + this.landingTime = landingTime; + } + + public long getStartingTime() { + return startingTime; + } + + public void setStartingTime(long startingTime) { + this.startingTime = startingTime; + } + + public MachineInfo getInfo() { + return info; + } + + public void setInfo(MachineInfo info) { + this.info = info; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + private void fillInfo() { + + MachineInfo info = new MachineInfo(); + AbstractOperatingSystem operatingSystem = OperatingSystem.getOperatingSystem(); + info.setSystem(operatingSystem.getDisplayString()); + + try { + final int byteToMb = 1024 * 1024; + com.sun.management.OperatingSystemMXBean operatingSystemMXBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + long free = operatingSystemMXBean.getFreePhysicalMemorySize() / byteToMb; + long total = operatingSystemMXBean.getTotalPhysicalMemorySize() / byteToMb; + long used = total - free; + JSONObject jo = new JSONObject(); + jo.put("free", free); + jo.put("used", used); + jo.put("total", total); + info.setMachine(jo.toString()); + } catch (Exception ignored) { + } + + boolean local = WorkContext.getCurrent().isLocal(); + info.setWork(local ? 1 : 0); + + List contexts = PluginManager.getContexts(); + List contextNames = contexts.stream() + .map(PluginContext::getName) + .collect(Collectors.toList()); + JSONArray contextNameJa = new JSONArray(contextNames); + info.setPlugins(contextNameJa.toString()); + this.setInfo(info); + + } + + private void fillMode() { + + this.setMode(DesignerStartupConfig.getInstance().isEnabled() ? 0 : 1); + } + + public void fill() { + + fillInfo(); + fillMode(); + } + + private static class MachineInfo { + + /** + * 系统信息 + */ + private String system; + + /** + * 机器信息 + */ + private String machine; + + /** + * work:0-远程;1-本地; + */ + private int work; + + /** + * 插件列表 + */ + private String plugins; + + public MachineInfo() { + } + + public MachineInfo(String system, String machine, int work, String plugins) { + this.system = system; + this.machine = machine; + this.work = work; + this.plugins = plugins; + } + + public String getSystem() { + return system; + } + + public void setSystem(String system) { + this.system = system; + } + + public String getMachine() { + return machine; + } + + public void setMachine(String machine) { + this.machine = machine; + } + + public int getWork() { + return work; + } + + public void setWork(int work) { + this.work = work; + } + + public String getPlugins() { + return plugins; + } + + public void setPlugins(String plugins) { + this.plugins = plugins; + } + } +} diff --git a/designer-base/src/main/java/com/fr/startup/metric/DesignerStartupPageStatistic.java b/designer-base/src/main/java/com/fr/startup/metric/DesignerStartupPageStatistic.java new file mode 100644 index 0000000000..412ee434cf --- /dev/null +++ b/designer-base/src/main/java/com/fr/startup/metric/DesignerStartupPageStatistic.java @@ -0,0 +1,71 @@ +package com.fr.startup.metric; + +/** + * 设计器启动页使用数据 + * + * created by Harrison on 2022/08/12 + **/ +public class DesignerStartupPageStatistic { + + /** + * operate:0-双击工作目录进入 或 点击蓝色箭头进入;1-切换其他工作目录;2-点击展开全部;3-点击工作目录中的模版直接打开 或 直接点击蓝色箭头进入 + */ + private int operate; + + /** + * workplace:工作目录名称,当operate为 0或1时记录 + */ + private String workspace; + + /** + * workplaceNumber:工作目录的个数,当operate为 0或1或2或3时记录 + */ + private String workspaceNum; + + /** + * template:模板名称,当operate为 3时记录 + */ + private String template; + + public DesignerStartupPageStatistic(int operate, String workspace, String workspaceNum, String template) { + this.operate = operate; + this.workspace = workspace; + this.workspaceNum = workspaceNum; + this.template = template; + } + + public DesignerStartupPageStatistic() { + } + + public int getOperate() { + return operate; + } + + public void setOperate(int operate) { + this.operate = operate; + } + + public String getWorkspace() { + return workspace; + } + + public void setWorkspace(String workspace) { + this.workspace = workspace; + } + + public String getWorkspaceNum() { + return workspaceNum; + } + + public void setWorkspaceNum(String workspaceNum) { + this.workspaceNum = workspaceNum; + } + + public String getTemplate() { + return template; + } + + public void setTemplate(String template) { + this.template = template; + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java b/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java index 98ff33466d..1f7ba51136 100644 --- a/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/optimized/DesignerStartupPageActivator.java @@ -9,6 +9,8 @@ import com.fr.start.common.DesignerStartupContext; import com.fr.start.module.StartupArgs; import com.fr.start.util.DesignerStartupPageUtil; import com.fr.start.warmup.DesignerPreWarmTask; +import com.fr.startup.metric.DesignerMetrics; +import com.fr.startup.metric.DesignerStartupModel; import com.fr.startup.ui.StartupPageModel; import com.fr.startup.ui.StartupPageWindow; import com.fr.startup.ui.StartupWorkspaceBean; @@ -58,8 +60,8 @@ public class DesignerStartupPageActivator extends Activator { warmTask.start(); // 即时暂停 - DesignerStartupContext.getRecorder().suspend(); - + suspendRecorder(context); + UIUtil.invokeLaterIfNeeded(() -> { StartupPageModel model = StartupPageModel.create(); @@ -89,9 +91,20 @@ public class DesignerStartupPageActivator extends Activator { StartupPageWindow window = new StartupPageWindow(model); window.setVisible(true); context.setOnWaiting(true); + }); } + private void suspendRecorder(DesignerStartupContext context) { + + DesignerMetrics designerMetrics = context.getDesignerMetrics(); + DesignerStartupModel designerStartupModel = designerMetrics.getModel(); + StopWatch recorder = DesignerStartupContext.getRecorder(); + recorder.suspend(); + long time = recorder.getTime(TimeUnit.MILLISECONDS); + designerStartupModel.setLandingTime(time); + } + private void handleModel(StartupPageModel model) { // 将选中的环境设置为当前环境 @@ -118,12 +131,21 @@ public class DesignerStartupPageActivator extends Activator { UIUtil.invokeLaterIfNeeded(() -> { // 换到 awt 线程中关闭,不然异步会出现问题。 DesignerStartupContext.getInstance().setOnStartup(false); + recordStartupEnd(stopWatch); }); } - + FineLoggerFactory.getLogger().debug("designer-startup-page started cost {} ms", DesignerStartupContext.getRecorder().getTime(TimeUnit.MILLISECONDS)); } + private void recordStartupEnd(StopWatch stopWatch) { + + DesignerMetrics designerMetrics = DesignerStartupContext.getInstance().getDesignerMetrics(); + DesignerStartupModel model = designerMetrics.getModel(); + model.setStartingTime(stopWatch.getTime(TimeUnit.MILLISECONDS)); + model.fill(); + } + @Override public void stop() {