This commit is contained in:
2248356998 qq.com
2025-09-29 17:09:12 +08:00
parent 2416226eb0
commit 156ed88bd6
20 changed files with 120 additions and 67 deletions

View File

@@ -21,12 +21,12 @@
<link rel="apple-touch-icon" href="favicon.png"> <link rel="apple-touch-icon" href="favicon.png">
<base href="/" /> <base href="/" />
<title>ThingsGateway</title> <title>ThingsGateway</title>
<link rel="stylesheet" href=@($"_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css") />
<link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css") />
<link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/motronic.min.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/motronic.min.css") />
<link rel="stylesheet" href=@($"ThingsGateway.AdminServer.styles.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"ThingsGateway.AdminServer.styles.css") />
<link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/site.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/site.css") />
<link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/devui.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/devui.css") />
@* <script src=@($"{WebsiteConst.DefaultResourceUrl}js/theme.js") type="module"></script><!-- 初始主题 --> *@ @* <script src=@($"{WebsiteConst.DefaultResourceUrl}js/theme.js") type="module"></script><!-- 初始主题 --> *@
<!-- PWA Manifest --> <!-- PWA Manifest -->
@@ -40,8 +40,8 @@
<BlazorReconnector @rendermode="new InteractiveServerRenderMode(false)" /> <BlazorReconnector @rendermode="new InteractiveServerRenderMode(false)" />
<script src=@($"_content/BootstrapBlazor/js/bootstrap.blazor.bundle.min.js?v={this.GetType().Assembly.GetName().Version}")></script> <script src=@($"_content/BootstrapBlazor/js/bootstrap.blazor.bundle.min.js")></script>
<script src=@($"{WebsiteConst.DefaultResourceUrl}js/localStorageUtil.js?v={this.GetType().Assembly.GetName().Version}")></script> <script src=@($"{WebsiteConst.DefaultResourceUrl}js/localStorageUtil.js")></script>
<script src="_framework/blazor.web.js"></script> <script src="_framework/blazor.web.js"></script>
<!-- PWA Service Worker --> <!-- PWA Service Worker -->
<script type="text/javascript">'serviceWorker' in navigator && navigator.serviceWorker.register('./service-worker.js')</script> <script type="text/javascript">'serviceWorker' in navigator && navigator.serviceWorker.register('./service-worker.js')</script>

View File

@@ -70,7 +70,7 @@
<Button @onclick="ShowAbout" class="layout-header-bar d-none d-lg-flex px-2" Icon="fa fa-info" Color="Color.None" TooltipText="@Localizer[nameof(About)]" /> <Button @onclick="ShowAbout" class="layout-header-bar d-none d-lg-flex px-2" Icon="fa fa-info" Color="Color.None" TooltipText="@Localizer[nameof(About)]" />
} }
@* 版本号 *@ @* 版本号 *@
<div class="px-1 navbar-header-text d-none d-lg-block">@_versionString</div> <div class="px-1 navbar-header-text text-nowrap d-none d-lg-block">@_versionString</div>
@* 主题切换 *@ @* 主题切换 *@
@* <ThemeToggle /> *@ @* <ThemeToggle /> *@

View File

@@ -14,7 +14,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="BootstrapBlazor.TableExport" Version="9.2.6" /> <PackageReference Include="BootstrapBlazor.TableExport" Version="9.2.6" />
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" /> <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
<PackageReference Include="BootstrapBlazor" Version="9.10.3" /> <PackageReference Include="BootstrapBlazor" Version="9.11.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -204,7 +204,7 @@ internal sealed partial class SchedulerFactory : ISchedulerFactory
} }
else else
{ {
_logger.LogWarning("Schedule hosted service preload completed, and a total of <{Count}> schedulers are appended.", _schedulers.Count); _logger.LogInformation("Schedule hosted service preload completed, and a total of <{Count}> schedulers are appended.", _schedulers.Count);
} }
} }
} }

View File

