diff --git a/cim-boot-server/cim-boot-server.iml b/cim-boot-server/cim-boot-server.iml index 6d0ab4a..e9a3876 100644 --- a/cim-boot-server/cim-boot-server.iml +++ b/cim-boot-server/cim-boot-server.iml @@ -18,6 +18,7 @@ + diff --git a/cim-boot-server/cim-boot-server.iws b/cim-boot-server/cim-boot-server.iws index 6c69322..e4dad74 100644 --- a/cim-boot-server/cim-boot-server.iws +++ b/cim-boot-server/cim-boot-server.iws @@ -9,10 +9,15 @@ - - - + + + + + + + + + + + @@ -149,12 +168,24 @@ + + + + diff --git a/cim-boot-server/libs/cim-server-sdk-netty-4.0.0.jar b/cim-boot-server/libs/cim-server-sdk-netty-4.0.0.jar index 5ccdbd3..150677e 100644 Binary files a/cim-boot-server/libs/cim-server-sdk-netty-4.0.0.jar and b/cim-boot-server/libs/cim-server-sdk-netty-4.0.0.jar differ diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java index bbfd8f6..977ddee 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/component/handler/BindHandler.java @@ -67,10 +67,12 @@ public class BindHandler implements CIMRequestHandler { session.setDeviceName(body.get("deviceName")); session.setAppVersion(body.get("appVersion")); session.setOsVersion(body.get("osVersion")); + session.setLanguage(body.get("language")); channel.attr(ChannelAttr.UID).set(uid); channel.attr(ChannelAttr.CHANNEL).set(session.getChannel()); channel.attr(ChannelAttr.DEVICE_ID).set(session.getDeviceId()); + channel.attr(ChannelAttr.LANGUAGE).set(session.getLanguage()); /* *存储到数据库 diff --git a/cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java b/cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java index 49eb598..ed09032 100644 --- a/cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java +++ b/cim-boot-server/src/main/java/com/farsunset/cim/entity/Session.java @@ -97,6 +97,12 @@ public class Session implements Serializable { @Column(name = "os_version") private String osVersion; + /** + * 终端语言 + */ + @Column(name = "language") + private String language; + /** * 登录时间 */ @@ -230,6 +236,14 @@ public class Session implements Serializable { this.location = location; } + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + public int getState() { return state; } diff --git a/cim-boot-server/src/main/resources/i18n/messages.properties b/cim-boot-server/src/main/resources/i18n/messages.properties index b2d4192..8d7892d 100644 --- a/cim-boot-server/src/main/resources/i18n/messages.properties +++ b/cim-boot-server/src/main/resources/i18n/messages.properties @@ -32,6 +32,7 @@ module.common.headlogo = 头像 module.common.homepage = 主页 module.common.website = 网址 module.common.text = 文字 +module.common.language = 语言 module.global.error.500.hint = 服务程序发生内部错误 module.global.error.400.hint = 请求参数类型不正确 diff --git a/cim-boot-server/src/main/resources/page/console/session/manage.html b/cim-boot-server/src/main/resources/page/console/session/manage.html index 549df67..584357e 100644 --- a/cim-boot-server/src/main/resources/page/console/session/manage.html +++ b/cim-boot-server/src/main/resources/page/console/session/manage.html @@ -48,13 +48,14 @@ function doSendMessage(){ - - - - - - - + + + + + + + + @@ -69,6 +70,7 @@ function doSendMessage(){ + diff --git a/cim-boot-server/src/main/resources/static/css/common.css b/cim-boot-server/src/main/resources/static/css/common.css index 2e70f3c..28ad0ff 100644 --- a/cim-boot-server/src/main/resources/static/css/common.css +++ b/cim-boot-server/src/main/resources/static/css/common.css @@ -1 +1 @@ -@CHARSET "UTF-8";html,body{height:100%;font-family:微软雅黑;background:url(/image/pattern.png) repeat,linear-gradient(#e1e4e7,#f3f4f5);}.header{position:fixed;height:100px;background:#2b345d;width:100%;z-index:999;line-height:100px;-webkit-box-shadow:0 0 12px 0 #0d1e33;box-shadow:0 0 12px 0 #0d1e33;}.header_liner{position:fixed;height:5px;top:95px;width:100%;z-index:998;background:linear-gradient(to right,#ff4444,#99cc00,#33b5e5,#aa66cc,#ffbb33);}#mainWrapper{width:auto;margin-left:180px;min-height:600px;padding-bottom:50px;padding-top:100px;}ul,ol{margin:0;padding:0;list-style:none;}.tip_blue{zoom:1;background:#3391D7;color:#FFFFFF;text-align:center;line-height:50px;height:50px;font-family:楷体;min-width:300px;position:absolute;z-index:9999;font-size:16px;font-weight:bold;padding:0 15px;border-radius:3px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.4);box-shadow:0 3px 5px rgba(0,0,0,.4);}.tip_red{zoom:1;background:#DF3D3D;color:#FFFFFF;text-align:center;font-family:楷体;line-height:50px;height:50px;min-width:300px;position:absolute;z-index:9999;font-size:16px;font-weight:bold;padding:0 15px;border-radius:3px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.4);box-shadow:0 3px 5px rgba(0,0,0,.4);}.tip_green{zoom:1;background:#54ad18;color:#ffffff;text-align:center;font-family:楷体;line-height:50px;height:50px;min-width:300px;position:absolute;z-index:9999;font-size:16px;font-weight:bold;padding:0 15px;border-radius:3px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.4);box-shadow:0 3px 5px rgba(0,0,0,.4);}.tip_process{zoom:1;color:#394A5E;text-align:center;line-height:50px;height:50px;font-family:楷体;background-color:white;min-width:300px;position:absolute;z-index:9999;border-radius:4px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);}.icon_loading_small{background:url(/image/icon_loading_small.gif) no-repeat;width:22px;height:22px;left:20px;top:15px;position:absolute;}.form-group label{width:70px;text-align:right;}.lay-main-toolbar{height:60px;border-radius:0px;border-right:1px solid #B5BBBF;border-bottom:#c8c8c8 solid 1px;background:white;box-shadow:rgba(0,0,0,0.15) 0px 1px 8px;position:relative;width:100%;padding:8px;}.nav-menu-divider{box-shadow:#e9eaeb 0px 1px 0px;border-bottom:#c4c6c7 solid 1px;}.btn i{font-size:17px;margin-right:2px;font-weight:bold;font-style:normal;line-height:17px;}.modal-dialog{margin:150px auto;}.dialog_close:hover,.dialog_close:focus{opacity:.6;filter:alpha(opacity=60);}.gdialog .modal-header{cursor:move;}.ui-vnav{position:fixed;top:100px;left:0;width:180px;min-height:560px;height:960px;_overflow:hidden;background:#ffffff;z-index:88;box-shadow:1px 0 4px rgba(0,0,0,.3);}.ui-vnav .ui-bar{height:20px;overflow:hidden;}.ui-vnav .ui-bd{display:block;margin:9px 0;width:100%;height:0px;line-height:0px;border-top:1px solid #afb1b2;border-bottom:1px solid #eaeaea;}.ui-vnav .ui-item{height:45px;line-height:45px;padding:0 10px;text-align:center;cursor:pointer;border-bottom:1px #e4e5e6 solid;}.ui-vnav .ui-item:hover{color:white;background-color:#F3F3F3;}.ui-vnav .current,.ui-vnav .current:hover{background-color:#FFFFFF;border-left:6px #44b549 solid;padding-left:4px;}.ui-vnav .ui-item a{position:relative;display:block;height:45px;line-height:45px;font-size:16px;color:#666;text-decoration:none;}.ui-vnav .ui-shd{position:absolute;right:0;top:0;width:4px;height:100%;overflow:hidden;border-right:1px solid #b5b5b6;background-image:-webkit-linear-gradient(left,transparent,rgba(0,0,0,.1));background-image:-moz-linear-gradient(left,transparent,rgba(0,0,0,.1));background-image:-o-linear-gradient(left,transparent,rgba(0,0,0,.1));background-image:linear-gradient(top right,transparent,#c9cacb);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00DBDCDD',EndColorStr='#B5B5B6',gradientType=1);}.utable{border-collapse:collapse;border-spacing:0;text-align:center;font-size:12px;background:#ffffff;word-break:break-all;table-layout:fixed;margin-right:10px;}.utable tr th{background-color:#eff1f9;border-right:solid 1px #D4D4D4;border-left:solid 1px #D4D4D4;border-bottom:solid 1px #D4D4D4;color:#463E5E;line-height:40px;font-size:14px;text-align:center;}.utable tr:hover{background-color:#f5f6f9;}.utable tr td{border-right:solid 1px #D4D4D4;border-bottom:solid 1px #D4D4D4;color:#666;max-height:80px;line-height:35px;height:35px;padding-left:5px;padding-right:5px;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.datarecord{text-align:center;line-height:30px;background-color:#14A7D5;margin-right:10px;}.input-pagenumber{width:50px;display:inline;height:31px;margin-left:20px;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0px;border-bottom-right-radius:0px;}textarea{resize:none;}.modal-header{border-bottom:#c8c8c8 solid 1px;box-shadow:rgba(0,0,0,0.15) 0px 1px 8px;height:50px;}.modal-open .modal{overflow-y:hidden;}.btn:focus,button:focus{outline:none;}.bar-button{color:#222222;background-color:#ffffff;border-color:#7d7d7d;}.input-required{border-color:#e91e63;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(204,42,79,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(204,42,79,.6);} \ No newline at end of file +@CHARSET "UTF-8";html,body{height:100%;font-family:微软雅黑;background:url(/image/pattern.png) repeat,linear-gradient(#e1e4e7,#f3f4f5);}.header{position:fixed;height:100px;background:#2b345d;width:100%;z-index:999;line-height:100px;-webkit-box-shadow:0 0 12px 0 #0d1e33;box-shadow:0 0 12px 0 #0d1e33;}.header_liner{position:fixed;height:5px;top:95px;width:100%;z-index:998;background:linear-gradient(to right,#ff4444,#99cc00,#33b5e5,#aa66cc,#ffbb33);}#mainWrapper{width:auto;margin-left:180px;min-height:600px;padding-bottom:50px;padding-top:100px;}ul,ol{margin:0;padding:0;list-style:none;}.tip_blue{zoom:1;background:#3391D7;color:#FFFFFF;text-align:center;line-height:50px;height:50px;font-family:楷体;min-width:300px;position:absolute;z-index:9999;font-size:16px;font-weight:bold;padding:0 15px;border-radius:3px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.4);box-shadow:0 3px 5px rgba(0,0,0,.4);}.tip_red{zoom:1;background:#DF3D3D;color:#FFFFFF;text-align:center;font-family:楷体;line-height:50px;height:50px;min-width:300px;position:absolute;z-index:9999;font-size:16px;font-weight:bold;padding:0 15px;border-radius:3px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.4);box-shadow:0 3px 5px rgba(0,0,0,.4);}.tip_green{zoom:1;background:#54ad18;color:#ffffff;text-align:center;font-family:楷体;line-height:50px;height:50px;min-width:300px;position:absolute;z-index:9999;font-size:16px;font-weight:bold;padding:0 15px;border-radius:3px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.4);box-shadow:0 3px 5px rgba(0,0,0,.4);}.tip_process{zoom:1;color:#394A5E;text-align:center;line-height:50px;height:50px;font-family:楷体;background-color:white;min-width:300px;position:absolute;z-index:9999;border-radius:4px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);}.icon_loading_small{background:url(/image/icon_loading_small.gif) no-repeat;width:22px;height:22px;left:20px;top:15px;position:absolute;}.form-group label{width:70px;text-align:right;}.lay-main-toolbar{height:60px;border-radius:0px;border-right:1px solid #B5BBBF;border-bottom:#c8c8c8 solid 1px;background:white;box-shadow:rgba(0,0,0,0.15) 0px 1px 8px;position:relative;width:100%;padding:8px;}.nav-menu-divider{box-shadow:#e9eaeb 0px 1px 0px;border-bottom:#c4c6c7 solid 1px;}.btn i{font-size:17px;margin-right:2px;font-weight:bold;font-style:normal;line-height:17px;}.modal-dialog{margin:150px auto;}.dialog_close:hover,.dialog_close:focus{opacity:.6;filter:alpha(opacity=60);}.gdialog .modal-header{cursor:move;}.ui-vnav{position:fixed;top:100px;left:0;width:180px;min-height:560px;height:100%;_overflow:hidden;background:#ffffff;z-index:88;box-shadow:1px 0 4px rgba(0,0,0,.3);}.ui-vnav .ui-bar{height:20px;overflow:hidden;}.ui-vnav .ui-bd{display:block;margin:9px 0;width:100%;height:0px;line-height:0px;border-top:1px solid #afb1b2;border-bottom:1px solid #eaeaea;}.ui-vnav .ui-item{height:45px;line-height:45px;padding:0 10px;text-align:center;cursor:pointer;border-bottom:1px #e4e5e6 solid;}.ui-vnav .ui-item:hover{color:white;background-color:#F3F3F3;}.ui-vnav .current,.ui-vnav .current:hover{background-color:#FFFFFF;border-left:6px #44b549 solid;padding-left:4px;}.ui-vnav .ui-item a{position:relative;display:block;height:45px;line-height:45px;font-size:16px;color:#666;text-decoration:none;}.ui-vnav .ui-shd{position:absolute;right:0;top:0;width:4px;height:100%;overflow:hidden;border-right:1px solid #b5b5b6;background-image:-webkit-linear-gradient(left,transparent,rgba(0,0,0,.1));background-image:-moz-linear-gradient(left,transparent,rgba(0,0,0,.1));background-image:-o-linear-gradient(left,transparent,rgba(0,0,0,.1));background-image:linear-gradient(top right,transparent,#c9cacb);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00DBDCDD',EndColorStr='#B5B5B6',gradientType=1);}.utable{border-collapse:collapse;border-spacing:0;text-align:center;font-size:12px;background:#ffffff;word-break:break-all;table-layout:fixed;margin-right:10px;}.utable tr th{background-color:#eff1f9;border-right:solid 1px #D4D4D4;border-left:solid 1px #D4D4D4;border-bottom:solid 1px #D4D4D4;color:#463E5E;line-height:40px;font-size:14px;text-align:center;}.utable tr:hover{background-color:#f5f6f9;}.utable tr td{border-right:solid 1px #D4D4D4;border-bottom:solid 1px #D4D4D4;color:#666;max-height:80px;line-height:35px;height:35px;padding-left:5px;padding-right:5px;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.datarecord{text-align:center;line-height:30px;background-color:#14A7D5;margin-right:10px;}.input-pagenumber{width:50px;display:inline;height:31px;margin-left:20px;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0px;border-bottom-right-radius:0px;}textarea{resize:none;}.modal-header{border-bottom:#c8c8c8 solid 1px;box-shadow:rgba(0,0,0,0.15) 0px 1px 8px;height:50px;}.modal-open .modal{overflow-y:hidden;}.btn:focus,button:focus{outline:none;}.bar-button{color:#222222;background-color:#ffffff;border-color:#7d7d7d;}.input-required{border-color:#e91e63;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(204,42,79,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(204,42,79,.6);} \ No newline at end of file diff --git a/cim-boot-server/src/main/resources/static/js/cim/cim.web.sdk.js b/cim-boot-server/src/main/resources/static/js/cim/cim.web.sdk.js index 52c9f8d..86411e6 100644 --- a/cim-boot-server/src/main/resources/static/js/cim/cim.web.sdk.js +++ b/cim-boot-server/src/main/resources/static/js/cim/cim.web.sdk.js @@ -63,6 +63,7 @@ CIMPushManager.bind = function (account) { body.getDataMap().set("packageName", APP_PACKAGE); body.getDataMap().set("deviceId", deviceId); body.getDataMap().set("deviceName", browser.name); + body.getDataMap().set("language", navigator.language); CIMPushManager.sendRequest(body); }; diff --git a/cim-client-sdk-libs/android/cim-android-sdk-4.0.0.jar b/cim-client-sdk-libs/android/cim-android-sdk-4.0.0.jar index acd0649..171b4df 100644 Binary files a/cim-client-sdk-libs/android/cim-android-sdk-4.0.0.jar and b/cim-client-sdk-libs/android/cim-android-sdk-4.0.0.jar differ diff --git a/cim-client-sdk-libs/js/cim.web.sdk.js b/cim-client-sdk-libs/js/cim.web.sdk.js index 52c9f8d..86411e6 100644 --- a/cim-client-sdk-libs/js/cim.web.sdk.js +++ b/cim-client-sdk-libs/js/cim.web.sdk.js @@ -63,6 +63,7 @@ CIMPushManager.bind = function (account) { body.getDataMap().set("packageName", APP_PACKAGE); body.getDataMap().set("deviceId", deviceId); body.getDataMap().set("deviceName", browser.name); + body.getDataMap().set("language", navigator.language); CIMPushManager.sendRequest(body); }; diff --git a/cim-client-sdk/cim-android-sdk/cim-android-sdk.iml b/cim-client-sdk/cim-android-sdk/cim-android-sdk.iml old mode 100755 new mode 100644 diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java index 4fd7025..98ad286 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -28,11 +28,13 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; +import android.os.LocaleList; import android.text.TextUtils; import com.farsunset.cim.sdk.android.logger.CIMLogger; import com.farsunset.cim.sdk.android.constant.CIMConstant; import com.farsunset.cim.sdk.android.model.SentBody; +import java.util.Locale; import java.util.UUID; /** @@ -161,6 +163,7 @@ public class CIMPushManager { sent.put("appVersion", getVersionName(context)); sent.put("osVersion", Build.VERSION.RELEASE); sent.put("packageName", context.getPackageName()); + sent.put("language", getLanguage()); sent.setTimestamp(System.currentTimeMillis()); sendRequest(context, sent); } @@ -293,4 +296,10 @@ public class CIMPushManager { return deviceId; } + private static String getLanguage(){ + + Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? LocaleList.getDefault().get(0) : Locale.getDefault(); + + return locale.getLanguage() + "-" + locale.getCountry(); + } } diff --git a/cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/constant/ChannelAttr.java b/cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/constant/ChannelAttr.java index bf7df87..da69d86 100644 --- a/cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/constant/ChannelAttr.java +++ b/cim-server-sdk/src/main/java/com/farsunset/cim/sdk/server/constant/ChannelAttr.java @@ -9,4 +9,5 @@ public interface ChannelAttr { AttributeKey ID = AttributeKey.valueOf("id"); AttributeKey DEVICE_ID = AttributeKey.valueOf("device_id"); AttributeKey TAG = AttributeKey.valueOf("tag"); + AttributeKey LANGUAGE = AttributeKey.valueOf("language"); } diff --git a/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-4.0.0.jar b/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-4.0.0.jar index acd0649..1ef7e40 100644 Binary files a/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-4.0.0.jar and b/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-4.0.0.jar differ diff --git a/cim-use-examples/cim-client-vue/websocket/cim.web.sdk.js b/cim-use-examples/cim-client-vue/websocket/cim.web.sdk.js index 433e741..14f9a74 100644 --- a/cim-use-examples/cim-client-vue/websocket/cim.web.sdk.js +++ b/cim-use-examples/cim-client-vue/websocket/cim.web.sdk.js @@ -67,6 +67,7 @@ const onbindAccount = CIMPushManager.bindAccount = function (account) { body.getDataMap().set("packageName", APP_PACKAGE); body.getDataMap().set("deviceId", deviceId); body.getDataMap().set("deviceName", browser.name); + body.getDataMap().set("language", navigator.language); CIMPushManager.sendRequest(body); };
<@spring.message 'module.console.cimsession.account'/><@spring.message 'module.console.cimsession.nid'/><@spring.message 'module.console.cimsession.channel'/><@spring.message 'module.console.cimsession.deviceid'/><@spring.message 'module.console.cimsession.device.name'/><@spring.message 'module.console.cimsession.app.version'/><@spring.message 'module.console.cimsession.os.version'/><@spring.message 'module.console.cimsession.account'/><@spring.message 'module.console.cimsession.nid'/><@spring.message 'module.console.cimsession.channel'/><@spring.message 'module.console.cimsession.deviceid'/><@spring.message 'module.console.cimsession.device.name'/><@spring.message 'module.console.cimsession.app.version'/><@spring.message 'module.console.cimsession.os.version'/><@spring.message 'module.common.language'/> <@spring.message 'module.console.cimsession.online.time'/> <@spring.message "module.common.operation"/>
${cimsession.deviceName! } ${cimsession.appVersion! } ${cimsession.osVersion! }${cimsession.language! } <@spring.messageArgs "module.console.cimsession.time.format",[((.now?long - cimsession.bindTime)/1000)?round?c] />