Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
@page
@model Senparc.Areas.Admin.Areas.Admin.Pages.AdminUserInfoAuthorizationPageModel
@{
ViewData["Title"] = "角色授予";
ViewData["Title"] = AR["AdminUserInfo.角色授予"];
}


@section breadcrumbs{
<li>系统管理</li>
<li>@AR["Common.系统管理"]</li>
<li>
<a asp-Page="/AdminUserInfo">管理员管理</a>
<a asp-Page="/AdminUserInfo">@AR["AdminUserInfo.管理员管理"]</a>
</li>
<li>
@ViewData["Title"]
Expand All @@ -30,8 +30,8 @@
}
<hr />
<div class="col-md-12 col-sm-12 col-xs-12">
<a class="btn btn-default" asp-page="./Index">返回</a>
<a class="btn btn-success" id="submit">保存</a>
<a class="btn btn-default" asp-page="./Index">@AR["Common.返回"]</a>
<a class="btn btn-success" id="submit">@AR["Common.保存"]</a>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
@model Senparc.Areas.Admin.Areas.Admin.Pages.LoginModel
@{
Layout = null;
var currentCulture = System.Globalization.CultureInfo.CurrentUICulture.Name;
}
@inject Microsoft.Extensions.Localization.IStringLocalizer<Senparc.Areas.Admin.AdminResource> AR
<!DOCTYPE html>
<html>
<html lang="@currentCulture">
<head>
<meta charset="utf-8" />
<title>登录 NCF 管理后台</title>
<title>@AR["Admin.Title"]</title>
<meta name="description" content="@ViewBag.Description" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
Expand All @@ -24,25 +26,36 @@
</head>
<body>
<div class="content" id="app">
<div style="position: absolute; top: 18px; right: 18px; z-index: 10; background: rgba(255,255,255,.9); border-radius: 6px; padding: 6px 10px;">
<label for="ncf-login-lang" style="font-size: 12px; color: #606266; margin-right: 6px;">@AR["Admin.Language.SelectLanguage"]</label>
<select id="ncf-login-lang" onchange="ncfSwitchLanguage(this.value)">
<option value="zh-CN" selected="@(currentCulture == "zh-CN" ? "selected" : null)">简体中文</option>
<option value="en" selected="@(currentCulture.StartsWith("en") ? "selected" : null)">English</option>
<option value="ja" selected="@(currentCulture.StartsWith("ja") ? "selected" : null)">日本語</option>
<option value="fr" selected="@(currentCulture.StartsWith("fr") ? "selected" : null)">Français</option>
<option value="es" selected="@(currentCulture.StartsWith("es") ? "selected" : null)">Español</option>
<option value="ru" selected="@(currentCulture.StartsWith("ru") ? "selected" : null)">Русский</option>
</select>
</div>
<div class="login-container animated fadeIn logoBox ">
<div class="login-inner-box">
<span class="logoImg">
<img src="~/images/logo-login-ncf.png" width="173" />
</span>
<div class="loginbox bg-white logoBg">
<div class="loginbox-title">管理员登录</div>
<div class="loginbox-title">@AR["Admin.Login.Title"]</div>
<div class="loginbox-textbox">
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" class="demo-ruleForm">
<el-form-item prop="user">
<el-input v-model.number="ruleForm.user" placeholder="请输入用户名"></el-input>
<el-input v-model.number="ruleForm.user" placeholder="@AR["Admin.Login.UsernamePlaceholder"]"></el-input>
</el-form-item>
<el-form-item prop="tenant" v-if="enableMultiTenant">
<el-input v-model="ruleForm.tenant" placeholder="请输入租户名称"></el-input>
<el-input v-model="ruleForm.tenant" placeholder="@AR["Admin.Login.TenantPlaceholder"]"></el-input>
</el-form-item>
<el-form-item prop="pass">
<el-input type="password" v-model="ruleForm.pass" placeholder="请输入密码" autocomplete="off"></el-input>
<el-input type="password" v-model="ruleForm.pass" placeholder="@AR["Admin.Login.PasswordPlaceholder"]" autocomplete="off"></el-input>
</el-form-item>
<el-button :loading="loading" style="width: 100%;" type="primary" @@click="submitForm('ruleForm')">登录</el-button>
<el-button :loading="loading" style="width: 100%;" type="primary" @@click="submitForm('ruleForm')">@AR["Admin.Login.Submit"]</el-button>
</el-form>
</div>
</div>
Expand All @@ -57,6 +70,19 @@
<script src="~/lib/vue/vue.js"></script>
<script src="~/lib/element-ui_2.13.2/element.js"></script>
<script src="~/lib/axios/axios.min.js"></script>
<script>
window.ncfLoginI18n = {
usernameRequired: '@AR["Admin.Login.Error.UsernameRequired"]',
passwordRequired: '@AR["Admin.Login.Error.PasswordRequired"]',
loginFailed: 'Login failed',
loginRetry: 'Login failed, please try again'
};

