* commit 'af36a7a6dfb3b02d2c3819928cc8c50e34ecadb2': REPORT-51360 设计器通行证和finedb里的区分开,对不支持jxbrowser的系统做兼容处理 REPORT-51360 新增模板商城toast提示 兼容处理 REPORT-51360 【10.0.17】设计器用户登录策略调整 KERNEL-7634 mac和win使用不同版本的jxbrowser CHART-19475 条件属性的标签固定宽度 REPORT-51958 远程环境检测及同步 REPORT-53019 字体检查国际化显示不全 REPORT-53328 && REPORT-53314 交互修改 REPORT-53305 去掉匿名内部类对象 隐式持有的外层对象字段 REPORT-51958 远程环境检测及同步 REPORT-51958 远程环境检测及同步 REPORT-51958 远程环境检测及同步 REPORT-51958 远程环境检测及同步 REPORT-51958 远程环境检测及同步 REPORT-51958 远程环境检测及同步 REPORT-51958 远程环境检测及同步 REPORT-51958 远程环境检测及同步 KERNEL-7974 看下新的控件式组件做成插件支持需要开放什么接口feature/big-screen
@ -0,0 +1,339 @@
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.env.DesignerWorkspaceInfo; |
||||
import com.fr.design.env.DesignerWorkspaceType; |
||||
import com.fr.design.env.RemoteWorkspace; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.env.VersionCheckMessageDialog; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.invoke.Reflect; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.locale.InterProviderFactory; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.context.PluginMarker; |
||||
import com.fr.plugin.manage.PluginManager; |
||||
import com.fr.plugin.manage.control.PluginControllerHelper; |
||||
import com.fr.plugin.manage.control.PluginTaskCallback; |
||||
import com.fr.plugin.manage.control.PluginTaskResult; |
||||
import com.fr.plugin.manage.control.ProgressCallback; |
||||
import com.fr.rpc.Result; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.base.WorkspaceAPI; |
||||
import com.fr.workspace.connect.WorkspaceConnectionInfo; |
||||
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 java.lang.reflect.Method; |
||||
import java.text.ParsePosition; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.ArrayList; |
||||
import java.util.Date; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.concurrent.CountDownLatch; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
/** |
||||
* @author pengda |
||||
* @version 10.0 |
||||
* Created on 2021-06-02 |
||||
*/ |
||||
public class VersionCheckUtils { |
||||
public static final String INCONSISTENCY = "inconsistency"; |
||||
public static final String MISSING = "missing"; |
||||
private static final String ID = "id"; |
||||
private static final String VERSION = "version"; |
||||
private static final String NAME = "name"; |
||||
|
||||
|
||||
public static boolean versionCheck(String envName) { |
||||
return checkLocalAndRemoteJartime(envName) && checkLocalAndRemotePlugin().size() == 0; |
||||
} |
||||
|
||||
public static boolean versionCheck(DesignerWorkspaceInfo selectedEnv) { |
||||
return checkLocalAndRemoteJartime(selectedEnv) && checkLocalAndRemotePlugin().size() == 0; |
||||
} |
||||
|
||||
public static void showVersionCheckDialog(String envName) { |
||||
if (!VersionCheckUtils.versionCheck(envName)) { |
||||
VersionCheckMessageDialog versionCheckMessageDialog = new VersionCheckMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Sync_Check_Brief_Info"), envName); |
||||
versionCheckMessageDialog.setVisible(true); |
||||
} |
||||
} |
||||
|
||||
public static boolean checkLocalAndRemoteJartime(String envName) { |
||||
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
||||
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); |
||||
return checkLocalAndRemoteJartime(selectedEnv); |
||||
} |
||||
|
||||
public static boolean checkLocalAndRemoteJartime(DesignerWorkspaceInfo selectedEnv) { |
||||
//是否需要做服务校验
|
||||
if (needCheckBranch(selectedEnv)) { |
||||
String localBranch; |
||||
String remoteBranch = getRemoteBranch(selectedEnv); |
||||
localBranch = GeneralUtils.readFullBuildNO(); |
||||
//通过是否包含#来避免当前版本为非安装版本(主要是内部开发版本)
|
||||
if (localBranch.contains("#") && ComparatorUtils.equals(localBranch, remoteBranch)) { |
||||
//说明版本一致,仅做日志记录
|
||||
FineLoggerFactory.getLogger().info("Remote Designer version consistency"); |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
public static List<String> getNoExistServiceDescription(String envName) { |
||||
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
||||
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); |
||||
WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); |
||||
List<String> noExistServiceDescription = new ArrayList<>(); |
||||
Set<Class> noExistServiceSet = getNoExistServiceSet(connectionInfo); |
||||
for (Class clazz : noExistServiceSet) { |
||||
WorkspaceAPI workspaceAPI = (WorkspaceAPI) clazz.getAnnotation(WorkspaceAPI.class); |
||||
if (workspaceAPI == null) { |
||||
FineLoggerFactory.getLogger().info("workspace service {} get annotation failed", clazz); |
||||
continue; |
||||
} |
||||
if (workspaceAPI.ignore()) { |
||||
continue; |
||||
} |
||||
String descriptionOfCN = InterProviderFactory.getProvider().getLocText(workspaceAPI.description()); |
||||
noExistServiceDescription.add(descriptionOfCN); |
||||
} |
||||
return noExistServiceDescription; |
||||
} |
||||
|
||||
public static String getRemoteBranch(String envName) { |
||||
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); |
||||
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); |
||||
return getRemoteBranch(selectedEnv); |
||||
} |
||||
|
||||
public static String getRemoteBranch(DesignerWorkspaceInfo selectedEnv) { |
||||
String remoteBranch = StringUtils.EMPTY; |
||||
WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); |
||||
try { |
||||
remoteBranch = new FunctionalHttpRequest(connectionInfo).getServerBranch(); |
||||
} catch (WorkspaceConnectionException e) { |
||||
remoteBranch = Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Branch_Is_Old") + formatBranch(GeneralUtils.readFullBuildNO()); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return remoteBranch; |
||||
} |
||||
|
||||
/** |
||||
* 获取不存在的服务列表 |
||||
* |
||||
* @param info 环境连接信息 |
||||
* @return 以Set形式返回不存在的服务 |
||||
*/ |
||||
public static Set<Class> getNoExistServiceSet(WorkspaceConnectionInfo info) { |
||||
Set<Class> noExistServiceSet = new HashSet<Class>(); |
||||
Set<Class> remoteServiceSet = new HashSet<Class>(); |
||||
Set<Class> localServiceSet = FineObjectPool.getInstance().getServerPool().keySet(); |
||||
|
||||
try { |
||||
JSONArray serviceArray = new FunctionalHttpRequest(info).getServiceList(); |
||||
for (int i = 0; i < serviceArray.size(); i++) { |
||||
try { |
||||
Class clazz = Class.forName((String) serviceArray.get(i)); |
||||
remoteServiceSet.add(clazz); |
||||
} catch (Exception e) { |
||||
continue; |
||||
} |
||||
} |
||||
noExistServiceSet.addAll(localServiceSet); |
||||
noExistServiceSet.removeAll(remoteServiceSet); |
||||
return noExistServiceSet; |
||||
} catch (WorkspaceConnectionException e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
//根据本地的服务列表做逐一检测
|
||||
for (Class clazz : localServiceSet) { |
||||
Method testMethod = Reflect.on(Method.class).create(clazz, "connectTest", new Class[0], String.class, new Class[0], 1025, 8, null, null, null, null).get(); |
||||
WorkspaceProxyPool proxyPool = (WorkspaceProxyPool) (((RemoteWorkspace) WorkContext.getCurrent()).getClient()).getPool(); |
||||
Result result = proxyPool.testInvoker(testMethod); |
||||
Exception invokeException = (Exception) result.getException(); |
||||
if (invokeException != null) { |
||||
Exception cause = (Exception) invokeException.getCause(); |
||||
//获取被包装最底层的异常
|
||||
while (cause != null) { |
||||
invokeException = cause; |
||||
cause = (Exception) invokeException.getCause(); |
||||
} |
||||
//该异常表示服务不存在
|
||||
if (invokeException instanceof ClassNotFoundException) { |
||||
noExistServiceSet.add(clazz); |
||||
} |
||||
} |
||||
} |
||||
return noExistServiceSet; |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
return noExistServiceSet; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 格式化分支版本号 |
||||
* |
||||
* @param buildNO 初始的分支版本号 |
||||
* @return 格式化后的版本号 |
||||
*/ |
||||
private static String formatBranch(String buildNO) { |
||||
Date jarDate = (new SimpleDateFormat("yyyy.MM.dd")).parse(buildNO, new ParsePosition(buildNO.indexOf("-") + 1)); |
||||
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); |
||||
return df.format(jarDate); |
||||
} |
||||
|
||||
private static boolean needCheckBranch(DesignerWorkspaceInfo selectedEnv) { |
||||
if (selectedEnv.getType() == DesignerWorkspaceType.Remote) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static JSONArray checkLocalAndRemotePlugin() { |
||||
JSONArray differentPlugins = new JSONArray(); |
||||
JSONArray remotePlugins = FRContext.getCommonOperator().getPluginStatus(); |
||||
Map<String, PluginContext> localPluginsMap = new HashMap<>(); |
||||
List<PluginContext> localPlugins = PluginManager.getContexts(); |
||||
for (PluginContext pluginContext : localPlugins) { |
||||
localPluginsMap.put(pluginContext.getID(), pluginContext); |
||||
} |
||||
JSONObject remotePlugin; |
||||
for (int i = 0; i < remotePlugins.size(); i++) { |
||||
remotePlugin = remotePlugins.getJSONObject(i); |
||||
if (localPluginsMap.containsKey(remotePlugin.getString(ID))) { |
||||
if (ComparatorUtils.equals(localPluginsMap.get(remotePlugin.getString(ID)).getVersion(), remotePlugin.getString(VERSION))) { |
||||
continue; |
||||
} else { |
||||
if (remotePlugin.getString(NAME) == null) { |
||||
remotePlugin.put(NAME, localPluginsMap.get(remotePlugin.getString(ID)).getName()); |
||||
} |
||||
remotePlugin.put("type", INCONSISTENCY); |
||||
} |
||||
} |
||||
remotePlugin.put("type", MISSING); |
||||
if (remotePlugin.getString(NAME) == null) { |
||||
remotePlugin.put(NAME, remotePlugin.getString("id")); |
||||
} |
||||
differentPlugins.put(remotePlugin); |
||||
} |
||||
return differentPlugins; |
||||
} |
||||
|
||||
public static JSONArray syncPlugins(JSONArray differentPlugins) { |
||||
Set<String> uninstallFailed = uninstallPlugins(differentPlugins); |
||||
List<PluginMarker> plugins = getSyncPlugins(differentPlugins, uninstallFailed); |
||||
installPlugins(plugins); |
||||
return getPluginsSyncFailed(differentPlugins); |
||||
} |
||||
|
||||
private static List<PluginMarker> getSyncPlugins(JSONArray differentPlugins, Set<String> uninstallFailed) { |
||||
JSONObject differentPlugin; |
||||
String id; |
||||
String version; |
||||
List<PluginMarker> plugins = new ArrayList<>(); |
||||
if (differentPlugins != null) { |
||||
for (int i = 0; i < differentPlugins.size(); i++) { |
||||
differentPlugin = differentPlugins.getJSONObject(i); |
||||
id = differentPlugin.getString(ID); |
||||
if (uninstallFailed.contains(id)) { |
||||
continue; |
||||
} |
||||
version = differentPlugin.getString(VERSION); |
||||
plugins.add(PluginMarker.create(id, version)); |
||||
} |
||||
} |
||||
return plugins; |
||||
} |
||||
|
||||
private static Set<String> uninstallPlugins(JSONArray differentPlugins) { |
||||
Set<PluginMarker> pluginsNeedUninstall = new HashSet<>(); |
||||
Map<String, PluginContext> localPluginsMap = new HashMap<>(); |
||||
List<PluginContext> localPlugins = PluginManager.getContexts(); |
||||
for (PluginContext pluginContext : localPlugins) { |
||||
localPluginsMap.put(pluginContext.getID(), pluginContext); |
||||
} |
||||
for (int i = 0; i < differentPlugins.size(); i++) { |
||||
String id = differentPlugins.getJSONObject(i).getString(ID); |
||||
if (localPluginsMap.containsKey(id)) { |
||||
pluginsNeedUninstall.add(localPluginsMap.get(id).getMarker()); |
||||
} |
||||
} |
||||
Set<String> uninstallFailedID = new HashSet<>(); |
||||
CountDownLatch latch = new CountDownLatch(pluginsNeedUninstall.size()); |
||||
for (PluginMarker pluginMarker : pluginsNeedUninstall) { |
||||
PluginManager.getController().uninstall(pluginMarker, true, new PluginTaskCallback() { |
||||
@Override |
||||
public void done(PluginTaskResult result) { |
||||
latch.countDown(); |
||||
if (!result.isSuccess()) { |
||||
uninstallFailedID.add(pluginMarker.getPluginID()); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
try { |
||||
latch.await(5000, TimeUnit.MILLISECONDS); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return uninstallFailedID; |
||||
} |
||||
|
||||
private static JSONArray getPluginsSyncFailed(JSONArray differentPlugins){ |
||||
JSONArray pluginsNeedSync = JSONArray.create(); |
||||
List<PluginContext> localPlugins = PluginManager.getContexts(); |
||||
Map<String, String> localPluginsInfo = new HashMap<>(); |
||||
for (int i = 0; i < localPlugins.size(); i++) { |
||||
localPluginsInfo.put(localPlugins.get(i).getID(), localPlugins.get(i).getVersion()); |
||||
} |
||||
for (int i = 0; i < differentPlugins.size(); i++) { |
||||
JSONObject plugin = differentPlugins.getJSONObject(i); |
||||
String id = plugin.getString(ID); |
||||
if (localPluginsInfo.containsKey(id) && ComparatorUtils.equals(plugin.getString(VERSION), localPluginsInfo.get(id))) { |
||||
continue; |
||||
} |
||||
pluginsNeedSync.add(plugin); |
||||
} |
||||
return pluginsNeedSync; |
||||
} |
||||
|
||||
private static void installPlugins(List<PluginMarker> plugins) { |
||||
CountDownLatch latch = new CountDownLatch(plugins.size()); |
||||
for (int i = 0; i < plugins.size(); i++) { |
||||
PluginControllerHelper.installOnline(plugins.get(i), new ProgressCallback() { |
||||
@Override |
||||
public void updateProgress(String description, double progress) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void done(PluginTaskResult result) { |
||||
latch.countDown(); |
||||
} |
||||
}); |
||||
} |
||||
try { |
||||
latch.await(); |
||||
} catch (InterruptedException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
|
||||
} |
||||
} |
@ -1,54 +1,43 @@
|
||||
package com.fr.design.actions.community; |
||||
|
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.login.AbstractDesignerSSO; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
|
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.CloudCenter; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
public class BBSAction extends AbstractDesignerSSO { |
||||
|
||||
public class BBSAction extends UpdateAction |
||||
{ |
||||
|
||||
public BBSAction() { |
||||
this.setMenuKeySet(BBS); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/bbs"); |
||||
|
||||
public BBSAction() |
||||
{ |
||||
this.setMenuKeySet(BBS); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/bbs"); |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 动作 |
||||
* @param arg0 事件 |
||||
*/ |
||||
@Override |
||||
public void actionPerformed(ActionEvent arg0) |
||||
{ |
||||
String url = CloudCenter.getInstance().acquireUrlByKind("bbs"); |
||||
BrowseUtils.browser(url); |
||||
public String getJumpUrl() { |
||||
return CloudCenter.getInstance().acquireUrlByKind("bbs"); |
||||
} |
||||
public static final MenuKeySet BBS = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'B'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Bbs"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
public static final MenuKeySet BBS = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'B'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Bbs"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
@ -1,50 +1,42 @@
|
||||
package com.fr.design.actions.community; |
||||
|
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.login.AbstractDesignerSSO; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.CloudCenter; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
public class BugAction extends AbstractDesignerSSO { |
||||
|
||||
public class BugAction extends UpdateAction |
||||
{ |
||||
public BugAction() { |
||||
this.setMenuKeySet(BUG); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/bug"); |
||||
} |
||||
|
||||
public BugAction() |
||||
{ this.setMenuKeySet(BUG); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/bug"); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent arg0) |
||||
{ |
||||
String url = CloudCenter.getInstance().acquireUrlByKind("bbs.bugs"); |
||||
BrowseUtils.browser(url); |
||||
@Override |
||||
public String getJumpUrl() { |
||||
return CloudCenter.getInstance().acquireUrlByKind("bbs.bugs"); |
||||
} |
||||
|
||||
} |
||||
public static final MenuKeySet BUG = new MenuKeySet() { |
||||
public static final MenuKeySet BUG = new MenuKeySet() { |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Bug"); |
||||
} |
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Bug"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public char getMnemonic() |
||||
{ |
||||
@Override |
||||
public char getMnemonic() { |
||||
|
||||
return 'U'; |
||||
} |
||||
}; |
||||
return 'U'; |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
@ -1,49 +1,41 @@
|
||||
package com.fr.design.actions.community; |
||||
|
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.login.AbstractDesignerSSO; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.CloudCenter; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public class NeedAction extends UpdateAction |
||||
{ |
||||
|
||||
public NeedAction() |
||||
{ |
||||
this.setMenuKeySet(NEED); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/need"); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent arg0) |
||||
{ |
||||
String url = CloudCenter.getInstance().acquireUrlByKind("bbs.needs"); |
||||
BrowseUtils.browser(url); |
||||
|
||||
} |
||||
public static final MenuKeySet NEED = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'N'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Commuinity_Need"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
public class NeedAction extends AbstractDesignerSSO { |
||||
|
||||
public NeedAction() { |
||||
this.setMenuKeySet(NEED); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/need"); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getJumpUrl() { |
||||
return CloudCenter.getInstance().acquireUrlByKind("bbs.needs"); |
||||
} |
||||
|
||||
public static final MenuKeySet NEED = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'N'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Commuinity_Need"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
@ -1,49 +1,41 @@
|
||||
package com.fr.design.actions.community; |
||||
|
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.login.AbstractDesignerSSO; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
|
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.CloudCenter; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public class SignAction extends UpdateAction |
||||
{ |
||||
|
||||
public SignAction() |
||||
{ |
||||
this.setMenuKeySet(SIGN); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/sign"); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent arg0) |
||||
{ |
||||
String url = CloudCenter.getInstance().acquireUrlByKind("bbs.aut"); |
||||
BrowseUtils.browser(url); |
||||
|
||||
} |
||||
public static final MenuKeySet SIGN = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'S'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_sign"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
public class SignAction extends AbstractDesignerSSO { |
||||
|
||||
public SignAction() { |
||||
this.setMenuKeySet(SIGN); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/sign"); |
||||
} |
||||
|
||||
@Override |
||||
public String getJumpUrl() { |
||||
return CloudCenter.getInstance().acquireUrlByKind("bbs.aut"); |
||||
} |
||||
|
||||
public static final MenuKeySet SIGN = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'S'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_sign"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
@ -1,69 +1,41 @@
|
||||
package com.fr.design.actions.community; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.login.AbstractDesignerSSO; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.KeyStroke; |
||||
import java.awt.Desktop; |
||||
import java.awt.event.ActionEvent; |
||||
import java.io.IOException; |
||||
import java.net.URI; |
||||
import java.net.URISyntaxException; |
||||
|
||||
public class UpAction extends UpdateAction |
||||
{ |
||||
public class UpAction extends AbstractDesignerSSO { |
||||
|
||||
public UpAction() |
||||
{ |
||||
this.setMenuKeySet(UPDATE); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/update.png")); |
||||
|
||||
} |
||||
public UpAction() { |
||||
this.setMenuKeySet(UPDATE); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/update.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent arg0) |
||||
{ |
||||
String url = CloudCenter.getInstance().acquireUrlByKind("bbs.update"); |
||||
if (StringUtils.isEmpty(url)) { |
||||
FineLoggerFactory.getLogger().info("The URL is empty!"); |
||||
return; |
||||
} |
||||
try { |
||||
Desktop.getDesktop().browse(new URI(url)); |
||||
} catch (IOException exp) { |
||||
FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Set_Default_Browser")); |
||||
FineLoggerFactory.getLogger().error(exp.getMessage(), exp); |
||||
} catch (URISyntaxException exp) { |
||||
FineLoggerFactory.getLogger().error(exp.getMessage(), exp); |
||||
} catch (Exception exp) { |
||||
FineLoggerFactory.getLogger().error(exp.getMessage(), exp); |
||||
FineLoggerFactory.getLogger().error("Can not open the browser for URL: " + url); |
||||
} |
||||
|
||||
public String getJumpUrl() { |
||||
return CloudCenter.getInstance().acquireUrlByKind("bbs.update"); |
||||
} |
||||
public static final MenuKeySet UPDATE = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'U'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Update"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
public static final MenuKeySet UPDATE = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'U'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Update"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
@ -1,49 +1,43 @@
|
||||
package com.fr.design.actions.community; |
||||
|
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.locale.impl.VideoMark; |
||||
import com.fr.design.login.AbstractDesignerSSO; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.locale.LocaleCenter; |
||||
import com.fr.general.locale.LocaleMark; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public class VideoAction extends AbstractDesignerSSO { |
||||
|
||||
public class VideoAction extends UpdateAction |
||||
{ |
||||
|
||||
public VideoAction() |
||||
{ |
||||
this.setMenuKeySet(VIDEO); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/video"); |
||||
} |
||||
public VideoAction() { |
||||
this.setMenuKeySet(VIDEO); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/bbs/video"); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent arg0) |
||||
{ |
||||
public String getJumpUrl() { |
||||
LocaleMark<String> localeMark = LocaleCenter.getMark(VideoMark.class); |
||||
BrowseUtils.browser(localeMark.getValue()); |
||||
return localeMark.getValue(); |
||||
} |
||||
public static final MenuKeySet VIDEO = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'V'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Video"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
public static final MenuKeySet VIDEO = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'V'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_Video"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
@ -1,8 +1,10 @@
|
||||
package com.fr.design.extra; |
||||
|
||||
import com.fr.design.login.DesignerLoginSource; |
||||
|
||||
/** |
||||
* Created by lp on 2016/8/16. |
||||
*/ |
||||
public interface LoginContextListener { |
||||
void showLoginContext(); |
||||
void showLoginContext(DesignerLoginSource source); |
||||
} |
||||
|
@ -0,0 +1,92 @@
|
||||
package com.fr.design.login; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.os.impl.SupportOSImpl; |
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.log.MessageFormatter; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.org.bouncycastle.util.encoders.Hex; |
||||
import java.awt.event.ActionEvent; |
||||
import java.security.SecureRandom; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
import javax.crypto.Cipher; |
||||
import javax.crypto.spec.IvParameterSpec; |
||||
import javax.crypto.spec.SecretKeySpec; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/6/7 |
||||
*/ |
||||
public abstract class AbstractDesignerSSO extends UpdateAction { |
||||
|
||||
private static final String PRODUCT_FINEREPORT = "product-finereport"; |
||||
|
||||
private static final String KEY = "i7hP48WAcuTrmxfN"; |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent event) { |
||||
String url = getJumpUrl(); |
||||
if (!SupportOSImpl.DESIGNER_LOGIN.support()) { |
||||
BrowseUtils.browser(url); |
||||
return; |
||||
} |
||||
DesignerEnvManager manager = DesignerEnvManager.getEnvManager(); |
||||
int uid = manager.getDesignerLoginUid(); |
||||
if (uid > 0) { |
||||
String ssoUrl = CloudCenter.getInstance().acquireUrlByKind("designer.sso.api", "https://id.fanruan.com/api/app/?code={}&referrer={}"); |
||||
try { |
||||
String code = generateLoginCode(); |
||||
MessageFormatter.FormattingTuple tuple = MessageFormatter.arrayFormat(ssoUrl, new String[]{code, url}); |
||||
BrowseUtils.browser(tuple.getMessage()); |
||||
} catch (Exception e) { |
||||
BrowseUtils.browser(url); |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} else { |
||||
boolean loginRemindBeforeJumpBBS = manager.isLoginRemindBeforeJumpBBS(); |
||||
if (loginRemindBeforeJumpBBS) { |
||||
Map<String, String> params = new HashMap<>(); |
||||
params.put("bbsJumpUrl", url); |
||||
DesignerLoginHelper.showLoginDialog(DesignerLoginSource.BBS_JUMP, params); |
||||
manager.setLoginRemindBeforeJumpBBS(false); |
||||
} else { |
||||
BrowseUtils.browser(url); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private String generateLoginCode() throws Exception { |
||||
DesignerEnvManager manager = DesignerEnvManager.getEnvManager(); |
||||
JSONObject jo = JSONObject.create(); |
||||
jo.put("uid", manager.getDesignerLoginUid()); |
||||
jo.put("username", manager.getDesignerLoginUsername()); |
||||
jo.put("source", PRODUCT_FINEREPORT); |
||||
byte[] iv = randomIv(); |
||||
return new String(Hex.encode(iv)) + encrypt(jo.toString(), KEY.getBytes(), iv); |
||||
} |
||||
|
||||
private static byte[] randomIv() { |
||||
byte[] salt = new byte[16]; |
||||
SecureRandom secureRandom = new SecureRandom(); |
||||
secureRandom.setSeed(System.currentTimeMillis()); |
||||
secureRandom.nextBytes(salt); |
||||
return salt; |
||||
} |
||||
|
||||
public static String encrypt(String content, byte[] key, byte[] iv) throws Exception { |
||||
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); |
||||
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding"); |
||||
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); |
||||
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); |
||||
byte[] resultBytes = cipher.doFinal(content.getBytes()); |
||||
return new String(Hex.encode(resultBytes)); |
||||
} |
||||
|
||||
public abstract String getJumpUrl(); |
||||
} |
@ -0,0 +1,280 @@
|
||||
package com.fr.design.login; |
||||
|
||||
import com.fr.design.bridge.exec.JSBridge; |
||||
import com.fr.design.bridge.exec.JSCallback; |
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.gui.ilable.ActionLabel; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.locale.impl.BbsResetMark; |
||||
import com.fr.design.login.executor.DesignerLoginBrowserExecutor; |
||||
import com.fr.design.login.executor.DesignerLoginExecutor; |
||||
import com.fr.design.login.executor.DesignerSendCaptchaExecutor; |
||||
import com.fr.design.login.executor.DesignerSmsLoginExecutor; |
||||
import com.fr.design.login.executor.DesignerSmsRegisterExecutor; |
||||
import com.fr.design.login.task.DesignerLoginTaskWorker; |
||||
import com.fr.design.mainframe.toast.DesignerToastMsgUtil; |
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.locale.LocaleCenter; |
||||
import com.fr.general.locale.LocaleMark; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.teamdev.jxbrowser.chromium.Browser; |
||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
||||
import com.teamdev.jxbrowser.chromium.JSObject; |
||||
import java.awt.Desktop; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.net.URI; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerLoginBridge { |
||||
|
||||
private Map<String, String> params; |
||||
|
||||
public static DesignerLoginBridge getBridge(Browser browser, Map<String, String> params) { |
||||
return new DesignerLoginBridge(browser, params); |
||||
} |
||||
|
||||
private JSObject window; |
||||
|
||||
private DesignerLoginBridge(Browser browser, Map<String, String> params) { |
||||
this.params = params; |
||||
this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); |
||||
Set<Map.Entry<String, String>> entries = params.entrySet(); |
||||
for (Map.Entry<String, String> entry : entries) { |
||||
this.window.setProperty(entry.getKey(), entry.getValue()); |
||||
} |
||||
} |
||||
|
||||
@JSBridge |
||||
public String i18nText(String key) { |
||||
return Toolkit.i18nText(key); |
||||
} |
||||
|
||||
@JSBridge |
||||
public void closeWindow(boolean loginSuccess) { |
||||
DesignerLoginSource source = DesignerLoginSource.valueOf(Integer.parseInt(params.get("designerLoginSource"))); |
||||
if (loginSuccess) { |
||||
if (source == DesignerLoginSource.GUIDE) { |
||||
DesignerToastMsgUtil.toastPrompt( |
||||
getHyperlinkPane( |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Title"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Guide_Login_Success_Hyperlink_Text"), |
||||
CloudCenter.getInstance().acquireUrlByKind("designer.premium.template", "https://market.fanruan.com/template") |
||||
) |
||||
); |
||||
} else if (source == DesignerLoginSource.BBS_JUMP) { |
||||
String bbsJumpUrl = params.get("bbsJumpUrl"); |
||||
BrowseUtils.browser(bbsJumpUrl); |
||||
} |
||||
DesignerLoginHelper.closeWindow(); |
||||
return; |
||||
} |
||||
if (source == DesignerLoginSource.SWITCH_ACCOUNT) { |
||||
DesignerLoginHelper.closeWindow(); |
||||
return; |
||||
} |
||||
if (source == DesignerLoginSource.BBS_JUMP) { |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
String bbsJumpUrl = params.get("bbsJumpUrl"); |
||||
String[] options = new String[]{ |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_BBS_Go_Directly"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Return_Login") |
||||
}; |
||||
int rv = FineJOptionPane.showConfirmDialog( |
||||
DesignerLoginHelper.getDialog(), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_BBS_Quit_Tip"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), |
||||
JOptionPane.OK_CANCEL_OPTION, |
||||
JOptionPane.WARNING_MESSAGE, |
||||
null, |
||||
options, |
||||
options[1] |
||||
); |
||||
if (rv == JOptionPane.YES_OPTION) { |
||||
BrowseUtils.browser(bbsJumpUrl); |
||||
DesignerLoginHelper.closeWindow(); |
||||
} |
||||
} |
||||
}); |
||||
} else { |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
String[] options = new String[]{ |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Quit"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Return_Login") |
||||
}; |
||||
int rv = FineJOptionPane.showConfirmDialog( |
||||
DesignerLoginHelper.getDialog(), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Quit_Tip"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), |
||||
JOptionPane.OK_CANCEL_OPTION, |
||||
JOptionPane.WARNING_MESSAGE, |
||||
null, |
||||
options, |
||||
options[1] |
||||
); |
||||
if (rv == JOptionPane.OK_OPTION) { |
||||
DesignerLoginHelper.closeWindow(); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 服务条款 |
||||
*/ |
||||
@JSBridge |
||||
public void serviceHref() { |
||||
try { |
||||
String url = CloudCenter.getInstance().acquireUrlByKind("designer.bbs.service.terms", "https://bbs.fanruan.com/thread-102821-1-1.html"); |
||||
Desktop.getDesktop().browse(new URI(url)); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 忘记密码 |
||||
*/ |
||||
@JSBridge |
||||
public void forgetHref() { |
||||
try { |
||||
LocaleMark<String> resetMark = LocaleCenter.getMark(BbsResetMark.class); |
||||
Desktop.getDesktop().browse(new URI(resetMark.getValue())); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 设计器端的用户登录 |
||||
* |
||||
* @param username 用户名 |
||||
* @param password 密码 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void normalLogin(String username, String password, final JSFunction callback) { |
||||
DesignerLoginTaskWorker<Void> worker = new DesignerLoginTaskWorker<>( |
||||
new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), |
||||
new DesignerLoginExecutor(username, password)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 发送短信验证码 |
||||
* |
||||
* @param regionCode 区号 |
||||
* @param phone 手机 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void sendCaptcha(String regionCode, String phone, final JSFunction callback) { |
||||
DesignerLoginTaskWorker<Void> worker = new DesignerLoginTaskWorker<>( |
||||
new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), |
||||
new DesignerSendCaptchaExecutor(regionCode, phone)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 设计器端的短信登录 |
||||
* |
||||
* @param regionCode 区号 |
||||
* @param phone 手机 |
||||
* @param code 验证码 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void smsLogin(String regionCode, String phone, String code, final JSFunction callback) { |
||||
DesignerLoginTaskWorker<Void> worker = new DesignerLoginTaskWorker<>( |
||||
new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), |
||||
new DesignerSmsLoginExecutor(regionCode, phone, code)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 设计器端的用户注册 |
||||
* |
||||
* @param regionCode 区号 |
||||
* @param phone 手机 |
||||
* @param password 密码 |
||||
* @param regToken 注册令牌 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void smsRegister(String regionCode, String phone, String password, String regToken, final JSFunction callback) { |
||||
DesignerLoginTaskWorker<Void> worker = new DesignerLoginTaskWorker<>( |
||||
new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), |
||||
new DesignerSmsRegisterExecutor(regionCode, phone, password, regToken)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 使用系统浏览器打开网页 |
||||
* |
||||
* @param url 要打开的网页 |
||||
*/ |
||||
@JSBridge |
||||
public void openShopUrlAtWebBrowser(String url) { |
||||
if (Desktop.isDesktopSupported()) { |
||||
try { |
||||
//创建一个URI实例,注意不是URL
|
||||
URI uri = URI.create(url); |
||||
//获取当前系统桌面扩展
|
||||
Desktop desktop = Desktop.getDesktop(); |
||||
//判断系统桌面是否支持要执行的功能
|
||||
if (desktop.isSupported(Desktop.Action.BROWSE)) { |
||||
//获取系统默认浏览器打开链接
|
||||
desktop.browse(uri); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 调整面板大小 |
||||
* |
||||
* @param width 宽 |
||||
* @param height 高 |
||||
*/ |
||||
@JSBridge |
||||
public void resize(int width, int height) { |
||||
DesignerLoginHelper.getDialog().setSize(width, height); |
||||
} |
||||
|
||||
private JPanel getHyperlinkPane(String title, String hyperlinkText, String hyperlink) { |
||||
ActionLabel actionLabel = new ActionLabel(hyperlinkText); |
||||
actionLabel.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
try { |
||||
Desktop.getDesktop().browse(new URI(hyperlink)); |
||||
} catch (Exception ignore) { |
||||
} |
||||
} |
||||
}); |
||||
JPanel panel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
panel.add(new UILabel(title)); |
||||
panel.add(actionLabel); |
||||
return panel; |
||||
} |
||||
} |
@ -0,0 +1,104 @@
|
||||
package com.fr.design.login; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.extra.WebViewDlgHelper; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.os.impl.SupportOSImpl; |
||||
import com.fr.design.update.ui.dialog.UpdateMainDialog; |
||||
import com.fr.general.GeneralContext; |
||||
import java.awt.Dialog; |
||||
import java.awt.Frame; |
||||
import java.awt.Window; |
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.WindowConstants; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerLoginHelper { |
||||
|
||||
private static final String MAIN_RESOURCE_PATH = "/com/fr/design/login/login.html"; |
||||
private static final String JXBROWSER = "com.teamdev.jxbrowser.chromium.Browser"; |
||||
|
||||
private static UIDialog dialog = null; |
||||
|
||||
public static String getMainResourcePath() { |
||||
return MAIN_RESOURCE_PATH; |
||||
} |
||||
|
||||
public static UIDialog getDialog() { |
||||
return dialog; |
||||
} |
||||
|
||||
public static void showLoginDialog(DesignerLoginSource source) { |
||||
showLoginDialog(source, new HashMap<>()); |
||||
} |
||||
|
||||
public static void showLoginDialog(DesignerLoginSource source, Map<String, String> params) { |
||||
showLoginDialog(source, params, DesignerContext.getDesignerFrame()); |
||||
} |
||||
|
||||
public static void showLoginDialog(DesignerLoginSource source, Map<String, String> params, Window window) { |
||||
if (!SupportOSImpl.DESIGNER_LOGIN.support()) { |
||||
WebViewDlgHelper.createLoginDialog(window); |
||||
return; |
||||
} |
||||
boolean hasJxBrowser = true; |
||||
try { |
||||
Class.forName(JXBROWSER); |
||||
} catch (ClassNotFoundException e) { |
||||
hasJxBrowser = false; |
||||
} |
||||
if (hasJxBrowser) { |
||||
showLoginPane(source, params, window); |
||||
} else { |
||||
showUpdatePane(); |
||||
} |
||||
} |
||||
|
||||
private static void showLoginPane(DesignerLoginSource source, Map<String, String> params, Window window) { |
||||
DesignerLoginPane designerLoginPane = new DesignerLoginPane(source, params); |
||||
if (dialog == null) { |
||||
if (window instanceof Dialog) { |
||||
dialog = new DesignerLoginShowDialog((Dialog) window, designerLoginPane); |
||||
} else if (window instanceof Frame) { |
||||
dialog = new DesignerLoginShowDialog((Frame) window, designerLoginPane); |
||||
} else { |
||||
return; |
||||
} |
||||
|
||||
} |
||||
dialog.setVisible(true); |
||||
} |
||||
|
||||
|
||||
private static void showUpdatePane() { |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Login_Message")); |
||||
if (!GeneralContext.getLocale().equals(Locale.JAPANESE) && !GeneralContext.getLocale().equals(Locale.JAPAN) |
||||
&& !Locale.getDefault().equals(Locale.JAPAN) && !Locale.getDefault().equals(Locale.JAPANESE)) { |
||||
UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); |
||||
dialog.setAutoUpdateAfterInit(); |
||||
dialog.showDialog(); |
||||
} |
||||
} |
||||
|
||||
public static void closeWindow() { |
||||
if (dialog != null) { |
||||
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
||||
dialog.setVisible(false); |
||||
dialog = null; |
||||
} |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
DesignerEnvManager.getEnvManager().setOpenDebug(true); |
||||
showLoginDialog(DesignerLoginSource.NORMAL); |
||||
} |
||||
} |
@ -0,0 +1,42 @@
|
||||
package com.fr.design.login; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.login.utils.DesignerLoginUtils; |
||||
import com.fr.design.ui.ModernUIPane; |
||||
import com.teamdev.jxbrowser.chromium.JSValue; |
||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; |
||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; |
||||
import java.awt.BorderLayout; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerLoginPane extends BasicPane { |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "DESIGNER_LOGIN"; |
||||
} |
||||
|
||||
public DesignerLoginPane(DesignerLoginSource source, Map<String, String> params) { |
||||
params.put("designerLoginSource", String.valueOf(source.getSource())); |
||||
params.put("lastLoginType", String.valueOf(DesignerEnvManager.getEnvManager().getLastLoginType().getType())); |
||||
params.put("lastLoginAccount", DesignerEnvManager.getEnvManager().getLastLoginAccount()); |
||||
setLayout(new BorderLayout()); |
||||
ModernUIPane<Object> modernUIPane = new ModernUIPane.Builder<>() |
||||
.prepare(new ScriptContextAdapter() { |
||||
@Override |
||||
public void onScriptContextCreated(ScriptContextEvent event) { |
||||
JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); |
||||
window.asObject().setProperty("DesignerLoginHelper", DesignerLoginBridge.getBridge(event.getBrowser(), params)); |
||||
} |
||||
}) |
||||
.withEMB(DesignerLoginHelper.getMainResourcePath(), DesignerLoginUtils.renderMap()) |
||||
.build(); |
||||
add(modernUIPane, BorderLayout.CENTER); |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.login; |
||||
|
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dialog; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerLoginShowDialog extends UIDialog { |
||||
|
||||
private static final Dimension DEFAULT = new Dimension(422, 478); |
||||
|
||||
public DesignerLoginShowDialog(Frame frame, Component pane) { |
||||
super(frame); |
||||
init(pane); |
||||
} |
||||
|
||||
public DesignerLoginShowDialog(Dialog dialog, Component pane) { |
||||
super(dialog); |
||||
init(pane); |
||||
} |
||||
|
||||
private void init(Component pane) { |
||||
setUndecorated(true); |
||||
JPanel panel = (JPanel) getContentPane(); |
||||
panel.setLayout(new BorderLayout()); |
||||
add(pane, BorderLayout.CENTER); |
||||
setSize(DEFAULT); |
||||
GUICoreUtils.centerWindow(this); |
||||
setResizable(false); |
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
|
||||
} |
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.fr.design.login; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/6/7 |
||||
*/ |
||||
public enum DesignerLoginSource { |
||||
NORMAL(0), GUIDE(1), SWITCH_ACCOUNT(2), BBS_JUMP(3), UNKNOWN(-1); |
||||
|
||||
private int source; |
||||
|
||||
DesignerLoginSource(int source) { |
||||
this.source = source; |
||||
} |
||||
|
||||
public int getSource() { |
||||
return source; |
||||
} |
||||
|
||||
public static DesignerLoginSource valueOf(int source) { |
||||
for(DesignerLoginSource value : DesignerLoginSource.values()) { |
||||
if(value.getSource() == source) { |
||||
return value; |
||||
} |
||||
} |
||||
return UNKNOWN; |
||||
} |
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.fr.design.login; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/6/4 |
||||
*/ |
||||
public enum DesignerLoginType { |
||||
NORMAL_LOGIN(0), SMS_LOGIN(1), UNKNOWN(-1); |
||||
|
||||
private int type; |
||||
|
||||
DesignerLoginType(int type) { |
||||
this.type = type; |
||||
} |
||||
|
||||
public int getType() { |
||||
return type; |
||||
} |
||||
|
||||
public static DesignerLoginType valueOf(int type) { |
||||
for(DesignerLoginType value : DesignerLoginType.values()) { |
||||
if(value.getType() == type) { |
||||
return value; |
||||
} |
||||
} |
||||
return UNKNOWN; |
||||
} |
||||
} |
@ -0,0 +1,49 @@
|
||||
package com.fr.design.login.bean; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/6/3 |
||||
*/ |
||||
public class BBSAccountLogin { |
||||
|
||||
private int uid; |
||||
|
||||
private String username; |
||||
|
||||
private String appId; |
||||
|
||||
private String refreshToken; |
||||
|
||||
public int getUid() { |
||||
return uid; |
||||
} |
||||
|
||||
public void setUid(int uid) { |
||||
this.uid = uid; |
||||
} |
||||
|
||||
public String getUsername() { |
||||
return username; |
||||
} |
||||
|
||||
public void setUsername(String username) { |
||||
this.username = username; |
||||
} |
||||
|
||||
public String getAppId() { |
||||
return appId; |
||||
} |
||||
|
||||
public void setAppId(String appId) { |
||||
this.appId = appId; |
||||
} |
||||
|
||||
public String getRefreshToken() { |
||||
return refreshToken; |
||||
} |
||||
|
||||
public void setRefreshToken(String refreshToken) { |
||||
this.refreshToken = refreshToken; |
||||
} |
||||
} |
@ -0,0 +1,226 @@
|
||||
package com.fr.design.login.config; |
||||
|
||||
import com.fr.design.login.DesignerLoginType; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLReadable; |
||||
import com.fr.stable.xml.XMLWriter; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/6/2 |
||||
*/ |
||||
public class DesignerLoginConfigManager implements XMLReadable, XMLWriter { |
||||
|
||||
public static final String XML_TAG = "DesignerLoginConfigManager"; |
||||
|
||||
private static DesignerLoginConfigManager singleton; |
||||
|
||||
/** |
||||
* bbs uid |
||||
*/ |
||||
private int uid = -1; |
||||
/** |
||||
* bbs 用户名 |
||||
*/ |
||||
private String username = StringUtils.EMPTY; |
||||
/** |
||||
* bbs 应用Id |
||||
*/ |
||||
private String appId = StringUtils.EMPTY; |
||||
/** |
||||
* bbs refreshToken |
||||
*/ |
||||
private String refreshToken = StringUtils.EMPTY; |
||||
/** |
||||
* 登录引导页一个月内不再提醒 |
||||
*/ |
||||
private boolean doNotRemind = false; |
||||
/** |
||||
* 登录引导页一个月内不再提醒 |
||||
*/ |
||||
private long doNotRemindSelectedTime = -1L; |
||||
/** |
||||
* 设计器激活时间 |
||||
*/ |
||||
private long designerActivatedTime = -1L; |
||||
/** |
||||
* bbs 上次登录时间 |
||||
*/ |
||||
private long lastLoginTime = -1L; |
||||
/** |
||||
* bbs 上次登录方式 |
||||
*/ |
||||
private DesignerLoginType lastLoginType = DesignerLoginType.UNKNOWN; |
||||
/** |
||||
* bbs 上次登录账号 |
||||
*/ |
||||
private String lastLoginAccount = StringUtils.EMPTY; |
||||
/** |
||||
* 当前版本第一次启动 |
||||
*/ |
||||
private boolean currentVersionFirstLaunch = true; |
||||
/** |
||||
* bbs跳转前的登录提醒 |
||||
*/ |
||||
private boolean loginRemindBeforeJumpBBS = true; |
||||
/** |
||||
* 插件管理第一次启动时的提醒 |
||||
*/ |
||||
private boolean pluginRemindOnFirstLaunch = true; |
||||
|
||||
private DesignerLoginConfigManager() { |
||||
|
||||
} |
||||
|
||||
public static DesignerLoginConfigManager getInstance() { |
||||
if (singleton == null) { |
||||
singleton = new DesignerLoginConfigManager(); |
||||
} |
||||
return singleton; |
||||
} |
||||
|
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
if (reader.isAttr()) { |
||||
this.setUid(reader.getAttrAsInt("uid", -1)); |
||||
this.setUsername(reader.getAttrAsString("username", StringUtils.EMPTY)); |
||||
this.setAppId(reader.getAttrAsString("appId", StringUtils.EMPTY)); |
||||
this.setRefreshToken(reader.getAttrAsString("refreshToken", StringUtils.EMPTY)); |
||||
this.setDoNotRemind(reader.getAttrAsBoolean("doNotRemind", false)); |
||||
this.setDoNotRemindSelectedTime(reader.getAttrAsLong("doNotRemindSelectedTime", -1L)); |
||||
this.setDesignerActivatedTime(reader.getAttrAsLong("designerActivatedTime", -1L)); |
||||
this.setLastLoginTime(reader.getAttrAsLong("lastLoginTime", -1L)); |
||||
this.setCurrentVersionFirstLaunch(reader.getAttrAsBoolean("currentVersionFirstLaunch", true)); |
||||
this.setLastLoginType(DesignerLoginType.valueOf(reader.getAttrAsInt("lastLoginType", -1))); |
||||
this.setLastLoginAccount(reader.getAttrAsString("lastLoginAccount", StringUtils.EMPTY)); |
||||
this.setLoginRemindBeforeJumpBBS(reader.getAttrAsBoolean("loginRemindBeforeJumpBBS", true)); |
||||
this.setPluginRemindOnFirstLaunch(reader.getAttrAsBoolean("pluginRemindOnFirstLaunch", true)); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
writer.startTAG(XML_TAG); |
||||
writer.attr("uid", uid); |
||||
writer.attr("username", username); |
||||
writer.attr("appId", appId); |
||||
writer.attr("refreshToken", refreshToken); |
||||
writer.attr("doNotRemind", doNotRemind); |
||||
writer.attr("doNotRemindSelectedTime", doNotRemindSelectedTime); |
||||
writer.attr("designerActivatedTime", designerActivatedTime); |
||||
writer.attr("lastLoginTime", lastLoginTime); |
||||
writer.attr("currentVersionFirstLaunch", currentVersionFirstLaunch); |
||||
writer.attr("lastLoginType", lastLoginType.getType()); |
||||
writer.attr("lastLoginAccount", lastLoginAccount); |
||||
writer.attr("loginRemindBeforeJumpBBS", loginRemindBeforeJumpBBS); |
||||
writer.attr("pluginRemindOnFirstLaunch", pluginRemindOnFirstLaunch); |
||||
writer.end(); |
||||
} |
||||
|
||||
public int getUid() { |
||||
return uid; |
||||
} |
||||
|
||||
public void setUid(int uid) { |
||||
this.uid = uid; |
||||
} |
||||
|
||||
public String getUsername() { |
||||
return username; |
||||
} |
||||
|
||||
public void setUsername(String username) { |
||||
this.username = username; |
||||
} |
||||
|
||||
public String getAppId() { |
||||
return appId; |
||||
} |
||||
|
||||
public void setAppId(String appId) { |
||||
this.appId = appId; |
||||
} |
||||
|
||||
public String getRefreshToken() { |
||||
return refreshToken; |
||||
} |
||||
|
||||
public void setRefreshToken(String refreshToken) { |
||||
this.refreshToken = refreshToken; |
||||
} |
||||
|
||||
public long getDoNotRemindSelectedTime() { |
||||
return doNotRemindSelectedTime; |
||||
} |
||||
|
||||
public void setDoNotRemindSelectedTime(long doNotRemindSelectedTime) { |
||||
this.doNotRemindSelectedTime = doNotRemindSelectedTime; |
||||
} |
||||
|
||||
public boolean isDoNotRemind() { |
||||
return doNotRemind; |
||||
} |
||||
|
||||
public void setDoNotRemind(boolean doNotRemind) { |
||||
this.doNotRemind = doNotRemind; |
||||
} |
||||
|
||||
public long getDesignerActivatedTime() { |
||||
return designerActivatedTime; |
||||
} |
||||
|
||||
public void setDesignerActivatedTime(long designerActivatedTime) { |
||||
this.designerActivatedTime = designerActivatedTime; |
||||
} |
||||
|
||||
public long getLastLoginTime() { |
||||
return lastLoginTime; |
||||
} |
||||
|
||||
public void setLastLoginTime(long lastLoginTime) { |
||||
this.lastLoginTime = lastLoginTime; |
||||
} |
||||
|
||||
public boolean isCurrentVersionFirstLaunch() { |
||||
return currentVersionFirstLaunch; |
||||
} |
||||
|
||||
public void setCurrentVersionFirstLaunch(boolean currentVersionFirstLaunch) { |
||||
this.currentVersionFirstLaunch = currentVersionFirstLaunch; |
||||
} |
||||
|
||||
public DesignerLoginType getLastLoginType() { |
||||
return lastLoginType; |
||||
} |
||||
|
||||
public void setLastLoginType(DesignerLoginType lastLoginType) { |
||||
this.lastLoginType = lastLoginType; |
||||
} |
||||
|
||||
public String getLastLoginAccount() { |
||||
return lastLoginAccount; |
||||
} |
||||
|
||||
public void setLastLoginAccount(String lastLoginAccount) { |
||||
this.lastLoginAccount = lastLoginAccount; |
||||
} |
||||
|
||||
public boolean isLoginRemindBeforeJumpBBS() { |
||||
return loginRemindBeforeJumpBBS; |
||||
} |
||||
|
||||
public void setLoginRemindBeforeJumpBBS(boolean loginRemindBeforeJumpBBS) { |
||||
this.loginRemindBeforeJumpBBS = loginRemindBeforeJumpBBS; |
||||
} |
||||
|
||||
public boolean isPluginRemindOnFirstLaunch() { |
||||
return pluginRemindOnFirstLaunch; |
||||
} |
||||
|
||||
public void setPluginRemindOnFirstLaunch(boolean pluginRemindOnFirstLaunch) { |
||||
this.pluginRemindOnFirstLaunch = pluginRemindOnFirstLaunch; |
||||
} |
||||
} |
@ -0,0 +1,30 @@
|
||||
package com.fr.design.login.executor; |
||||
|
||||
import com.fr.design.bridge.exec.JSExecutor; |
||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
||||
import com.teamdev.jxbrowser.chromium.JSObject; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-18 |
||||
*/ |
||||
public class DesignerLoginBrowserExecutor implements JSExecutor { |
||||
|
||||
public static DesignerLoginBrowserExecutor create(JSObject window, JSFunction callback) { |
||||
return new DesignerLoginBrowserExecutor(window, callback); |
||||
} |
||||
|
||||
private JSObject window; |
||||
private JSFunction callback; |
||||
|
||||
private DesignerLoginBrowserExecutor(JSObject window, JSFunction callback) { |
||||
this.window = window; |
||||
this.callback = callback; |
||||
} |
||||
|
||||
@Override |
||||
public void executor(String newValue) { |
||||
callback.invoke(window, newValue); |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.login.executor; |
||||
|
||||
import com.fr.design.extra.Process; |
||||
import com.fr.design.extra.exe.Command; |
||||
import com.fr.design.extra.exe.Executor; |
||||
import com.fr.design.login.service.DesignerPassportManager; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/28 |
||||
*/ |
||||
public class DesignerLoginExecutor implements Executor { |
||||
private String result = "[]"; |
||||
|
||||
private String username; |
||||
private String password; |
||||
|
||||
public DesignerLoginExecutor(String username, String password) { |
||||
this.username = username; |
||||
this.password = password; |
||||
} |
||||
|
||||
@Override |
||||
public String getTaskFinishMessage() { |
||||
return result; |
||||
} |
||||
|
||||
@Override |
||||
public Command[] getCommands() { |
||||
return new Command[]{ |
||||
new Command() { |
||||
@Override |
||||
public String getExecuteMessage() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void run(Process<String> process) { |
||||
result = String.valueOf(DesignerPassportManager.getInstance().login(username, password)); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.login.executor; |
||||
|
||||
import com.fr.design.extra.Process; |
||||
import com.fr.design.extra.exe.Command; |
||||
import com.fr.design.extra.exe.Executor; |
||||
import com.fr.design.login.service.DesignerPassportManager; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/28 |
||||
*/ |
||||
public class DesignerSendCaptchaExecutor implements Executor { |
||||
private String result = "[]"; |
||||
|
||||
private String regionCode; |
||||
private String phone; |
||||
|
||||
public DesignerSendCaptchaExecutor(String regionCode, String phone) { |
||||
this.regionCode = regionCode; |
||||
this.phone = phone; |
||||
} |
||||
|
||||
@Override |
||||
public String getTaskFinishMessage() { |
||||
return result; |
||||
} |
||||
|
||||
@Override |
||||
public Command[] getCommands() { |
||||
return new Command[]{ |
||||
new Command() { |
||||
@Override |
||||
public String getExecuteMessage() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void run(Process<String> process) { |
||||
result = String.valueOf(DesignerPassportManager.getInstance().sendCaptcha(regionCode, phone)); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,47 @@
|
||||
package com.fr.design.login.executor; |
||||
|
||||
import com.fr.design.extra.Process; |
||||
import com.fr.design.extra.exe.Command; |
||||
import com.fr.design.extra.exe.Executor; |
||||
import com.fr.design.login.service.DesignerPassportManager; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/28 |
||||
*/ |
||||
public class DesignerSmsLoginExecutor implements Executor { |
||||
private String result = "[]"; |
||||
|
||||
private String regionCode; |
||||
private String phone; |
||||
private String code; |
||||
|
||||
public DesignerSmsLoginExecutor(String regionCode, String phone, String code) { |
||||
this.regionCode = regionCode; |
||||
this.phone = phone; |
||||
this.code = code; |
||||
} |
||||
|
||||
@Override |
||||
public String getTaskFinishMessage() { |
||||
return result; |
||||
} |
||||
|
||||
@Override |
||||
public Command[] getCommands() { |
||||
return new Command[]{ |
||||
new Command() { |
||||
@Override |
||||
public String getExecuteMessage() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void run(Process<String> process) { |
||||
result = DesignerPassportManager.getInstance().smsLogin(regionCode, phone, code); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,49 @@
|
||||
package com.fr.design.login.executor; |
||||
|
||||
import com.fr.design.extra.Process; |
||||
import com.fr.design.extra.exe.Command; |
||||
import com.fr.design.extra.exe.Executor; |
||||
import com.fr.design.login.service.DesignerPassportManager; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/28 |
||||
*/ |
||||
public class DesignerSmsRegisterExecutor implements Executor { |
||||
private String result = "[]"; |
||||
|
||||
private String regionCode; |
||||
private String phone; |
||||
private String password; |
||||
private String regToken; |
||||
|
||||
public DesignerSmsRegisterExecutor(String regionCode, String phone, String password, String regToken) { |
||||
this.regionCode = regionCode; |
||||
this.phone = phone; |
||||
this.password = password; |
||||
this.regToken = regToken; |
||||
} |
||||
|
||||
@Override |
||||
public String getTaskFinishMessage() { |
||||
return result; |
||||
} |
||||
|
||||
@Override |
||||
public Command[] getCommands() { |
||||
return new Command[]{ |
||||
new Command() { |
||||
@Override |
||||
public String getExecuteMessage() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void run(Process<String> process) { |
||||
result = String.valueOf(DesignerPassportManager.getInstance().smsRegister(regionCode, phone, password, regToken)); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,83 @@
|
||||
package com.fr.design.login.guide; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.bridge.exec.JSBridge; |
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.login.DesignerLoginHelper; |
||||
import com.fr.design.login.DesignerLoginSource; |
||||
import com.teamdev.jxbrowser.chromium.Browser; |
||||
import com.teamdev.jxbrowser.chromium.JSObject; |
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerGuideBridge { |
||||
|
||||
public static DesignerGuideBridge getBridge(Browser browser) { |
||||
return new DesignerGuideBridge(browser); |
||||
} |
||||
|
||||
private JSObject window; |
||||
|
||||
private DesignerGuideBridge(Browser browser) { |
||||
this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); |
||||
} |
||||
|
||||
@JSBridge |
||||
public String i18nText(String key) { |
||||
return Toolkit.i18nText(key); |
||||
} |
||||
|
||||
@JSBridge |
||||
public void closeWindow(boolean doNotRemind, boolean login) { |
||||
if (login) { |
||||
DesignerGuideHelper.closeWindow(); |
||||
DesignerLoginHelper.showLoginDialog(DesignerLoginSource.GUIDE); |
||||
checkDoNotRemind(doNotRemind); |
||||
} else { |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
String[] options = new String[]{ |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Quit"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Return_Login") |
||||
}; |
||||
int rv = FineJOptionPane.showConfirmDialog( |
||||
DesignerGuideHelper.getDialog(), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Quit_Tip"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), |
||||
JOptionPane.YES_NO_OPTION, |
||||
JOptionPane.WARNING_MESSAGE, |
||||
null, |
||||
options, |
||||
options[1] |
||||
); |
||||
if (rv == JOptionPane.YES_OPTION) { |
||||
DesignerGuideHelper.closeWindow(); |
||||
checkDoNotRemind(doNotRemind); |
||||
} else if (rv == JOptionPane.NO_OPTION) { |
||||
DesignerLoginHelper.showLoginDialog(DesignerLoginSource.GUIDE); |
||||
DesignerGuideHelper.closeWindow(); |
||||
checkDoNotRemind(doNotRemind); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 用户勾选了一个月内不再提醒 |
||||
*/ |
||||
private void checkDoNotRemind(boolean doNotRemind) { |
||||
DesignerEnvManager manager = DesignerEnvManager.getEnvManager(); |
||||
manager.setDesignerLoginDoNotRemind(doNotRemind); |
||||
if (doNotRemind) { |
||||
manager.setDesignerLoginDoNotRemindSelectedTime(System.currentTimeMillis()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,114 @@
|
||||
package com.fr.design.login.guide; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.event.DesignerOpenedListener; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.os.impl.SupportOSImpl; |
||||
import javax.swing.WindowConstants; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerGuideHelper { |
||||
|
||||
private static final String MAIN_RESOURCE_PATH = "/com/fr/design/login/guide.html"; |
||||
private static final String JXBROWSER = "com.teamdev.jxbrowser.chromium.Browser"; |
||||
private static final long ONE_WEEK = 7 * 24 * 3600 * 1000L; |
||||
private static final long ONE_MONTH = 30 * 24 * 3600 * 1000L; |
||||
private static final long SIX_MONTH = 6 * ONE_MONTH; |
||||
|
||||
private static UIDialog dialog = null; |
||||
|
||||
public static String getMainResourcePath() { |
||||
return MAIN_RESOURCE_PATH; |
||||
} |
||||
|
||||
public static UIDialog getDialog() { |
||||
return dialog; |
||||
} |
||||
|
||||
public static void prepareShowGuideDialog() { |
||||
if (!SupportOSImpl.DESIGNER_LOGIN.support()) { |
||||
return; |
||||
} |
||||
if (isActivatedForOneWeek()) { |
||||
if (isLogin() && !isLoginForSixMonths()) { |
||||
return; |
||||
} |
||||
if (selectedDoNotRemindInOneMonth()) { |
||||
return; |
||||
} |
||||
DesignerContext.getDesignerFrame().addDesignerOpenedListener(new DesignerOpenedListener() { |
||||
@Override |
||||
public void designerOpened() { |
||||
showGuideDialog(); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 激活满一周 |
||||
*/ |
||||
private static boolean isActivatedForOneWeek() { |
||||
return (System.currentTimeMillis() - DesignerEnvManager.getEnvManager().getDesignerActivatedTime()) > ONE_WEEK; |
||||
} |
||||
|
||||
/** |
||||
* 已经登录 |
||||
*/ |
||||
private static boolean isLogin() { |
||||
return DesignerEnvManager.getEnvManager().getDesignerLoginUid() > 0; |
||||
} |
||||
|
||||
/** |
||||
* 已经登录满六个月 |
||||
*/ |
||||
private static boolean isLoginForSixMonths() { |
||||
return isLogin() && (System.currentTimeMillis() - DesignerEnvManager.getEnvManager().getDesignerLastLoginTime()) > SIX_MONTH; |
||||
} |
||||
|
||||
/** |
||||
* 一个月内不再提醒 |
||||
*/ |
||||
private static boolean selectedDoNotRemindInOneMonth() { |
||||
return DesignerEnvManager.getEnvManager().isDesignerLoginDoNotRemind() |
||||
&& (System.currentTimeMillis() - DesignerEnvManager.getEnvManager().getDesignerLoginDoNotRemindSelectedTime()) <= ONE_MONTH; |
||||
} |
||||
|
||||
private static void showGuideDialog() { |
||||
boolean hasJxBrowser = true; |
||||
try { |
||||
Class.forName(JXBROWSER); |
||||
} catch (ClassNotFoundException e) { |
||||
hasJxBrowser = false; |
||||
} |
||||
if (hasJxBrowser) { |
||||
showGuidePane(); |
||||
} |
||||
} |
||||
|
||||
private static void showGuidePane() { |
||||
DesignerGuidePane designerGuidePane = new DesignerGuidePane(); |
||||
if (dialog == null) { |
||||
dialog = new DesignerGuideShowDialog(DesignerContext.getDesignerFrame(), designerGuidePane); |
||||
} |
||||
dialog.setVisible(true); |
||||
} |
||||
|
||||
public static void closeWindow() { |
||||
if (dialog != null) { |
||||
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
||||
dialog.setVisible(false); |
||||
dialog = null; |
||||
} |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
DesignerEnvManager.getEnvManager().setOpenDebug(true); |
||||
showGuideDialog(); |
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.fr.design.login.guide; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.login.guide.utils.DesignerGuideUtils; |
||||
import com.fr.design.ui.ModernUIPane; |
||||
import com.teamdev.jxbrowser.chromium.JSValue; |
||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; |
||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; |
||||
import java.awt.BorderLayout; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerGuidePane extends BasicPane { |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "DESIGNER_GUIDE"; |
||||
} |
||||
|
||||
public DesignerGuidePane() { |
||||
setLayout(new BorderLayout()); |
||||
ModernUIPane<Object> modernUIPane = new ModernUIPane.Builder<>() |
||||
.prepare(new ScriptContextAdapter() { |
||||
@Override |
||||
public void onScriptContextCreated(ScriptContextEvent event) { |
||||
JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); |
||||
window.asObject().setProperty("DesignerGuideHelper", DesignerGuideBridge.getBridge(event.getBrowser())); |
||||
} |
||||
}) |
||||
.withEMB(DesignerGuideHelper.getMainResourcePath(), DesignerGuideUtils.renderMap()) |
||||
.build(); |
||||
add(modernUIPane, BorderLayout.CENTER); |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.design.login.guide; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerGuideShowDialog extends UIDialog { |
||||
|
||||
private static final Dimension DEFAULT = new Dimension(700, 577); |
||||
|
||||
public DesignerGuideShowDialog(Frame frame, BasicPane pane) { |
||||
super(frame); |
||||
setUndecorated(true); |
||||
JPanel panel = (JPanel) getContentPane(); |
||||
panel.setLayout(new BorderLayout()); |
||||
add(pane, BorderLayout.CENTER); |
||||
setSize(DEFAULT); |
||||
GUICoreUtils.centerWindow(this); |
||||
setResizable(false); |
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
|
||||
} |
||||
} |
@ -0,0 +1,19 @@
|
||||
package com.fr.design.login.guide.utils; |
||||
|
||||
import com.fr.general.GeneralContext; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerGuideUtils { |
||||
|
||||
public static Map<String, String> renderMap() { |
||||
Map<String, String> map4Tpl = new HashMap<>(); |
||||
map4Tpl.put("language", GeneralContext.getLocale().toString()); |
||||
return map4Tpl; |
||||
} |
||||
} |
@ -0,0 +1,167 @@
|
||||
package com.fr.design.login.service; |
||||
|
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.http.HttpToolbox; |
||||
import com.fr.general.log.MessageFormatter; |
||||
import com.fr.json.JSON; |
||||
import com.fr.json.JSONFactory; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.org.apache.commons.lang3.RandomStringUtils; |
||||
import java.util.HashMap; |
||||
import java.util.UUID; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/28 |
||||
*/ |
||||
public class DesignerLoginClient { |
||||
|
||||
private static final String LOGIN_API = CloudCenter.getInstance().acquireUrlByKind("designer.login.api", "http://api.shequ.fanruan.com/v1/user/login/"); |
||||
private static final String SEND_CAPTCHA_API = CloudCenter.getInstance().acquireUrlByKind("designer.send.captcha.api", "http://api.shequ.fanruan.com/v1/code/getsmscaptcha/?location={}&phone={}&smstype={}"); |
||||
private static final String SMS_LOGIN_API = CloudCenter.getInstance().acquireUrlByKind("designer.sms.login.api", "http://api.shequ.fanruan.com/v1/user/smslogin/"); |
||||
private static final String SMS_REGISTER_API = CloudCenter.getInstance().acquireUrlByKind("designer.sms.register.api", "http://api.shequ.fanruan.com/v1/user/register/"); |
||||
private static final String USERNAME = "username"; |
||||
private static final String PASSWORD = "password"; |
||||
private static final String SMS_TYPE_LOGIN_AND_REGISTER = "1"; |
||||
private static final String LOCATION = "location"; |
||||
private static final String PHONE = "phone"; |
||||
private static final String CODE = "code"; |
||||
private static final String STATUS = "status"; |
||||
private static final String DATA = "data"; |
||||
private static final String CLIENT = "client"; |
||||
private static final String UID = "uid"; |
||||
private static final String APP_ID = "appid"; |
||||
private static final String REFRESH_TOKEN = "refresh_token"; |
||||
private static final String REGISTER = "register"; |
||||
private static final String REG_TOKEN = "regtoken"; |
||||
private static final String REG_PHONE = "regphone"; |
||||
private static final String DEVICE = "device"; |
||||
private static final String REG_FROM = "reg_from"; |
||||
private static final String PRODUCT_FINEREPORT = "product-finereport"; |
||||
|
||||
/** |
||||
* 服务器内部错误 |
||||
*/ |
||||
private static final int INTERNAL_ERROR = 0; |
||||
|
||||
/** |
||||
* 未知错误 |
||||
*/ |
||||
private static final int UNKNOWN_ERROR = -3; |
||||
|
||||
/** |
||||
* 网络连接失败 |
||||
*/ |
||||
private static final int NETWORK_CONNECTED_FAILED = -4; |
||||
|
||||
public DesignerLoginResult login(String username, String password) { |
||||
try { |
||||
HashMap<String, Object> params = new HashMap<>(); |
||||
params.put(USERNAME, username); |
||||
params.put(PASSWORD, password); |
||||
String result = HttpToolbox.post(LOGIN_API, params); |
||||
JSONObject response = JSONFactory.createJSON(JSON.OBJECT, result); |
||||
int status = response.optInt(STATUS); |
||||
if (status < 0) { |
||||
return DesignerLoginResult.create(status, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, false, StringUtils.EMPTY); |
||||
} |
||||
JSONObject data = response.optJSONObject(DATA); |
||||
if (data != null) { |
||||
JSONObject client = data.optJSONObject(CLIENT); |
||||
if (client != null) { |
||||
int uid = client.optInt(UID); |
||||
if (uid > 0) { |
||||
return DesignerLoginResult.create(uid, client.optString(USERNAME), client.optString(APP_ID), data.optString(REFRESH_TOKEN), false, StringUtils.EMPTY); |
||||
} |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
return DesignerLoginResult.create(NETWORK_CONNECTED_FAILED, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, false, StringUtils.EMPTY); |
||||
} |
||||
return DesignerLoginResult.create(UNKNOWN_ERROR, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, false, StringUtils.EMPTY); |
||||
} |
||||
|
||||
public int sendCaptcha(String regionCode, String phone) { |
||||
try { |
||||
String url = MessageFormatter.arrayFormat(SEND_CAPTCHA_API, new String[]{regionCode, phone, SMS_TYPE_LOGIN_AND_REGISTER}).getMessage(); |
||||
String result = HttpToolbox.get(url); |
||||
JSONObject response = JSONFactory.createJSON(JSON.OBJECT, result); |
||||
return response.optInt(STATUS); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return INTERNAL_ERROR; |
||||
} |
||||
|
||||
public DesignerLoginResult smsLogin(String regionCode, String phone, String code) { |
||||
try { |
||||
HashMap<String, Object> params = new HashMap<>(); |
||||
params.put(LOCATION, regionCode); |
||||
params.put(PHONE, phone); |
||||
params.put(CODE, code); |
||||
String result = HttpToolbox.post(SMS_LOGIN_API, params); |
||||
JSONObject response = JSONFactory.createJSON(JSON.OBJECT, result); |
||||
int status = response.optInt(STATUS); |
||||
if (status < 0) { |
||||
return DesignerLoginResult.create(status, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, false, StringUtils.EMPTY); |
||||
} |
||||
JSONObject data = response.optJSONObject(DATA); |
||||
if (data != null) { |
||||
boolean register = data.optBoolean(REGISTER); |
||||
if (register) { |
||||
String regToken = data.optString(REG_TOKEN); |
||||
if (regToken != null) { |
||||
return DesignerLoginResult.create(status, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, true, regToken); |
||||
} |
||||
} else { |
||||
JSONObject client = data.optJSONObject(CLIENT); |
||||
if (client != null) { |
||||
int uid = client.optInt(UID); |
||||
if (uid > 0) { |
||||
return DesignerLoginResult.create(uid, client.optString(USERNAME), client.optString(APP_ID), data.optString(REFRESH_TOKEN), false, StringUtils.EMPTY); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return DesignerLoginResult.create(INTERNAL_ERROR, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, false, StringUtils.EMPTY); |
||||
} |
||||
|
||||
public DesignerLoginResult smsRegister(String regionCode, String phone, String password, String regToken) { |
||||
try { |
||||
HashMap<String, Object> params = new HashMap<>(); |
||||
params.put(USERNAME, RandomStringUtils.randomAlphabetic(8)); |
||||
params.put(PASSWORD, password); |
||||
params.put(REG_TOKEN, regToken); |
||||
params.put(LOCATION, regionCode); |
||||
params.put(REG_PHONE, phone); |
||||
params.put(DEVICE, PRODUCT_FINEREPORT); |
||||
params.put(REG_FROM, PRODUCT_FINEREPORT); |
||||
String result = HttpToolbox.post(SMS_REGISTER_API, params); |
||||
JSONObject response = JSONFactory.createJSON(JSON.OBJECT, result); |
||||
int status = response.optInt(STATUS); |
||||
if (status < 0) { |
||||
return DesignerLoginResult.create(status, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, false, StringUtils.EMPTY); |
||||
} |
||||
JSONObject data = response.optJSONObject(DATA); |
||||
if (data != null) { |
||||
JSONObject client = data.optJSONObject(CLIENT); |
||||
if (client != null) { |
||||
int uid = client.optInt(UID); |
||||
if (uid > 0) { |
||||
return DesignerLoginResult.create(uid, client.optString(USERNAME), client.optString(APP_ID), data.optString(REFRESH_TOKEN), false, StringUtils.EMPTY); |
||||
} |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return DesignerLoginResult.create(INTERNAL_ERROR, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, false, StringUtils.EMPTY); |
||||
} |
||||
} |
@ -0,0 +1,82 @@
|
||||
package com.fr.design.login.service; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/28 |
||||
*/ |
||||
public class DesignerLoginResult { |
||||
|
||||
private int uid; |
||||
|
||||
private String username; |
||||
|
||||
private String appId; |
||||
|
||||
private String refreshToken; |
||||
|
||||
private boolean register; |
||||
|
||||
private String regToken; |
||||
|
||||
private DesignerLoginResult(int uid, String username, String appId, String refreshToken, boolean register, String regToken) { |
||||
this.uid = uid; |
||||
this.username = username; |
||||
this.appId = appId; |
||||
this.refreshToken = refreshToken; |
||||
this.regToken = regToken; |
||||
this.register = register; |
||||
} |
||||
|
||||
public static DesignerLoginResult create(int uid, String username, String appId, String refreshToken, boolean register, String regToken) { |
||||
return new DesignerLoginResult(uid, username, appId, refreshToken, register, regToken); |
||||
} |
||||
|
||||
public int getUid() { |
||||
return uid; |
||||
} |
||||
|
||||
public void setUid(int uid) { |
||||
this.uid = uid; |
||||
} |
||||
|
||||
public String getUsername() { |
||||
return username; |
||||
} |
||||
|
||||
public void setUsername(String username) { |
||||
this.username = username; |
||||
} |
||||
|
||||
public String getAppId() { |
||||
return appId; |
||||
} |
||||
|
||||
public void setAppId(String appId) { |
||||
this.appId = appId; |
||||
} |
||||
|
||||
public String getRefreshToken() { |
||||
return refreshToken; |
||||
} |
||||
|
||||
public void setRefreshToken(String refreshToken) { |
||||
this.refreshToken = refreshToken; |
||||
} |
||||
|
||||
public boolean isRegister() { |
||||
return register; |
||||
} |
||||
|
||||
public void setRegister(boolean register) { |
||||
this.register = register; |
||||
} |
||||
|
||||
public String getRegToken() { |
||||
return regToken; |
||||
} |
||||
|
||||
public void setRegToken(String regToken) { |
||||
this.regToken = regToken; |
||||
} |
||||
} |
@ -0,0 +1,114 @@
|
||||
package com.fr.design.login.service; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.login.DesignerLoginType; |
||||
import com.fr.design.upm.event.CertificateEvent; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.json.JSONObject; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/28 |
||||
*/ |
||||
public class DesignerPassportManager { |
||||
|
||||
private static final String STATUS = "status"; |
||||
private static final String REGISTER = "register"; |
||||
private static final String REG_TOKEN = "regtoken"; |
||||
|
||||
private static volatile DesignerPassportManager instance = null; |
||||
|
||||
public static DesignerPassportManager getInstance() { |
||||
if (instance == null) { |
||||
synchronized (DesignerPassportManager.class) { |
||||
if (instance == null) { |
||||
instance = new DesignerPassportManager(); |
||||
} |
||||
} |
||||
} |
||||
return instance; |
||||
} |
||||
|
||||
/** |
||||
* 账号密码登录帆软通行证 |
||||
* |
||||
* @param username 论坛账号 |
||||
* @param password 密码 |
||||
*/ |
||||
public int login(String username, String password) { |
||||
DesignerLoginClient client = new DesignerLoginClient(); |
||||
DesignerLoginResult result = client.login(username, password); |
||||
int uid = result.getUid(); |
||||
if (uid > 0) { |
||||
saveUserInfo(uid, result.getUsername(), result.getAppId(), result.getRefreshToken(), DesignerLoginType.NORMAL_LOGIN, username); |
||||
} |
||||
return uid; |
||||
} |
||||
|
||||
/** |
||||
* 发送短信验证码 |
||||
* |
||||
* @param regionCode 区号 |
||||
* @param phone 手机 |
||||
*/ |
||||
public int sendCaptcha(String regionCode, String phone) { |
||||
DesignerLoginClient client = new DesignerLoginClient(); |
||||
return client.sendCaptcha(regionCode, phone); |
||||
} |
||||
|
||||
/** |
||||
* 短信登录帆软通行证 |
||||
* |
||||
* @param regionCode 区号 |
||||
* @param phone 手机 |
||||
* @param code 验证码 |
||||
*/ |
||||
public String smsLogin(String regionCode, String phone, String code) { |
||||
DesignerLoginClient client = new DesignerLoginClient(); |
||||
DesignerLoginResult result = client.smsLogin(regionCode, phone, code); |
||||
int uid = result.getUid(); |
||||
if (uid > 0) { |
||||
saveUserInfo(uid, result.getUsername(), result.getAppId(), result.getRefreshToken(), DesignerLoginType.SMS_LOGIN, regionCode + "-" + phone); |
||||
} |
||||
JSONObject jo = new JSONObject(); |
||||
jo.put(STATUS, result.getUid()); |
||||
jo.put(REGISTER, result.isRegister()); |
||||
jo.put(REG_TOKEN, result.getRegToken()); |
||||
return jo.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 注册帆软通行证 |
||||
* |
||||
* @param regionCode 区号 |
||||
* @param phone 手机 |
||||
* @param password 密码 |
||||
* @param regToken 注册令牌 |
||||
*/ |
||||
public int smsRegister(String regionCode, String phone, String password, String regToken) { |
||||
DesignerLoginClient client = new DesignerLoginClient(); |
||||
DesignerLoginResult result = client.smsRegister(regionCode, phone, password, regToken); |
||||
int uid = result.getUid(); |
||||
if (uid > 0) { |
||||
saveUserInfo(uid, result.getUsername(), result.getAppId(), result.getRefreshToken(), DesignerLoginType.SMS_LOGIN, regionCode + "-" + phone); |
||||
} |
||||
return uid; |
||||
} |
||||
|
||||
/** |
||||
* 保存登录信息 |
||||
*/ |
||||
private void saveUserInfo(int uid, String username, String appId, String refreshToken, DesignerLoginType type, String account) { |
||||
DesignerEnvManager manager = DesignerEnvManager.getEnvManager(); |
||||
manager.setDesignerLoginUid(uid); |
||||
manager.setDesignerLoginUsername(username); |
||||
manager.setDesignerLoginAppId(appId); |
||||
manager.setDesignerLoginRefreshToken(refreshToken); |
||||
manager.setDesignerLastLoginTime(System.currentTimeMillis()); |
||||
manager.setLastLoginType(type); |
||||
manager.setLastLoginAccount(account); |
||||
DesignerEnvManager.getEnvManager().saveXMLFile(); |
||||
EventDispatcher.fire(CertificateEvent.LOGIN, username); |
||||
} |
||||
} |
@ -0,0 +1,87 @@
|
||||
package com.fr.design.login.socketio; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.login.DesignerLoginType; |
||||
import com.fr.design.login.bean.BBSAccountLogin; |
||||
import com.fr.design.upm.event.CertificateEvent; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.third.socketio.AckRequest; |
||||
import com.fr.third.socketio.Configuration; |
||||
import com.fr.third.socketio.SocketIOClient; |
||||
import com.fr.third.socketio.SocketIOServer; |
||||
import com.fr.third.socketio.listener.DataListener; |
||||
import java.net.URLDecoder; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/6/3 |
||||
*/ |
||||
public class LoginAuthServer { |
||||
|
||||
private SocketIOServer server; |
||||
|
||||
private static final String HOSTNAME = "localhost"; |
||||
private static final int PORT = 41925; |
||||
|
||||
private static volatile LoginAuthServer instance = null; |
||||
|
||||
public static LoginAuthServer getInstance() { |
||||
if (instance == null) { |
||||
synchronized (LoginAuthServer.class) { |
||||
if (instance == null) { |
||||
instance = new LoginAuthServer(); |
||||
} |
||||
} |
||||
} |
||||
return instance; |
||||
} |
||||
|
||||
private LoginAuthServer() { |
||||
Configuration config = new Configuration(); |
||||
config.setHostname(HOSTNAME); |
||||
config.setPort(PORT); |
||||
server = new SocketIOServer(config); |
||||
initEventListener(); |
||||
} |
||||
|
||||
public void start() { |
||||
try { |
||||
server.start(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
public void stop() { |
||||
try { |
||||
server.stop(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
private void initEventListener() { |
||||
server.addEventListener("bbsAccountLogin", BBSAccountLogin.class, new DataListener<BBSAccountLogin>() { |
||||
@Override |
||||
public void onData(SocketIOClient client, BBSAccountLogin data, AckRequest ackRequest) throws Exception { |
||||
// 保存登录信息到.FineReport100配置中
|
||||
int uid = data.getUid(); |
||||
if (uid > 0) { |
||||
String username = URLDecoder.decode(data.getUsername(), "UTF-8"); |
||||
DesignerEnvManager manager = DesignerEnvManager.getEnvManager(); |
||||
manager.setDesignerLoginUid(data.getUid()); |
||||
manager.setDesignerLoginUsername(username); |
||||
manager.setDesignerLoginAppId(data.getAppId()); |
||||
manager.setDesignerLoginRefreshToken(data.getRefreshToken()); |
||||
manager.setDesignerLastLoginTime(System.currentTimeMillis()); |
||||
manager.setLastLoginType(DesignerLoginType.NORMAL_LOGIN); |
||||
manager.setLastLoginAccount(username); |
||||
DesignerEnvManager.getEnvManager().saveXMLFile(); |
||||
EventDispatcher.fire(CertificateEvent.LOGIN, username); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,51 @@
|
||||
package com.fr.design.login.task; |
||||
|
||||
import com.fr.design.bridge.exec.JSCallback; |
||||
import com.fr.design.bridge.exec.JSUtils; |
||||
import com.fr.design.extra.Process; |
||||
import com.fr.design.extra.exe.Command; |
||||
import com.fr.design.extra.exe.Executor; |
||||
import com.fr.stable.StringUtils; |
||||
import javax.swing.SwingWorker; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/27 |
||||
*/ |
||||
public class DesignerLoginTaskWorker<V> extends SwingWorker<V, String> { |
||||
|
||||
private Executor executor; |
||||
private JSCallback callback; |
||||
|
||||
public DesignerLoginTaskWorker(final JSCallback callback, final Executor executor) { |
||||
this.executor = executor; |
||||
this.callback = callback; |
||||
} |
||||
|
||||
@Override |
||||
protected V doInBackground() throws Exception { |
||||
Command[] commands = executor.getCommands(); |
||||
for (Command command : commands) { |
||||
String message = command.getExecuteMessage(); |
||||
if (StringUtils.isNotBlank(message)) { |
||||
publish(message); |
||||
} |
||||
command.run(new Process<String>() { |
||||
@Override |
||||
public void process(String s) { |
||||
if (StringUtils.isNotBlank(s)) { |
||||
publish(JSUtils.trimText(s)); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected void done() { |
||||
String result = executor.getTaskFinishMessage(); |
||||
callback.execute(result); |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.design.login.utils; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.mainframe.toast.DesignerToastMsgUtil; |
||||
import com.fr.general.GeneralContext; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Lanlan |
||||
* @version 10.0 |
||||
* Created by Lanlan on 2021/5/21 |
||||
*/ |
||||
public class DesignerLoginUtils { |
||||
|
||||
public static Map<String, String> renderMap() { |
||||
Map<String, String> map4Tpl = new HashMap<>(); |
||||
map4Tpl.put("language", GeneralContext.getLocale().toString()); |
||||
return map4Tpl; |
||||
} |
||||
|
||||
public static void showPluginRemindOnFirstLaunch() { |
||||
DesignerEnvManager manager = DesignerEnvManager.getEnvManager(); |
||||
int uid = manager.getDesignerLoginUid(); |
||||
if (uid > 0) { |
||||
boolean pluginRemindOnFirstLaunch = manager.isPluginRemindOnFirstLaunch(); |
||||
if (pluginRemindOnFirstLaunch) { |
||||
DesignerToastMsgUtil.toastWarning( |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Plugin_Tip") |
||||
); |
||||
manager.setPluginRemindOnFirstLaunch(false); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,87 @@
|
||||
package com.fr.design.ui.compatible; |
||||
|
||||
import com.fr.design.ui.ModernRequestClient; |
||||
import com.fr.design.ui.ModernUIConstants; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.web.struct.AssembleComponent; |
||||
import com.fr.web.struct.AtomBuilder; |
||||
import com.fr.web.struct.PathGroup; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.category.StylePath; |
||||
import com.teamdev.jxbrowser.net.Network; |
||||
import com.teamdev.jxbrowser.net.UrlRequest; |
||||
import com.teamdev.jxbrowser.net.callback.InterceptRequestCallback; |
||||
|
||||
import java.io.InputStream; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2020/3/25 |
||||
*/ |
||||
public class NxComplexInterceptRequestCallback extends NxInterceptRequestCallback { |
||||
|
||||
private AssembleComponent component; |
||||
|
||||
public NxComplexInterceptRequestCallback(Network network, AssembleComponent component) { |
||||
super(network); |
||||
this.component = component; |
||||
} |
||||
|
||||
public NxComplexInterceptRequestCallback(Network network, AssembleComponent component, Map<String, String> map) { |
||||
super(network, map); |
||||
this.component = component; |
||||
} |
||||
|
||||
@Override |
||||
protected Response next(UrlRequest urlRequest, String path) { |
||||
if (path.startsWith("emb:dynamic")) { |
||||
String text = htmlText(map); |
||||
return InterceptRequestCallback.Response.intercept(generateBasicUrlRequestJob(urlRequest, "text/html", text.getBytes(StandardCharsets.UTF_8))); |
||||
} else { |
||||
int index = path.indexOf("="); |
||||
if (index > 0) { |
||||
path = path.substring(index + 1); |
||||
} else { |
||||
path = path.substring(4); |
||||
} |
||||
InputStream inputStream = IOUtils.readResource(path); |
||||
return InterceptRequestCallback.Response.intercept(generateBasicUrlRequestJob(urlRequest, getMimeType(path), IOUtils.inputStream2Bytes(inputStream))); |
||||
} |
||||
} |
||||
|
||||
private String htmlText(Map<String, String> map) { |
||||
PathGroup pathGroup = AtomBuilder.create().buildAssembleFilePath(ModernRequestClient.KEY, component); |
||||
StylePath[] stylePaths = pathGroup.toStylePathGroup(); |
||||
StringBuilder styleText = new StringBuilder(); |
||||
for (StylePath path : stylePaths) { |
||||
if (StringUtils.isNotBlank(path.toFilePath())) { |
||||
styleText.append("<link rel=\"stylesheet\" href=\"emb:"); |
||||
styleText.append(path.toFilePath()); |
||||
styleText.append("\"/>"); |
||||
} |
||||
} |
||||
String result = ModernUIConstants.HTML_TPL.replaceAll("##style##", styleText.toString()); |
||||
ScriptPath[] scriptPaths = pathGroup.toScriptPathGroup(); |
||||
StringBuilder scriptText = new StringBuilder(); |
||||
for (ScriptPath path : scriptPaths) { |
||||
if (StringUtils.isNotBlank(path.toFilePath())) { |
||||
scriptText.append("<script src=\"emb:"); |
||||
scriptText.append(path.toFilePath()); |
||||
scriptText.append("\"></script>"); |
||||
} |
||||
} |
||||
result = result.replaceAll("##script##", scriptText.toString()); |
||||
if (map != null) { |
||||
for (Map.Entry<String, String> entry : map.entrySet()) { |
||||
String key = entry.getKey(); |
||||
String value = entry.getValue(); |
||||
result = result.replaceAll("\\$\\{" + key + "}", value); |
||||
} |
||||
} |
||||
return result; |
||||
} |
||||
} |
@ -0,0 +1,134 @@
|
||||
package com.fr.design.ui.compatible; |
||||
|
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.EncodeConstants; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.org.apache.commons.codec.net.URLCodec; |
||||
import com.teamdev.jxbrowser.net.HttpHeader; |
||||
import com.teamdev.jxbrowser.net.HttpStatus; |
||||
import com.teamdev.jxbrowser.net.Network; |
||||
import com.teamdev.jxbrowser.net.UrlRequest; |
||||
import com.teamdev.jxbrowser.net.UrlRequestJob; |
||||
import com.teamdev.jxbrowser.net.callback.InterceptRequestCallback; |
||||
|
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.net.URI; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.nio.file.Files; |
||||
import java.nio.file.Path; |
||||
import java.util.Map; |
||||
import java.util.Optional; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2020/3/25 |
||||
*/ |
||||
public class NxInterceptRequestCallback implements InterceptRequestCallback { |
||||
|
||||
Network network; |
||||
Map<String, String> map; |
||||
|
||||
public NxInterceptRequestCallback(Network network) { |
||||
this.network = network; |
||||
} |
||||
|
||||
public NxInterceptRequestCallback(Network network, Map<String, String> map) { |
||||
this.network = network; |
||||
this.map = map; |
||||
} |
||||
|
||||
@Override |
||||
public Response on(Params params) { |
||||
UrlRequest urlRequest = params.urlRequest(); |
||||
String path = urlRequest.url(); |
||||
if (path.startsWith("file:")) { |
||||
Optional<UrlRequestJob> optional = generateFileProtocolUrlRequestJob(urlRequest, path); |
||||
if (optional.isPresent()) { |
||||
return InterceptRequestCallback.Response.intercept(optional.get()); |
||||
} |
||||
} else { |
||||
return next(urlRequest, path); |
||||
} |
||||
return Response.proceed(); |
||||
} |
||||
|
||||
Response next(UrlRequest urlRequest, String path) { |
||||
return Response.proceed(); |
||||
} |
||||
|
||||
private Optional<UrlRequestJob> generateFileProtocolUrlRequestJob(UrlRequest urlRequest, String path) { |
||||
try { |
||||
String url = new URLCodec().decode(path); |
||||
String filePath = TemplateUtils.renderParameter4Tpl(url, map); |
||||
File file = new File(URI.create(filePath).getPath()); |
||||
InputStream inputStream = IOUtils.readResource(file.getAbsolutePath()); |
||||
String mimeType = getMimeType(path); |
||||
byte[] bytes; |
||||
if (isPlainText(mimeType)) { |
||||
String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); |
||||
text = TemplateUtils.renderParameter4Tpl(text, map); |
||||
bytes = text.getBytes(StandardCharsets.UTF_8); |
||||
} else { |
||||
bytes = IOUtils.inputStream2Bytes(inputStream); |
||||
} |
||||
return Optional.of(generateBasicUrlRequestJob(urlRequest, mimeType, bytes)); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return Optional.empty(); |
||||
} |
||||
|
||||
private boolean isPlainText(String mimeType) { |
||||
return ArrayUtils.contains(new String[]{"text/html", "text/javascript", "text/css"}, mimeType); |
||||
} |
||||
|
||||
UrlRequestJob generateBasicUrlRequestJob(UrlRequest urlRequest, String mimeType, byte[] bytes) { |
||||
UrlRequestJob.Options options = UrlRequestJob.Options |
||||
.newBuilder(urlRequest.id(), HttpStatus.OK) |
||||
.addHttpHeader(HttpHeader.of("Content-Type", mimeType)) |
||||
.build(); |
||||
UrlRequestJob urlRequestJob = network.newUrlRequestJob(options); |
||||
urlRequestJob.write(bytes); |
||||
urlRequestJob.complete(); |
||||
return urlRequestJob; |
||||
} |
||||
|
||||
String getMimeType(String path) { |
||||
if (StringUtils.isBlank(path)) { |
||||
return "text/html"; |
||||
} |
||||
if (path.endsWith(".html")) { |
||||
return "text/html"; |
||||
} |
||||
if (path.endsWith(".css")) { |
||||
return "text/css"; |
||||
} |
||||
if (path.endsWith(".js")) { |
||||
return "text/javascript"; |
||||
} |
||||
if (path.endsWith(".svg")) { |
||||
return "image/svg+xml"; |
||||
} |
||||
if (path.endsWith(".png")) { |
||||
return "image/png"; |
||||
} |
||||
if (path.endsWith(".jpeg")) { |
||||
return "image/jpeg"; |
||||
} |
||||
if (path.endsWith(".gif")) { |
||||
return "image/gif"; |
||||
} |
||||
Path file = new File("D:\\Fanruan\\FR10.0\\final_05_27\\FineReport_10.0\\webapps\\webroot\\upm\\lib\\locale\\plugin_zh_CN.js").toPath(); |
||||
try { |
||||
return Files.probeContentType(file); |
||||
} catch (IOException e) { |
||||
return "text/html"; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.design.update.actions; |
||||
|
||||
import com.fr.decision.update.SyncExecutor; |
||||
import com.fr.decision.update.info.UpdateCallBack; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import java.util.concurrent.ExecutionException; |
||||
import javax.swing.SwingWorker; |
||||
|
||||
public abstract class SyncFileProcess extends SwingWorker<Boolean, Void> { |
||||
private UpdateCallBack callBack; |
||||
private String buildNo; |
||||
|
||||
public SyncFileProcess(UpdateCallBack callBack,String buildNo) { |
||||
this.callBack = callBack; |
||||
this.buildNo = buildNo; |
||||
} |
||||
|
||||
@Override |
||||
protected Boolean doInBackground() throws Exception { |
||||
return SyncExecutor.getInstance().execute(callBack,buildNo); |
||||
} |
||||
|
||||
@Override |
||||
protected void done() { |
||||
boolean success = false; |
||||
try { |
||||
success = get(); |
||||
} catch (InterruptedException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
Thread.currentThread().interrupt(); |
||||
} catch (ExecutionException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
if (success) { |
||||
onDownloadSuccess(); |
||||
} else { |
||||
onDownloadFailed(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 下载成功 |
||||
*/ |
||||
public abstract void onDownloadSuccess(); |
||||
|
||||
/** |
||||
* 下载失败 |
||||
*/ |
||||
public abstract void onDownloadFailed(); |
||||
} |
@ -0,0 +1,73 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.design.dialog.link.MessageWithLink; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.IOUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.Locale; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* 主jar下载失败的弹出框 |
||||
* |
||||
* */ |
||||
|
||||
public class ErrorDialog extends JDialog implements ActionListener { |
||||
public ErrorDialog(Frame parent, String message) { |
||||
super(parent, true); |
||||
init(message); |
||||
} |
||||
|
||||
private void init(String message){ |
||||
//主体内容
|
||||
JPanel centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
|
||||
//带超链的提示信息
|
||||
JPanel messagePanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
messagePanel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0)); |
||||
|
||||
MessageWithLink messageWithLink = new MessageWithLink(message + ",", Toolkit.i18nText("Fine-Design_Basic_Sync_Help"), CloudCenter.getInstance().acquireUrlByKind("help.replacejars", "https://help.fanruan.com/finereport/doc-view-3268.html")); |
||||
messageWithLink.setPreferredSize(new Dimension(108, 20)); |
||||
JPanel messageLinkPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
messageLinkPane.setBorder(BorderFactory.createEmptyBorder(5, 8, 5, 0)); |
||||
messageLinkPane.add(messageWithLink); |
||||
|
||||
//错误提示图标
|
||||
UILabel imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/icon/versioncheck/bigfail.png")); |
||||
messagePanel.add(imageLabel); |
||||
messagePanel.add(messageLinkPane); |
||||
|
||||
//确定按钮
|
||||
UIButton ok = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Button_OK")); |
||||
ok.addActionListener(this); |
||||
ok.setSize(new Dimension(44, 20)); |
||||
JPanel okPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); |
||||
okPanel.add(ok); |
||||
|
||||
centerPanel.add(messagePanel, BorderLayout.CENTER); |
||||
centerPanel.add(okPanel, BorderLayout.SOUTH); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Tool_Tips")); |
||||
this.setResizable(false); |
||||
this.add(centerPanel, BorderLayout.CENTER); |
||||
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 282 : 262, 118)); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
this.dispose(); |
||||
} |
||||
} |
@ -0,0 +1,119 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.design.RestartHelper; |
||||
import com.fr.design.dialog.link.MessageWithLink; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextarea.UITextArea; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.stable.StringUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.util.Locale; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.Icon; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JScrollPane; |
||||
import javax.swing.UIManager; |
||||
|
||||
/** |
||||
* @author pengda |
||||
* @version 10.0 |
||||
* Created on 2021-06-02 |
||||
*/ |
||||
public class SyncFailedPluginsDialog extends JDialog { |
||||
private UILabel detailsLabel; |
||||
private JScrollPane scrollPane; |
||||
public SyncFailedPluginsDialog(Frame parent, JSONArray syncFailedPlugins) { |
||||
super(parent, true); |
||||
JPanel body = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
|
||||
JPanel northPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
northPane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0)); |
||||
JPanel imagePanel = new JPanel(); |
||||
Icon icon = IOUtils.readIcon("com/fr/design/icon/versioncheck/warning.png"); |
||||
JLabel imageLabel = new JLabel(); |
||||
imageLabel.setIcon(icon); |
||||
imagePanel.add(imageLabel); |
||||
imagePanel.setPreferredSize(new Dimension(20, 20)); |
||||
|
||||
JPanel messagePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
MessageWithLink messageWithLink = new MessageWithLink(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugin_Fail_Suggestion"),Toolkit.i18nText("Fine-Design_Basic_Sync_Deal_Immediately"), |
||||
CloudCenter.getInstance().acquireUrlByKind("help.installplugins", "https://help.fanruan.com/finereport/doc-view-2198.html")); |
||||
messageWithLink.setPreferredSize(new Dimension(316, 20)); |
||||
|
||||
messagePane.add(messageWithLink); |
||||
messagePane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 0)); |
||||
|
||||
northPane.add(imageLabel, BorderLayout.WEST); |
||||
northPane.add(messagePane, BorderLayout.CENTER); |
||||
|
||||
JPanel centerPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
detailsLabel = new UILabel(Toolkit.i18nText("Fine_Designer_Look_Detail")); |
||||
detailsLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); |
||||
detailsLabel.addMouseListener(detailsLabelClickListener); |
||||
JPanel detailsTitlePanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
detailsTitlePanel.add(detailsLabel); |
||||
detailsTitlePanel.setBorder(BorderFactory.createEmptyBorder(0,0,5,0)); |
||||
|
||||
UITextArea detailsTextArea = new UITextArea(); |
||||
StringBuilder detailsText = new StringBuilder(StringUtils.EMPTY); |
||||
for (int i = 0; i < syncFailedPlugins.size(); i++) { |
||||
JSONObject plugin = syncFailedPlugins.getJSONObject(i); |
||||
detailsText.append(plugin.getString("name")).append(",").append(Toolkit.i18nText("Fine-Design_Basic_Sync_Server_Version")).append(plugin.getString("version")).append("\n"); |
||||
} |
||||
detailsTextArea.setText(detailsText.toString()); |
||||
scrollPane = new JScrollPane(detailsTextArea); |
||||
centerPanel.add(detailsTitlePanel,BorderLayout.NORTH); |
||||
centerPanel.add(scrollPane,BorderLayout.CENTER); |
||||
|
||||
JPanel southPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); |
||||
UIButton restartButton = new UIButton(Toolkit.i18nText("Fine-Design_Updater_Restart_Designer")); |
||||
restartButton.addMouseListener(restartButtonClickListener); |
||||
southPane.add(restartButton); |
||||
|
||||
body.add(northPane,BorderLayout.NORTH); |
||||
body.add(centerPanel,BorderLayout.CENTER); |
||||
body.add(southPane,BorderLayout.SOUTH); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Tool_Tips")); |
||||
this.setResizable(false); |
||||
this.add(body, BorderLayout.CENTER); |
||||
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 400 : 380, 225)); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
private MouseListener detailsLabelClickListener = new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
if(scrollPane.isVisible()){ |
||||
scrollPane.setVisible(false); |
||||
detailsLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); |
||||
}else{ |
||||
scrollPane.setVisible(true); |
||||
detailsLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
private MouseListener restartButtonClickListener = new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
RestartHelper.restartForUpdate(DesignerContext.getDesignerFrame()); |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,105 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.design.VersionCheckUtils; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.general.IOUtils; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Locale; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JDialog; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* @author pengda |
||||
* @version 10.0 |
||||
* Created on 2021-06-02 |
||||
*/ |
||||
public class VersionCheckMessageDialog extends JDialog implements ActionListener { |
||||
private UILabel imageLabel; |
||||
private UILabel detailLabel; |
||||
private JPanel centerPanel; |
||||
private JPanel detailPanel; |
||||
private JPanel body; |
||||
private String envName; |
||||
|
||||
public VersionCheckMessageDialog(Frame parent, String message, String envName) { |
||||
super(parent, true); |
||||
this.envName = envName; |
||||
init(message); |
||||
} |
||||
|
||||
private void init(String message) { |
||||
JPanel imagePanel = new JPanel(); |
||||
imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/warnings/warning32.png")); |
||||
imagePanel.add(imageLabel); |
||||
JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); |
||||
UILabel messageText = new UILabel(); |
||||
messageText.setText("<html>" + message + "</html>"); |
||||
messagePanel.add(messageText); |
||||
|
||||
centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
centerPanel.setBorder(BorderFactory.createEmptyBorder(15, 10, 10, 10)); |
||||
centerPanel.add(imagePanel, BorderLayout.WEST); |
||||
centerPanel.add(messagePanel, BorderLayout.CENTER); |
||||
|
||||
detailLabel = new UILabel(); |
||||
detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); |
||||
detailLabel.setForeground(Color.BLUE); |
||||
|
||||
detailPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
detailPanel.add(detailLabel, BorderLayout.EAST); |
||||
|
||||
String localBranch = GeneralUtils.readFullBuildNO(); |
||||
String remoteBranch = VersionCheckUtils.getRemoteBranch(envName); |
||||
List<String> noExistServiceDescription; |
||||
if(ComparatorUtils.equals(localBranch,remoteBranch)) { |
||||
noExistServiceDescription = new ArrayList<>(); |
||||
}else{ |
||||
noExistServiceDescription = VersionCheckUtils.getNoExistServiceDescription(this.envName); |
||||
} |
||||
|
||||
detailPanel.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
hideDialog(); |
||||
CheckServiceDialog checkServiceDialog = new CheckServiceDialog(DesignerContext.getDesignerFrame(), localBranch, remoteBranch, noExistServiceDescription); |
||||
checkServiceDialog.setVisible(true); |
||||
} |
||||
}); |
||||
|
||||
body = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
body.add(centerPanel, BorderLayout.CENTER); |
||||
body.add(detailPanel, BorderLayout.SOUTH); |
||||
|
||||
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Sync_Prompt")); |
||||
this.setResizable(false); |
||||
this.add(body, BorderLayout.NORTH); |
||||
this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US) ? 300 : 280, 135)); |
||||
GUICoreUtils.centerWindow(this); |
||||
} |
||||
|
||||
private void hideDialog(){ |
||||
this.dispose(); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
hideDialog(); |
||||
} |
||||
} |
@ -1,4 +1,4 @@
|
||||
com.fr.design.mainframe.check.CheckButton=230*118 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=490*185 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=490*31 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.messageWithLink=490*35 |
||||
com.fr.design.mainframe.check.CheckFontInfoDialog.unfold=490*280 |
After Width: | Height: | Size: 179 B |
After Width: | Height: | Size: 722 B |
After Width: | Height: | Size: 377 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 410 B |
After Width: | Height: | Size: 942 B |
@ -0,0 +1,2 @@
|
||||
VERSION=1.0 |
||||
ENV_VERSION=10.0 |
@ -0,0 +1,52 @@
|
||||
.background-login-close { |
||||
color: white !important; |
||||
font-weight: bold; |
||||
font-size: 14px; |
||||
} |
||||
.background-guide-close { |
||||
color: black !important; |
||||
font-weight: bold; |
||||
font-size: 16px; |
||||
} |
||||
.background-login-loading { |
||||
background: url(./img/login_loading.gif) no-repeat center center; |
||||
} |
||||
.background-plugin-need-update { |
||||
background: url(./img/icon_new.png) no-repeat center center; |
||||
} |
||||
.background-plugin-cant-use { |
||||
background: url(./img/icon_cantuse.png) no-repeat center center; |
||||
} |
||||
.background-plugin-is-disable { |
||||
background: url(./img/icon_disable.png) no-repeat center center; |
||||
} |
||||
.background-plugin-is-disable-new { |
||||
background: url(./img/icon_disable-new.png) no-repeat center center; |
||||
} |
||||
.background-plugin-selected { |
||||
background: url(./img/icon_marked.png) no-repeat center center; |
||||
} |
||||
.background-shop-title-close { |
||||
background: url(./img/icon_close40x40_normal.svg) no-repeat center center; |
||||
} |
||||
.background-dialog-confirm { |
||||
background: url(./img/warning.png) no-repeat center center; |
||||
background-size: contain; |
||||
} |
||||
.background-close-button { |
||||
background: url(./img/icon_close9x9_normal.png) no-repeat center center; |
||||
} |
||||
.background-close-button:hover { |
||||
background: url(./img/icon_close9x9_hover.png) no-repeat center center; |
||||
} |
||||
.designer-login-guide { |
||||
background: url(./img/login_guide.png) no-repeat center center; |
||||
background-size: cover; |
||||
} |
||||
.designer-guide-login-button { |
||||
font-size: 14px; |
||||
color: white; |
||||
border-radius: 4px; |
||||
background-color: #3685F2; |
||||
} |
||||
|
@ -0,0 +1,25 @@
|
||||
<!DOCTYPE html> |
||||
<html> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<title>title</title> |
||||
<style> |
||||
@font-face { |
||||
font-family: "fineui"; |
||||
src: url('../lib/font/iconfont.eot'); |
||||
src: url('../lib/font/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../lib/font/iconfont.woff') format('woff'), /* chrome、firefox */ url('../lib/font/iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ url('../lib/font/iconfont.svg#svgFontName') format('svg'); /* iOS 4.1- */ |
||||
} |
||||
</style> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||
<link rel="stylesheet" type="text/css" href="lib/bundle.css"/> |
||||
<script type="text/javascript" charset="UTF-8" src="lib/locale/login_zh_CN.js?_=compatible"></script> |
||||
<script type="text/javascript" charset="UTF-8" src="lib/locale/login_${language}.js"></script><script type="text/javascript" charset="UTF-8" src="lib/fineui.min.js"></script><script type="text/javascript"></script> |
||||
<style> |
||||
body { |
||||
overflow-y: auto; |
||||
} |
||||
</style> |
||||
<link href="guide.css" rel="stylesheet"></head> |
||||
</html> |
||||
<script type="text/javascript" src="guide.js"></script> |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 260 B |
After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 473 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 357 KiB |
@ -0,0 +1,5 @@
|
||||
var Store = { |
||||
i18n : { |
||||
|
||||
}} |
||||
window.Store = Store; |