259 lines
11 KiB
Plaintext
259 lines
11 KiB
Plaintext
@namespace MasaBlazorApp3
|
|
@using MasaBlazorApp3.Pojo.Config
|
|
@using MasaBlazorApp3.Util
|
|
@using log4net
|
|
@inherits LayoutComponentBase
|
|
|
|
<style>
|
|
.my-tab-menu {
|
|
padding: 10px 20px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.my-tab-menu:hover {
|
|
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7); /* 阴影效果 */
|
|
text-decoration: none !important;
|
|
background: #255dd6;
|
|
border-radius: 20px;
|
|
}
|
|
|
|
a.active {
|
|
background: #255dd4;
|
|
border-radius: 20px;
|
|
}
|
|
|
|
.warning-message {
|
|
background: #ffeaa7;
|
|
padding: 15px;
|
|
border-radius: 8px;
|
|
text-align: center;
|
|
/* margin-top: 2px; */
|
|
display: block;
|
|
animation: pulse 1.5s infinite;
|
|
}
|
|
</style>
|
|
|
|
<RadzenLayout>
|
|
<RadzenHeader Style="height: 75px;">
|
|
<RadzenRow JustifyContent="JustifyContent.Start" AlignItems="AlignItems.Center" Style="height: 100%;">
|
|
<RadzenColumn Size="1">
|
|
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center">
|
|
<RadzenIcon Icon="chevron_left" Style="font-size:3rem;cursor: pointer;padding: 0 10px;" @onclick="@(() => { backHome(); })" />
|
|
</RadzenStack>
|
|
</RadzenColumn>
|
|
<RadzenColumn Size="10" Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Start">
|
|
@if (children.Count > 5)
|
|
{
|
|
|
|
<RadzenStack Style="width: 100%; overflow-x: auto; white-space: nowrap; display: flex;" Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center">
|
|
@foreach (Premission p in children)
|
|
{
|
|
if (childrenIds.Any(id => id == p.Id))
|
|
{
|
|
<RadzenLink Match="NavLinkMatch.All" class="my-tab-menu" Path="@p.PremissionPath">@p.PremissionName</RadzenLink>
|
|
}
|
|
}
|
|
@if (children.Any(c => c.PremissionPath.Contains("Box")))
|
|
{
|
|
<RadzenIcon Icon="card_travel" Style="font-size:2rem;cursor: pointer;" class="rz-ripple" IconColor="white" @onclick="@(() => { OpenStorage(); })" />
|
|
}
|
|
</RadzenStack>
|
|
}
|
|
else
|
|
{
|
|
|
|
|
|
<RadzenStack Style="width: 100%; overflow-x: auto; white-space: nowrap; display: flex;" Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" AlignItems="AlignItems.Center">
|
|
@foreach (Premission p in children)
|
|
{
|
|
if (childrenIds.Any(id => id == p.Id))
|
|
{
|
|
<RadzenLink Match="NavLinkMatch.All" class="my-tab-menu" Path="@p.PremissionPath">@p.PremissionName</RadzenLink>
|
|
}
|
|
}
|
|
@if (children.Any(c => c.PremissionPath.Contains("Box")))
|
|
{
|
|
<RadzenIcon Icon="card_travel" Style="font-size:2rem;cursor: pointer;" class="rz-ripple" IconColor="white" @onclick="@(() => { OpenStorage(); })" />
|
|
}
|
|
</RadzenStack>
|
|
}
|
|
</RadzenColumn>
|
|
<RadzenColumn Size="1">
|
|
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Center">
|
|
<RadzenIcon Icon="exit_to_app" Style="font-size:2rem;cursor: pointer;" class="rz-ripple" IconColor="white" @onclick="@(() => { logout(); })" />
|
|
</RadzenStack>
|
|
</RadzenColumn>
|
|
</RadzenRow>
|
|
</RadzenHeader>
|
|
<RadzenBody>
|
|
@if (warnTime != 999999999)
|
|
{
|
|
<div class="warning-message" id="warningMessage">
|
|
<strong>警告:</strong> 您长时间未操作屏幕,系统将在 <span id="countdown">@warnTime</span> 秒后自动退出!
|
|
</div>
|
|
}
|
|
<div class="container-fluid rz-p-1">
|
|
<RadzenCard>
|
|
@Body
|
|
</RadzenCard>
|
|
</div>
|
|
</RadzenBody>
|
|
<RadzenNotification />
|
|
<RadzenComponents />
|
|
</RadzenLayout>
|
|
|
|
@code
|
|
{
|
|
@inject IJSRuntime JSRuntime
|
|
@inject GlobalStateService globalStateService;
|
|
@inject NavigationManager na;
|
|
int selectedIndex = 0;
|
|
Pojo.User Operator;
|
|
List<int> childrenIds;
|
|
List<Premission> children;
|
|
@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.SettingConfig> setting;
|
|
@inject PortUtil _portUtil;
|
|
@inject NotificationService _message
|
|
private readonly ILog logger = LogManager.GetLogger(typeof(MainLayout));
|
|
bool currentPage = true;
|
|
int warnTime = 999999999;
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
string Uri = na.Uri;
|
|
string[] s = Uri.Split("/");
|
|
|
|
Operator = globalStateService.Operator;
|
|
Premission parent = new Premission().getAdminPremission().Find(p => p.PremissionPath == s[3]);
|
|
childrenIds = Operator.role.permissionIds.Where(id => id - (parent.Id * 10) < 10).ToList();
|
|
children = parent.Items.ToList();
|
|
|
|
if (setting.Value.autoOutLog > 0)
|
|
{
|
|
// 是否需要自动退出
|
|
var promiseUtil = new PromiseUtil<object>();
|
|
promiseUtil.taskAsyncLoop(500, null, async (data, next, stop) =>
|
|
{
|
|
if (globalStateService.Operator == null || !currentPage)
|
|
{
|
|
|
|
logger.Info($"MainLayout页自动退出循环停止{globalStateService.Operator == null},{!currentPage}");
|
|
stop();
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
//没有在操作抽屉
|
|
if (!_portUtil.Operate)
|
|
{
|
|
// 无人操作鼠标键盘
|
|
if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > setting.Value.autoOutLog && (DateTime.Now - _portUtil.mouseClickTime).TotalSeconds > setting.Value.autoOutLog)
|
|
{
|
|
logger.Info($"设备{setting.Value.autoOutLog}内无人操作,用户【{Operator?.NickName}】自动退出登录,_portUtil.Operate:{_portUtil.Operate},totalSecond:{(DateTime.Now - _portUtil.dateTime).TotalSeconds},lastInputTime:{(DateTime.Now - _portUtil.mouseClickTime).TotalSeconds},autoOutLog:{setting.Value.autoOutLog}");
|
|
globalStateService.Operator = null;
|
|
globalStateService.Reviewer = null;
|
|
na.NavigateTo("");
|
|
stop();
|
|
}
|
|
else
|
|
{
|
|
if (setting.Value.warningMessage > 0)
|
|
{
|
|
if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > (setting.Value.autoOutLog - setting.Value.warningMessage) && (DateTime.Now - _portUtil.mouseClickTime).TotalSeconds > (setting.Value.autoOutLog - setting.Value.warningMessage))
|
|
{
|
|
if ((DateTime.Now - _portUtil.dateTime).TotalSeconds <= (setting.Value.autoOutLog - setting.Value.warningMessage))
|
|
{
|
|
//提示3秒后将自动退出
|
|
warnTime = Convert.ToInt32(setting.Value.autoOutLog - (DateTime.Now - _portUtil.dateTime).TotalSeconds);
|
|
await InvokeAsync(StateHasChanged);
|
|
}
|
|
else
|
|
{
|
|
//提示3秒后将自动退出
|
|
warnTime = Convert.ToInt32(setting.Value.autoOutLog - (DateTime.Now - _portUtil.mouseClickTime).TotalSeconds);
|
|
//提示3秒后将自动退出
|
|
await InvokeAsync(StateHasChanged);
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
warnTime = 999999999;
|
|
await InvokeAsync(StateHasChanged);
|
|
}
|
|
}
|
|
next();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
next();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.Info($"检查是否自动退出循环异常:{ex.Message}");
|
|
next();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
base.OnInitialized();
|
|
}
|
|
|
|
|
|
|
|
void backHome()
|
|
{
|
|
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
|
|
currentPage = false;
|
|
na.NavigateTo("");
|
|
}
|
|
|
|
void logout()
|
|
{
|
|
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
|
|
globalStateService.Operator = null;
|
|
globalStateService.Reviewer = null;
|
|
na.NavigateTo("");
|
|
}
|
|
async Task OpenStorage()
|
|
{
|
|
try
|
|
{
|
|
var b = await _portUtil.OpenStorage();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.Info($"开储物箱发生错误,{ex.Message}");
|
|
_message.Notify(
|
|
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"开储物箱发生错误,{ex.Message}", Duration = 4000 }
|
|
);
|
|
}
|
|
}
|
|
private DotNetObjectReference<MainLayout>? dotNetObjectReference;
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (firstRender)
|
|
{
|
|
dotNetObjectReference = DotNetObjectReference.Create(this);
|
|
await JSRuntime.InvokeVoidAsync("registerMouseClickHandler", dotNetObjectReference);
|
|
}
|
|
}
|
|
|
|
[JSInvokable]
|
|
public void HandleMouseClick(int clientX, int clientY)
|
|
{
|
|
// 这里处理鼠标点击事件,例如记录日志或更新状态
|
|
// Console.WriteLine($"Mouse clicked at: ({clientX}, {clientY})");
|
|
_portUtil.mouseClickTime = DateTime.Now;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
dotNetObjectReference?.Dispose();
|
|
}
|
|
} |