Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
T
TokenVaultManagement
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
jasonwai
TokenVaultManagement
Commits
947640ad
Commit
947640ad
authored
Jun 15, 2023
by
Jason
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
更新多語言
parent
bf57cd83
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
2128 additions
and
357 deletions
+2128
-357
HomeController.cs
... Vault Management/backstage/Controllers/HomeController.cs
+2
-2
TokenVaultController .cs
...Management/backstage/Controllers/TokenVaultController .cs
+392
-49
UserController.cs
... Vault Management/backstage/Controllers/UserController.cs
+414
-80
Index.zh.resx
...t Management/backstage/Resources/Views/Home/Index.zh.resx
+138
-0
_layout.zh.resx
...nagement/backstage/Resources/Views/Shared/_layout.zh.resx
+30
-0
List.zh.resx
...agement/backstage/Resources/Views/TokenVault/List.zh.resx
+153
-0
CreateDepartment.zh.resx
...t/backstage/Resources/Views/User/CreateDepartment.zh.resx
+150
-0
CreateUser.zh.resx
...agement/backstage/Resources/Views/User/CreateUser.zh.resx
+144
-0
GetUser.zh.resx
...Management/backstage/Resources/Views/User/GetUser.zh.resx
+162
-0
ListDepartments.zh.resx
...nt/backstage/Resources/Views/User/ListDepartments.zh.resx
+144
-0
ListUsers.zh.resx
...nagement/backstage/Resources/Views/User/ListUsers.zh.resx
+147
-0
Login.zh.resx
...t Management/backstage/Resources/Views/User/Login.zh.resx
+8
-2
Startup.cs
Merchant Token Vault Management/backstage/Startup.cs
+16
-14
TokenVault_NSECURED.csproj
...ken Vault Management/backstage/TokenVault_NSECURED.csproj
+5
-0
Index.cshtml
... Token Vault Management/backstage/Views/Home/Index.cshtml
+9
-8
_Layout.cshtml
...en Vault Management/backstage/Views/Shared/_Layout.cshtml
+16
-18
List.cshtml
...n Vault Management/backstage/Views/TokenVault/List.cshtml
+17
-15
CreateDepartment.cshtml
...t Management/backstage/Views/User/CreateDepartment.cshtml
+14
-12
CreateUser.cshtml
...n Vault Management/backstage/Views/User/CreateUser.cshtml
+14
-12
GetUser.cshtml
...oken Vault Management/backstage/Views/User/GetUser.cshtml
+33
-31
ListDepartments.cshtml
...lt Management/backstage/Views/User/ListDepartments.cshtml
+9
-7
ListUsers.cshtml
...en Vault Management/backstage/Views/User/ListUsers.cshtml
+11
-9
Login.cshtml
... Token Vault Management/backstage/Views/User/Login.cshtml
+100
-98
No files found.
Merchant Token Vault Management/backstage/Controllers/HomeController.cs
View file @
947640ad
...
@@ -105,7 +105,7 @@ namespace backstage.Controllers
...
@@ -105,7 +105,7 @@ namespace backstage.Controllers
}
}
public
IActionResult
ChangeLanguage
(
string
lang
)
public
IActionResult
ChangeLanguage
(
string
lang
,
string
returnUrl
)
{
{
// 設置所選語言
// 設置所選語言
Response
.
Cookies
.
Append
(
Response
.
Cookies
.
Append
(
...
@@ -115,7 +115,7 @@ namespace backstage.Controllers
...
@@ -115,7 +115,7 @@ namespace backstage.Controllers
);
);
// 重新導向到先前的頁面或首頁
// 重新導向到先前的頁面或首頁
return
LocalRedirect
(
"~/"
);
return
Redirect
(
"~"
+
returnUrl
);
}
}
...
...
Merchant Token Vault Management/backstage/Controllers/TokenVaultController .cs
View file @
947640ad
...
@@ -18,13 +18,13 @@ using backstage.Models;
...
@@ -18,13 +18,13 @@ using backstage.Models;
using
backstage.Models.Users
;
using
backstage.Models.Users
;
using
Newtonsoft.Json.Linq
;
using
Newtonsoft.Json.Linq
;
using
System.Linq
;
using
System.Linq
;
using
backstage.Models.TokenVault
;
using
backstage.Models.TokenVault
;
using
Microsoft.AspNetCore.Routing
;
using
Microsoft.AspNetCore.Routing
;
using
System.Text.Json
;
using
System.Text.Json
;
using
System.Dynamic
;
using
System.Dynamic
;
using
TokenVault_management.Models
;
using
TokenVault_management.Models
;
using
System.Text.RegularExpressions
;
using
Microsoft.Extensions.Localization
;
using
Microsoft.AspNetCore.Localization
;
namespace
backstage.Controllers
namespace
backstage.Controllers
{
{
...
@@ -33,17 +33,23 @@ namespace backstage.Controllers
...
@@ -33,17 +33,23 @@ namespace backstage.Controllers
private
readonly
IHttpContextAccessor
_httpContextAccessor
;
private
readonly
IHttpContextAccessor
_httpContextAccessor
;
private
readonly
IConfiguration
_config
;
private
readonly
IConfiguration
_config
;
private
readonly
ICallApi
_callApi
;
private
readonly
ICallApi
_callApi
;
private
readonly
IStringLocalizer
<
UserController
>
_localizer
;
private
static
Logger
logger
=
LogManager
.
GetCurrentClassLogger
();
private
static
Logger
logger
=
LogManager
.
GetCurrentClassLogger
();
private
readonly
string
_currentLanguage
;
/// <summary>
/// <summary>
/// 讀取組態用
/// 讀取組態用
/// </summary>
/// </summary>
public
TokenVaultController
(
IConfiguration
config
,
ICallApi
callApi
,
IHttpContextAccessor
httpContextAccessor
)
public
TokenVaultController
(
IConfiguration
config
,
ICallApi
callApi
,
IHttpContextAccessor
httpContextAccessor
,
IStringLocalizer
<
UserController
>
localizer
)
{
{
_config
=
config
;
_config
=
config
;
_callApi
=
callApi
;
_callApi
=
callApi
;
_httpContextAccessor
=
httpContextAccessor
;
_httpContextAccessor
=
httpContextAccessor
;
_localizer
=
localizer
;
var
requestCultureFeature
=
_httpContextAccessor
.
HttpContext
.
Features
.
Get
<
IRequestCultureFeature
>();
var
currentCulture
=
requestCultureFeature
.
RequestCulture
.
Culture
;
_currentLanguage
=
currentCulture
.
TwoLetterISOLanguageName
;
}
}
...
@@ -52,7 +58,7 @@ namespace backstage.Controllers
...
@@ -52,7 +58,7 @@ namespace backstage.Controllers
public
async
Task
<
IActionResult
>
List
(
int
merchantId
)
public
async
Task
<
IActionResult
>
List
(
int
merchantId
)
{
{
var
TokenVaultResponse
=
new
TokenVaultResponse
();
var
TokenVaultResponse
=
new
TokenVaultResponse
();
string
msg
=
string
.
Empty
;
ViewBag
.
Merchant_id
=
merchantId
;
ViewBag
.
Merchant_id
=
merchantId
;
#
region
取得部門列表
#
region
取得部門列表
...
@@ -96,6 +102,7 @@ namespace backstage.Controllers
...
@@ -96,6 +102,7 @@ namespace backstage.Controllers
[
HttpGet
]
[
HttpGet
]
public
async
Task
<
IActionResult
>
ListFields
([
FromQuery
]
int
Merchant_id
,
int
vault_id
)
public
async
Task
<
IActionResult
>
ListFields
([
FromQuery
]
int
Merchant_id
,
int
vault_id
)
{
{
string
msg
;
var
TokenVaultResponse
=
new
TokenVaultResponse
();
var
TokenVaultResponse
=
new
TokenVaultResponse
();
// 確認使用者是否已經登入
// 確認使用者是否已經登入
if
(!
User
.
Identity
.
IsAuthenticated
)
if
(!
User
.
Identity
.
IsAuthenticated
)
...
@@ -300,6 +307,7 @@ namespace backstage.Controllers
...
@@ -300,6 +307,7 @@ namespace backstage.Controllers
[
HttpPost
]
[
HttpPost
]
public
async
Task
<
ResultModel
>
AddUsers
([
FromBody
]
JsonElement
requestData
)
public
async
Task
<
ResultModel
>
AddUsers
([
FromBody
]
JsonElement
requestData
)
{
{
string
msg
;
var
result
=
new
ResultModel
();
var
result
=
new
ResultModel
();
int
Merchant_id
=
requestData
.
GetProperty
(
"Merchant_id"
).
GetInt32
();
int
Merchant_id
=
requestData
.
GetProperty
(
"Merchant_id"
).
GetInt32
();
int
vault_id
=
requestData
.
GetProperty
(
"vault_id"
).
GetInt32
();
int
vault_id
=
requestData
.
GetProperty
(
"vault_id"
).
GetInt32
();
...
@@ -342,23 +350,64 @@ namespace backstage.Controllers
...
@@ -342,23 +350,64 @@ namespace backstage.Controllers
var
existUser
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
uid
==
user_id
).
FirstOrDefault
();
var
existUser
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
uid
==
user_id
).
FirstOrDefault
();
if
(
existUser
==
null
)
if
(
existUser
==
null
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"User is not exist."
;
break
;
case
"zh"
:
msg
=
"使用者不存在"
;
break
;
default
:
msg
=
"使用者不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"user_id不存在"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"User is not exist."
;
break
;
case
"zh"
:
msg
=
"使用者不存在"
;
break
;
default
:
msg
=
"使用者不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"user_id不存在"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Check field_id failed."
;
break
;
case
"zh"
:
msg
=
"檢查field_id失敗"
;
break
;
default
:
msg
=
"檢查field_id失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"檢查field_id失敗"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -380,24 +429,66 @@ namespace backstage.Controllers
...
@@ -380,24 +429,66 @@ namespace backstage.Controllers
var
existDepartment
=
DepartmentsResponse
.
merchants
.
Where
(
m
=>
m
.
merchant_id
==
Merchant_id
).
FirstOrDefault
();
var
existDepartment
=
DepartmentsResponse
.
merchants
.
Where
(
m
=>
m
.
merchant_id
==
Merchant_id
).
FirstOrDefault
();
if
(
existDepartment
==
null
)
if
(
existDepartment
==
null
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Merchint_id is not exist."
;
break
;
case
"zh"
:
msg
=
"merchant_id不存在"
;
break
;
default
:
msg
=
"merchant_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"merchant_id不存在"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Merchint_id is not exist."
;
break
;
case
"zh"
:
msg
=
"merchant_id不存在"
;
break
;
default
:
msg
=
"merchant_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"merchant_id不存在"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Check merchint_id failed."
;
break
;
case
"zh"
:
msg
=
"檢查merchant_id失敗"
;
break
;
default
:
msg
=
"檢查merchant_id失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"檢查merchant_id失敗"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -421,21 +512,63 @@ namespace backstage.Controllers
...
@@ -421,21 +512,63 @@ namespace backstage.Controllers
var
existField
=
FieldsResponse
.
fields
.
Where
(
m
=>
m
.
id
==
field_id
).
FirstOrDefault
();
var
existField
=
FieldsResponse
.
fields
.
Where
(
m
=>
m
.
id
==
field_id
).
FirstOrDefault
();
if
(
existField
==
null
)
if
(
existField
==
null
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Field_id is not exist."
;
break
;
case
"zh"
:
msg
=
"field_id不存在"
;
break
;
default
:
msg
=
"field_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"field_id不存在"
;
result
.
Message
=
msg
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Field_id is not exist."
;
break
;
case
"zh"
:
msg
=
"field_id不存在"
;
break
;
default
:
msg
=
"field_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"field_id不存在"
;
result
.
Message
=
msg
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Field_id is not exist."
;
break
;
case
"zh"
:
msg
=
"field_id不存在"
;
break
;
default
:
msg
=
"field_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"檢查field_id失敗"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -464,8 +597,22 @@ namespace backstage.Controllers
...
@@ -464,8 +597,22 @@ namespace backstage.Controllers
var
departmentResponse
=
JsonConvert
.
DeserializeObject
<
DepartmentsResponse
>(
apiResult
.
Data
.
ToString
());
var
departmentResponse
=
JsonConvert
.
DeserializeObject
<
DepartmentsResponse
>(
apiResult
.
Data
.
ToString
());
if
(
departmentResponse
.
r
!=
0
)
if
(
departmentResponse
.
r
!=
0
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Add user into department failed."
;
break
;
case
"zh"
:
msg
=
"加入部門失敗"
;
break
;
default
:
msg
=
"加入部門失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"加入部門失敗"
+
apiResult
.
Data
.
ToString
();
result
.
Message
=
msg
+
apiResult
.
Data
.
ToString
();
return
result
;
return
result
;
}
}
}
}
...
@@ -486,9 +633,22 @@ namespace backstage.Controllers
...
@@ -486,9 +633,22 @@ namespace backstage.Controllers
apiResult
=
await
_callApi
.
CallAPI
(
url
,
parameters
,
httpMethod
);
apiResult
=
await
_callApi
.
CallAPI
(
url
,
parameters
,
httpMethod
);
if
(!
apiResult
.
IsSuccess
)
if
(!
apiResult
.
IsSuccess
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Field_id is not exist."
;
break
;
case
"zh"
:
msg
=
"加入vault失敗"
;
break
;
default
:
msg
=
"加入vault失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"加入vault失敗"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -526,14 +686,42 @@ namespace backstage.Controllers
...
@@ -526,14 +686,42 @@ namespace backstage.Controllers
FieldsResponse2
=
JsonConvert
.
DeserializeObject
<
FieldsResponse
>(
apiResult
.
Data
.
ToString
());
FieldsResponse2
=
JsonConvert
.
DeserializeObject
<
FieldsResponse
>(
apiResult
.
Data
.
ToString
());
if
(
FieldsResponse2
.
failInfo
!=
null
)
if
(
FieldsResponse2
.
failInfo
!=
null
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Add user into Field_id failed."
;
break
;
case
"zh"
:
msg
=
"加入Fields失敗"
;
break
;
default
:
msg
=
"加入Fields失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"加入Fields失敗"
+
FieldsResponse2
.
m
;
result
.
Message
=
msg
+
FieldsResponse2
.
m
;
return
result
;
return
result
;
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Add user into fields Success."
;
break
;
case
"zh"
:
msg
=
"加入Fields成功"
;
break
;
default
:
msg
=
"加入Fields成功"
;
break
;
}
result
.
IsSuccess
=
true
;
result
.
IsSuccess
=
true
;
result
.
Message
=
"加入Fields成功"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -541,8 +729,22 @@ namespace backstage.Controllers
...
@@ -541,8 +729,22 @@ namespace backstage.Controllers
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Add user into Field_id failed."
;
break
;
case
"zh"
:
msg
=
"加入Fields失敗"
;
break
;
default
:
msg
=
"加入Fields失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"加入Fields失敗"
+
apiResult
.
Data
.
ToString
();
result
.
Message
=
msg
+
apiResult
.
Data
.
ToString
();
return
result
;
return
result
;
}
}
...
@@ -560,6 +762,7 @@ namespace backstage.Controllers
...
@@ -560,6 +762,7 @@ namespace backstage.Controllers
[
HttpPost
]
[
HttpPost
]
public
async
Task
<
ResultModel
>
DelUsers
([
FromBody
]
JsonElement
requestData
)
public
async
Task
<
ResultModel
>
DelUsers
([
FromBody
]
JsonElement
requestData
)
{
{
string
msg
;
var
result
=
new
ResultModel
();
var
result
=
new
ResultModel
();
int
Merchant_id
=
requestData
.
GetProperty
(
"Merchant_id"
).
GetInt32
();
int
Merchant_id
=
requestData
.
GetProperty
(
"Merchant_id"
).
GetInt32
();
int
vault_id
=
requestData
.
GetProperty
(
"vault_id"
).
GetInt32
();
int
vault_id
=
requestData
.
GetProperty
(
"vault_id"
).
GetInt32
();
...
@@ -594,22 +797,63 @@ namespace backstage.Controllers
...
@@ -594,22 +797,63 @@ namespace backstage.Controllers
if
(
existUser
==
null
)
if
(
existUser
==
null
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"User_id is not exist."
;
break
;
case
"zh"
:
msg
=
"user_id不存在"
;
break
;
default
:
msg
=
"user_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"user_id不存在"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"User_id is not exist."
;
break
;
case
"zh"
:
msg
=
"user_id不存在"
;
break
;
default
:
msg
=
"user_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"user_id不存在"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Check field_id failed."
;
break
;
case
"zh"
:
msg
=
"檢查field_id失敗"
;
break
;
default
:
msg
=
"檢查field_id失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"檢查field_id失敗"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -631,8 +875,22 @@ namespace backstage.Controllers
...
@@ -631,8 +875,22 @@ namespace backstage.Controllers
var
existDepartment
=
DepartmentsResponse
.
merchants
.
Where
(
m
=>
m
.
merchant_id
==
Merchant_id
).
FirstOrDefault
();
var
existDepartment
=
DepartmentsResponse
.
merchants
.
Where
(
m
=>
m
.
merchant_id
==
Merchant_id
).
FirstOrDefault
();
if
(
existDepartment
==
null
)
if
(
existDepartment
==
null
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Merchant_id is not exist."
;
break
;
case
"zh"
:
msg
=
"merchant_id不存在"
;
break
;
default
:
msg
=
"merchant_id不存在"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"merchant_id不存在"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -647,8 +905,22 @@ namespace backstage.Controllers
...
@@ -647,8 +905,22 @@ namespace backstage.Controllers
}
}
else
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"User_id is not exist."
;
break
;
case
"zh"
:
msg
=
"檢查merchant_id失敗"
;
break
;
default
:
msg
=
"檢查merchant_id失敗"
;
break
;
}
result
.
IsSuccess
=
false
;
result
.
IsSuccess
=
false
;
result
.
Message
=
"檢查merchant_id失敗"
;
result
.
Message
=
msg
;
return
result
;
return
result
;
}
}
...
@@ -1341,21 +1613,11 @@ namespace backstage.Controllers
...
@@ -1341,21 +1613,11 @@ namespace backstage.Controllers
}
}
[
Authorize
(
Policy
=
"AdminOnly"
)]
[
HttpPost
]
[
HttpPost
]
public
async
Task
<
IActionResult
>
ListTokenVaultAjax
(
int
merchantId
)
public
async
Task
<
IActionResult
>
ListTokenVaultAjax
(
int
merchantId
)
{
{
string
msg
;
// 確認使用者是否已經登入
if
(!
User
.
Identity
.
IsAuthenticated
)
{
return
RedirectToAction
(
"Login"
,
"User"
);
}
// 取得使用者的 "token" Claim 值
// 取得使用者的 "token" Claim 值
string
token
=
User
.
FindFirstValue
(
"token"
);
string
token
=
User
.
FindFirstValue
(
"token"
);
...
@@ -1379,13 +1641,61 @@ namespace backstage.Controllers
...
@@ -1379,13 +1641,61 @@ namespace backstage.Controllers
if
(
TokenVaultResponse
.
info
.
Count
>
0
)
if
(
TokenVaultResponse
.
info
.
Count
>
0
)
{
{
var
sortedData
=
TokenVaultResponse
.
info
.
OrderBy
(
a
=>
a
.
vault_id
);
var
sortedData
=
TokenVaultResponse
.
info
.
OrderBy
(
a
=>
a
.
vault_id
);
string
enabletext
=
"Disable"
;
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Disable"
;
break
;
case
"zh"
:
msg
=
"停用"
;
break
;
default
:
msg
=
"停用"
;
break
;
}
string
enabletext
=
msg
;
// 轉出html
// 轉出html
string
outputHtml
=
""
;
string
outputHtml
=
""
;
string
permission
;
string
Fields
;
switch
(
_currentLanguage
)
{
case
"en"
:
permission
=
"Permission"
;
Fields
=
"Fields"
;
break
;
case
"zh"
:
permission
=
"權限"
;
Fields
=
"欄位"
;
break
;
default
:
permission
=
"權限"
;
Fields
=
"欄位"
;
break
;
}
foreach
(
var
vault
in
sortedData
)
foreach
(
var
vault
in
sortedData
)
{
{
if
(
vault
.
enabled
==
1
)
if
(
vault
.
enabled
==
1
)
enabletext
=
"Enable"
;
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Enable"
;
break
;
case
"zh"
:
msg
=
"啟用"
;
break
;
default
:
msg
=
"啟用"
;
break
;
}
enabletext
=
msg
;
}
string
htmlCode
=
@
$"<tr class=""expense-color"">
string
htmlCode
=
@
$"<tr class=""expense-color"">
<
td
><
a
asp
-
action
=
""
Detail
""
asp
-
route
-
Id
=
""
{
vault
.
vault_id
}
""
>
{
vault
.
vault_id
}</
a
></
td
>
<
td
><
a
asp
-
action
=
""
Detail
""
asp
-
route
-
Id
=
""
{
vault
.
vault_id
}
""
>
{
vault
.
vault_id
}</
a
></
td
>
...
@@ -1395,8 +1705,8 @@ namespace backstage.Controllers
...
@@ -1395,8 +1705,8 @@ namespace backstage.Controllers
<
td
>{
vault
.
created
}</
td
>
<
td
>{
vault
.
created
}</
td
>
<
td
>{
enabletext
}</
td
>
<
td
>{
enabletext
}</
td
>
<
td
>
<
td
>
<
button
class
=""
btn
btnPermission
btn
-
sm
""
data
-
toggle
=
""
modal
""
data
-
target
=
""
#
permission
""
>
Permission
</
button
>
<
button
class
=""
btn
btnPermission
btn
-
sm
""
data
-
toggle
=
""
modal
""
data
-
target
=
""
#
permission
""
>
{
permission
}
</
button
>
<
button
class
=""
btn
btnPermission
btn
-
sm
fieldsBtn
""
data
-
Merchant_id
=
""
{
merchantId
}
""
data
-
vault_id
=
""
{
vault
.
vault_id
}
""
>
Fields
</
button
>
<
button
class
=""
btn
btnPermission
btn
-
sm
fieldsBtn
""
data
-
Merchant_id
=
""
{
merchantId
}
""
data
-
vault_id
=
""
{
vault
.
vault_id
}
""
>
{
Fields
}
</
button
>
</
td
>
</
td
>
<
td
>{
vault
.
tokenCount
}</
td
>
<
td
>{
vault
.
tokenCount
}</
td
>
<
td
>{
vault
.
userCount
}</
td
>
<
td
>{
vault
.
userCount
}</
td
>
...
@@ -1534,7 +1844,7 @@ namespace backstage.Controllers
...
@@ -1534,7 +1844,7 @@ namespace backstage.Controllers
[
HttpPost
]
[
HttpPost
]
public
async
Task
<
IActionResult
>
CreateTokenVault
(
TokenVaultForCreate
tokenVault
)
public
async
Task
<
IActionResult
>
CreateTokenVault
(
TokenVaultForCreate
tokenVault
)
{
{
string
msg
;
#
region
取得部門列表
#
region
取得部門列表
var
DepartmentsResponse
=
new
DepartmentsResponse
();
var
DepartmentsResponse
=
new
DepartmentsResponse
();
...
@@ -1567,19 +1877,39 @@ namespace backstage.Controllers
...
@@ -1567,19 +1877,39 @@ namespace backstage.Controllers
#
endregion
#
endregion
// 確認使用者是否已經登入
if
(!
User
.
Identity
.
IsAuthenticated
)
{
return
RedirectToAction
(
"Login"
,
"User"
);
}
if
(
string
.
IsNullOrEmpty
(
tokenVault
.
name
))
if
(
string
.
IsNullOrEmpty
(
tokenVault
.
name
))
{
{
ModelState
.
AddModelError
(
"name"
,
"名稱不能為空"
);
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"不能為空"
;
break
;
default
:
msg
=
"不能為空"
;
break
;
}
ModelState
.
AddModelError
(
"name"
,
msg
);
}
}
if
(
tokenVault
.
merchant_id
==
0
)
if
(
tokenVault
.
merchant_id
==
0
)
{
{
ModelState
.
AddModelError
(
"merchant_id"
,
"部門不能為空"
);
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"部門不能為空"
;
break
;
default
:
msg
=
"部門不能為空"
;
break
;
}
ModelState
.
AddModelError
(
"merchant_id"
,
msg
);
}
}
if
(!
ModelState
.
IsValid
)
if
(!
ModelState
.
IsValid
)
...
@@ -1603,8 +1933,21 @@ namespace backstage.Controllers
...
@@ -1603,8 +1933,21 @@ namespace backstage.Controllers
var
userAddResponse
=
JsonConvert
.
DeserializeObject
<
UserAddResponse
>(
apiResult
.
Data
.
ToString
());
var
userAddResponse
=
JsonConvert
.
DeserializeObject
<
UserAddResponse
>(
apiResult
.
Data
.
ToString
());
if
(
userAddResponse
.
r
==
0
)
if
(
userAddResponse
.
r
==
0
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Create Token Vault success."
;
break
;
case
"zh"
:
msg
=
"新增Token Vault成功"
;
break
;
default
:
msg
=
"新增Token Vault成功"
;
break
;
}
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"msg"
]
=
"新增Vault成功"
;
TempData
[
"msg"
]
=
msg
;
return
RedirectToAction
(
"List"
);
return
RedirectToAction
(
"List"
);
}
}
else
else
...
...
Merchant Token Vault Management/backstage/Controllers/UserController.cs
View file @
947640ad
...
@@ -18,6 +18,8 @@ using backstage.Models.Users;
...
@@ -18,6 +18,8 @@ using backstage.Models.Users;
using
Newtonsoft.Json.Linq
;
using
Newtonsoft.Json.Linq
;
using
System.Linq
;
using
System.Linq
;
using
TokenVault_management.Models
;
using
TokenVault_management.Models
;
using
Microsoft.Extensions.Localization
;
using
Microsoft.AspNetCore.Localization
;
namespace
backstage.Controllers
namespace
backstage.Controllers
{
{
...
@@ -27,17 +29,25 @@ namespace backstage.Controllers
...
@@ -27,17 +29,25 @@ namespace backstage.Controllers
private
readonly
IHttpContextAccessor
_httpContextAccessor
;
private
readonly
IHttpContextAccessor
_httpContextAccessor
;
private
readonly
IConfiguration
_config
;
private
readonly
IConfiguration
_config
;
private
readonly
ICallApi
_callApi
;
private
readonly
ICallApi
_callApi
;
private
readonly
IStringLocalizer
<
UserController
>
_localizer
;
private
readonly
string
_currentLanguage
;
private
static
Logger
logger
=
LogManager
.
GetCurrentClassLogger
();
private
static
Logger
logger
=
LogManager
.
GetCurrentClassLogger
();
/// <summary>
/// <summary>
/// 讀取組態用
/// 讀取組態用
/// </summary>
/// </summary>
public
UserController
(
IConfiguration
config
,
ICallApi
callApi
,
IHttpContextAccessor
httpContextAccessor
)
public
UserController
(
IConfiguration
config
,
ICallApi
callApi
,
IHttpContextAccessor
httpContextAccessor
,
IStringLocalizer
<
UserController
>
localizer
)
{
{
_config
=
config
;
_config
=
config
;
_callApi
=
callApi
;
_callApi
=
callApi
;
_httpContextAccessor
=
httpContextAccessor
;
_httpContextAccessor
=
httpContextAccessor
;
_localizer
=
localizer
;
var
requestCultureFeature
=
_httpContextAccessor
.
HttpContext
.
Features
.
Get
<
IRequestCultureFeature
>();
var
currentCulture
=
requestCultureFeature
.
RequestCulture
.
Culture
;
_currentLanguage
=
currentCulture
.
TwoLetterISOLanguageName
;
}
}
...
@@ -61,12 +71,52 @@ namespace backstage.Controllers
...
@@ -61,12 +71,52 @@ namespace backstage.Controllers
{
{
return
View
(
user
);
return
View
(
user
);
}
}
if
(
string
.
IsNullOrEmpty
(
user
.
username
))
{
string
msg
;
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"can't be empty."
;
break
;
case
"zh"
:
msg
=
"不得空白"
;
break
;
default
:
msg
=
"不得空白"
;
break
;
}
//var u = await _UserRepository.Login(user);
ModelState
.
AddModelError
(
"username"
,
_localizer
[
"username"
]
+
msg
);
var
u
=
new
UserLogin
();
}
if
(
string
.
IsNullOrEmpty
(
user
.
pwd
))
{
string
msg
;
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"can't be empty."
;
break
;
case
"zh"
:
msg
=
"不得空白"
;
break
;
default
:
msg
=
"不得空白"
;
break
;
}
ModelState
.
AddModelError
(
"pwd"
,
_localizer
[
"password"
]
+
msg
);
}
if
(!
ModelState
.
IsValid
)
{
return
View
(
user
);
}
var
u
=
new
UserLogin
();
var
url
=
_config
[
"IP"
];
var
url
=
_config
[
"IP"
];
...
@@ -367,8 +417,23 @@ namespace backstage.Controllers
...
@@ -367,8 +417,23 @@ namespace backstage.Controllers
}
}
else
else
{
{
string
msg
;
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"User is not exist."
;
break
;
case
"zh"
:
msg
=
"使用者不存在"
;
break
;
default
:
msg
=
"使用者不存在"
;
break
;
}
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
"
使用者不存在
"
;
TempData
[
"msg"
]
=
""
;
return
RedirectToAction
(
"ListUsers"
);
return
RedirectToAction
(
"ListUsers"
);
}
}
}
}
...
@@ -393,24 +458,21 @@ namespace backstage.Controllers
...
@@ -393,24 +458,21 @@ namespace backstage.Controllers
/// 修改密碼
/// 修改密碼
/// </summary>
/// </summary>
/// <returns></returns>
/// <returns></returns>
[
Authorize
]
[
Authorize
(
Policy
=
"AdminOnly"
)
]
[
HttpGet
]
[
HttpGet
]
public
async
Task
<
IActionResult
>
ChangePassword
(
string
username
,
string
returnUrl
)
public
async
Task
<
IActionResult
>
ChangePassword
(
string
username
,
string
returnUrl
)
{
{
if
(
User
.
Identity
.
IsAuthenticated
&&
User
.
IsInRole
(
"Admin"
))
string
msg
=
string
.
Empty
;
{
var
url
=
_config
[
"IP"
]
+
"/user/list"
;
// 使用者已驗證並具有 "admin" 角色
ViewBag
.
returnUrl
=
returnUrl
;
var
url
=
_config
[
"IP"
]
+
"/user/list"
;
ViewBag
.
returnUrl
=
returnUrl
;
var
httpMethod
=
HttpMethod
.
Post
;
var
httpMethod
=
HttpMethod
.
Post
;
// 取得使用者的 "token" Claim 值
// 取得使用者的 "token" Claim 值
string
token
=
User
.
FindFirstValue
(
"token"
);
string
token
=
User
.
FindFirstValue
(
"token"
);
var
types
=
new
[]
{
"all"
};
var
types
=
new
[]
{
"all"
};
var
types_data
=
new
{
inc
=
types
};
var
types_data
=
new
{
inc
=
types
};
var
parameters
=
new
Dictionary
<
string
,
string
>
var
parameters
=
new
Dictionary
<
string
,
string
>
{
{
{
"token"
,
token
},
{
"token"
,
token
},
{
"types"
,
JsonConvert
.
SerializeObject
(
types_data
)}
{
"types"
,
JsonConvert
.
SerializeObject
(
types_data
)}
...
@@ -418,68 +480,116 @@ namespace backstage.Controllers
...
@@ -418,68 +480,116 @@ namespace backstage.Controllers
};
};
var
apiResult
=
await
_callApi
.
CallAPI
(
url
,
parameters
,
httpMethod
);
var
apiResult
=
await
_callApi
.
CallAPI
(
url
,
parameters
,
httpMethod
);
if
(
apiResult
.
IsSuccess
)
if
(
apiResult
.
IsSuccess
)
{
{
try
try
{
var
UserResponse
=
JsonConvert
.
DeserializeObject
<
UserResponse
>(
apiResult
.
Data
.
ToString
());
if
(
UserResponse
.
r
==
0
)
{
{
var
UserResponse
=
JsonConvert
.
DeserializeObject
<
UserResponse
>(
apiResult
.
Data
.
ToString
());
if
(
UserResponse
.
userCount
>
0
)
if
(
UserResponse
.
r
==
0
)
{
{
if
(
UserResponse
.
userCount
>
0
)
var
existUser
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
username
==
username
).
FirstOrDefault
();
if
(
existUser
==
null
)
{
{
var
existUser
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
username
==
username
).
FirstOrDefault
();
if
(
existUser
==
null
)
switch
(
_currentLanguage
)
{
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
"使用者不存在"
;
return
Redirect
(
"~"
+
returnUrl
);
}
else
{
{
return
View
(
existUser
);
}
}
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
"使用者不存在"
;
return
Redirect
(
"~"
+
returnUrl
);
case
"en"
:
msg
=
"User is not exist."
;
break
;
case
"zh"
:
msg
=
"使用者不存在"
;
break
;
default
:
msg
=
"使用者不存在"
;
break
;
}
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
msg
;
return
Redirect
(
"~"
+
returnUrl
);
}
else
{
return
View
(
existUser
);
}
}
}
else
if
(
UserResponse
.
r
==
65537
)
switch
(
_currentLanguage
)
{
{
case
"en"
:
msg
=
"User is not exist."
;
break
;
case
"zh"
:
msg
=
"使用者不存在"
;
break
;
default
:
msg
=
"使用者不存在"
;
break
;
}
}
else
TempData
[
"IsSuccess"
]
=
false
;
{
TempData
[
"msg"
]
=
msg
;
TempData
[
"IsSuccess"
]
=
false
;
return
Redirect
(
"~"
+
returnUrl
);
TempData
[
"msg"
]
=
"發生錯誤"
;
return
RedirectToAction
(
returnUrl
);
}
}
}
catch
(
Exception
e
)
else
if
(
UserResponse
.
r
==
65537
)
{
}
else
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Error."
;
break
;
case
"zh"
:
msg
=
"發生錯誤"
;
break
;
default
:
msg
=
"發生錯誤"
;
break
;
}
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
e
.
Message
;
TempData
[
"msg"
]
=
msg
;
return
Redirect
(
"~"
+
returnUrl
);
return
Redirect
ToAction
(
returnUrl
);
}
}
}
}
catch
(
Exception
e
)
TempData
[
"IsSuccess"
]
=
false
;
{
TempData
[
"msg"
]
=
"發生錯誤"
;
TempData
[
"IsSuccess"
]
=
false
;
return
Redirect
(
"~"
+
returnUrl
);
TempData
[
"msg"
]
=
e
.
Message
;
return
Redirect
(
"~"
+
returnUrl
);
}
}
}
else
{
ViewBag
.
returnUrl
=
returnUrl
;
switch
(
_currentLanguage
)
return
View
();
{
case
"en"
:
msg
=
"Error."
;
break
;
case
"zh"
:
msg
=
"發生錯誤"
;
break
;
default
:
msg
=
"發生錯誤"
;
break
;
}
}
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
msg
;
return
Redirect
(
"~"
+
returnUrl
);
}
}
...
@@ -488,10 +598,24 @@ namespace backstage.Controllers
...
@@ -488,10 +598,24 @@ namespace backstage.Controllers
public
async
Task
<
IActionResult
>
ChangePassword
(
User
user
,
string
returnUrl
)
public
async
Task
<
IActionResult
>
ChangePassword
(
User
user
,
string
returnUrl
)
{
{
var
url
=
_config
[
"IP"
]
+
"/admin/changepassword"
;
var
url
=
_config
[
"IP"
]
+
"/admin/changepassword"
;
string
msg
;
if
(
string
.
IsNullOrEmpty
(
user
.
password
))
if
(
string
.
IsNullOrEmpty
(
user
.
password
))
{
{
ModelState
.
AddModelError
(
"Password"
,
"密碼不能為空"
);
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"不能為空"
;
break
;
default
:
msg
=
"不能為空"
;
break
;
}
ModelState
.
AddModelError
(
"Password"
,
msg
);
}
}
var
httpMethod
=
HttpMethod
.
Post
;
var
httpMethod
=
HttpMethod
.
Post
;
...
@@ -511,8 +635,22 @@ namespace backstage.Controllers
...
@@ -511,8 +635,22 @@ namespace backstage.Controllers
var
userAddResponse
=
JsonConvert
.
DeserializeObject
<
UserAddResponse
>(
apiResult
.
Data
.
ToString
());
var
userAddResponse
=
JsonConvert
.
DeserializeObject
<
UserAddResponse
>(
apiResult
.
Data
.
ToString
());
if
(
userAddResponse
.
r
==
0
)
if
(
userAddResponse
.
r
==
0
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Change password success."
;
break
;
case
"zh"
:
msg
=
"更改密碼成功"
;
break
;
default
:
msg
=
"更改密碼成功"
;
break
;
}
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"msg"
]
=
"更改密碼成功"
;
TempData
[
"msg"
]
=
msg
;
return
RedirectToAction
(
"ListUsers"
);
return
RedirectToAction
(
"ListUsers"
);
}
}
else
else
...
@@ -542,10 +680,64 @@ namespace backstage.Controllers
...
@@ -542,10 +680,64 @@ namespace backstage.Controllers
public
async
Task
<
IActionResult
>
CreateUser
(
User
user
)
public
async
Task
<
IActionResult
>
CreateUser
(
User
user
)
{
{
var
url
=
_config
[
"IP"
]
+
"/user/add"
;
var
url
=
_config
[
"IP"
]
+
"/user/add"
;
string
msg
;
if
(
string
.
IsNullOrEmpty
(
user
.
password
))
if
(
string
.
IsNullOrEmpty
(
user
.
password
))
{
{
ModelState
.
AddModelError
(
"Password"
,
"密碼不能為空"
);
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"不得空白"
;
break
;
default
:
msg
=
"不得空白"
;
break
;
}
ModelState
.
AddModelError
(
"password"
,
_localizer
[
"password"
]
+
msg
);
}
if
(
string
.
IsNullOrEmpty
(
user
.
name
))
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"不得空白"
;
break
;
default
:
msg
=
"不得空白"
;
break
;
}
ModelState
.
AddModelError
(
"name"
,
_localizer
[
"name"
]
+
msg
);
}
if
(
string
.
IsNullOrEmpty
(
user
.
username
))
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"不得空白"
;
break
;
default
:
msg
=
"不得空白"
;
break
;
}
ModelState
.
AddModelError
(
"username"
,
_localizer
[
"username"
]
+
msg
);
}
}
var
httpMethod
=
HttpMethod
.
Post
;
var
httpMethod
=
HttpMethod
.
Post
;
...
@@ -565,8 +757,23 @@ namespace backstage.Controllers
...
@@ -565,8 +757,23 @@ namespace backstage.Controllers
var
userAddResponse
=
JsonConvert
.
DeserializeObject
<
UserAddResponse
>(
apiResult
.
Data
.
ToString
());
var
userAddResponse
=
JsonConvert
.
DeserializeObject
<
UserAddResponse
>(
apiResult
.
Data
.
ToString
());
if
(
userAddResponse
.
r
==
0
)
if
(
userAddResponse
.
r
==
0
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Create user success."
;
break
;
case
"zh"
:
msg
=
"新增使用者成功"
;
break
;
default
:
msg
=
"新增使用者成功"
;
break
;
}
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"msg"
]
=
"新增使用者成功"
;
TempData
[
"msg"
]
=
msg
;
return
RedirectToAction
(
"ListUsers"
);
return
RedirectToAction
(
"ListUsers"
);
}
}
else
else
...
@@ -594,8 +801,7 @@ namespace backstage.Controllers
...
@@ -594,8 +801,7 @@ namespace backstage.Controllers
public
async
Task
<
IActionResult
>
GetUser
(
User
user
)
public
async
Task
<
IActionResult
>
GetUser
(
User
user
)
{
{
string
msg
=
string
.
Empty
;
// 取得使用者的 "token" Claim 值
// 取得使用者的 "token" Claim 值
string
token
=
User
.
FindFirstValue
(
"token"
);
string
token
=
User
.
FindFirstValue
(
"token"
);
...
@@ -630,25 +836,84 @@ namespace backstage.Controllers
...
@@ -630,25 +836,84 @@ namespace backstage.Controllers
//檢查name
//檢查name
if
(
string
.
IsNullOrEmpty
(
user
.
name
))
if
(
string
.
IsNullOrEmpty
(
user
.
name
))
{
{
ModelState
.
AddModelError
(
"name"
,
"name必填"
);
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"不得空白"
;
break
;
default
:
msg
=
"不得空白"
;
break
;
}
ModelState
.
AddModelError
(
"name"
,
msg
);
}
}
var
existName
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
name
==
user
.
name
).
FirstOrDefault
();
var
existName
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
name
==
user
.
name
).
FirstOrDefault
();
if
(
existName
!=
null
)
if
(
existName
!=
null
)
{
{
if
(
existName
.
uid
!=
user
.
uid
)
if
(
existName
.
uid
!=
user
.
uid
)
ModelState
.
AddModelError
(
"name"
,
"name重複"
);
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" exist."
;
break
;
case
"zh"
:
msg
=
"重複"
;
break
;
default
:
msg
=
"重複"
;
break
;
}
ModelState
.
AddModelError
(
"name"
,
msg
);
}
}
}
//檢查username
//檢查username
if
(
string
.
IsNullOrEmpty
(
user
.
username
))
if
(
string
.
IsNullOrEmpty
(
user
.
username
))
{
{
ModelState
.
AddModelError
(
"username"
,
"username必填"
);
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" can't be empty."
;
break
;
case
"zh"
:
msg
=
"不得空白"
;
break
;
default
:
msg
=
"不得空白"
;
break
;
}
ModelState
.
AddModelError
(
"username"
,
msg
);
}
}
var
existUserName
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
username
==
user
.
username
).
FirstOrDefault
();
var
existUserName
=
UserResponse
.
Users
.
Where
(
u
=>
u
.
username
==
user
.
username
).
FirstOrDefault
();
if
(
existUserName
!=
null
)
if
(
existUserName
!=
null
)
{
{
if
(
existUserName
.
uid
!=
user
.
uid
)
if
(
existUserName
.
uid
!=
user
.
uid
)
ModelState
.
AddModelError
(
"username"
,
"username重複"
);
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
" exist."
;
break
;
case
"zh"
:
msg
=
"重複"
;
break
;
default
:
msg
=
"重複"
;
break
;
}
ModelState
.
AddModelError
(
"username"
,
""
);
}
}
}
if
(!
ModelState
.
IsValid
)
if
(!
ModelState
.
IsValid
)
...
@@ -674,8 +939,23 @@ namespace backstage.Controllers
...
@@ -674,8 +939,23 @@ namespace backstage.Controllers
apiResult
=
await
_callApi
.
CallAPI
(
url
,
parameters
,
httpMethod
);
apiResult
=
await
_callApi
.
CallAPI
(
url
,
parameters
,
httpMethod
);
if
(
apiResult
.
IsSuccess
)
if
(
apiResult
.
IsSuccess
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Edit success."
;
break
;
case
"zh"
:
msg
=
"編輯成功"
;
break
;
default
:
msg
=
"編輯成功"
;
break
;
}
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"msg"
]
=
"編輯成功"
;
TempData
[
"msg"
]
=
msg
;
//修改密碼
//修改密碼
if
(!
string
.
IsNullOrEmpty
(
user
.
newPassword
))
if
(!
string
.
IsNullOrEmpty
(
user
.
newPassword
))
...
@@ -698,8 +978,23 @@ namespace backstage.Controllers
...
@@ -698,8 +978,23 @@ namespace backstage.Controllers
var
response
=
JsonConvert
.
DeserializeObject
<
Response
>(
apiResult
.
Data
.
ToString
());
var
response
=
JsonConvert
.
DeserializeObject
<
Response
>(
apiResult
.
Data
.
ToString
());
if
(
response
.
r
==
0
)
if
(
response
.
r
==
0
)
{
{
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"Edit success."
;
break
;
case
"zh"
:
msg
=
"編輯成功"
;
break
;
default
:
msg
=
"編輯成功"
;
break
;
}
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"IsSuccess"
]
=
true
;
TempData
[
"msg"
]
=
"編輯成功"
;
TempData
[
"msg"
]
=
msg
;
}
}
else
else
...
@@ -719,8 +1014,22 @@ namespace backstage.Controllers
...
@@ -719,8 +1014,22 @@ namespace backstage.Controllers
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"user_id is not exist."
;
break
;
case
"zh"
:
msg
=
"user_id不存在"
;
break
;
default
:
msg
=
"user_id不存在"
;
break
;
}
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
"user_id不存在"
;
TempData
[
"msg"
]
=
msg
;
return
View
(
existUser
);
return
View
(
existUser
);
}
}
...
@@ -728,6 +1037,18 @@ namespace backstage.Controllers
...
@@ -728,6 +1037,18 @@ namespace backstage.Controllers
}
}
//查無使用者
//查無使用者
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"User is not exist."
;
break
;
case
"zh"
:
msg
=
"查無使用者"
;
break
;
default
:
msg
=
"查無使用者"
;
break
;
}
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"IsSuccess"
]
=
false
;
TempData
[
"msg"
]
=
"查無使用者"
;
TempData
[
"msg"
]
=
"查無使用者"
;
return
RedirectToAction
(
"ListUsers"
);
return
RedirectToAction
(
"ListUsers"
);
...
@@ -743,7 +1064,7 @@ namespace backstage.Controllers
...
@@ -743,7 +1064,7 @@ namespace backstage.Controllers
{
{
var
DepartmentsResponse
=
new
DepartmentsResponse
();
var
DepartmentsResponse
=
new
DepartmentsResponse
();
var
url
=
_config
[
"IP"
]
+
"/merchant/list"
;
var
url
=
_config
[
"IP"
]
+
"/merchant/list"
;
var
httpMethod
=
HttpMethod
.
Post
;
var
httpMethod
=
HttpMethod
.
Post
;
...
@@ -828,10 +1149,25 @@ namespace backstage.Controllers
...
@@ -828,10 +1149,25 @@ namespace backstage.Controllers
public
async
Task
<
IActionResult
>
CreateDepartment
(
DepartmentForCreate
department
)
public
async
Task
<
IActionResult
>
CreateDepartment
(
DepartmentForCreate
department
)
{
{
var
url
=
_config
[
"IP"
]
+
"/merchant/add"
;
var
url
=
_config
[
"IP"
]
+
"/merchant/add"
;
string
msg
;
if
(
string
.
IsNullOrEmpty
(
department
.
name
))
if
(
string
.
IsNullOrEmpty
(
department
.
name
))
{
{
ModelState
.
AddModelError
(
"name"
,
"部門名稱不能為空"
);
switch
(
_currentLanguage
)
{
case
"en"
:
msg
=
"can't be empty."
;
break
;
case
"zh"
:
msg
=
"部門名稱不能為空"
;
break
;
default
:
msg
=
"部門名稱不能為空"
;
break
;
}
ModelState
.
AddModelError
(
"name"
,
msg
);
}
}
if
(
string
.
IsNullOrEmpty
(
department
.
phone
))
if
(
string
.
IsNullOrEmpty
(
department
.
phone
))
{
{
...
@@ -1125,15 +1461,13 @@ namespace backstage.Controllers
...
@@ -1125,15 +1461,13 @@ namespace backstage.Controllers
}
}
[
HttpGet
]
[
HttpGet
]
public
async
Task
<
IActionResult
>
Logout
()
public
async
Task
<
IActionResult
>
Logout
()
{
{
await
HttpContext
.
SignOutAsync
();
await
HttpContext
.
SignOutAsync
();
foreach
(
var
cookieKey
in
Request
.
Cookies
.
Keys
)
HttpContext
.
Response
.
Cookies
.
Delete
(
cookieKey
);
return
RedirectToAction
(
nameof
(
Login
));
HttpContext
.
Response
.
Cookies
.
Delete
(
"backstage"
);
return
RedirectToAction
(
nameof
(
Login
));
}
}
}
}
...
...
Merchant Token Vault Management/backstage/Resources/Views/Home/Index.zh.resx
0 → 100644
View file @
947640ad
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data
name=
"Number of data"
xml:space=
"preserve"
>
<value>
資料數量
</value>
</data>
<data
name=
"Number of data modifications this month"
xml:space=
"preserve"
>
<value>
本月資料修改數量
</value>
</data>
<data
name=
"Number of departments"
xml:space=
"preserve"
>
<value>
部門數量
</value>
</data>
<data
name=
"Number of new data this month"
xml:space=
"preserve"
>
<value>
本月新資料數量
</value>
</data>
<data
name=
"Number of Token Vaults"
xml:space=
"preserve"
>
<value>
Token Vault數量
</value>
</data>
<data
name=
"Statistic"
xml:space=
"preserve"
>
<value>
數據統計
</value>
</data>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Resources/Views/Shared/_layout.zh.resx
View file @
947640ad
...
@@ -117,6 +117,36 @@
...
@@ -117,6 +117,36 @@
<resheader
name=
"writer"
>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</resheader>
<data
name=
"Change Password"
xml:space=
"preserve"
>
<value>
修改密碼
</value>
</data>
<data
name=
"Department List"
xml:space=
"preserve"
>
<value>
部門列表
</value>
</data>
<data
name=
"Keys"
xml:space=
"preserve"
>
<value>
金鑰管理
</value>
</data>
<data
name=
"Login"
xml:space=
"preserve"
>
<value>
登入
</value>
</data>
<data
name=
"Logout"
xml:space=
"preserve"
>
<value>
登出
</value>
</data>
<data
name=
"Setting Backup"
xml:space=
"preserve"
>
<value>
設定備份
</value>
</data>
<data
name=
"Token Vault"
xml:space=
"preserve"
>
<value>
Token Vault管理
</value>
</data>
<data
name=
"User List"
xml:space=
"preserve"
>
<value>
使用者列表
</value>
</data>
<data
name=
"Users"
xml:space=
"preserve"
>
<value>
使用者管理
</value>
</data>
<data
name=
"Vault Backup"
xml:space=
"preserve"
>
<value>
Vault備份
</value>
</data>
<data
name=
"version"
xml:space=
"preserve"
>
<data
name=
"version"
xml:space=
"preserve"
>
<value>
版本
</value>
<value>
版本
</value>
</data>
</data>
...
...
Merchant Token Vault Management/backstage/Resources/Views/TokenVault/List.zh.resx
0 → 100644
View file @
947640ad
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data
name=
"Choose department"
xml:space=
"preserve"
>
<value>
選擇部門
</value>
</data>
<data
name=
"Create Department"
xml:space=
"preserve"
>
<value>
新增部門
</value>
</data>
<data
name=
"Creation Date"
xml:space=
"preserve"
>
<value>
建立日期
</value>
</data>
<data
name=
"Description"
xml:space=
"preserve"
>
<value>
描述
</value>
</data>
<data
name=
"Management"
xml:space=
"preserve"
>
<value>
管理
</value>
</data>
<data
name=
"Name"
xml:space=
"preserve"
>
<value>
名稱
</value>
</data>
<data
name=
"Number of data"
xml:space=
"preserve"
>
<value>
資料數量
</value>
</data>
<data
name=
"Number of users"
xml:space=
"preserve"
>
<value>
使用者數量
</value>
</data>
<data
name=
"Status"
xml:space=
"preserve"
>
<value>
狀態
</value>
</data>
<data
name=
"Token Vault List"
xml:space=
"preserve"
>
<value>
Token Vault列表管理
</value>
</data>
<data
name=
"Tpyes"
xml:space=
"preserve"
>
<value>
種類
</value>
</data>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Resources/Views/User/CreateDepartment.zh.resx
0 → 100644
View file @
947640ad
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data
name=
"Back to list"
xml:space=
"preserve"
>
<value>
返回列表
</value>
</data>
<data
name=
"Basic"
xml:space=
"preserve"
>
<value>
基本資料
</value>
</data>
<data
name=
"Create Department"
xml:space=
"preserve"
>
<value>
新增部門
</value>
</data>
<data
name=
"creation_date"
xml:space=
"preserve"
>
<value>
建立日期
</value>
</data>
<data
name=
"Department List"
xml:space=
"preserve"
>
<value>
部門列表
</value>
</data>
<data
name=
"merchant_id"
xml:space=
"preserve"
>
<value>
部門ID
</value>
</data>
<data
name=
"name"
xml:space=
"preserve"
>
<value>
名稱
</value>
</data>
<data
name=
"phone"
xml:space=
"preserve"
>
<value>
電話
</value>
</data>
<data
name=
"submit"
xml:space=
"preserve"
>
<value>
送出
</value>
</data>
<data
name=
"username"
xml:space=
"preserve"
>
<value>
使用者名稱
</value>
</data>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Resources/Views/User/CreateUser.zh.resx
0 → 100644
View file @
947640ad
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data
name=
"Back to list"
xml:space=
"preserve"
>
<value>
返回列表
</value>
</data>
<data
name=
"Basic"
xml:space=
"preserve"
>
<value>
基本資料
</value>
</data>
<data
name=
"Create User"
xml:space=
"preserve"
>
<value>
新增使用者
</value>
</data>
<data
name=
"email"
xml:space=
"preserve"
>
<value>
電子郵件
</value>
</data>
<data
name=
"name"
xml:space=
"preserve"
>
<value>
名稱
</value>
</data>
<data
name=
"password"
xml:space=
"preserve"
>
<value>
密碼
</value>
</data>
<data
name=
"Submit"
xml:space=
"preserve"
>
<value>
送出
</value>
</data>
<data
name=
"username"
xml:space=
"preserve"
>
<value>
使用者名稱
</value>
</data>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Resources/Views/User/GetUser.zh.resx
0 → 100644
View file @
947640ad
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data
name=
"Back to list"
xml:space=
"preserve"
>
<value>
返回列表
</value>
</data>
<data
name=
"Basic"
xml:space=
"preserve"
>
<value>
基本資料
</value>
</data>
<data
name=
"Change Password"
xml:space=
"preserve"
>
<value>
修改密碼
</value>
</data>
<data
name=
"Confrim"
xml:space=
"preserve"
>
<value>
確認
</value>
</data>
<data
name=
"creation_date"
xml:space=
"preserve"
>
<value>
建立日期
</value>
</data>
<data
name=
"Current Password"
xml:space=
"preserve"
>
<value>
目前密碼
</value>
</data>
<data
name=
"Email"
xml:space=
"preserve"
>
<value>
電子郵件
</value>
</data>
<data
name=
"Modify User"
xml:space=
"preserve"
>
<value>
修改使用者
</value>
</data>
<data
name=
"name"
xml:space=
"preserve"
>
<value>
名稱
</value>
</data>
<data
name=
"New Password"
xml:space=
"preserve"
>
<value>
新密碼
</value>
</data>
<data
name=
"Submit"
xml:space=
"preserve"
>
<value>
送出
</value>
</data>
<data
name=
"The two passwords entered do not match"
xml:space=
"preserve"
>
<value>
兩次密碼不相同
</value>
</data>
<data
name=
"Types"
xml:space=
"preserve"
>
<value>
種類
</value>
</data>
<data
name=
"username"
xml:space=
"preserve"
>
<value>
使用者名稱
</value>
</data>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Resources/Views/User/ListDepartments.zh.resx
0 → 100644
View file @
947640ad
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data
name=
"Back to list"
xml:space=
"preserve"
>
<value>
返回列表
</value>
</data>
<data
name=
"Create"
xml:space=
"preserve"
>
<value>
新增部門
</value>
</data>
<data
name=
"creation_date"
xml:space=
"preserve"
>
<value>
建立日期
</value>
</data>
<data
name=
"Department List"
xml:space=
"preserve"
>
<value>
部門列表
</value>
</data>
<data
name=
"merchant_id"
xml:space=
"preserve"
>
<value>
部門ID
</value>
</data>
<data
name=
"name"
xml:space=
"preserve"
>
<value>
名稱
</value>
</data>
<data
name=
"phone"
xml:space=
"preserve"
>
<value>
電話
</value>
</data>
<data
name=
"username"
xml:space=
"preserve"
>
<value>
使用者名稱
</value>
</data>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Resources/Views/User/ListUsers.zh.resx
0 → 100644
View file @
947640ad
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data
name=
"Admin"
xml:space=
"preserve"
>
<value>
管理員
</value>
</data>
<data
name=
"Admin count"
xml:space=
"preserve"
>
<value>
Admin數量
</value>
</data>
<data
name=
"Create"
xml:space=
"preserve"
>
<value>
新增
</value>
</data>
<data
name=
"creation_date"
xml:space=
"preserve"
>
<value>
建立日期
</value>
</data>
<data
name=
"Email"
xml:space=
"preserve"
>
<value>
電子郵件
</value>
</data>
<data
name=
"enabled"
xml:space=
"preserve"
>
<value>
啟用
</value>
</data>
<data
name=
"name"
xml:space=
"preserve"
>
<value>
名稱
</value>
</data>
<data
name=
"User count"
xml:space=
"preserve"
>
<value>
使用者數量
</value>
</data>
<data
name=
"username"
xml:space=
"preserve"
>
<value>
使用者名稱
</value>
</data>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Resources/Views/
Home/Index.en
.resx
→
Merchant Token Vault Management/backstage/Resources/Views/
User/Login.zh
.resx
View file @
947640ad
...
@@ -117,7 +117,13 @@
...
@@ -117,7 +117,13 @@
<resheader
name=
"writer"
>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</resheader>
<data
name=
"version"
xml:space=
"preserve"
>
<data
name=
"Login"
xml:space=
"preserve"
>
<value>
version
</value>
<value>
登入
</value>
</data>
<data
name=
"password"
xml:space=
"preserve"
>
<value>
密碼
</value>
</data>
<data
name=
"username"
xml:space=
"preserve"
>
<value>
使用者名稱
</value>
</data>
</data>
</root>
</root>
\ No newline at end of file
Merchant Token Vault Management/backstage/Startup.cs
View file @
947640ad
...
@@ -92,17 +92,7 @@ namespace backstage
...
@@ -92,17 +92,7 @@ namespace backstage
services
.
AddControllersWithViews
()
services
.
AddControllersWithViews
()
.
AddViewLocalization
();
// 添加視圖本地化支持
.
AddViewLocalization
();
// 添加視圖本地化支持
services
.
Configure
<
RequestLocalizationOptions
>(
options
=>
{
var
supportedCultures
=
new
[]
{
new
CultureInfo
(
"en"
),
new
CultureInfo
(
"zh"
)
};
options
.
DefaultRequestCulture
=
new
RequestCulture
(
"en"
);
options
.
SupportedCultures
=
supportedCultures
;
options
.
SupportedUICultures
=
supportedCultures
;
});
}
}
...
@@ -120,7 +110,7 @@ namespace backstage
...
@@ -120,7 +110,7 @@ namespace backstage
app
.
UseExceptionHandler
(
"/Home/Error"
);
app
.
UseExceptionHandler
(
"/Home/Error"
);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app
.
UseHsts
();
app
.
UseHsts
();
app
.
UseStatusCodePagesWithRedirects
(
"/Home/Error"
);
//������http�}�Y������URL
app
.
UseStatusCodePagesWithRedirects
(
"/Home/Error"
);
}
}
app
.
UseAuthentication
();
app
.
UseAuthentication
();
...
@@ -150,11 +140,23 @@ namespace backstage
...
@@ -150,11 +140,23 @@ namespace backstage
app
.
UseStaticFiles
();
app
.
UseStaticFiles
();
app
.
UseRouting
();
app
.
UseRouting
();
app
.
UseAuthorization
();
// 將 app.UseAuthorization() 放在 app.UseRouting() 之後
app
.
UseAuthorization
();
// 將 app.UseAuthorization() 放在 app.UseRouting() 之後
//�ҥ� cookie ��h�\��
app
.
UseCookiePolicy
();
app
.
UseCookiePolicy
();
var
supportedCultures
=
new
CultureInfo
[]
{
//new CultureInfo("en-US"),
new
CultureInfo
(
"zh"
),
new
CultureInfo
(
"en"
),
};
app
.
UseRequestLocalization
(
new
RequestLocalizationOptions
()
{
SupportedCultures
=
supportedCultures
,
SupportedUICultures
=
supportedCultures
,
//當預設Provider偵測不到用戶支持上述Culture的話,就會是↓
DefaultRequestCulture
=
new
RequestCulture
(
"zh"
)
//Default UICulture、Culture
});
app
.
UseEndpoints
(
endpoints
=>
app
.
UseEndpoints
(
endpoints
=>
{
{
endpoints
.
MapControllerRoute
(
endpoints
.
MapControllerRoute
(
...
...
Merchant Token Vault Management/backstage/TokenVault_NSECURED.csproj
View file @
947640ad
...
@@ -22,6 +22,11 @@
...
@@ -22,6 +22,11 @@
<None Remove="Models\Payment\**" />
<None Remove="Models\Payment\**" />
</ItemGroup>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Remove="Resources\Views\Shared\_layout.en.resx" />
</ItemGroup>
<ItemGroup>
<ItemGroup>
<None Include="wwwroot\css\style.css.map" />
<None Include="wwwroot\css\style.css.map" />
<None Include="wwwroot\favicon.ico" />
<None Include="wwwroot\favicon.ico" />
...
...
Merchant Token Vault Management/backstage/Views/Home/Index.cshtml
View file @
947640ad
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
@{
ViewData["Title"] = "Index";
ViewData["Title"] = "Index";
}
}
...
@@ -9,17 +10,17 @@
...
@@ -9,17 +10,17 @@
{
{
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
}
}
<div class="floating-msg" id="msgDiv"></div>
<div class="floating-msg" id="msgDiv"></div>
</div>
</div>
<div class="page-header">
<div class="page-header">
<h3 class="page-title">
Statistic
</h3>
<h3 class="page-title">
@Localizer["Statistic"]
</h3>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">
Number of departments
</h4>
<h4 class="card-title">
@Localizer["Number of departments"]
</h4>
<div class="card-content text-center">
<div class="card-content text-center">
<img src="~/images/admin-vault-department.svg" class="img-fuild">
<img src="~/images/admin-vault-department.svg" class="img-fuild">
<p class="number text-center">@ViewBag.departmentCount</p>
<p class="number text-center">@ViewBag.departmentCount</p>
...
@@ -31,7 +32,7 @@
...
@@ -31,7 +32,7 @@
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">
Number of Token Vaults
</h4>
<h4 class="card-title">
@Localizer["Number of Token Vaults"]
</h4>
<div class="card-content text-center">
<div class="card-content text-center">
<img src="~/images/admin-vault.svg" class="img-fuild">
<img src="~/images/admin-vault.svg" class="img-fuild">
<p class="number text-center">32</p>
<p class="number text-center">32</p>
...
@@ -43,7 +44,7 @@
...
@@ -43,7 +44,7 @@
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">Token Vault Entry <br>
Number of data
</h4>
<h4 class="card-title">Token Vault Entry <br>
@Localizer["Number of data"]
</h4>
<div class="card-content text-center">
<div class="card-content text-center">
<img src="~/images/admin-vault-data.svg" class="img-fuild">
<img src="~/images/admin-vault-data.svg" class="img-fuild">
<p class="number text-center">200</p>
<p class="number text-center">200</p>
...
@@ -55,7 +56,7 @@
...
@@ -55,7 +56,7 @@
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">Token Vualt Entry<br />
Number of new data this month
</h4>
<h4 class="card-title">Token Vualt Entry<br />
@Localizer["Number of new data this month"]
</h4>
<div class="card-content text-center">
<div class="card-content text-center">
<img src="~/images/admin-vault-add.svg" class="img-fuild">
<img src="~/images/admin-vault-add.svg" class="img-fuild">
<p class="number text-center">10</p>
<p class="number text-center">10</p>
...
@@ -67,7 +68,7 @@
...
@@ -67,7 +68,7 @@
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="col-lg-4 col-md-6 grid-margin stretch-card dashboard-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">Token Vualt Entry<br />
Number of data modifications this month
</h4>
<h4 class="card-title">Token Vualt Entry<br />
@Localizer["Number of data modifications this month"]
</h4>
<div class="card-content text-center">
<div class="card-content text-center">
<img src="~/images/admin-vault-edit.svg" class="img-fuild">
<img src="~/images/admin-vault-edit.svg" class="img-fuild">
<p class="number text-center">7</p>
<p class="number text-center">7</p>
...
...
Merchant Token Vault Management/backstage/Views/Shared/_Layout.cshtml
View file @
947640ad
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@inject IViewLocalizer Localizer
<!DOCTYPE html>
<!DOCTYPE html>
<html
lang=
"en"
>
<html
lang=
"en"
>
...
@@ -77,26 +76,26 @@
...
@@ -77,26 +76,26 @@
</div>
</div>
</a>
</a>
<div
class=
"dropdown-menu navbar-dropdown"
aria-labelledby=
"profileDropdown"
>
<div
class=
"dropdown-menu navbar-dropdown"
aria-labelledby=
"profileDropdown"
>
<a
class=
"dropdown-item"
asp-controller=
"User"
asp-action=
"ChangePassword"
asp-route-username=
"@Context.User.Claims.FirstOrDefault(m => m.Type == "
username
").
Value
"
asp-route-returnUrl=
"@Context.Request.Path"
>
<a
class=
"dropdown-item"
asp-controller=
"User"
asp-action=
"ChangePassword"
asp-route-username=
"@Context.User.Claims.FirstOrDefault(m => m.Type == "
username
").
Value
"
asp-route-returnUrl=
"@Context.Request.Path
.Value
"
>
<i
class=
"mdi mdi-lock-open mr-2"
></i>
Change Password
<i
class=
"mdi mdi-lock-open mr-2"
></i>
@Localizer["Change Password"]
</a>
</a>
<a
class=
"dropdown-item"
asp-controller=
"User"
asp-action=
"Register"
>
<a
class=
"dropdown-item"
asp-controller=
"User"
asp-action=
"Register"
>
<i
class=
"mdi mdi-account-plus mr-2"
></i>
Setting Backup
<i
class=
"mdi mdi-account-plus mr-2"
></i>
@Localizer["Setting Backup"]
</a>
</a>
<a
class=
"dropdown-item"
asp-controller=
""
asp-action=
""
>
<a
class=
"dropdown-item"
asp-controller=
""
asp-action=
""
>
<i
class=
"mdi mdi-account-details mr-2"
></i>
Vault Backup
<i
class=
"mdi mdi-account-details mr-2"
></i>
@Localizer["Vault Backup"]
</a>
</a>
<div
class=
"dropdown-divider"
></div>
<div
class=
"dropdown-divider"
></div>
<a
class=
"dropdown-item"
asp-controller=
"User"
asp-action=
"Logout"
>
<a
class=
"dropdown-item"
asp-controller=
"User"
asp-action=
"Logout"
>
<i
class=
"mdi mdi-logout mr-2 text-danger"
></i>
Logout
<i
class=
"mdi mdi-logout mr-2 text-danger"
></i>
@Localizer["Logout"]
</a>
</a>
</div>
</div>
}
}
else
else
{
{
<a
class=
"nav-link "
asp-controller=
"User"
asp-action=
"Login"
>
Login
</a>
<a
class=
"nav-link "
asp-controller=
"User"
asp-action=
"Login"
>
@Localizer["Login"]
</a>
}
}
...
@@ -142,8 +141,7 @@
...
@@ -142,8 +141,7 @@
<i
class=
"mdi mdi-earth"
></i>
<i
class=
"mdi mdi-earth"
></i>
</a>
</a>
<div
class=
"dropdown-menu dropdown-menu-right navbar-dropdown preview-list"
aria-labelledby=
"languageDropdown"
>
<div
class=
"dropdown-menu dropdown-menu-right navbar-dropdown preview-list"
aria-labelledby=
"languageDropdown"
>
<a
class=
"dropdown-item preview-item"
href=
"/Home/ChangeLanguage?lang=en"
>
<a
class=
"dropdown-item preview-item"
asp-action=
"ChangeLanguage"
asp-controller=
"Home"
asp-route-lang=
"en"
asp-route-returnUrl=
"@Context.Request.Path.Value"
>
<div
class=
"preview-thumbnail"
>
<div
class=
"preview-thumbnail"
>
<div
class=
"preview-icon languageIcon"
>
<div
class=
"preview-icon languageIcon"
>
<img
src=
"/images/icon-lan-en-80.jpg"
>
<img
src=
"/images/icon-lan-en-80.jpg"
>
...
@@ -154,8 +152,8 @@
...
@@ -154,8 +152,8 @@
</div>
</div>
</a>
</a>
<div
class=
"dropdown-divider"
></div>
<div
class=
"dropdown-divider"
></div>
<a
class=
"dropdown-item preview-item"
href=
"/Home/ChangeLanguage?lang=zh
"
>
<a
class=
"dropdown-item preview-item"
asp-action=
"ChangeLanguage"
asp-controller=
"Home"
asp-route-lang=
"zh"
asp-route-returnUrl=
"@Context.Request.Path.Value
"
>
<div
class=
"preview-thumbnail"
>
<div
class=
"preview-thumbnail"
>
<div
class=
"preview-icon languageIcon"
>
<div
class=
"preview-icon languageIcon"
>
<img
src=
"/images/icon-lan-cn-80.jpg"
>
<img
src=
"/images/icon-lan-cn-80.jpg"
>
...
@@ -192,15 +190,15 @@
...
@@ -192,15 +190,15 @@
<ul
class=
"nav "
>
<ul
class=
"nav "
>
<li
class=
"nav-item"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
data-toggle=
"collapse"
href=
"#Member"
aria-expanded=
"false"
aria-controls=
"Member"
>
<a
class=
"nav-link"
data-toggle=
"collapse"
href=
"#Member"
aria-expanded=
"false"
aria-controls=
"Member"
>
<span
class=
"menu-title"
>
Users
</span>
<span
class=
"menu-title"
>
@Localizer["Users"]
</span>
<i
class=
"menu-arrow"
></i>
<i
class=
"menu-arrow"
></i>
<i
class=
"mdi mdi-account-multiple menu-icon"
></i>
<i
class=
"mdi mdi-account-multiple menu-icon"
></i>
</a>
</a>
<div
class=
"collapse"
id=
"Member"
>
<div
class=
"collapse"
id=
"Member"
>
<ul
class=
"nav flex-column sub-menu"
>
<ul
class=
"nav flex-column sub-menu"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"User"
asp-action=
"ListUsers"
>
User List
</a></li>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"User"
asp-action=
"ListUsers"
>
@Localizer["User List"]
</a></li>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"User"
asp-action=
"ListDepartments"
>
Department List
</a></li>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"User"
asp-action=
"ListDepartments"
>
@Localizer["Department List"]
</a></li>
@*
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"Member"
asp-action=
"GetMember"
>
信徒資料
</a></li>
*@
@*
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"Member"
asp-action=
"GetMember"
>
信徒資料
</a></li>
*@
</ul>
</ul>
...
@@ -208,13 +206,13 @@
...
@@ -208,13 +206,13 @@
</li>
</li>
<li
class=
"nav-item"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"@Url.Action("
List
",
"
TokenVault
")"
>
<a
class=
"nav-link"
href=
"@Url.Action("
List
",
"
TokenVault
")"
>
<span
class=
"menu-title"
>
Token Vault
</span>
<span
class=
"menu-title"
>
@Localizer["Token Vault"]
</span>
<i
class=
"mdi mdi-database menu-icon"
></i>
<i
class=
"mdi mdi-database menu-icon"
></i>
</a>
</a>
</li>
</li>
<li
class=
"nav-item"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"@Url.Action("
ListKeys
",
"
Key
")"
>
<a
class=
"nav-link"
href=
"@Url.Action("
ListKeys
",
"
Key
")"
>
<span
class=
"menu-title"
>
Keys
</span>
<span
class=
"menu-title"
>
@Localizer["Keys"]
</span>
<i
class=
"mdi mdi-bank menu-icon"
></i>
<i
class=
"mdi mdi-bank menu-icon"
></i>
</a>
</a>
</li>
</li>
...
@@ -228,8 +226,8 @@
...
@@ -228,8 +226,8 @@
<div class="collapse" id="FinancialRecordExpenses">
<div class="collapse" id="FinancialRecordExpenses">
<ul class="nav flex-column sub-menu">
<ul class="nav flex-column sub-menu">
<li class="nav-item"> <a class="nav-link" asp-controller="Key" asp-action="ListKeys">Key列表</a></li>-->
<li class="nav-item"> <a class="nav-link" asp-controller="Key" asp-action="ListKeys">Key列表</a></li>-->
@*
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"FinancialRecordExpenses"
asp-action=
"List"
>
支出紀錄管理
</a></li>
*@
@*
<li
class=
"nav-item"
>
<a
class=
"nav-link"
asp-controller=
"FinancialRecordExpenses"
asp-action=
"List"
>
支出紀錄管理
</a></li>
*@
<!--</ul>
<!--</ul>
</div>
</div>
</li>-->
</li>-->
...
...
Merchant Token Vault Management/backstage/Views/TokenVault/List.cshtml
View file @
947640ad
@model backstage.Models.TokenVault.TokenVaultResponse
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model backstage.Models.TokenVault.TokenVaultResponse
@{
@{
ViewData["Title"] =
"TokenVault列表管理"
;
ViewData["Title"] =
@Localizer["Token Vault List"]
;
}
}
@{
@{
bool isAdmin = User.IsInRole("Admin");
bool isAdmin = User.IsInRole("Admin");
...
@@ -8,7 +10,7 @@
...
@@ -8,7 +10,7 @@
}
}
<div class="page-header">
<div class="page-header">
<h3 class="page-title">
Token Vault List
</h3>
<h3 class="page-title">
@Localizer["Token Vault List"]
</h3>
<input id="msg" hidden value="@TempData["msg"]" />
<input id="msg" hidden value="@TempData["msg"]" />
@if (TempData["isSuccess"] != null)
@if (TempData["isSuccess"] != null)
{
{
...
@@ -25,7 +27,7 @@
...
@@ -25,7 +27,7 @@
<div class="row">
<div class="row">
<div class="col-md-12">
<div class="col-md-12">
<ul class="breadcrumb breadcrumb_memberGo">
<ul class="breadcrumb breadcrumb_memberGo">
<li class="breadcrumb-item active">
Token vault
</li>
<li class="breadcrumb-item active">
@Localizer["Token Vault List"]
</li>
</ul>
</ul>
</div>
</div>
...
@@ -37,11 +39,11 @@
...
@@ -37,11 +39,11 @@
<div class="row justify-content-between">
<div class="row justify-content-between">
<div class="col-md-auto">
<div class="col-md-auto">
<select id="selectDepartmentList" class="form-control margin-right margin-top" asp-items="ViewBag.DepartmentsList">
<select id="selectDepartmentList" class="form-control margin-right margin-top" asp-items="ViewBag.DepartmentsList">
<option value="">
Choose department
</option>
<option value="">
@Localizer["Choose department"]
</option>
</select>
</select>
</div>
</div>
<div class="col-md-auto">
<div class="col-md-auto">
<a type="button" class="btn btn-info float-right mb-2 @disabledClass" asp-action="CreateTokenVault">
Create
</a>
<a type="button" class="btn btn-info float-right mb-2 @disabledClass" asp-action="CreateTokenVault">
@Localizer["Create Department"]
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="row">
...
@@ -57,15 +59,15 @@
...
@@ -57,15 +59,15 @@
<thead>
<thead>
<tr class="">
<tr class="">
<th>Id</th>
<th>Id</th>
<th>
Name
</th>
<th>
@Localizer["Name"]
</th>
<th>
Description
</th>
<th>
@Localizer["Description"]
</th>
<th>
Tpyes
</th>
<th>
@Localizer["Tpyes"]
</th>
<th>
Creation Date
</th>
<th>
@Localizer["Creation Date"]
</th>
<th>
Status
</th>
<th>
@Localizer["Status"]
</th>
<th>
Management
</th>
<th>
@Localizer["Management"]
</th>
<th>
Number of data
</th>
<th>
@Localizer["Number of data"]
</th>
<th>
Number of users
</th>
<th>
@Localizer["Number of users"]
</th>
</tr>
</tr>
</thead>
</thead>
<tbody id="tbody">
<tbody id="tbody">
...
...
Merchant Token Vault Management/backstage/Views/User/CreateDepartment.cshtml
View file @
947640ad
@model backstage.Models.Users.DepartmentForCreate
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model backstage.Models.Users.DepartmentForCreate
@{
@{
ViewData["Title"] =
"Create Department"
;
ViewData["Title"] =
@Localizer["Create Department"]
;
}
}
<!-- partial -->
<!-- partial -->
<div class="page-header">
<div class="page-header">
<h3 class="page-title">
Create Department
</h3>
<h3 class="page-title">
@Localizer["Create Department"]
</h3>
<input id="msg" hidden value="@TempData["msg"]" />
<input id="msg" hidden value="@TempData["msg"]" />
@if (TempData["isSuccess"] != null)
@if (TempData["isSuccess"] != null)
{
{
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
}
}
<div class="floating-msg" id="msgDiv"></div>
<div class="floating-msg" id="msgDiv"></div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-12 grid-margin stretch-card">
<div class="col-12 grid-margin stretch-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">
Create Department
</h4>
<h4 class="card-title">
@Localizer["Create Department"]
</h4>
<form class="forms-sample" method="post" asp-action="CreateDepartment" autocomplete="off">
<form class="forms-sample" method="post" asp-action="CreateDepartment" autocomplete="off">
<div id="errorMsg" asp-validation-summary="All" class="text-danger"></div>
<div id="errorMsg" asp-validation-summary="All" class="text-danger"></div>
<p class="form-title card-description">
Basic
</p>
<p class="form-title card-description">
@Localizer["Basic"]
</p>
<div class="row">
<div class="row">
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label asp-for="name" class="col-form-label" for=""></label>
<label asp-for="name" class="col-form-label" for="">
@Localizer["name"]
</label>
<input asp-for="name" type="text" class="form-control" id="">
<input asp-for="name" type="text" class="form-control" id="">
<span asp-validation-for="name" class="text-danger"></span>
<span asp-validation-for="name" class="text-danger"></span>
</div>
</div>
<div class="col-md-4 form-group ">
<div class="col-md-4 form-group ">
<label asp-for="phone" class="col-form-label" for="phone"></label>
<label asp-for="phone" class="col-form-label" for="phone">
@Localizer["phone"]
</label>
<input asp-for="phone" class="form-control" id="phone">
<input asp-for="phone" class="form-control" id="phone">
<span asp-validation-for="phone" class="text-danger"></span>
<span asp-validation-for="phone" class="text-danger"></span>
</div>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary mr-2">Submit</button>
<a type="button" class="btn btn-light" asp-action="ListDepartments">Back to list</a>
<button type="submit" class="btn btn-primary mr-2">@Localizer["Submit"]</button>
<a type="button" class="btn btn-light" asp-action="ListDepartments">@Localizer["Back to list"]</a>
</form>
</form>
</div>
</div>
</div>
</div>
...
...
Merchant Token Vault Management/backstage/Views/User/CreateUser.cshtml
View file @
947640ad
@model backstage.Models.Users.User
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model backstage.Models.Users.User
@{
@{
ViewData["Title"] = "Create User";
ViewData["Title"] = "Create User";
}
}
...
@@ -13,25 +15,25 @@
...
@@ -13,25 +15,25 @@
{
{
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
}
}
<div class="floating-msg" id="msgDiv"></div>
<div class="floating-msg" id="msgDiv"></div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-12 grid-margin stretch-card">
<div class="col-12 grid-margin stretch-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">
Create User
</h4>
<h4 class="card-title">
@Localizer["Create User"]
</h4>
<form class="forms-sample" method="post" asp-action="CreateUser" autocomplete="off">
<form class="forms-sample" method="post" asp-action="CreateUser" autocomplete="off">
<div id="errorMsg" asp-validation-summary="All" class="text-danger"></div>
<div id="errorMsg" asp-validation-summary="All" class="text-danger"></div>
<p class="form-title card-description">
Basic
</p>
<p class="form-title card-description">
@Localizer["Basic"]
</p>
<div class="row">
<div class="row">
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label asp-for="name" class="col-form-label" for=""></label>
<label asp-for="name" class="col-form-label" for="">
@Localizer["name"]
</label>
<input asp-for="name" type="text" class="form-control" id="">
<input asp-for="name" type="text" class="form-control" id="">
<span asp-validation-for="name" class="text-danger"></span>
<span asp-validation-for="name" class="text-danger"></span>
</div>
</div>
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label asp-for="username" class="col-form-label" for="username"></label>
<label asp-for="username" class="col-form-label" for="username">
@Localizer["username"]
</label>
<input asp-for="username" class="form-control" id="username">
<input asp-for="username" class="form-control" id="username">
<span asp-validation-for="username" class="text-danger"></span>
<span asp-validation-for="username" class="text-danger"></span>
</div>
</div>
...
@@ -40,7 +42,7 @@
...
@@ -40,7 +42,7 @@
<div class="row">
<div class="row">
<div class="col-md-6 form-group">
<div class="col-md-6 form-group">
<label asp-for="email" class="col-form-label" for="email">
email
</label>
<label asp-for="email" class="col-form-label" for="email">
@Localizer["email"]
</label>
<input asp-for="email" class="form-control" id="email">
<input asp-for="email" class="form-control" id="email">
<span asp-validation-for="email" class="text-danger"></span>
<span asp-validation-for="email" class="text-danger"></span>
</div>
</div>
...
@@ -48,11 +50,11 @@
...
@@ -48,11 +50,11 @@
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label asp-for="password" class="col-form-label" for=""></label>
<label asp-for="password" class="col-form-label" for="">
@Localizer["password"]
</label>
<input asp-for="password" type="text" class="form-control" id="">
<input asp-for="password" type="text" class="form-control" id="">
<span asp-validation-for="password" class="text-danger"></span>
<span asp-validation-for="password" class="text-danger"></span>
</div>
</div>
</div>
</div>
...
@@ -60,8 +62,8 @@
...
@@ -60,8 +62,8 @@
<button type="submit" class="btn btn-primary mr-2">
Submit
</button>
<button type="submit" class="btn btn-primary mr-2">
@Localizer["Submit"]
</button>
<a type="button" class="btn btn-light" asp-action="ListUsers">
Back to list
</a>
<a type="button" class="btn btn-light" asp-action="ListUsers">
@Localizer["Back to list"]
</a>
</form>
</form>
</div>
</div>
</div>
</div>
...
...
Merchant Token Vault Management/backstage/Views/User/GetUser.cshtml
View file @
947640ad
@model backstage.Models.Users.User
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model backstage.Models.Users.User
@{
@{
ViewData["Title"] = "Modify User";
ViewData["Title"] = "Modify User";
}
}
...
@@ -11,7 +13,7 @@
...
@@ -11,7 +13,7 @@
<input id="msg" hidden value="@TempData["msg"]" />
<input id="msg" hidden value="@TempData["msg"]" />
@if (TempData["isSuccess"] != null)
@if (TempData["isSuccess"] != null)
{
{
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
<input id="isSuccess" hidden value="@TempData["isSuccess"].ToString()" />
}
}
<div class="floating-msg" id="msgDiv"></div>
<div class="floating-msg" id="msgDiv"></div>
</div>
</div>
...
@@ -19,18 +21,18 @@
...
@@ -19,18 +21,18 @@
<div class="col-12 grid-margin stretch-card">
<div class="col-12 grid-margin stretch-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<h4 class="card-title">
Modify User
</h4>
<h4 class="card-title">
@Localizer["Modify User"]
</h4>
<form class="forms-sample" method="post" asp-action="GetUser" autocomplete="off">
<form class="forms-sample" method="post" asp-action="GetUser" autocomplete="off">
<div id="errorMsg" asp-validation-summary="All" class="text-danger"></div>
<div id="errorMsg" asp-validation-summary="All" class="text-danger"></div>
<p class="form-title card-description">
Basic
</p>
<p class="form-title card-description">
@Localizer["Basic"]
</p>
<div class="row">
<div class="row">
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label asp-for="uid" class="col-form-label" for=""></label>
<label asp-for="uid" class="col-form-label" for=""></label>
<input asp-for="uid" type="text" class="form-control" disabled>
<input asp-for="uid" type="text" class="form-control" disabled>
</div>
</div>
<div class="col-md-4 form-group ">
<div class="col-md-4 form-group ">
<label asp-for="created_date" class="col-form-label" for="creation_date"></label>
<label asp-for="created_date" class="col-form-label" for="creation_date">
@Localizer["created_date"]
</label>
<input asp-for="created_date" class="form-control" id="creation_date" disabled>
<input asp-for="created_date" class="form-control" id="creation_date" disabled>
</div>
</div>
...
@@ -38,12 +40,12 @@
...
@@ -38,12 +40,12 @@
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-4 form-group ">
<div class="col-md-4 form-group ">
<label asp-for="name" class="col-form-label" for=""></label>
<label asp-for="name" class="col-form-label" for="">
@Localizer["name"]
</label>
<input asp-for="name" type="text" class="form-control" id="">
<input asp-for="name" type="text" class="form-control" id="">
<span asp-validation-for="name" class="text-danger"></span>
<span asp-validation-for="name" class="text-danger"></span>
</div>
</div>
<div class="col-md-4 form-group ">
<div class="col-md-4 form-group ">
<label asp-for="username" class="col-form-label" for="username"></label>
<label asp-for="username" class="col-form-label" for="username">
@Localizer["username"]
</label>
<input asp-for="username" class="form-control" id="username" disabled>
<input asp-for="username" class="form-control" id="username" disabled>
<span asp-validation-for="username" class="text-danger"></span>
<span asp-validation-for="username" class="text-danger"></span>
</div>
</div>
...
@@ -54,62 +56,62 @@
...
@@ -54,62 +56,62 @@
{
{
for (int i = 0; i < Model.email.Count; i++)
for (int i = 0; i < Model.email.Count; i++)
{
{
<div class="col-md-2 form-group">
<div class="col-md-2 form-group">
<label asp-for="@Model.email[i].type" class="col-form-label" for="emailType">Types
</label>
<label asp-for="@Model.email[i].type" class="col-form-label" for="emailType">@Localizer["Types"]
</label>
<input name="email[@i].type" value="@Model.email[i].type" class="form-control" />
<input name="email[@i].type" value="@Model.email[i].type" class="form-control" />
<span asp-validation-for="@Model.email[i].type" class="text-danger"></span>
<span asp-validation-for="@Model.email[i].type" class="text-danger"></span>
</div>
</div>
<div class="col-md-6 form-group">
<div class="col-md-6 form-group">
<label asp-for="@Model.email[i].email" class="col-form-label" for="emailAddress">Email
</label>
<label asp-for="@Model.email[i].email" class="col-form-label" for="emailAddress">@Localizer["Email"]
</label>
<input name="email[@i].email" value="@Model.email[i].email" class="form-control" />
<input name="email[@i].email" value="@Model.email[i].email" class="form-control" />
<span asp-validation-for="@Model.email[i].email" class="text-danger"></span>
<span asp-validation-for="@Model.email[i].email" class="text-danger"></span>
</div>
</div>
}
}
}
}
</div>
</div>
<!--<div class="row" id="">
<!--<div class="row" id="">
<div class="col-md-2 form-group">
<div class="col-md-2 form-group">
<label class="col-form-label" >新增類型</label>-->
<label class="col-form-label" >新增類型</label>-->
@*<input name="email[@(Model.email != null ? Model.email.Count : 0)].type" class="form-control" />*@
@*<input name="email[@(Model.email != null ? Model.email.Count : 0)].type" class="form-control" />*@
<!--<input class="form-control" />
<!--<input class="form-control" />
</div>
</div>
<div class="col-md-6 form-group">
<div class="col-md-6 form-group">
<label class="col-form-label">新增電子郵件</label>-->
<label class="col-form-label">新增電子郵件</label>-->
@*<input name="email[@(Model.email != null ? Model.email.Count : 0)].email" class="form-control" />*@
@*<input name="email[@(Model.email != null ? Model.email.Count : 0)].email" class="form-control" />*@
<!--<input class="form-control"/>
<!--<input class="form-control"/>
</div>
</div>
</div>-->
</div>-->
<p class="form-title card-description">
Change Password
</p>
<p class="form-title card-description">
@Localizer["Change Password"]
</p>
<div class="row">
<div class="row">
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label asp-for="password" class="col-form-label" for="">
Current Password
</label>
<label asp-for="password" class="col-form-label" for="">
@Localizer["Current Password"]
</label>
<input asp-for="password" type="password" class="form-control">
<input asp-for="password" type="password" class="form-control">
</div>
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label asp-for="newPassword" class="col-form-label">
New Password
</label>
<label asp-for="newPassword" class="col-form-label">
@Localizer["New Password"]
</label>
<input asp-for="newPassword" type="password" class="form-control" id="newPWD">
<input asp-for="newPassword" type="password" class="form-control" id="newPWD">
</div>
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-md-4 form-group required">
<div class="col-md-4 form-group required">
<label class="col-form-label">
Confrim
</label>
<label class="col-form-label">
@Localizer["Confrim"]
</label>
<input class="form-control" type="password" id="confirmPWD">
<input class="form-control" type="password" id="confirmPWD">
<span id="passwordMatchError" class="text-danger" style="display: none;">
The two passwords entered do not match
</span>
<span id="passwordMatchError" class="text-danger" style="display: none;">
@Localizer["The two passwords entered do not match"]
</span>
</div>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary mr-2">
Submit
</button>
<button type="submit" class="btn btn-primary mr-2">
@Localizer["Submit"]
</button>
<a type="button" class="btn btn-light" asp-action="ListUsers">
Back to list
</a>
<a type="button" class="btn btn-light" asp-action="ListUsers">
@Localizer["Back to list"]
</a>
</form>
</form>
</div>
</div>
</div>
</div>
...
...
Merchant Token Vault Management/backstage/Views/User/ListDepartments.cshtml
View file @
947640ad
@model backstage.Models.Users.DepartmentsResponse
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model backstage.Models.Users.DepartmentsResponse
@{
@{
bool isAdmin = User.IsInRole("Admin");
bool isAdmin = User.IsInRole("Admin");
string disabledClass = isAdmin ? "" : "disabled";
string disabledClass = isAdmin ? "" : "disabled";
}
}
<div class="page-header">
<div class="page-header">
<h3 class="page-title">
Department List
</h3>
<h3 class="page-title">
@Localizer["Department List"]
</h3>
<input id="msg" hidden value="@TempData["msg"]" />
<input id="msg" hidden value="@TempData["msg"]" />
@if (TempData["isSuccess"] != null)
@if (TempData["isSuccess"] != null)
{
{
...
@@ -17,24 +19,24 @@
...
@@ -17,24 +19,24 @@
<div class="col-lg-12 grid-margin stretch-card">
<div class="col-lg-12 grid-margin stretch-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<a type="button" class="btn btn-info float-right mb-2 @disabledClass" asp-action="CreateDepartment">
Create
</a>
<a type="button" class="btn btn-info float-right mb-2 @disabledClass" asp-action="CreateDepartment">
@Localizer["Create"]
</a>
@*列表*@
@*列表*@
<div class="">
<div class="">
<table class="table table-striped ">
<table class="table table-striped ">
<thead>
<thead>
<tr>
<tr>
<th>
merchant_id
</th>
<th>
@Localizer["merchant_id"]
</th>
<th>
name
</th>
<th>
@Localizer["name"]
</th>
@*<th>address</th>
@*<th>address</th>
<th>country_id</th>
<th>country_id</th>
<th>postcode</th>*@
<th>postcode</th>*@
<th>phone
</th>
<th>@Localizer["phone"]
</th>
@*<th>fax</th>*@
@*<th>fax</th>*@
@*<th>vatid</th>*@
@*<th>vatid</th>*@
@*<th>enabled</th>*@
@*<th>enabled</th>*@
<th>creation_date
</th>
<th>@Localizer["creation_date"]
</th>
@*<th>vatid_verify</th>
@*<th>vatid_verify</th>
<th>deposit_book_verify</th>
<th>deposit_book_verify</th>
<th>user_natid_verify</th>
<th>user_natid_verify</th>
...
...
Merchant Token Vault Management/backstage/Views/User/ListUsers.cshtml
View file @
947640ad
@model backstage.Models.Users.UserResponse
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model backstage.Models.Users.UserResponse
@{
@{
bool isAdmin = User.IsInRole("Admin");
bool isAdmin = User.IsInRole("Admin");
string disabledClass = isAdmin ? "" : "disabled";
string disabledClass = isAdmin ? "" : "disabled";
...
@@ -17,8 +19,8 @@
...
@@ -17,8 +19,8 @@
<div class="col-lg-12 grid-margin stretch-card">
<div class="col-lg-12 grid-margin stretch-card">
<div class="card">
<div class="card">
<div class="card-body">
<div class="card-body">
<div id="adminStatus" style="float: left;">
User count:@ViewBag.userCount / Admin count
:@ViewBag.adminCount </div>
<div id="adminStatus" style="float: left;">
@Localizer["User count"]:@ViewBag.userCount / @Localizer["Admin count"]
:@ViewBag.adminCount </div>
<a type="button" class="btn btn-info float-right mb-2 @disabledClass" asp-action="CreateUser">
Create
</a>
<a type="button" class="btn btn-info float-right mb-2 @disabledClass" asp-action="CreateUser">
@Localizer["Create"]
</a>
@*列表*@
@*列表*@
<div class="">
<div class="">
...
@@ -26,14 +28,14 @@
...
@@ -26,14 +28,14 @@
<thead>
<thead>
<tr>
<tr>
<th>uid</th>
<th>uid</th>
<th>
name
</th>
<th>
@Localizer["name"]
</th>
@*<th>name_en</th>*@
@*<th>name_en</th>*@
<th>username
</th>
<th>@Localizer["username"]
</th>
<th>email
</th>
<th>@Localizer["Email"]
</th>
@*<th>locked</th>*@
@*<th>locked</th>*@
<th>creation_date
</th>
<th>@Localizer["creation_date"]
</th>
<th>enabled
</th>
<th>@Localizer["enabled"]
</th>
<th>Admin
</th>
<th>@Localizer["Admin"]
</th>
@*<th>birthdate</th>
@*<th>birthdate</th>
<th>marital_status</th>
<th>marital_status</th>
<th>gender</th>
<th>gender</th>
...
...
Merchant Token Vault Management/backstage/Views/User/Login.cshtml
View file @
947640ad
@model backstage.Models.Users.User
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model backstage.Models.Users.User
@{
@{
ViewData["Title"] = "Login";
ViewData["Title"] = "Login";
}
}
@{
@{
Layout = null;
Layout = null;
}
}
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<html>
<head>
<head>
<meta
name=
"viewport"
content=
"width=device-width"
/>
<meta
name=
"viewport"
content=
"width=device-width"
/>
<!-- Required meta tags -->
<!-- Required meta tags -->
<meta
charset=
"utf-8"
>
<meta
charset=
"utf-8"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1, shrink-to-fit=no"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1, shrink-to-fit=no"
>
<title>
@ViewData["Title"]
</title>
<title>
@ViewData["Title"]
</title>
<!-- End Required meta tags -->
<!-- End Required meta tags -->
<!-- plugins:css -->
<!-- plugins:css -->
<link
rel=
"stylesheet"
href=
"~/vendors/mdi/css/materialdesignicons.min.css"
>
<link
rel=
"stylesheet"
href=
"~/vendors/mdi/css/materialdesignicons.min.css"
>
<link
rel=
"stylesheet"
href=
"~/vendors/css/vendor.bundle.base.css"
>
<link
rel=
"stylesheet"
href=
"~/vendors/css/vendor.bundle.base.css"
>
<!-- endinject -->
<!-- endinject -->
<link
rel=
"stylesheet"
href=
"~/lib/bootstrap/dist/css/bootstrap.min.css"
/>
<link
rel=
"stylesheet"
href=
"~/lib/bootstrap/dist/css/bootstrap.min.css"
/>
@*
<link
rel=
"stylesheet"
href=
"~/css/site.css"
/>
*@
@*
<link
rel=
"stylesheet"
href=
"~/css/site.css"
/>
*@
<!-- Layout styles -->
<!-- Layout styles -->
<link
rel=
"stylesheet"
href=
"~/css/style.css"
>
<link
rel=
"stylesheet"
href=
"~/css/style.css"
>
<!-- End layout styles -->
<!-- End layout styles -->
<link
rel=
"shortcut icon"
href=
"~/images/favicon.png"
/>
<link
rel=
"shortcut icon"
href=
"~/images/favicon.png"
/>
<!--jquery ui datepicker-->
<!--jquery ui datepicker-->
<link
href=
"~/lib/jquery-ui/jquery-ui.min.css"
rel=
"stylesheet"
/>
<link
href=
"~/lib/jquery-ui/jquery-ui.min.css"
rel=
"stylesheet"
/>
<!--END jquery ui datepicker-->
<!--END jquery ui datepicker-->
</head>
</head>
<body>
<body>
<div
class=
"container-scroller"
>
<div
class=
"container-fluid page-body-wrapper full-page-wrapper"
>
<div
class=
"content-wrapper d-flex align-items-center auth"
>
<div
class=
"row flex-grow"
>
<div
class=
"col-lg-4 mx-auto"
>
<div
class=
"auth-form-light text-left p-5"
>
<div
class=
"brand-logo"
>
<img
src=
"~/images/LOGO_nsecured.svg"
>
</div>
<div
class=
"product-logo"
>
<img
src=
"~/images/logo-J-100.jpg"
>
</div>
@*
<h4
class=
"text-center"
>
Tokenization Manager
</h4>
*@
<input
id=
"msg"
hidden
value=
"@TempData["
msg
"]"
/>
@if (TempData["isSuccess"] != null)
{
<input
id=
"isSuccess"
hidden
value=
"@TempData["
isSuccess
"].
ToString
()"
/>
}
<div
id=
"msgDiv"
></div>
<!-- <h6 class="font-weight-light">基本資料</h6> -->
<form
class=
"pt-3"
method=
"post"
asp-action=
"login"
asp-route-ReturnUrl=
@Context.Request.Query["ReturnUrl"]
>
<div
id=
"errorMsg"
asp-validation-summary=
"All"
class=
"text-danger"
></div>
<div
class=
"form-group"
>
<input
class=
"form-control form-control-lg"
asp-for=
"username"
placeholder=
"username"
/>
<div
class=
"container-scroller"
>
<span
asp-validation-for=
"username"
class=
"text-danger"
></span>
<div
class=
"container-fluid page-body-wrapper full-page-wrapper"
>
</div>
<div
class=
"content-wrapper d-flex align-items-center auth"
>
<div
class=
"form-group"
>
<div
class=
"row flex-grow"
>
<div
class=
"col-lg-4 mx-auto"
>
<div
class=
"auth-form-light text-left p-5"
>
<div
class=
"brand-logo"
>
<img
src=
"~/images/LOGO_nsecured.svg"
>
</div>
<div
class=
"product-logo"
>
<img
src=
"~/images/logo-J-100.jpg"
>
</div>
@*
<h4
class=
"text-center"
>
Tokenization Manager
</h4>
*@
<input
id=
"msg"
hidden
value=
"@TempData["
msg
"]"
/>
@if (TempData["isSuccess"] != null)
{
<input
id=
"isSuccess"
hidden
value=
"@TempData["
isSuccess
"].
ToString
()"
/>
}
<div
id=
"msgDiv"
></div>
<!-- <h6 class="font-weight-light">基本資料</h6> -->
<form
class=
"pt-3"
method=
"post"
asp-action=
"login"
asp-route-ReturnUrl=
@Context.Request.Query["ReturnUrl"]
>
<div
id=
"errorMsg"
asp-validation-summary=
"All"
class=
"text-danger"
></div>
<div
class=
"form-group"
>
<input
class=
"form-control form-control-lg"
asp-for=
"username"
placeholder=
"@Localizer["
username
"]"
/>
<span
asp-validation-for=
"username"
class=
"text-danger"
></span>
</div>
<div
class=
"form-group"
>
<input
class=
"form-control form-control-lg"
type=
"password"
asp-for=
"pwd"
placeholder=
"@Localizer["
password
"]"
/>
<span
asp-validation-for=
"pwd"
class=
"text-danger"
></span>
</div>
<div
class=
"mt-3"
>
<button
type=
"submit"
class=
"btn btn-block btn-gradient-primary btn-lg font-weight-medium"
>
@Localizer["Login"]
</button>
</div>
@*
<div
class=
"my-2 d-flex justify-content-between align-items-center"
>
<div
class=
"form-check"
>
<label
class=
"form-check-label text-muted"
>
<input
type=
"checkbox"
asp-for=
"keepLogin"
class=
"form-check-input"
>
保持登入
</label>
</div>
<a
asp-action=
"RecoverPassword"
class=
"auth-link text-black"
>
忘記密碼
</a>
</div>
*@
@*
<div
class=
"mb-2"
>
<button
type=
"button"
class=
"btn btn-block btn-facebook"
>
<i
class=
"mdi mdi-facebook mr-2"
></i>
使用facebook登入
</button>
</div>
*@
@*
<div
class=
"text-center mt-4 font-weight-light"
>
沒有帳號?
<a
asp-action=
"Register"
class=
"text-primary"
>
建立
</a></div>
*@
<input
class=
"form-control form-control-lg"
type=
"password"
asp-for=
"pwd"
placeholder=
"password"
/>
</form>
<span
asp-validation-for=
"pwd"
class=
"text-danger"
></span>
</div>
</div>
</div>
<div
class=
"mt-3"
>
</div>
<button
type=
"submit"
class=
"btn btn-block btn-gradient-primary btn-lg font-weight-medium"
>
Login
</button>
</div>
</div>
</div>
@*
<div
class=
"my-2 d-flex justify-content-between align-items-center"
>
</div>
<div
class=
"form-check"
>
<!-- content-wrapper ends -->
<label
class=
"form-check-label text-muted"
>
@*
<script
src=
"~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
></script>
*@
<input
type=
"checkbox"
asp-for=
"keepLogin"
class=
"form-check-input"
>
保持登入
<script
src=
"~/lib/jquery/dist/jquery.js"
></script>
</label>
<script
src=
"~/js/site.js"
asp-append-version=
"true"
></script>
</div>
<a
asp-action=
"RecoverPassword"
class=
"auth-link text-black"
>
忘記密碼
</a>
</div>
*@
@*
<div
class=
"mb-2"
>
<button
type=
"button"
class=
"btn btn-block btn-facebook"
>
<i
class=
"mdi mdi-facebook mr-2"
></i>
使用facebook登入
</button>
</div>
*@
@*
<div
class=
"text-center mt-4 font-weight-light"
>
沒有帳號?
<a
asp-action=
"Register"
class=
"text-primary"
>
建立
</a></div>
*@
</form>
<!-- plugins:js -->
</div>
<script
src=
"~/vendors/js/vendor.bundle.base.js"
></script>
</div>
<!-- endinject -->
</div>
<!-- Plugin js for this page -->
</div>
<!-- End plugin js for this page -->
</div>
<!-- inject:js -->
</div>
<script
src=
"~/js/off-canvas.js"
></script>
<!-- content-wrapper ends -->
<script
src=
"~/js/hoverable-collapse.js"
></script>
@*
<script
src=
"~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
></script>
*@
<script
src=
"~/js/misc.js"
></script>
<script
src=
"~/lib/jquery/dist/jquery.js"
></script>
<!-- endinject -->
<script
src=
"~/js/site.js"
asp-append-version=
"true"
></script>
<!-- Custom js for this page -->
<script
src=
"~/js/file-upload.js"
></script>
<!-- End custom js for this page -->
<!--jquery ui datepicker-->
<!-- plugins:js -->
<script
src=
"~/lib/jquery-ui/jquery-ui.min.js"
></script>
<script
src=
"~/vendors/js/vendor.bundle.base.js"
></script>
<!--END jquery ui datepicker-->
<!-- endinject -->
<!-- Plugin js for this page -->
<!-- End plugin js for this page -->
<!-- inject:js -->
<script
src=
"~/js/off-canvas.js"
></script>
<script
src=
"~/js/hoverable-collapse.js"
></script>
<script
src=
"~/js/misc.js"
></script>
<!-- endinject -->
<!-- Custom js for this page -->
<script
src=
"~/js/file-upload.js"
></script>
<!-- End custom js for this page -->
<!--jquery ui datepicker-->
<script
src=
"~/lib/jquery-ui/jquery-ui.min.js"
></script>
<!--END jquery ui datepicker-->
<script
src=
"~/lib/jquery.ba-dotimeout.js"
></script>
<script
src=
"~/lib/jquery.ba-dotimeout.js"
></script>
</body>
</body>
</html>
</html>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment