Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
fuyue82
o2oa
提交
b9f11aad
o2oa
项目概览
fuyue82
/
o2oa
与 Fork 源项目一致
Fork自
浙江兰德纵横网络技术股份有限公司 / o2oa
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
o2oa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b9f11aad
编写于
3月 09, 2021
作者:
O
o2sword
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
多语言国际化3
上级
37004738
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
93 addition
and
31 deletion
+93
-31
o2server/commons/language/platform.properties
o2server/commons/language/platform.properties
+7
-1
o2server/commons/language/platform_en.properties
o2server/commons/language/platform_en.properties
+7
-1
o2server/commons/language/platform_zh_CN.properties
o2server/commons/language/platform_zh_CN.properties
+7
-1
o2server/commons/language/platform_zh_TW.properties
o2server/commons/language/platform_zh_TW.properties
+7
-1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Person.java
.../src/main/java/com/x/base/core/project/config/Person.java
+14
-1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/WebServers.java
.../main/java/com/x/base/core/project/config/WebServers.java
+2
-0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionAccessDenied.java
.../x/base/core/project/exception/ExceptionAccessDenied.java
+5
-4
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionAccessDeniedOrEntityNotExist.java
...ject/exception/ExceptionAccessDeniedOrEntityNotExist.java
+4
-3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionEntityNotExist.java
.../base/core/project/exception/ExceptionEntityNotExist.java
+7
-6
o2server/x_base_core_project/src/main/java/com/x/base/core/project/logger/MessageFormatter.java
...java/com/x/base/core/project/logger/MessageFormatter.java
+12
-0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/LanguageTools.java
...ain/java/com/x/base/core/project/tools/LanguageTools.java
+21
-4
o2server/x_organization_assemble_personal/src/main/java/com/x/organization/assemble/personal/jaxrs/person/ActionGet.java
...rganization/assemble/personal/jaxrs/person/ActionGet.java
+0
-9
未找到文件。
o2server/commons/language/platform.properties
浏览文件 @
b9f11aad
allModels
=
\u
6D4B
\u
8BD5
exception_accessDenied
=
\u7528\u6237
:{}
\u6743\u9650\u
4E0D
\u
8DB3.
exception_accessDenied_1
=
\u7528\u6237
:{}
\u
8BBF
\u
95EE
\u
5BF9
\u
8C61 class:{}, id:{},
\u6743\u9650\u
4E0D
\u
8DB3.
exception_accessDeniedOrEntityNotExist
=
\u7528\u6237
:{}
\u6743\u9650\u
4E0D
\u
8DB3
\u6216\u8005\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_accessDeniedOrEntityNotExist_1
=
\u7528\u6237
:{}
\u6743\u9650\u
4E0D
\u
8DB3
\u6216\u8005\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
, {}.
exception_entityNotExist
=
\u6807\u
8BC6
\u
4E3A:{}
\u7684
{}
\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_entityNotExist_1
=
\u6807\u
8BC6
\u
4E3A:{}
\u7684\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_entityNotExist_2
=
\u
7C7B
\u
578B
\u
4E3A: {}
\u7684\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
o2server/commons/language/platform_en.properties
浏览文件 @
b9f11aad
allModels
=
test
exception_accessDenied
=
User :{} Insufficient permissions.
exception_accessDenied_1
=
User :{} access object class:{}, id:{}, insufficient permission.
exception_accessDeniedOrEntityNotExist
=
User :{} Insufficient permissions or the object does not exist.
exception_accessDeniedOrEntityNotExist_1
=
User :{} Insufficient permission or object does not exist, {}.
exception_entityNotExist
=
The {2} object identified as :{1} does not exist.
exception_entityNotExist_1
=
The object identified as :{} does not exist.
exception_entityNotExist_2
=
Object of type: {} does not exist.
o2server/commons/language/platform_zh_CN.properties
浏览文件 @
b9f11aad
allModels
=
\u
6D4B
\u
8BD5
exception_accessDenied
=
\u7528\u6237
:{}
\u6743\u9650\u
4E0D
\u
8DB3.
exception_accessDenied_1
=
\u7528\u6237
:{}
\u
8BBF
\u
95EE
\u
5BF9
\u
8C61 class:{}, id:{},
\u6743\u9650\u
4E0D
\u
8DB3.
exception_accessDeniedOrEntityNotExist
=
\u7528\u6237
:{}
\u6743\u9650\u
4E0D
\u
8DB3
\u6216\u8005\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_accessDeniedOrEntityNotExist_1
=
\u7528\u6237
:{}
\u6743\u9650\u
4E0D
\u
8DB3
\u6216\u8005\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
, {}.
exception_entityNotExist
=
\u6807\u
8BC6
\u
4E3A:{}
\u7684
{}
\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_entityNotExist_1
=
\u6807\u
8BC6
\u
4E3A:{}
\u7684\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_entityNotExist_2
=
\u
7C7B
\u
578B
\u
4E3A: {}
\u7684\u
5BF9
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
o2server/commons/language/platform_zh_TW.properties
浏览文件 @
b9f11aad
allModels
=
\u
6E2C
\u
8A66
exception_accessDenied
=
\u7528\u6236
:{}
\u
6B0A
\u9650\u
4E0D
\u
8DB3.
exception_accessDenied_1
=
\u7528\u6236
:{}
\u
8A2A
\u
554F
\u
5C0D
\u
8C61 class:{}, id:{},
\u
6B0A
\u9650\u
4E0D
\u
8DB3.
exception_accessDeniedOrEntityNotExist
=
\u7528\u6236
:{}
\u
6B0A
\u9650\u
4E0D
\u
8DB3
\u6216\u8005\u
5C0D
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_accessDeniedOrEntityNotExist_1
=
\u7528\u6236
:{}
\u
6B0A
\u9650\u
4E0D
\u
8DB3
\u6216\u8005\u
5C0D
\u
8C61
\u
4E0D
\u
5B58
\u5728
, {}.
exception_entityNotExist
=
\u
6A19
\u
8B58
\u
70BA:{}
\u7684
{}
\u
5C0D
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_entityNotExist_1
=
\u
6A19
\u
8B58
\u
70BA:{}
\u7684\u
5C0D
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
exception_entityNotExist_2
=
\u
985E
\u
578B
\u
70BA: {}
\u7684\u
5C0D
\u
8C61
\u
4E0D
\u
5B58
\u5728
.
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Person.java
浏览文件 @
b9f11aad
...
...
@@ -45,6 +45,7 @@ public class Person extends ConfigObject {
public
static
final
String
DEFAULT_PASSWORDREGEX
=
"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$"
;
public
static
final
String
DEFAULT_PASSWORDREGEXHINT
=
"6位以上,包含数字和字母."
;
public
static
final
String
DEFAULT_LANGUAGE
=
"zh_CN"
;
public
Person
()
{
this
.
captchaLogin
=
DEFAULT_CAPTCHALOGIN
;
...
...
@@ -59,6 +60,7 @@ public class Person extends ConfigObject {
this
.
passwordRegexHint
=
DEFAULT_PASSWORDREGEXHINT
;
this
.
personUnitOrderByAsc
=
DEFAULT_PERSONUNITORDERBYASC
;
this
.
tokenCookieHttpOnly
=
DEFAULT_TOKENCOOKIEHTTPONLY
;
this
.
language
=
DEFAULT_LANGUAGE
;
}
public
static
Person
defaultInstance
()
{
...
...
@@ -118,6 +120,9 @@ public class Person extends ConfigObject {
@FieldDescribe
(
"人员组织排序是否为升序,true为升序(默认),false为降序"
)
private
Boolean
personUnitOrderByAsc
;
@FieldDescribe
(
"平台语言:zh_CN(中文,默认)、en(英语)"
)
private
String
language
;
public
Boolean
getTokenCookieHttpOnly
()
{
return
BooleanUtils
.
isTrue
(
this
.
tokenCookieHttpOnly
);
}
...
...
@@ -319,4 +324,12 @@ public class Person extends ConfigObject {
public
void
setPersonUnitOrderByAsc
(
Boolean
personUnitOrderByAsc
)
{
this
.
personUnitOrderByAsc
=
personUnitOrderByAsc
;
}
}
\ No newline at end of file
public
String
getLanguage
()
{
return
language
;
}
public
void
setLanguage
(
String
language
)
{
this
.
language
=
language
;
}
}
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/WebServers.java
浏览文件 @
b9f11aad
...
...
@@ -142,6 +142,8 @@ public class WebServers extends ConcurrentSkipListMap<String, WebServer> {
/* 密码规则 */
map
.
put
(
"passwordRegex"
,
Config
.
person
().
getPasswordRegex
());
map
.
put
(
"passwordRegexHint"
,
Config
.
person
().
getPasswordRegexHint
());
/* 平台语言 */
map
.
put
(
"language"
,
Config
.
person
().
getLanguage
());
/* RSA */
File
publicKeyFile
=
new
File
(
Config
.
base
(),
"config/public.key"
);
...
...
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionAccessDenied.java
浏览文件 @
b9f11aad
...
...
@@ -4,26 +4,27 @@ import java.util.Objects;
import
com.x.base.core.entity.JpaObject
;
import
com.x.base.core.project.http.EffectivePerson
;
import
com.x.base.core.project.tools.LanguageTools
;
public
class
ExceptionAccessDenied
extends
PromptException
{
private
static
final
long
serialVersionUID
=
-
7354813827434276962L
;
public
ExceptionAccessDenied
(
String
person
)
{
super
(
"用户:{} 权限不足."
,
person
);
super
(
LanguageTools
.
getValue
(
"exception_accessDenied"
)
,
person
);
}
public
ExceptionAccessDenied
(
EffectivePerson
effectivePerson
)
{
super
(
"用户:{} 权限不足."
,
effectivePerson
.
getDistinguishedName
());
super
(
LanguageTools
.
getValue
(
"exception_accessDenied"
)
,
effectivePerson
.
getDistinguishedName
());
}
public
ExceptionAccessDenied
(
EffectivePerson
effectivePerson
,
JpaObject
jpa
)
{
super
(
"用户:{} 访问对象 class:{}, id:{}, 权限不足."
,
effectivePerson
.
getDistinguishedName
(),
super
(
LanguageTools
.
getValue
(
"exception_accessDenied_1"
)
,
effectivePerson
.
getDistinguishedName
(),
(
null
==
jpa
)
?
null
:
jpa
.
getClass
().
getName
(),
(
null
==
jpa
)
?
null
:
jpa
.
getId
());
}
public
ExceptionAccessDenied
(
EffectivePerson
effectivePerson
,
String
message
)
{
super
(
"用户:{} 权限不足, {}."
,
effectivePerson
.
getDistinguishedName
(),
Objects
.
toString
(
message
,
""
));
super
(
LanguageTools
.
getValue
(
"exception_accessDenied"
)
,
effectivePerson
.
getDistinguishedName
(),
Objects
.
toString
(
message
,
""
));
}
}
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionAccessDeniedOrEntityNotExist.java
浏览文件 @
b9f11aad
...
...
@@ -3,21 +3,22 @@ package com.x.base.core.project.exception;
import
java.util.Objects
;
import
com.x.base.core.project.http.EffectivePerson
;
import
com.x.base.core.project.tools.LanguageTools
;
public
class
ExceptionAccessDeniedOrEntityNotExist
extends
PromptException
{
private
static
final
long
serialVersionUID
=
-
7354813827434276962L
;
public
ExceptionAccessDeniedOrEntityNotExist
(
String
person
)
{
super
(
"用户:{} 权限不足或者对象不存在."
,
person
);
super
(
LanguageTools
.
getValue
(
"exception_accessDeniedOrEntityNotExist"
)
,
person
);
}
public
ExceptionAccessDeniedOrEntityNotExist
(
EffectivePerson
effectivePerson
)
{
super
(
"用户:{} 权限不足或者对象不存在."
,
effectivePerson
.
getDistinguishedName
());
super
(
LanguageTools
.
getValue
(
"exception_accessDeniedOrEntityNotExist"
)
,
effectivePerson
.
getDistinguishedName
());
}
public
ExceptionAccessDeniedOrEntityNotExist
(
EffectivePerson
effectivePerson
,
String
message
)
{
super
(
"用户:{} 权限不足或者对象不存在, {}."
,
effectivePerson
.
getDistinguishedName
(),
Objects
.
toString
(
message
,
""
));
super
(
LanguageTools
.
getValue
(
"exception_accessDeniedOrEntityNotExist_1"
)
,
effectivePerson
.
getDistinguishedName
(),
Objects
.
toString
(
message
,
""
));
}
}
o2server/x_base_core_project/src/main/java/com/x/base/core/project/exception/ExceptionEntityNotExist.java
浏览文件 @
b9f11aad
...
...
@@ -2,6 +2,7 @@ package com.x.base.core.project.exception;
import
java.util.List
;
import
com.x.base.core.project.tools.LanguageTools
;
import
org.apache.commons.lang3.StringUtils
;
import
com.x.base.core.entity.JpaObject
;
...
...
@@ -11,28 +12,28 @@ public class ExceptionEntityNotExist extends PromptException {
private
static
final
long
serialVersionUID
=
-
7354813827434276962L
;
public
ExceptionEntityNotExist
(
String
flag
,
JpaObject
jpa
)
{
super
(
"标识为:{} 的 {} 对象不存在."
,
flag
,
(
null
==
jpa
)
?
null
:
jpa
.
nameOfEntity
());
super
(
LanguageTools
.
getValue
(
"exception_entityNotExist"
)
,
flag
,
(
null
==
jpa
)
?
null
:
jpa
.
nameOfEntity
());
}
public
<
T
extends
JpaObject
>
ExceptionEntityNotExist
(
String
flag
,
Class
<
T
>
cls
)
{
super
(
"标识为:{} 的 {} 对象不存在."
,
flag
,
(
null
==
cls
)
?
null
:
cls
.
getSimpleName
());
super
(
LanguageTools
.
getValue
(
"exception_entityNotExist"
)
,
flag
,
(
null
==
cls
)
?
null
:
cls
.
getSimpleName
());
}
public
<
T
extends
JpaObject
>
ExceptionEntityNotExist
(
List
<
String
>
ids
,
Class
<
T
>
cls
)
{
super
(
"标识为:{} 的 {} 对象不存在."
,
(
null
==
ids
)
?
null
:
StringUtils
.
join
(
ids
,
","
),
super
(
LanguageTools
.
getValue
(
"exception_entityNotExist"
)
,
(
null
==
ids
)
?
null
:
StringUtils
.
join
(
ids
,
","
),
(
null
==
cls
)
?
null
:
cls
.
getSimpleName
());
}
public
<
T
extends
JpaObject
>
ExceptionEntityNotExist
(
String
flag
,
String
name
)
{
super
(
"标识为:{} 的 {} 对象不存在."
,
flag
,
name
);
super
(
LanguageTools
.
getValue
(
"exception_entityNotExist"
)
,
flag
,
name
);
}
public
<
T
extends
JpaObject
>
ExceptionEntityNotExist
(
String
flag
)
{
super
(
"标识为:{} 的对象不存在."
,
flag
);
super
(
LanguageTools
.
getValue
(
"exception_entityNotExist_1"
)
,
flag
);
}
public
<
T
extends
JpaObject
>
ExceptionEntityNotExist
(
Class
<
T
>
cls
)
{
super
(
"类型为: {} 的对象不存在."
,
cls
.
getSimpleName
());
super
(
LanguageTools
.
getValue
(
"exception_entityNotExist_2"
)
,
cls
.
getSimpleName
());
}
}
o2server/x_base_core_project/src/main/java/com/x/base/core/project/logger/MessageFormatter.java
浏览文件 @
b9f11aad
...
...
@@ -25,6 +25,8 @@ package com.x.base.core.project.logger;
*
*/
import
org.apache.commons.lang3.StringUtils
;
import
java.text.MessageFormat
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -100,6 +102,7 @@ final public class MessageFormatter {
static
final
char
DELIM_START
=
'{'
;
static
final
char
DELIM_STOP
=
'}'
;
static
final
String
DELIM_STR
=
"{}"
;
static
final
String
DELIM_STR2
=
"{%d}"
;
private
static
final
char
ESCAPE_CHAR
=
'\\'
;
/**
...
...
@@ -200,7 +203,16 @@ final public class MessageFormatter {
StringBuilder
sbuf
=
new
StringBuilder
(
messagePattern
.
length
()
+
50
);
int
L
;
String
message
=
messagePattern
;
for
(
L
=
0
;
L
<
argArray
.
length
;
L
++)
{
j
=
messagePattern
.
indexOf
(
String
.
format
(
DELIM_STR2
,
L
));
if
(
j
>
-
1
){
message
=
StringUtils
.
replace
(
message
,
String
.
format
(
DELIM_STR2
,
L
),
(
String
)
argArray
[
L
]);
if
(
L
==
argArray
.
length
-
1
){
return
new
FormattingTuple
(
message
,
argArray
,
throwable
);
}
continue
;
}
j
=
messagePattern
.
indexOf
(
DELIM_STR
,
i
);
...
...
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/LanguageTools.java
浏览文件 @
b9f11aad
package
com.x.base.core.project.tools
;
import
com.x.base.core.project.config.Config
;
import
org.apache.commons.lang3.StringUtils
;
import
java.util.Locale
;
...
...
@@ -9,15 +10,21 @@ public class LanguageTools {
private
final
static
String
LANGUAGE_PLATFORM
=
"language.platform"
;
public
static
String
getValue
ByKey
(
String
key
)
{
return
getValue
ByKey
(
key
,
null
);
public
static
String
getValue
(
String
key
)
{
return
getValue
(
key
,
null
);
}
public
static
String
getValue
ByKey
(
String
key
,
String
locale
)
{
public
static
String
getValue
(
String
key
,
String
locale
)
{
if
(
StringUtils
.
isBlank
(
key
)){
return
null
;
}
ResourceBundle
resourceBundle
=
null
;
if
(
StringUtils
.
isBlank
(
locale
)){
try
{
locale
=
Config
.
person
().
getLanguage
();
}
catch
(
Exception
e
)
{
}
}
if
(
StringUtils
.
isBlank
(
locale
)){
resourceBundle
=
ResourceBundle
.
getBundle
(
LANGUAGE_PLATFORM
,
Locale
.
getDefault
());
}
else
if
(
"zh"
.
equalsIgnoreCase
(
locale
)
||
"zh_CN"
.
equalsIgnoreCase
(
locale
))
{
...
...
@@ -26,16 +33,24 @@ public class LanguageTools {
resourceBundle
=
ResourceBundle
.
getBundle
(
LANGUAGE_PLATFORM
,
Locale
.
ENGLISH
);
}
else
if
(
"zh_HK"
.
equalsIgnoreCase
(
locale
)
||
"zh_TW"
.
equalsIgnoreCase
(
locale
))
{
resourceBundle
=
ResourceBundle
.
getBundle
(
LANGUAGE_PLATFORM
,
Locale
.
TRADITIONAL_CHINESE
);
}
else
{
resourceBundle
=
ResourceBundle
.
getBundle
(
LANGUAGE_PLATFORM
,
Locale
.
getDefault
());
}
return
resourceBundle
.
getString
(
key
);
}
public
static
String
getValue
ByKey
(
String
baseName
,
String
key
,
String
locale
)
{
public
static
String
getValue
(
String
baseName
,
String
key
,
String
locale
)
{
if
(
StringUtils
.
isBlank
(
key
)){
return
null
;
}
ResourceBundle
resourceBundle
=
null
;
if
(
StringUtils
.
isBlank
(
locale
)){
try
{
locale
=
Config
.
person
().
getLanguage
();
}
catch
(
Exception
e
)
{
}
}
if
(
StringUtils
.
isBlank
(
locale
)){
resourceBundle
=
ResourceBundle
.
getBundle
(
baseName
,
Locale
.
getDefault
());
}
else
if
(
"zh"
.
equalsIgnoreCase
(
locale
)
||
"zh_CN"
.
equalsIgnoreCase
(
locale
))
{
...
...
@@ -44,6 +59,8 @@ public class LanguageTools {
resourceBundle
=
ResourceBundle
.
getBundle
(
baseName
,
Locale
.
ENGLISH
);
}
else
if
(
"zh_HK"
.
equalsIgnoreCase
(
locale
)
||
"zh_TW"
.
equalsIgnoreCase
(
locale
))
{
resourceBundle
=
ResourceBundle
.
getBundle
(
baseName
,
Locale
.
TRADITIONAL_CHINESE
);
}
else
{
resourceBundle
=
ResourceBundle
.
getBundle
(
baseName
,
Locale
.
getDefault
());
}
return
resourceBundle
.
getString
(
key
);
...
...
o2server/x_organization_assemble_personal/src/main/java/com/x/organization/assemble/personal/jaxrs/person/ActionGet.java
浏览文件 @
b9f11aad
...
...
@@ -47,15 +47,6 @@ class ActionGet extends BaseAction {
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ActionGet
.
class
);
ActionResult
<
Wo
>
execute
(
EffectivePerson
effectivePerson
)
throws
Exception
{
logger
.
print
(
"===============test1============================"
);
logger
.
print
(
LanguageTools
.
getValueByKey
(
"allModels"
,
"zh"
));
logger
.
print
(
LanguageTools
.
getValueByKey
(
"allModels"
,
"en"
));
logger
.
print
(
"===============test2============================"
);
try
(
EntityManagerContainer
emc
=
EntityManagerContainerFactory
.
instance
().
create
())
{
Business
business
=
new
Business
(
emc
);
ActionResult
<
Wo
>
result
=
new
ActionResult
<>();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录