@@ -1,9 +1,9 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<PluginVersion>10.11.78</PluginVersion> <PluginVersion>10.11.80</PluginVersion>
<ProPluginVersion>10.11.78</ProPluginVersion> <ProPluginVersion>10.11.80</ProPluginVersion>
<DefaultVersion>10.11.78</DefaultVersion> <DefaultVersion>10.11.80</DefaultVersion>
<AuthenticationVersion>10.11.6</AuthenticationVersion> <AuthenticationVersion>10.11.6</AuthenticationVersion>
<SourceGeneratorVersion>10.11.6</SourceGeneratorVersion> <SourceGeneratorVersion>10.11.6</SourceGeneratorVersion>
<NET8Version>8.0.20</NET8Version> <NET8Version>8.0.20</NET8Version>
@@ -12,7 +12,7 @@
<IsTrimmable>false</IsTrimmable> <IsTrimmable>false</IsTrimmable>
<ManagementProPluginVersion>10.11.70</ManagementProPluginVersion> <ManagementProPluginVersion>10.11.70</ManagementProPluginVersion>
<ManagementPluginVersion>10.11.70</ManagementPluginVersion> <ManagementPluginVersion>10.11.70</ManagementPluginVersion>
<TSVersion>4.0.0-beta.70</TSVersion> <TSVersion>4.0.0-beta.80</TSVersion>
</PropertyGroup> </PropertyGroup>

View File

@@ -99,16 +99,16 @@ public static class ChannelOptionsExtensions
if (channelOptions.MaxClientCount > 0) if (channelOptions.MaxClientCount > 0)
config.SetMaxCount(channelOptions.MaxClientCount); config.SetMaxCount(channelOptions.MaxClientCount);
config.SetTransportOption(new TouchSocket.Sockets.TransportOption() config.SetTransportOption(a =>
{ {
SendPipeOptions = new System.IO.Pipelines.PipeOptions( a.SendPipeOptions = new System.IO.Pipelines.PipeOptions(
minimumSegmentSize: 1024,
useSynchronizationContext: false),
ReceivePipeOptions = new System.IO.Pipelines.PipeOptions(
minimumSegmentSize: 1024, minimumSegmentSize: 1024,
useSynchronizationContext: false);
a.ReceivePipeOptions = new System.IO.Pipelines.PipeOptions(
pauseWriterThreshold: 1024 * 1024, pauseWriterThreshold: 1024 * 1024,
resumeWriterThreshold: 1024 * 512, resumeWriterThreshold: 1024 * 512,
useSynchronizationContext: false) minimumSegmentSize: 1024,
useSynchronizationContext: false);
}); });
switch (channelType) switch (channelType)

View File

@@ -378,7 +378,7 @@ public abstract class DriverBase : AsyncDisposableObject, IDriver
// 记录设备线程已停止的信息 // 记录设备线程已停止的信息
LogMessage?.LogInformation(string.Format(AppResource.DeviceTaskStop, DeviceName)); LogMessage?.LogInformation(string.Format(AppResource.DeviceTaskStop, DeviceName));
await Task.Delay(1000).ConfigureAwait(false); await Task.Delay(50).ConfigureAwait(false);
// 执行资源释放操作 // 执行资源释放操作
await this.SafeDisposeAsync().ConfigureAwait(false); await this.SafeDisposeAsync().ConfigureAwait(false);

View File

@@ -176,8 +176,8 @@ public class ChannelRuntimeService : IChannelRuntimeService
if (restart) if (restart)
{ {
await GlobalData.ChannelThreadManage.RestartChannelAsync(newChannelRuntimes).ConfigureAwait(false); await GlobalData.ChannelThreadManage.RestartChannelAsync(newChannelRuntimes).ConfigureAwait(false);
await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a=> !newDeviceRuntimes.Contains(a)).ToArray(),_logger).ConfigureAwait(false); await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).ToArray(), _logger).ConfigureAwait(false);
} }
return true; return true;
@@ -209,7 +209,7 @@ public class ChannelRuntimeService : IChannelRuntimeService
{ {
await GlobalData.ChannelThreadManage.RestartChannelAsync(newChannelRuntimes).ConfigureAwait(false); await GlobalData.ChannelThreadManage.RestartChannelAsync(newChannelRuntimes).ConfigureAwait(false);
await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).ToArray(),_logger).ConfigureAwait(false); await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).ToArray(), _logger).ConfigureAwait(false);
} }
return true; return true;
@@ -241,7 +241,7 @@ public class ChannelRuntimeService : IChannelRuntimeService
{ {
await GlobalData.ChannelThreadManage.RestartChannelAsync(newChannelRuntimes).ConfigureAwait(false); await GlobalData.ChannelThreadManage.RestartChannelAsync(newChannelRuntimes).ConfigureAwait(false);
await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).ToArray(),_logger).ConfigureAwait(false); await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).ToArray(), _logger).ConfigureAwait(false);
} }
return true; return true;

View File

