Commit 947640ad authored by Jason's avatar Jason

更新多語言

parent bf57cd83
...@@ -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);
} }
......
...@@ -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
......
...@@ -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 RedirectToAction(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));
} }
} }
......
<?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
...@@ -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>
......
<?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
<?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
<?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
<?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
<?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
<?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
...@@ -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
...@@ -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(
......
...@@ -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" />
......
 @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>
......
@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>-->
......
@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">
......
@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>
......
@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>
......
@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>
......
@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>
......
@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>
......
@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>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment