This commit is contained in:
CortexCore 2024-05-10 02:59:40 +08:00
parent 01f42d169d
commit f77100bd56
14 changed files with 938 additions and 137 deletions

View File

@ -0,0 +1,21 @@
<MudDialog>
<DialogContent>
<MudText>@ContentText</MudText>
</DialogContent>
<DialogActions>
<MudButton OnClick="Cancel">Cancel</MudButton>
<MudButton Color="@Color" Variant="Variant.Filled" OnClick="Submit">@ButtonText</MudButton>
</DialogActions>
</MudDialog>
@code {
[CascadingParameter] MudDialogInstance MudDialog { get; set; }
[Parameter] public string ContentText { get; set; }
[Parameter] public string ButtonText { get; set; }
[Parameter] public Color Color { get; set; }
void Submit() => MudDialog.Close(DialogResult.Ok(true));
void Cancel() => MudDialog.Cancel();
}

View File

@ -0,0 +1,38 @@
@using BITKit
<MudStack Class="align-center" Row="true">
<MudTextField Margin="Margin.Dense" Disabled="@isBusy" Variant="Variant.Outlined" @bind-Value="nextTag" Label="添加搜索标签,用;分隔"/>
<MudIconButton Disabled="@isBusy" Icon="@Icons.Material.Filled.Add" OnClick="Add"></MudIconButton>
<MudChipSet
disabled="@isBusy"
AllClosable="true"
OnClose="Closed"
MultiSelection="true"
Filter="true"
SelectedChipsChanged="x=>OnSelectedChipsChanged?.Invoke(x)">
@foreach (var value in values)
{
<MudChip Disabled="isBusy" Text="@value"></MudChip>
}
</MudChipSet>
<MudSpacer/>
</MudStack>
@code {
private string nextTag { get; set; } = string.Empty;
[Parameter]
public Action<MudChip[]> OnSelectedChipsChanged { get; set; }
private List<string> values { get; set; }= new()
{
"oder","material","device","procedure","product"
};
public void Add()
{
if (string.IsNullOrEmpty(nextTag) is false)
values.TryAdd(nextTag);
}
private bool isBusy { get; set; }
public void Closed(MudChip chip) => values.Remove(chip.Text);
}

View File

@ -1,12 +1,12 @@
@inherits LayoutComponentBase
<MudThemeProvider @bind-IsDarkMode="@_isDarkMode"/>
<MudLayout>
<MudAppBar Color="Color.Transparent" Fixed="true" Elevation="0">
@* <MudToggleIconButton @bind-Toggled="_drawerOpen" *@
@* Icon="@Icons.Material.Filled.Menu" *@
@* ToggledIcon="@Icons.Material.Filled.Menu" *@
@* Color="Color.Inherit" Edge="Edge.Start" /> *@
<MudToggleIconButton @bind-Toggled="_drawerOpen"
Icon="@Icons.Material.Filled.Menu"
ToggledIcon="@Icons.Material.Filled.Menu"
Color="Color.Inherit" Edge="Edge.Start" />
<MudImage Src="images/header-logo.png" Width="256"></MudImage>
<MudSpacer />
<MudToggleIconButton @bind-Toggled="@_isDarkMode"
@ -17,23 +17,25 @@
/>
<MudIconButton Icon="@Icons.Custom.Brands.GitHub" Color="Color.Inherit" />
</MudAppBar>
<MudDrawer Color="Color.Transparent" @bind-Open="_drawerOpen" ClipMode="DrawerClipMode.Always" Elevation="0">
<MudDrawer Color="Color.Surface" @bind-Open="_drawerOpen" ClipMode="DrawerClipMode.Always" Elevation="0">
@* <MudDrawerHeader> *@
@* <MudText Typo="Typo.h6">导航</MudText> *@
@* </MudDrawerHeader> *@
<NavMenu/>
</MudDrawer>
<MudMainContent Class="mt-16 pa-4">
<MudMainContent Class="mt-16 pa-4" >
@Body
</MudMainContent>
</MudLayout>
<MudThemeProvider @bind-IsDarkMode="@_isDarkMode"/>
<MudDialogProvider/>
<MudSnackbarProvider/>
@code {
private MudTheme Theme = new MudTheme();
private bool _drawerOpen = true;
private bool _isDarkMode = false;
private bool _isDarkMode;
private void DrawerToggle()
{

View File

@ -1,6 +1,15 @@
<MudNavMenu Dense="true" Class="pa-4" Rounded="true" Color="Color.Info">
<MudNavLink Href="" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.PlayCircleOutline">主页</MudNavLink>
<MudNavLink Href="/query" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.DataObject">解析标识</MudNavLink>
<MudNavLink Href="/query" Match="NavLinkMatch.All" Icon="@Icons.Material.Outlined.DataObject">解析标识</MudNavLink>
<MudNavLink Href="template/register" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.AppRegistration">注册标识模板</MudNavLink>
<MudNavLink Href="/register" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Outlined.Assignment">注册标识</MudNavLink>
<MudNavGroup Icon="@Icons.Material.Outlined.OtherHouses" Title="企业" Expanded="true">
<MudNavLink Match="NavLinkMatch.Prefix" Href="/enterprise/register" Icon="@Icons.Material.Outlined.Bookmark">注册企业</MudNavLink>
<MudNavLink Match="NavLinkMatch.Prefix" Href="/enterprise/query" Icon="@Icons.Material.Outlined.ScreenSearchDesktop">前缀查询</MudNavLink>
</MudNavGroup>
<MudNavGroup Icon="@Icons.Material.Outlined.Numbers" Title="统计与查询" Expanded="true">
<MudNavLink Match="NavLinkMatch.All" Href="/query/tags" Icon="@Icons.Material.Outlined.Scoreboard">标签查询</MudNavLink>
<MudNavLink Match="NavLinkMatch.Prefix" Href="/query/registration" Icon="@Icons.Material.Outlined.Scoreboard">最新标识查询</MudNavLink>
</MudNavGroup>
<MudNavLink Href="/FAQ" Match="NavLinkMatch.All" Icon="@Icons.Material.Outlined.QuestionAnswer">FAQ常见问题</MudNavLink>
</MudNavMenu>

View File

@ -0,0 +1,341 @@
@page "/Enterprise/Register"
@using IDIS.Models
@using Cysharp.Threading.Tasks
@using System.Text
@using BITKit.Crypto
@inject IDIS_EnterpriseService enterpriseService
<MudText Typo="Typo.h3" GutterBottom="true">企业注册</MudText>
<MudStack>
@* <MudTextField *@
@* @bind-Value="@enterprise.EnterpriseApply.Prefix" *@
@* Variant="Variant.Outlined" *@
@* HelperText="例如:88.123.99" *@
@* Label="企业前缀"></MudTextField> *@
<MudGrid>
<MudItem xs="2">
<MudPaper Class="pa-4 mb-4">
<MudText>用户信息</MudText>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.SystemUser.UserName" Label="用户名"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.SystemUser.EMail" InputType="InputType.Email" Label="电子邮箱"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.SystemUser.Mobile" InputType="InputType.Telephone" Label="手机号"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.SystemUser.Password" Label="密码" InputType="InputType.Password"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.SystemUser.Remark" Label="备注"></MudTextField>
</MudPaper>
</MudItem>
<MudItem xs="2">
<MudPaper Class="pa-4">
<MudText>照片上传</MudText>
@if (string.IsNullOrEmpty(enterprise.EnterpriseApply.CreditImageContent) is false)
{
var base64 = $"data:image/png;base64,{enterprise.EnterpriseApply.CreditImageContent}";
<MudImage Fluid="true" Src="@base64"/>
}
<MudFileUpload T="IBrowserFile" FilesChanged="UploadLicense">
<ButtonTemplate>
<MudButton FullWidth="true" HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.CloudUpload"
for="@context.Id">
营业执照
</MudButton>
</ButtonTemplate>
</MudFileUpload>
@if (string.IsNullOrEmpty(enterprise.EnterpriseApply.LegalPersonIdImageFrontContent) is false)
{
var base64 = $"data:image/png;base64,{enterprise.EnterpriseApply.LegalPersonIdImageFrontContent}";
<MudImage Fluid="true" Src="@base64"/>
}
<MudFileUpload T="IBrowserFile" FilesChanged="UploadLegalPersonIdFront">
<ButtonTemplate>
<MudButton FullWidth="true" HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.CloudUpload"
for="@context.Id">
法人身份证正面
</MudButton>
</ButtonTemplate>
</MudFileUpload>
@if (string.IsNullOrEmpty(enterprise.EnterpriseApply.LegalPersonIdImageBackContent) is false)
{
var base64 = $"data:image/png;base64,{enterprise.EnterpriseApply.LegalPersonIdImageBackContent}";
<MudImage Fluid="true" Src="@base64"/>
}
<MudFileUpload T="IBrowserFile" FilesChanged="UploadLegalPersonIdBack">
<ButtonTemplate>
<MudButton FullWidth="true" HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.CloudUpload"
for="@context.Id">
法人身份证反面
</MudButton>
</ButtonTemplate>
</MudFileUpload>
</MudPaper>
</MudItem>
<MudItem xs="4" Class="d-flex">
<MudPaper Class="pa-4 ">
<MudText>企业信息</MudText>
<MudStack Row="true">
<MudStack>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.Prefix" Label="前缀" HelperText="例如:88.123.99"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.NameCN" Label="企业名称"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.EMail" InputType="InputType.Email" Label="电子邮箱"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.AddressCN" Label="地址"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.CityCode" Label="城市代码"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.CountyCode" Label="县代码"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.CreditType" Label="信用类型"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.Descption" Label="企业描述"></MudTextField>
</MudStack>
<MudStack>
<MudTextField Margin="@myMargin"Required="true" @bind-Value="@enterprise.EnterpriseApply.CreditCode" Label="企业信用代码" HelperText="例如:91500000MA60F2F94T"></MudTextField>
<MudTextField Margin="@myMargin"Required="true" @bind-Value="@enterprise.EnterpriseApply.ProvinceCode" Label="省份代码"></MudTextField>
<MudTextField Margin="@myMargin"Required="true" @bind-Value="@enterprise.EnterpriseApply.WebSite" InputType="InputType.Url" Label="企业网站"></MudTextField>
<MudTextField Margin="@myMargin"Required="true" @bind-Value="@enterprise.EnterpriseApply.LegalPersonIdNumber" Label="法人身份证号"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.LegalPersonIdName" Label="法人姓名"></MudTextField>
<MudTextField Margin="@myMargin"Required="true" @bind-Value="@enterprise.EnterpriseApply.Mobile" InputType="InputType.Telephone" Label="企业手机"></MudTextField>
<MudTextField Margin="@myMargin" Required="true" @bind-Value="@enterprise.EnterpriseApply.Remarks" Label="企业备注"></MudTextField>
<MudTextField Required="true" @bind-Value="@enterprise.EnterpriseApply.ContactName" Label="联系人姓名"></MudTextField>
</MudStack>
</MudStack>
</MudPaper>
</MudItem>
<MudItem xs="4">
<MudPaper Class="pa-4">
<MudStack Row="true">
<MudButton OnClick="@Verification" Variant="Variant.Filled" Color="Color.Primary" DisableElevation="true">验证</MudButton>
<MudButton OnClick="()=>enterprise=new()" Variant="Variant.Filled" Color="Color.Secondary" DisableElevation="true" Class="mx-2">重置</MudButton>
<MudButton OnClick="()=>reportBuilder.Clear()" Variant="Variant.Filled" DisableElevation="true">重置验证</MudButton>
<MudSpacer/>
<MudButton OnClick="()=>Register().Forget()" Color="Color.Success" Variant="Variant.Filled" DisableElevation="true">注册企业</MudButton>
</MudStack>
</MudPaper>
<MudPaper Class="pa-4">
<MudText Typo="Typo.subtitle2">表单验证</MudText>
<MudAlert Severity="@severity">@currentMessage</MudAlert>
@foreach (var line in reportBuilder.ToString().Split('\n'))
{
<MudText Typo="Typo.body2">@line</MudText>
}
</MudPaper>
</MudItem>
</MudGrid>
</MudStack>
@code {
public IDIS_Enterprise enterprise { get; set; }= new();
private string currentMessage { get; set; } = "我们先完成企业信息填写";
private Severity severity { get; set; } = Severity.Normal;
private StringBuilder reportBuilder { get; set; } = new();
private Margin myMargin { get; set; } = Margin.Dense;
private void Verification()
{
reportBuilder.Clear();
if(string.IsNullOrEmpty(enterprise.EnterpriseApply.Prefix))
{
reportBuilder.AppendLine("企业前缀不能为空");
}
if(string.IsNullOrEmpty(enterprise.EnterpriseApply.CreditCode))
{
reportBuilder.AppendLine("信用代码不能为空");
}
if (string.IsNullOrEmpty(enterprise.SystemUser.UserName))
{
reportBuilder.AppendLine("用户名不能为空");
}
if (string.IsNullOrEmpty(enterprise.SystemUser.EMail))
{
reportBuilder.AppendLine("电子邮箱不能为空");
}
if (string.IsNullOrEmpty(enterprise.SystemUser.Mobile))
{
reportBuilder.AppendLine("手机号不能为空");
}
if (string.IsNullOrEmpty(enterprise.SystemUser.Password))
{
reportBuilder.AppendLine("密码不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.NameCN))
{
reportBuilder.AppendLine("企业名称不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.EMail))
{
reportBuilder.AppendLine("企业电子邮箱不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.AddressCN))
{
reportBuilder.AppendLine("企业地址不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.CityCode))
{
reportBuilder.AppendLine("城市代码不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.CountyCode))
{
reportBuilder.AppendLine("县代码不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.Descption))
{
reportBuilder.AppendLine("企业描述不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.ProvinceCode))
{
reportBuilder.AppendLine("省份代码不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.WebSite))
{
reportBuilder.AppendLine("企业网站不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.LegalPersonIdNumber))
{
reportBuilder.AppendLine("法人身份证号不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.LegalPersonIdName))
{
reportBuilder.AppendLine("法人姓名不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.Mobile))
{
reportBuilder.AppendLine("企业手机不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.Remarks))
{
reportBuilder.AppendLine("企业备注不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.ContactName))
{
reportBuilder.AppendLine("联系人姓名不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.CreditImageContent))
{
reportBuilder.AppendLine("营业执照不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.LegalPersonIdImageFrontContent))
{
reportBuilder.AppendLine("法人身份证正面不能为空");
}
if (string.IsNullOrEmpty(enterprise.EnterpriseApply.LegalPersonIdImageBackContent))
{
reportBuilder.AppendLine("法人身份证反面不能为空");
}
if (reportBuilder.Length > 0)
{
currentMessage = "表单验证失败";
severity = Severity.Error;
}
else
{
currentMessage = "表单验证成功";
severity = Severity.Success;
}
InvokeAsync(StateHasChanged).AndForget();
}
private async UniTask Register()
{
Verification();
if(reportBuilder.Length>0)
{
return;
}
severity = Severity.Normal;
currentMessage = "正在验证表单";
await InvokeAsync(StateHasChanged);
await Task.Delay(1000);
try
{
BITCrypto crypto = new BITCrypto();
currentMessage = "正在注册企业";
await enterpriseService.RegisterAsync(enterprise.SystemUser
with{
Password =crypto.Hash(enterprise.SystemUser.Password)
}, enterprise.EnterpriseApply);
currentMessage = "企业注册成功";
reportBuilder.Clear();
}
catch (Exception e)
{
currentMessage = e.Message;
severity = Severity.Error;
}
await InvokeAsync(StateHasChanged);
}
private async void UploadLicense(IBrowserFile? obj)
{
try
{
if (obj is null)
{
reportBuilder.AppendLine("营业执照不能为空");
return;
}
using var ms = new MemoryStream();
await obj.OpenReadStream().CopyToAsync(ms);
enterprise.EnterpriseApply.CreditImageContent = Convert.ToBase64String(ms.ToArray());
currentMessage = "上传成功";
severity = Severity.Success;
}
catch (Exception e)
{
currentMessage = e.Message;
severity = Severity.Error;
}
await InvokeAsync(StateHasChanged);
}
private async void UploadLegalPersonIdFront(IBrowserFile? obj)
{
try
{
if (obj is null)
{
reportBuilder.AppendLine("法人身份证正面不能为空");
return;
}
using var ms = new MemoryStream();
await obj.OpenReadStream().CopyToAsync(ms);
enterprise.EnterpriseApply.LegalPersonIdImageFrontContent = Convert.ToBase64String(ms.ToArray());
currentMessage = "上传成功";
severity = Severity.Success;
}
catch (Exception e)
{
currentMessage = e.Message;
severity = Severity.Error;
}
await InvokeAsync(StateHasChanged);
}
private async void UploadLegalPersonIdBack(IBrowserFile? obj)
{
try
{
if (obj is null)
{
reportBuilder.AppendLine("法人身份证杯面不能为空");
return;
}
using var ms = new MemoryStream();
await obj.OpenReadStream().CopyToAsync(ms);
enterprise.EnterpriseApply.LegalPersonIdImageBackContent = Convert.ToBase64String(ms.ToArray());
currentMessage = "上传成功";
severity = Severity.Success;
}
catch (Exception e)
{
currentMessage = e.Message;
severity = Severity.Error;
}
await InvokeAsync(StateHasChanged);
}
}

View File

@ -0,0 +1,63 @@
@page "/FAQ"
<MudText Typo="Typo.h3">FAQ,常见问题都在这里</MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudStack Spacing="2">
<MudText Typo="Typo.h4">如何通过标签查询标识</MudText>
<MudAlert>http://host:port/api/GetQueryByTag?tags=tag1;tag2;tag3&today=false</MudAlert>
<MudText><b>today</b>是可选参数</MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">如何通过标签查询解析记录</MudText>
<MudAlert>http://host:port/api/queryRecords/by?tags=tag1;tag2;tag3&today=false</MudAlert>
<MudText><b>today</b>是可选参数</MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">为啥子没得什么数据可以用</MudText>
<MudText>开始生产后就有了 : D,或者你可以去标识注册那整一堆</MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">我怎么知道这些Tag是啥子东西</MudText>
<MudAlert><MudLink Href="http://server.bitfall.icu:3000/root/IDIS.Model.YL106">YL106.Models</MudLink></MudAlert>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">仓库注册解析操作标识最新十条</MudText>
<MudText Typo="Typo.h5">注册记录</MudText>
<MudText>查询所有标签为<b>procedure_transport</b>的记录</MudText>
<MudText>然后手动解析10条记录</MudText>
<MudText Typo="Typo.h5">解析记录</MudText>
<MudText>查询所有标签为<b>procedure_transport</b>的解析记录</MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">每个新工单对所需的原材料注册的5条标识五种原材料</MudText>
<MudText>解析该工单的标识,从<b>原材料</b>属性中获取需要的标识</MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">每种成品注册的标识总量和解析总量(我这边传递一个参数查询具体某一种) 四种笔成品注册的标识总量和解析总量</MudText>
<MudText>同<b>仓库注册解析操作标识最新十条</b>,查询标签为<b>product_LS</b></MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">生产任务的标识注册总量和解析总量</MudText>
<MudText>同<b>仓库注册解析操作标识最新十条</b>,查询标签为<b>procedure_assembly</b></MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">每个工单的工单标识和生产成品标识</MudText>
<MudText>同<b>仓库注册解析操作标识最新十条</b>,查询标签分别为<b>oder</b>和<b>product</b></MudText>
<MudDivider DividerType="DividerType.Middle" Class="my-6"/>
<MudText Typo="Typo.h4">出库任务的任务标识 生产任务标识</MudText>
<MudText>同<b>每个新工单对所需的原材料注册的5条标识五种原材料</b>,查询标签为<b>procedure_transport</b>从标识中获取生产任务标识</MudText>
</MudStack>
@code {
}

View File

@ -0,0 +1,92 @@
@using IDIS.Services
@using IDIS.Models
@using IDIS.Services.Models
@using Microsoft.EntityFrameworkCore
@using IDIS_Server_SIM.Data
@using Cysharp.Threading.Tasks
@inject IDIS_Service_MySQLBased service
@inject QueryService queryService
@inject IDIS_Statistics_MySQLBased statistics
@page "/query/registration"
<MudText Typo="Typo.h3" GutterBottom="true">最新的标识动态</MudText>
<MudGrid>
<MudItem xs="3">
<MudAlert>数据图表</MudAlert>
<div>
<MudChart ChartSeries="@series" ChartType="ChartType.Line"></MudChart>
</div>
</MudItem>
<MudItem xs="9">
<MudAlert>搜索条件</MudAlert>
<DynamicTags OnSelectedChipsChanged="OnSelectedChipsChanged"></DynamicTags>
</MudItem>
</MudGrid>
<MudGrid>
<MudItem xs="6">
<MudAlert>最新注册的标识</MudAlert>
@foreach (var item in data)
{
<MudStack Row="true" Class="align-center">
<MudAlert Severity="Severity.Info">@item.Handle</MudAlert>
<MudText>@item.RegistrationTime</MudText>
</MudStack>
}
</MudItem>
<MudItem xs="6">
<MudAlert>最新解析的标识</MudAlert>
@foreach (var item in queryRecords)
{
<MudStack Row="true" Class="align-center">
<MudAlert Severity="Severity.Info">@item.Handle</MudAlert>
<MudText>@item.QueryTime</MudText>
</MudStack>
}
</MudItem>
</MudGrid>
@code {
private IDIS_SQL_Handle[] data { get; set; } = Array.Empty<IDIS_SQL_Handle>();
private IDIS_QueryRecord[] queryRecords { get; set; } = Array.Empty<IDIS_QueryRecord>();
private string[] handles { get; set; } = Array.Empty<string>();
private string[] tags { get; set; } = Array.Empty<string>();
public List<ChartSeries> series { get; set; }= new List<ChartSeries>()
{
new ChartSeries() { Name = "注册数量", Data = new double[] { 90, 79, 72, 69, 62, 62, 55, 65, 70 } },
new ChartSeries() { Name = "解析数量", Data = new double[] { 90, 79, 72, 69, 62, 62, 55, 65, 70 } },
};
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!firstRender) return;
await Rebuild();
await InvokeAsync(StateHasChanged);
}
private async void OnSelectedChipsChanged(MudChip[] obj)
{
tags = obj.Select(x => x.Text).ToArray();
handles = await queryService.QueryByTag(false, tags);
await Rebuild();
await InvokeAsync(StateHasChanged);
}
private async UniTask Rebuild()
{
data = (await service.handles.ToArrayAsync())
.Where(x=>handles.Length is 0 || handles.Contains(x.Handle))
.OrderBy(x=>x.RegistrationTime).Reverse().ToArray();
queryRecords = (await queryService.QueryRecordsByTag(false, tags));
series[0].Data = data
.GroupBy(x => x.RegistrationTime.Date.Day)
.Select(x => (double)x.Count()).ToArray();
series[1].Data = queryRecords
.GroupBy(x => x.QueryTime.Date.Day)
.Select(x => (double)x.Count()).ToArray();
}
}

View File

@ -0,0 +1,6 @@
@page "/Enterprise/Query"
<h3>使用管理员账户登录查看</h3>
@code {
}

View File

@ -9,7 +9,7 @@
<MudTextField
@bind-Value="@handle"
HelperText="例如:88.123.99/202402051710"
Label="Normal"
Label="在这里输入需要解析的标识"
Variant="Variant.Outlined"
Adornment="Adornment.End"
AdornmentIcon="@Icons.Material.Filled.Search"

View File

@ -0,0 +1,84 @@
@using BITKit
@using IDIS_Server_SIM.Data
@using IDIS.Models
@using IDIS.Services
@inject QueryService queryService
@inject IDIS_Service service
@page "/query/tags"
<MudText Typo="Typo.h3" GutterBottom="true">通过标签查询标识</MudText>
<MudText>多选标签,以过滤指定类型的标识</MudText>
<MudText>从选中多个标签开始</MudText>
<MudStack>
<MudStack Class="align-center" Row="true">
<MudCheckBox @bind-Value="@today" Label="只搜索今天的标识"></MudCheckBox>
<DynamicTags OnSelectedChipsChanged="OnSelectedChipsChanged"></DynamicTags>
</MudStack>
@if (isBusy)
{
<MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="my-7"/>
}
else
{
@foreach (var data in queryData)
{
<MudStack Row="true" Class="align-center">
<MudAlert>@data.Handle</MudAlert>
@if (data.Value.Length > 0)
{
@foreach (var tag in data.Value.First().Data.Value.Split(";"))
{
<MudChip>@tag</MudChip>
}
}
</MudStack>
}
}
</MudStack>
@code
{
private bool today { get; set; }
private bool isBusy { get; set; }
private string[] handles = Array.Empty<string>();
private IDIS_Query_Data[] queryData { get; set; }= Array.Empty<IDIS_Query_Data>();
}
@code {
private async void OnSelectedChipsChanged(MudChip[] obj)
{
isBusy = true;
await InvokeAsync(StateHasChanged);
var tags = obj.Select(x => x.Text).ToArray();
if (tags.Length is 0)
{
handles = Array.Empty<string>();
queryData = Array.Empty<IDIS_Query_Data>();
await InvokeAsync(StateHasChanged);
isBusy = false;
return;
}
handles = await queryService.QueryByTag(today, tags);
queryData = new IDIS_Query_Data[handles.Length];
for (var index = 0; index < handles.Length; index++)
{
try
{
var handle = handles[index];
queryData[index] = await service.QueryAsync(handle);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
queryData = queryData.Where(x => string.IsNullOrEmpty(x.Handle) is false).ToArray();
isBusy = false;
await InvokeAsync(StateHasChanged);
}
}

View File

@ -5,37 +5,17 @@
@using BITKit
@using System.Text.RegularExpressions
@using System.ComponentModel
@using System.Globalization
@inject ILogger<TemlateRegister> logger
@inject ISnackbar Snackbar
@inject IDIS_TemplateService templateService
@inject IDIS_EnterpriseService enterpriseService
@inject IDIS_Service service
@inherits OwningComponentBase
<MudText Typo="Typo.h3" GutterBottom="true">注册标识</MudText>
<MudText>当我们创建标识模板后<br/>我们就可以通过标识模板快速注册标识</MudText>
<MudGrid>
<MudItem xs="3">
<div class="d-flex flex-grow-1 gap-4 py-2">
<MudText Class="flex-1 d-flex" Typo="Typo.h6">选择标识模板</MudText>
<MudButton Class="d-flex" Variant="Variant.Outlined" OnClick="() => Refresh().Forget()">刷新</MudButton>
</div>
@if (templates.Length is 0)
{
<MudAlert Severity="Severity.Normal">模板为空</MudAlert>
}
else
{
<MudStack>
@foreach (var item in templates)
{
<MudButton
Class="pa-2"
Variant="Variant.Outlined"
OnClick="() => SelectTemplate(item)">
@(item.Prefix)/@(item.Version)
</MudButton>
}
</MudStack>
}
<TemplateSelector Reference="templateSelector" OnSelectTemplate="SelectTemplate"></TemplateSelector>
</MudItem>
<MudItem xs="1">
</MudItem>
@ -43,12 +23,13 @@
<MudStack>
<MudText Typo="Typo.h6">模板信息</MudText>
<MudStack Row="true">
<MudAutocomplete Disabled="true" T="string" Label="国家" @bind-Value="prefix_c" SearchFunc="@Search1"
<MudAutocomplete Variant="Variant.Text" Disabled="true" T="string" Label="国家" @bind-Value="prefix_c" SearchFunc="@Search1"
CoerceText="true" CoerceValue="true" />
<MudAutocomplete Disabled="true" T="string" Label="区域" @bind-Value="prefix_p" SearchFunc="@Search1"
<MudAutocomplete Variant="Variant.Text" Disabled="true" T="string" Label="区域" @bind-Value="prefix_p" SearchFunc="@Search1"
CoerceText="true" CoerceValue="true"/>
<MudAutocomplete Disabled="true" T="string" Label="企业" @bind-Value="prefix_e" SearchFunc="@Search1"
CoerceText="true" CoerceValue="true"/>
<MudAutocomplete Variant="Variant.Text" T="string" Label="企业" @bind-Value="prefix_e" SearchFunc="@Search1"
CoerceText="true" CoerceValue="true"/>
<MudTextField
@bind-Value="@handle_code"
HelperText="点击右侧图标生成标识"
@ -60,17 +41,40 @@
</MudStack>
<MudText Typo="Typo.h6">注册值</MudText>
<MudStack Spacing="0">
@for(var index=0;index<_valueInfo.Length;index++)
{
var registerInfo = _valueInfo[index];
var templateInfo = this.template.Items[index];
<MudTextField bind-Value="@registerInfo.Data.Value" HelperText="@templateInfo.IdType" T="string" Counter="25" Immediate="true" Label="@templateInfo.Name" Variant="Variant.Text" />
}
@foreach (var x in _valueInfo)
{
}
</MudStack>
<MudStack Spacing="0">
@for(var index=0;index<_valueInfo.Length;index++)
{
var i = index;
var templateInfo = this.template.Items[index];
@* @if (templateInfo.MetaData.Type is ("dateTime" or "DateTime")) *@
@* { *@
@* $1$ <MudDatePicker DateFormat="y" Label="@templateInfo.Name" @bind-Date="registerDateTimes[i].Value"/> #1# *@
@* <InputDate *@
@* Type="InputDateType.DateTimeLocal" *@
@* class="form-control" *@
@* id="ClockIn" *@
@* @bind-Value="registerDateTimes[i].Value" *@
@* @bind-Value:format="mm/dd/yyyy hh:mm tt" *@
@* placeholder="Clock In" /> *@
@* } *@
@* else *@
{
<MudTextField Margin="@myMargin"
@bind-Value="@_valueInfo[i].Data.Value"
HelperText="@($"{templateInfo.IdType}:{templateInfo.MetaData.Type}")"
T="string"
Counter="25"
Immediate="true"
Label="@templateInfo.Name"
Variant="Variant.Outlined" />
}
}
</MudStack>
@if (string.IsNullOrEmpty(currentMessage) is false)
{
<MudAlert Severity="severity">@currentMessage</MudAlert>
}
<div class="d-flex">
<MudButton Class="d-flex flex-grow-1" Variant="Variant.Outlined" OnClick="Reg">注册标识:@handle</MudButton>
</div>
@ -78,7 +82,13 @@
</MudItem>
</MudGrid>
@code {
private IDIS_Template[] templates = Array.Empty<IDIS_Template>();
public class DateTimeProxy
{
public DateTime? Value { get; set; } = DateTime.Now;
}
private Reference<TemplateSelector> templateSelector { get; set; } = new();
private IDIS_Template template = new IDIS_Template();
private IDIS_Register_Data.ValueInfo[] _valueInfo { get; set; } = Array.Empty<IDIS_Register_Data.ValueInfo>();
@ -86,18 +96,24 @@
private string prefix_p { get; set; } = "123";
private string prefix_e { get; set; } = "99";
private string handle_code { get; set; } = DateTime.Now.Ticks.ToString();
private string handle=> $"{prefix_c}.{prefix_p}.{prefix_e}/{handle_code}";
private string generatedHandleCode { get; set; } = DateTime.Now.Ticks.ToString();
private string handle=> $"{prefix_c}.{prefix_p}.{prefix_e.Split("(").Last().Split(")").First()}/{handle_code}";
private string currentMessage { get; set; } = string.Empty;
private IDIS_Enterprise.EnterpriseInfo[] enterprises { get; set; } = Array.Empty<IDIS_Enterprise.EnterpriseInfo>();
private Severity severity { get; set; } = Severity.Normal;
private Margin myMargin { get; set; } = Margin.Dense;
async UniTask Refresh()
protected override async Task OnAfterRenderAsync(bool firstRender)
{
Snackbar.Add("正在刷新模板");
templates = await templateService.ToArrayAsync();
await InvokeAsync(StateHasChanged);
Snackbar.Add("模板刷新完成");
if (!firstRender) return;
GenerateHandle();
await templateSelector.value.Refresh();
}
private void GenerateHandle()
{
handle_code = DateTime.Now.Ticks.ToString();
generatedHandleCode = handle_code = DateTime.Now.Ticks.ToString();
}
private void SelectTemplate(IDIS_Template newValue)
{
@ -108,7 +124,7 @@
var x = template.Items[index];
var info = new IDIS_Register_Data.ValueInfo
{
Type = x.Name,
Type = x.IdType,
Index = index,
Data = new IDIS_Register_Data.ValueData()
{
@ -116,12 +132,17 @@
Value = string.Empty
}
};
if(x.MetaData.Type is ("dateTime" or "DateTime"))
info.Data.Value = DateTime.Now.ToString(CultureInfo.InvariantCulture);
_valueInfo[index] = info;
}
InvokeAsync(StateHasChanged).AndForget();
}
private async void Reg()
{
currentMessage = "正在注册标识中...";
severity=Severity.Info;
try
{
if (Regex.IsMatch(handle, IDIS_Code.AddressRegex) is false)
@ -129,22 +150,39 @@
throw new Exception($"标识格式错误,正则表达式为{IDIS_Code.AddressRegex}");
}
await service.RegisterAsync(handle, template.Version, _valueInfo);
Snackbar.Add("注册成功");
await InvokeAsync(StateHasChanged);
currentMessage = "注册成功,标识码为:\n" + handle;
severity=Severity.Success;
if (string.Equals(generatedHandleCode, handle_code))
{
GenerateHandle();
}
}
catch (Exception e)
{
Snackbar.Add(e.Message, Severity.Error);
currentMessage = e.Message;
severity=Severity.Error;
}
await InvokeAsync(StateHasChanged);
}
private async Task<IEnumerable<string>> Search1(string arg)
{
await UniTask.Yield();
return new List<string>()
try
{
"88","123","99"
};
enterprises = await enterpriseService.GetEnterpriseAsync();
return enterprises
.Select(x =>$"{x.NameCN}({x.Prefix.Split(".")[2]})")
.Where(x => x.Contains(arg))
.Distinct();
}
catch (Exception e)
{
currentMessage = e.Message;
severity=Severity.Error;
await InvokeAsync(StateHasChanged);
return Array.Empty<string>();
}
}
}

View File

@ -7,34 +7,15 @@
@inject ISnackbar Snackbar
@inject IDIS_TemplateService templateService
@inject IDIS_Service service
@inject IDialogService dialogService
@inherits OwningComponentBase
<MudText Typo="Typo.h3" GutterBottom="true">注册标识模板</MudText>
<MudText>在注册与更新标识之前,我们需要一个创建标识模板,然后我们可以通过创建的模板注册标识<br />
基于已选的标识模板,创建新的标识模板</MudText>
<MudGrid>
<MudItem xs="3">
<div class="d-flex flex-grow-1 gap-4 py-2">
<MudText Class="flex-1 d-flex" Typo="Typo.h6">选择标识模板</MudText>
<MudButton Class="d-flex" Variant="Variant.Outlined" OnClick="() => Refresh().Forget()">刷新</MudButton>
</div>
@if (templates.Length is 0)
{
<MudAlert Severity="Severity.Normal">模板为空</MudAlert>
}
else
{
<MudStack>
@foreach (var item in templates)
{
<MudButton
Class="pa-2"
Variant="Variant.Outlined"
OnClick="() => SelectTemplate(item)">
@(item.Prefix)/@(item.Version)
</MudButton>
}
</MudStack>
}
<TemplateSelector Reference="templateSelector" OnSelectTemplate="SelectTemplate"></TemplateSelector>
</MudItem>
<MudItem xs="1">
</MudItem>
@ -42,79 +23,81 @@
<MudStack>
<MudText Typo="Typo.h6">模板信息</MudText>
<MudStack Row="true" Spacing="2">
<MudTextField @bind-Value="prefix" Label="前缀" Variant="Variant.Outlined"></MudTextField>
<MudTextField @bind-Value="version" Label="版本" Variant="Variant.Outlined"></MudTextField>
<MudTextField @bind-Value="prefix" Label="前缀" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="version" Label="版本" Variant="Variant.Text"></MudTextField>
</MudStack>
<MudTextField @bind-Value="description" Label="描述" Variant="Variant.Outlined"></MudTextField>
<MudTextField @bind-Value="description" Label="描述" Variant="Variant.Text"></MudTextField>
<MudText Typo="Typo.h6">模板条目</MudText>
<MudTable Items="@items"
Hover="true"
Class="py-2"
>
<HeaderContent>
<MudTh>Name</MudTh>
<MudTh>IdType</MudTh>
<MudTh>Type</MudTh>
<MudTh>MinLength</MudTh>
<MudTh>MaxLength</MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Name">@context.Name</MudTd>
<MudTd DataLabel="IdType">@context.IdType</MudTd>
<MudTd DataLabel="Type">@context.MetaData.Type</MudTd>
<MudTd DataLabel="MinLength">@context.MetaData.MinLength</MudTd>
<MudTd DataLabel="MaxLength">@context.MetaData.MaxLength</MudTd>
</RowTemplate>
<RowEditingTemplate>
<MudTd DataLabel="Name">
<MudTextField @bind-Value="@context.Name" Required />
</MudTd>
<MudTd DataLabel="IdType">
<MudTextField @bind-Value="@context.IdType" Required />
</MudTd>
<MudTd DataLabel="Type">
<MudTextField @bind-Value="@context.MetaData.Type" Required />
</MudTd>
<MudTd DataLabel="MinLength">
<MudTextField @bind-Value="@context.MetaData.MinLength" Required />
</MudTd>
<MudTd DataLabel="MaxLength">
<MudTextField @bind-Value="@context.MetaData.MaxLength" Required />
</MudTd>
</RowEditingTemplate>
</MudTable>
<div class="d-flex">
<MudButton Class="d-flex flex-grow-1" Variant="Variant.Outlined" OnClick="SaveTemplate">保存标识模板</MudButton>
<MudDivider Style="width: 1em" Vertical="true" FlexItem="true" />
<MudButton Class="d-flex" Variant="Variant.Outlined">删除标识模板</MudButton>
</div>
@for (var index = 0; index < items.Length; index++)
{
var item = items[index];
var i = index;
<MudStack Row="true" Spacing="2">
<MudTextField Margin="@myMargin" @bind-Value="item.Name" Label="名称" Variant="@Variant.Outlined"></MudTextField>
<MudTextField Margin="@myMargin" @bind-Value="item.IdType" Label="变量名" Variant="@Variant.Outlined"></MudTextField>
<MudSelect Variant="Variant.Outlined" Margin="@myMargin" @bind-Value="item.MetaData.Type" T="string" Label="数据类型" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem Value="@("string")" />
<MudSelectItem Value="@("int")" />
<MudSelectItem Value="@("float")" />
<MudSelectItem Value="@("dateTime")" />
<MudSelectItem Value="@("guid")" />
</MudSelect>
<MudTextField Margin="@myMargin" @bind-Value="item.MetaData.MinLength" Label="最小长度" Variant="@Variant.Outlined"></MudTextField>
<MudTextField Margin="@myMargin" @bind-Value="item.MetaData.MaxLength" Label="最大长度" Variant="@Variant.Outlined"></MudTextField>
<MudIconButton Title="删除该字段" Icon="@Icons.Material.Filled.DeleteOutline" OnClick="()=>RemoveItem(i)"/>
</MudStack>
}
<MudButton OnClick="AddItem">添加一个字段</MudButton>
<MudSpacer/>
<div class="d-flex">
<MudButton Class="d-flex flex-grow-1" Variant="Variant.Outlined" OnClick="SaveTemplate">保存标识模板</MudButton>
<MudDivider Style="width: 1em" Vertical="true" FlexItem="true" />
<MudButton Class="d-flex" Variant="Variant.Outlined" OnClick="AskDeleteTemplate">删除标识模板</MudButton>
</div>
</MudStack>
</MudItem>
</MudGrid>
@code {
public IDIS_Template[] templates { get; set; } = Array.Empty<IDIS_Template>();
private Reference<TemplateSelector> templateSelector { get; } = new();
private IDIS_Template template = new IDIS_Template();
private IDIS_Template_Item[] items = new []{new IDIS_Template_Item()};
private string prefix { get; set; } = new IDIS_Template().Prefix;
private string version { get; set; }= new IDIS_Template().Version;
private string description { get; set; }= new IDIS_Template().Description;
private Margin myMargin { get; set; } = Margin.Dense;
async UniTask Refresh()
private bool selectedTemplate;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
Snackbar.Add("正在刷新模板");
templates = await templateService.ToArrayAsync();
await InvokeAsync(StateHasChanged);
Snackbar.Add("模板刷新完成");
if (!firstRender) return;
await templateSelector.value.Refresh();
}
private void SelectTemplate(IDIS_Template newValue)
{
selectedTemplate = true;
template = newValue;
prefix = template.Prefix;
version = template.Version;
description = template.Description;
items = template.Items;
InvokeAsync(StateHasChanged).AndForget();
}
private void RemoveItem(int index)
{
var list = items.ToList();
list.RemoveAt(index);
items = list.ToArray();
}
private void AddItem()
{
items = items.Append(new IDIS_Template_Item()).ToArray();
}
private async void SaveTemplate()
{
@ -128,9 +111,55 @@
Snackbar.Add("正在保存模板");
try
{
foreach (var item in items)
{
if(string.IsNullOrWhiteSpace(item.Name))
throw new Exception("字段名称不能为空");
if(string.IsNullOrWhiteSpace(item.IdType))
throw new Exception("字段变量名不能为空");
if(string.IsNullOrWhiteSpace(item.MetaData.Type))
throw new Exception("字段数据类型不能为空");
if (item.MetaData.MinLength is 0)
throw new Exception("字段最小长度不能为空");
if (item.MetaData.MaxLength is 0)
throw new Exception("字段最大长度不能为空");
if (item.MetaData.MinLength > item.MetaData.MaxLength)
throw new Exception("字段最小长度不能大于最大长度");
}
await templateService.SaveAsync(newTemplate);
await templateSelector.value.Refresh();
Snackbar.Add("模板已保存");
await Refresh();
}
catch (Exception e)
{
Snackbar.Add(e.Message, Severity.Error);
}
}
private async void AskDeleteTemplate()
{
if (!selectedTemplate)
{
Snackbar.Add("未选择模板");
return;
}
var parameters = new DialogParameters<DialogTemplateExample_Dialog>();
parameters.Add(x => x.ContentText, $"是否确实要删除标识模板{template.Prefix}@{template.Version}?此过程无法撤消。");
parameters.Add(x => x.ButtonText, "删除");
parameters.Add(x => x.Color, Color.Error);
var options = new DialogOptions() { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
var result = await dialogService.ShowAsync<DialogTemplateExample_Dialog>("删除标识模板", parameters, options);
var newResult =await result.Result;
if (newResult.Canceled) return;
Snackbar.Add("正在删除模板");
try
{
await templateService.DeleteAsync(template.Prefix, template.Version);
await templateSelector.value.Refresh();
Snackbar.Add("模板删除完成");
}
catch (Exception e)
{

View File

@ -0,0 +1,71 @@
@using IDIS.Models
@inject Services.IDIS_TemplateService templateService
@using Cysharp.Threading.Tasks
@using BITKit
<div class="d-flex flex-grow-1 gap-4 py-2">
<MudText Class="flex-1 d-flex" Typo="Typo.h6">选择标识模板</MudText>
<MudButton Class="d-flex" Variant="Variant.Outlined" OnClick="() => Refresh().Forget()">刷新</MudButton>
</div>
<MudAlert Severity="severity">@currentMessage</MudAlert>
@if (templates.Length is not 0)
{
<MudStack>
@foreach (var item in templates)
{
<MudButton
Class="pa-2"
Variant="Variant.Outlined"
OnClick="() => OnSelectTemplate.Invoke(item)">
@(item.Prefix)/@(item.Version)
</MudButton>
}
</MudStack>
}
else
{
<MudStack Spacing="4">
@for (var i = 0; i < 5; i++)
{
<MudSkeleton />
}
</MudStack>
}
@code {
[Parameter]
public Reference<TemplateSelector>? Reference { get; set; }
private IDIS_Template[] templates = Array.Empty<IDIS_Template>();
private string currentMessage { get; set; } = "模板为空?试着刷新一下";
private Severity severity { get; set; } = Severity.Normal;
[Parameter]
public Action<IDIS_Template> OnSelectTemplate { get; set; }
protected override void OnInitialized()
{
base.OnInitialized();
if (Reference is not null)
Reference.value = this;
}
public async UniTask Refresh()
{
templates = Array.Empty<IDIS_Template>();
await InvokeAsync(StateHasChanged);
currentMessage = "正在刷新模板";
severity = Severity.Info;
try
{
templates = await templateService.ToArrayAsync();
currentMessage = "模板刷新完成";
severity = Severity.Info;
}
catch (Exception e)
{
currentMessage = e.Message;
severity = Severity.Error;
}
await InvokeAsync(StateHasChanged);
}
}

View File

@ -1,4 +1,5 @@
using BITKit;
using IDIS_Server_SIM.Data;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
@ -27,6 +28,10 @@ builder.Services.AddMudServices();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddTransient<QueryService>();
builder.Services.AddTransient<IDIS_Statistics_MySQLBased>();
builder.Services.AddTransient<IDIS_Service_MySQLBased>();
builder.Services.AddTransient<IDIS_EnterpriseService, IDIS_EnterpriseService_MySQLBased>();
builder.Services.AddTransient<IDIS_Service, IDIS_Service_MySQLBased>();
builder.Services.AddTransient<IDIS_TemplateService, IDIS_TemplateService_MySQLBased>();
@ -41,6 +46,8 @@ builder.Services.AddAuthentication(options =>
var app = builder.Build();
app.Services.GetRequiredService<IDIS_Statistics_MySQLBased>();
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.