* 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,8 +1,10 @@ |
|||||||
package com.fr.design.extra; |
package com.fr.design.extra; |
||||||
|
|
||||||
|
import com.fr.design.login.DesignerLoginSource; |
||||||
|
|
||||||
/** |
/** |
||||||
* Created by lp on 2016/8/16. |
* Created by lp on 2016/8/16. |
||||||
*/ |
*/ |
||||||
public interface LoginContextListener { |
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.CheckButton=230*118 |
||||||
com.fr.design.mainframe.check.CheckFontInfoDialog.collapse=490*185 |
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 |
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; |