@@ -205,7 +205,7 @@ public class DeviceRuntimeService : IDeviceRuntimeService
if (restart) if (restart)
{ {
await RuntimeServiceHelper.RestartDeviceAsync(newDeviceRuntimes).ConfigureAwait(false); await RuntimeServiceHelper.RestartDeviceAsync(newDeviceRuntimes).ConfigureAwait(false);
await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).ToArray(),_logger).ConfigureAwait(false); await RuntimeServiceHelper.ChangedDriverAsync(GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).ToArray(), _logger).ConfigureAwait(false);
} }
return true; return true;

View File

@@ -820,6 +820,7 @@ internal sealed class DeviceThreadManage : IAsyncDisposable, IDeviceThreadManage
LogMessage?.LogInformation(string.Format(AppResource.ChannelDispose, CurrentChannel?.Name ?? string.Empty)); LogMessage?.LogInformation(string.Format(AppResource.ChannelDispose, CurrentChannel?.Name ?? string.Empty));
await Task.Delay(50).ConfigureAwait(false);
LogMessage?.Logs?.ForEach(a => a.TryDispose()); LogMessage?.Logs?.ForEach(a => a.TryDispose());
} }
finally finally

View File

@@ -239,7 +239,7 @@ internal static class RuntimeServiceHelper
if (group.Key != null) if (group.Key != null)
await group.Key.RestartDeviceAsync(group.Value, false).ConfigureAwait(false); await group.Key.RestartDeviceAsync(group.Value, false).ConfigureAwait(false);
} }
foreach (var group in GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a=>!newDeviceRuntimes.Contains(a)).Where(a => a.Driver?.DeviceThreadManage != null).GroupBy(a => a.Driver.DeviceThreadManage)) foreach (var group in GlobalData.GetAllVariableBusinessDeviceRuntime().Where(a => !newDeviceRuntimes.Contains(a)).Where(a => a.Driver?.DeviceThreadManage != null).GroupBy(a => a.Driver.DeviceThreadManage))
{ {
if (group.Key != null) if (group.Key != null)
await group.Key.RestartDeviceAsync(group.ToArray(), false).ConfigureAwait(false); await group.Key.RestartDeviceAsync(group.ToArray(), false).ConfigureAwait(false);
@@ -268,9 +268,9 @@ internal static class RuntimeServiceHelper
} }
public static async Task ChangedDriverAsync(DeviceRuntime[] channelDevice, ILogger logger) public static async Task ChangedDriverAsync(DeviceRuntime[] channelDevice, ILogger logger)
{ {
await channelDevice.ParallelForEachAsync(async (item, token) => await channelDevice.ParallelForEachAsync(async (item, token) =>
{ {

View File

@@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Components.Web;
using ThingsGateway.Admin.Application; using ThingsGateway.Admin.Application;
using ThingsGateway.Admin.Razor; using ThingsGateway.Admin.Razor;
using ThingsGateway.NewLife;
using ThingsGateway.NewLife.Extension; using ThingsGateway.NewLife.Extension;
using ThingsGateway.NewLife.Json.Extension; using ThingsGateway.NewLife.Json.Extension;
using ThingsGateway.SqlSugar; using ThingsGateway.SqlSugar;
@@ -1319,17 +1320,26 @@ EventCallback.Factory.Create<MouseEventArgs>(this, async e =>
private TreeViewItem<ChannelDeviceTreeItem> UnknownTreeViewItem; private TreeViewItem<ChannelDeviceTreeItem> UnknownTreeViewItem;
SmartTriggerScheduler? scheduler; SmartTriggerScheduler? scheduler;
private bool _initialized;
public override async Task SetParametersAsync(ParameterView parameters) public override async Task SetParametersAsync(ParameterView parameters)
{ {
parameters.SetParameterProperties(this); parameters.SetParameterProperties(this);
OnInitialized(); if (!_initialized)
await OnInitializedAsync(); {
OnParametersSet(); _initialized = true;
StateHasChanged();
await OnParametersSetAsync();
OnInitialized();
await OnInitializedAsync();
OnParametersSet();
StateHasChanged();
await OnParametersSetAsync();
}
else
{
OnParametersSet();
StateHasChanged();
await OnParametersSetAsync();
}
} }
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
@@ -1402,19 +1412,29 @@ EventCallback.Factory.Create<MouseEventArgs>(this, async e =>
await base.OnInitializedAsync(); await base.OnInitializedAsync();
} }
WaitLock WaitLock = new(nameof(ChannelDeviceTree));
private async Task Notify(CancellationToken cancellationToken) private async Task Notify(CancellationToken cancellationToken)
{ {
if (cancellationToken.IsCancellationRequested) return; if (cancellationToken.IsCancellationRequested) return;
if (Disposed) return; if (Disposed) return;
await OnClickSearch(SearchText); try
Value = GetValue(Value);
if (ChannelDeviceChanged != null)
{ {
await ChannelDeviceChanged.Invoke(Value); await WaitLock.WaitAsync(cancellationToken);
await OnClickSearch(SearchText);
Value = GetValue(Value);
if (ChannelDeviceChanged != null)
{
await ChannelDeviceChanged.Invoke(Value);
}
await InvokeAsync(StateHasChanged);
}
finally
{
WaitLock.Release();
} }
await InvokeAsync(StateHasChanged);
} }
private static ChannelDeviceTreeItem GetValue(ChannelDeviceTreeItem channelDeviceTreeItem) private static ChannelDeviceTreeItem GetValue(ChannelDeviceTreeItem channelDeviceTreeItem)

View File

@@ -120,6 +120,7 @@ public partial class DeviceEditComponent
private string ChannelName; private string ChannelName;
private string DeviceName; private string DeviceName;
private bool _initialized;
public override async Task SetParametersAsync(ParameterView parameters) public override async Task SetParametersAsync(ParameterView parameters)
{ {
if (ChannelName.IsNullOrEmpty()) if (ChannelName.IsNullOrEmpty())
@@ -127,11 +128,22 @@ public partial class DeviceEditComponent
parameters.SetParameterProperties(this); parameters.SetParameterProperties(this);
ChannelName = await ChannelPageService.GetChannelNameAsync(Model?.ChannelId ?? 0); ChannelName = await ChannelPageService.GetChannelNameAsync(Model?.ChannelId ?? 0);
DeviceName = await DevicePageService.GetDeviceNameAsync(Model?.RedundantDeviceId ?? 0); DeviceName = await DevicePageService.GetDeviceNameAsync(Model?.RedundantDeviceId ?? 0);
OnInitialized(); if (!_initialized)
await OnInitializedAsync(); {
OnParametersSet(); _initialized = true;
StateHasChanged();
await OnParametersSetAsync(); OnInitialized();
await OnInitializedAsync();
OnParametersSet();
StateHasChanged();
await OnParametersSetAsync();
}
else
{
OnParametersSet();
StateHasChanged();
await OnParametersSetAsync();
}
} }
else else
{ {

View File

@@ -49,6 +49,11 @@ public partial class VariableEditComponent
private string DeviceName; private string DeviceName;
private string ChoiceBusinessDeviceName; private string ChoiceBusinessDeviceName;
private bool first = false; private bool first = false;
private bool _initialized;
public override async Task SetParametersAsync(ParameterView parameters) public override async Task SetParametersAsync(ParameterView parameters)
{ {
if (DeviceName.IsNullOrEmpty() && first == false) if (DeviceName.IsNullOrEmpty() && first == false)
@@ -56,14 +61,31 @@ public partial class VariableEditComponent
first = true; first = true;
parameters.SetParameterProperties(this); parameters.SetParameterProperties(this);
DeviceName = await DevicePageService.GetDeviceNameAsync(Model?.DeviceId ?? 0); DeviceName = await DevicePageService.GetDeviceNameAsync(Model?.DeviceId ?? 0);
OnInitialized(); if (!_initialized)
await OnInitializedAsync(); {
OnParametersSet(); _initialized = true;
ChoiceBusinessDeviceId = ChoiceBusinessDeviceId > 0 ? ChoiceBusinessDeviceId : (await DevicePageService.OnDeviceSelectedItemQueryAsync(new VirtualizeQueryOption() { Count = 1 }, false).ConfigureAwait(false)).Items.FirstOrDefault()?.Value?.ToLong() ?? 0; OnInitialized();
ChoiceBusinessDeviceName = (await DevicePageService.GetDeviceNameAsync(ChoiceBusinessDeviceId)) ?? string.Empty; await OnInitializedAsync();
OnParametersSet();
ChoiceBusinessDeviceId = ChoiceBusinessDeviceId > 0 ? ChoiceBusinessDeviceId : (await DevicePageService.OnDeviceSelectedItemQueryAsync(new VirtualizeQueryOption() { Count = 1 }, false).ConfigureAwait(false)).Items.FirstOrDefault()?.Value?.ToLong() ?? 0;
ChoiceBusinessDeviceName = (await DevicePageService.GetDeviceNameAsync(ChoiceBusinessDeviceId)) ?? string.Empty;
await InvokeAsync(StateHasChanged);
await OnParametersSetAsync();
}
else
{
OnParametersSet();
ChoiceBusinessDeviceId = ChoiceBusinessDeviceId > 0 ? ChoiceBusinessDeviceId : (await DevicePageService.OnDeviceSelectedItemQueryAsync(new VirtualizeQueryOption() { Count = 1 }, false).ConfigureAwait(false)).Items.FirstOrDefault()?.Value?.ToLong() ?? 0;
ChoiceBusinessDeviceName = (await DevicePageService.GetDeviceNameAsync(ChoiceBusinessDeviceId)) ?? string.Empty;
await InvokeAsync(StateHasChanged);
await OnParametersSetAsync();
}
await InvokeAsync(StateHasChanged);
await OnParametersSetAsync(); await OnParametersSetAsync();

View File

@@ -36,7 +36,7 @@
<Button OnClick="ShowAbout" class="layout-header-bar d-none d-lg-flex px-2" Icon="fa fa-info" Color="Color.None" TooltipText="@Localizer[nameof(About)]" /> <Button OnClick="ShowAbout" class="layout-header-bar d-none d-lg-flex px-2" Icon="fa fa-info" Color="Color.None" TooltipText="@Localizer[nameof(About)]" />
} }
@* 版本号 *@ @* 版本号 *@
<div class="px-1 navbar-header-text d-none d-lg-block">@_versionString</div> <div class="px-1 navbar-header-text text-nowrap d-none d-lg-block">@_versionString</div>
@* 主题切换 *@ @* 主题切换 *@
@* <ThemeToggle /> *@ @* <ThemeToggle /> *@

View File

@@ -8,8 +8,6 @@
// QQ群605534569 // QQ群605534569
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using BenchmarkConsoleApp;
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Jobs;

View File

@@ -8,8 +8,6 @@
// QQ群605534569 // QQ群605534569
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
using BenchmarkConsoleApp;
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Jobs;

View File

@@ -93,6 +93,8 @@ public partial class SqlHistoryAlarm : BusinessBaseWithCacheAlarm
{ {
try try
{ {
if (_driverPropertys.VariableAlarmEnable == false) return;
using var db = BusinessDatabaseUtil.GetDb((DbType)_driverPropertys.DbType, _driverPropertys.BigTextConnectStr); using var db = BusinessDatabaseUtil.GetDb((DbType)_driverPropertys.DbType, _driverPropertys.BigTextConnectStr);
if (!_driverPropertys.BigTextScriptHistoryTable.IsNullOrEmpty()) if (!_driverPropertys.BigTextScriptHistoryTable.IsNullOrEmpty())
{ {

View File

@@ -21,12 +21,12 @@
<base href="/" /> <base href="/" />
<title>ThingsGateway</title> <title>ThingsGateway</title>
<link rel="stylesheet" href=@($"_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css") />
<link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css") />
<link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/motronic.min.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"_content/BootstrapBlazor/css/motronic.min.css") />
<link rel="stylesheet" href=@($"ThingsGateway.Server.styles.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"ThingsGateway.Server.styles.css") />
<link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/site.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/site.css") />
<link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/devui.css?v={this.GetType().Assembly.GetName().Version}") /> <link rel="stylesheet" href=@($"{WebsiteConst.DefaultResourceUrl}css/devui.css") />
@* <script src=@($"{WebsiteConst.DefaultResourceUrl}js/theme.js") type="module"></script><!-- 初始主题 --> *@ @* <script src=@($"{WebsiteConst.DefaultResourceUrl}js/theme.js") type="module"></script><!-- 初始主题 --> *@
<!-- PWA Manifest --> <!-- PWA Manifest -->

View File

@@ -69,7 +69,7 @@
<Button @onclick="ShowAbout" class="layout-header-bar d-none d-lg-flex px-2" Icon="fa fa-info" Color="Color.None" TooltipText="@Localizer[nameof(About)]" /> <Button @onclick="ShowAbout" class="layout-header-bar d-none d-lg-flex px-2" Icon="fa fa-info" Color="Color.None" TooltipText="@Localizer[nameof(About)]" />
} }
@* 版本号 *@ @* 版本号 *@
<div class="px-1 navbar-header-text d-none d-lg-block">@_versionString</div> <div class="px-1 navbar-header-text text-nowrap text-nowrap d-none d-lg-block">@_versionString</div>
@* 主题切换 *@ @* 主题切换 *@
@* <ThemeToggle /> *@ @* <ThemeToggle /> *@