function ncfSwitchLanguage(culture) {
var returnUrl = window.location.pathname + window.location.search;
window.location.href = '/api/Language/Set?culture=' + encodeURIComponent(culture) + '&returnUrl=' + encodeURIComponent(returnUrl);
}
</script>
<!--js-->
<script src="~/js/Admin/axios.js"></script>
<script src="~/js/Admin/Pages/LogIn/index.js" asp-append-version="true"></script>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using Senparc.Ncf.Core.Config;
using Senparc.Xncf.Tenant.Domain.Services;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;

namespace Senparc.Areas.Admin.Areas.Admin.Pages
{
Expand All @@ -43,10 +44,13 @@ public class LoginModel : BasePageModel/* BaseAdminPageModel*/

private readonly AdminUserInfoService _userInfoService;
private readonly TenantInfoService _tenantInfoService;
public LoginModel(AdminUserInfoService userInfoService, TenantInfoService tenantInfoService)
private readonly IStringLocalizer<AdminResource> _localizer;
public LoginModel(AdminUserInfoService userInfoService, TenantInfoService tenantInfoService,
IStringLocalizer<AdminResource> localizer)
{
this._userInfoService = userInfoService;
this._tenantInfoService = tenantInfoService;
this._localizer = localizer;
}


Expand Down Expand Up @@ -124,14 +128,14 @@ public async Task<IActionResult> OnPostLoginAsync([FromBody] LoginInDto loginInD
if (tenantInfo == null)
{
SenparcTrace.SendCustomLog("登录失败", $", 错误:租户名称错误:" + tenantKey);
return Ok("pwd", false, $"用户名:{loginInDto.Name}, 错误:账号或密码错误!");
return Ok("pwd", false, _localizer["Admin.Login.Error.InvalidCredentials"]);
}

var requestTenantInfo = this._tenantInfoService.GetRequestTenantInfo(tenantInfo);
if (!_userInfoService.SetTenantInfo(requestTenantInfo))
{
SenparcTrace.SendCustomLog("租户配置失败", $", 错误:租户名配置错误:" + tenantKey);
return Ok("pwd", false, $"用户名:{loginInDto.Name}, 错误:账号或密码错误!");
return Ok("pwd", false, _localizer["Admin.Login.Error.InvalidCredentials"]);
}

tenantKey = tenantInfo.TenantKey;
Expand All @@ -147,7 +151,7 @@ public async Task<IActionResult> OnPostLoginAsync([FromBody] LoginInDto loginInD
if (userInfo == null)
{
SenparcTrace.SendCustomLog("登录失败", $"用户名:{loginInDto.Name}, 错误:账号或密码错误!101");
return Ok("pwd", false, "账号或密码错误!");
return Ok("pwd", false, _localizer["Admin.Login.Error.InvalidCredentials"]);
//ModelState.AddModelError(nameof(this.Password), "账号或密码错误!");
}

Expand All @@ -158,7 +162,7 @@ public async Task<IActionResult> OnPostLoginAsync([FromBody] LoginInDto loginInD
{
//ModelState.AddModelError(nameof(this.Password), "账号或密码错误!");
SenparcTrace.SendCustomLog("登录失败", $"用户名:{loginInDto.Name}, 错误:账号或密码错误!102");
return Ok("pwd", false, "账号或密码错误!");
return Ok("pwd", false, _localizer["Admin.Login.Error.InvalidCredentials"]);
}

return Ok(true);
Expand All @@ -172,7 +176,7 @@ public async Task<IActionResult> OnPostLoginAsync([FromBody] LoginInDto loginInD
{
SenparcTrace.SendCustomLog("登录失败", $"用户名:{loginInDto.Name}, 错误:{ex.Message}");
//其他异常,不返回错误信息
return Ok("pwd", false, "账号或密码错误!");
return Ok("pwd", false, _localizer["Admin.Login.Error.InvalidCredentials"]);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
@page
@model Senparc.Areas.Admin.Areas.Admin.Pages.MenuIndexModel
@{
ViewData["Title"] = "菜单管理"; Layout = "_Layout_Vue";
ViewData["Title"] = AR["Menu.管理"]; Layout = "_Layout_Vue";
}
@section Style{
<link href="~/css/Admin/Menu/Menu.css" rel="stylesheet" />
}
@section breadcrumbs {
<el-breadcrumb-item>系统管理</el-breadcrumb-item>
<el-breadcrumb-item>菜单列表</el-breadcrumb-item>
<el-breadcrumb-item>@AR["Common.系统管理"]</el-breadcrumb-item>
<el-breadcrumb-item>@AR["Menu.列表"]</el-breadcrumb-item>
}
<div>
<div class="admin-role">
<div class="filter-container">
<el-button class="filter-item" type="primary" icon="el-icon-plus" @@click="handleEdit('','','add')">增加菜单</el-button>
<el-button class="filter-item" type="primary" icon="el-icon-plus" @@click="handleEdit('','','add')">@AR["Menu.增加菜单"]</el-button>
</div>
<el-table :data="tableData"
style="width: 100%;margin-bottom: 20px;"
Expand All @@ -22,35 +22,35 @@
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column prop="menuName" align="left"
label="菜单名称">
label="@AR["Menu.名称"]">
</el-table-column>
<el-table-column prop="sort" align="center"
label="排序"
label="@AR["Common.排序"]"
sortable>
</el-table-column>
<el-table-column prop="adminRemark" align="center"
label="备注">
label="@AR["Common.备注"]">
</el-table-column>
<el-table-column prop="remark" align="center"
label="说明">
label="@AR["Common.说明"]">
</el-table-column>
<el-table-column align="center"
label="添加时间">
label="@AR["Common.添加时间"]">
<template slot-scope="scope">
{{formaTableTime(scope.row.addTime)}}
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<el-table-column label="@AR["Common.操作"]" align="center">
<template slot-scope="scope">
<el-button size="mini"
type="primary"
@@click="handleEdit(scope.$index, scope.row,'edit')">编辑</el-button>
@@click="handleEdit(scope.$index, scope.row,'edit')">@AR["Common.编辑"]</el-button>
<el-button size="mini"
type="primary"
v-if="scope.row.children"
@@click="handleEdit(scope.$index, scope.row,'addNext')">增加下一级</el-button>
<el-popconfirm placement="top" title="确认删除此菜单吗?" @@on-confirm="handleDelete(scope.$index, scope.row)">
<el-button size="mini" type="danger" slot="reference">删除</el-button>
@@click="handleEdit(scope.$index, scope.row,'addNext')">@AR["Menu.增加下级"]</el-button>
<el-popconfirm placement="top" title="@AR["Menu.确认删除"]" @@on-confirm="handleDelete(scope.$index, scope.row)">
<el-button size="mini" type="danger" slot="reference">@AR["Common.删除"]</el-button>
</el-popconfirm>
</template>
</el-table-column>
Expand All @@ -64,50 +64,50 @@
label-position="left"
label-width="100px"
style="max-width: 400px; margin-left:50px;">
<el-form-item label="菜单名称" prop="menuName">
<el-form-item label="@AR["Menu.名称"]" prop="menuName">
<el-input v-model="dialog.data.menuName" clearable placeholder="" />
</el-form-item>
<el-form-item label="父级菜单">
<el-form-item label="@AR["Menu.父级"]">
<el-cascader v-model="dialog.data.parentId"
:options="tableData"
clearable
:props="{ checkStrictly: dialog.checkStrictly,label: 'menuName',value:'id'}">
</el-cascader>
</el-form-item>
<el-form-item label="排序">
<el-form-item label="@AR["Common.排序"]">
<el-input type="number" v-model="dialog.data.sort" clearable placeholder="" />
</el-form-item>
<el-form-item label="类型" prop="menuType">
<el-form-item label="@AR["Menu.类型"]" prop="menuType">
<el-radio-group v-model="dialog.data.menuType">
<el-radio :label="1">菜单</el-radio>
<el-radio :label="2">页面</el-radio>
<el-radio :label="3">按钮</el-radio>
<el-radio :label="1">@AR["Menu.菜单"]</el-radio>
<el-radio :label="2">@AR["Menu.页面"]</el-radio>
<el-radio :label="3">@AR["Menu.按钮"]</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="路径">
<el-form-item label="@AR["Menu.路径"]">
<el-input v-model="dialog.data.url" clearable placeholder="" />
</el-form-item>
<el-form-item label="操作代码" prop="resourceCode">
<el-form-item label="@AR["Menu.操作代码"]" prop="resourceCode">
<el-input v-model="dialog.data.resourceCode" clearable placeholder="" />
</el-form-item>
<el-form-item label="是否锁定">
<el-form-item label="@AR["Menu.是否锁定"]">
<el-switch v-model="dialog.data.isLocked"></el-switch>
</el-form-item>
<el-form-item label="是否显示">
<el-form-item label="@AR["Menu.是否显示"]">
<el-switch v-model="dialog.data.visible"></el-switch>
</el-form-item>
<el-form-item label="图标">
<el-form-item label="@AR["Menu.图标"]">
<i v-if="dialog.data.icon" :class="'fa '+dialog.data.icon"></i>
<el-button @@click="dialogIcon.visible=true" plain style="margin-left:15px;">选择图标</el-button>
<el-button @@click="dialogIcon.visible=true" plain style="margin-left:15px;">@AR["Menu.选择图标"]</el-button>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @@click="dialog.visible = false">取 消</el-button>
<el-button :loading="dialog.updateLoading" :disabled="dialog.disabled" type="primary" @@click="updateData">确 认</el-button>
<el-button @@click="dialog.visible = false">@AR["Common.取消"]</el-button>
<el-button :loading="dialog.updateLoading" :disabled="dialog.disabled" type="primary" @@click="updateData">@AR["Common.确认"]</el-button>
</div>
</el-dialog>
<!--选择图标-->
<el-dialog title="图标列表" :visible.sync="dialogIcon.visible">
<el-dialog title="@AR["Menu.图标列表"]" :visible.sync="dialogIcon.visible">
<div class="menu-icons-grid">
<div v-for="item in dialogIcon.elementIcons" class="menu-icon-item" @@click="pickIcon(item)">
<i :class="'fa ' + item"></i>
Expand Down
Loading