Skip to content
Merged
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
2 changes: 1 addition & 1 deletion MSLX.Daemon/Controllers/AppInfoController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@
["targetFrontendVersion"] = new JObject
{
["desktop"] = "1.0.0",
["panel"] = "1.3.4"
["panel"] = "1.3.5"
},
["systemInfo"] = systemInfo
};
Expand Down Expand Up @@ -145,7 +145,7 @@
{
JObject remoteJObj = JObject.Parse(res.Content ?? "{}");
string remoteVerStr = remoteJObj["data"]?["daemonLatestVersion"]?.ToString() ?? "0.0.0";
if (!Version.TryParse(remoteVerStr, out Version remoteVerObj))

Check warning on line 148 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, arm64, win-arm64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 148 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, x64, win-x64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 148 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-arm64, linux-musl-arm64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 148 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-x64, linux-musl-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 148 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (osx, x64, osx-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.
{
remoteVerObj = new Version("0.0.0.0");
}
Expand Down Expand Up @@ -337,7 +337,7 @@
string archivePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"update_package{archiveExt}");

// 定义解压后的新文件临时名称
string currentExeName = Path.GetFileName(Process.GetCurrentProcess().MainModule?.FileName);

Check warning on line 340 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, arm64, win-arm64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 340 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, x64, win-x64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 340 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-arm64, linux-musl-arm64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 340 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-x64, linux-musl-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 340 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (osx, x64, osx-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.
string newFileTempName = currentExeName + ".new";
string newFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, newFileTempName);

Expand Down Expand Up @@ -414,7 +414,7 @@
{
System.Formats.Tar.TarReader reader = new System.Formats.Tar.TarReader(gzipStream);
System.Formats.Tar.TarEntry entry;
while ((entry = reader.GetNextEntry()) != null)

Check warning on line 417 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, x64, win-x64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 417 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, arm64, win-arm64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 417 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-arm64, linux-musl-arm64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 417 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-x64, linux-musl-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 417 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (osx, x64, osx-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.
{
if (entry.EntryType == System.Formats.Tar.TarEntryType.Directory) continue;
await entry.ExtractToFileAsync(destinationPath, overwrite: true);
Expand All @@ -434,8 +434,8 @@
string scriptPath;

var currentProcess = Process.GetCurrentProcess();
string currentModuleFileName = currentProcess.MainModule?.FileName;

Check warning on line 437 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, arm64, win-arm64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 437 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-arm64, linux-musl-arm64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 437 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (linux, musl-x64, linux-musl-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

Check warning on line 437 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (osx, x64, osx-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.
string currentExeName = Path.GetFileName(currentModuleFileName);

Check warning on line 438 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (windows, arm64, win-arm64, MSLX-Daemon.exe)

Converting null literal or possible null value to non-nullable type.

Check warning on line 438 in MSLX.Daemon/Controllers/AppInfoController.cs

View workflow job for this annotation

GitHub Actions / 构建发布 (osx, x64, osx-x64, MSLX-Daemon)

Converting null literal or possible null value to non-nullable type.

bool isDotnetDll = currentModuleFileName != null && currentModuleFileName.EndsWith(".dll");
bool isMacOS = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using MSLX.Daemon.Models;
using MSLX.Daemon.Utils;
using Newtonsoft.Json.Linq;

namespace MSLX.Daemon.Controllers.FrpControllers.Providers;

[ApiController]
[Route("api/frp/chmlfrp")]
[Authorize(Roles = "admin")]
public class ChmlFrpProxyController : ControllerBase
{
private const string ChmlFrpApiBaseUrl = "https://cf-v2.uapis.cn";

[HttpGet("userinfo")]
public Task<IActionResult> GetUserInfo()
=> ForwardGetAsync($"{ChmlFrpApiBaseUrl}/userinfo");

[HttpGet("tunnel")]
public Task<IActionResult> GetTunnels()
=> ForwardGetAsync($"{ChmlFrpApiBaseUrl}/tunnel");

[HttpGet("node")]
public Task<IActionResult> GetNodes()
=> ForwardGetAsync($"{ChmlFrpApiBaseUrl}/node");

[HttpGet("delete-tunnel")]
public Task<IActionResult> DeleteTunnel([FromQuery] int tunnelId)
=> ForwardGetAsync($"{ChmlFrpApiBaseUrl}/delete_tunnel?tunnelid={tunnelId}");

[HttpGet("tunnel-config")]
public Task<IActionResult> GetTunnelConfig([FromQuery] string node, [FromQuery] string tunnelName)
=> ForwardGetAsync(
$"{ChmlFrpApiBaseUrl}/tunnel_config?node={Uri.EscapeDataString(node)}&tunnel_names={Uri.EscapeDataString(tunnelName)}");

[HttpPost("create-tunnel")]
public async Task<IActionResult> CreateTunnel([FromBody] JToken body)
{
var response = await GeneralApi.PostAsync(
$"{ChmlFrpApiBaseUrl}/create_tunnel",
HttpService.PostContentType.Json,
body,
BuildProxyHeaders());

return BuildActionResult(response);
}

private async Task<IActionResult> ForwardGetAsync(string url)
{
var response = await GeneralApi.GetAsync(url, headers: BuildProxyHeaders());
return BuildActionResult(response);
}

private Dictionary<string, string> BuildProxyHeaders()
{
var headers = new Dictionary<string, string>();
if (Request.Headers.TryGetValue("X-Chmlfrp-Authorization", out StringValues authorization)
&& !StringValues.IsNullOrEmpty(authorization))
{
headers["Authorization"] = authorization.ToString();
}
return headers;
}

private IActionResult BuildActionResult(HttpService.HttpResponse response)
{
var contentData = ParseResponseContent(response.Content);

if (response.IsSuccessStatusCode)
{
return Ok(new ApiResponse<object?>
{
Code = 200,
Message = "请求成功",
Data = contentData
});
}

var statusCode = response.StatusCode > 0 ? response.StatusCode : 502;
return StatusCode(statusCode, new ApiResponse<object?>
{
Code = statusCode,
Message = ExtractErrorMessage(contentData, response.ResponseException),
Data = contentData
});
}

private static object? ParseResponseContent(string? content)
{
if (string.IsNullOrWhiteSpace(content)) return null;

try
{
return JToken.Parse(content);
}
catch
{
return content;
}
}

private static string ExtractErrorMessage(object? parsedContent, object? responseException)
{
if (parsedContent is JToken token)
{
var message = token["msg"]?.ToString()
?? token["message"]?.ToString()
?? token["error_description"]?.ToString()
?? token["error"]?.ToString();

if (!string.IsNullOrWhiteSpace(message)) return message;
}
else if (parsedContent is string str && !string.IsNullOrWhiteSpace(str))
{
return str;
}

return responseException?.ToString() ?? "请求失败";
}
}
2 changes: 0 additions & 2 deletions MSLX.Daemon/Frontend/assets/css/mslx-app-main.KzYct4rk.css

This file was deleted.

94 changes: 0 additions & 94 deletions MSLX.Daemon/Frontend/assets/js/mslx-app-main.BIAT6j6O.js

This file was deleted.

94 changes: 94 additions & 0 deletions MSLX.Daemon/Frontend/assets/js/mslx-app-main.Cdym3WOG.js

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

164 changes: 82 additions & 82 deletions MSLX.Daemon/Frontend/build.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": "1.3.4",
"buildTime": "2026-03-29 16:06:49",
"version": "1.3.5",
"buildTime": "2026-04-05 17:10:36",
"dependencies": {
"@codemirror/lang-javascript": "^6.2.4",
"@codemirror/lang-json": "^6.0.2",
Expand Down Expand Up @@ -74,10 +74,88 @@
"vite-svg-loader": "^5.1.0",
"vue-tsc": "^2.0.26"
},
"commitId": "956ff76a6e454d8f110ca758e758486a13f25585",
"commitMsg": "perf(webpanel): 更多Q弹头像特效!",
"commitId": "89086442333f955353a835b9330c3527a3a5699a",
"commitMsg": "fix(webpanel): 修复部分输入框的异常样式",
"commitAuthor": "luluxiaoyu",
"history": [
{
"commitId": "89086442333f955353a835b9330c3527a3a5699a",
"commitTime": "2026-04-05 17:09:09 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "fix(webpanel): 修复部分输入框的异常样式"
},
{
"commitId": "2aa48b7c2bf03855aa2003644ce9e43c52b6786e",
"commitTime": "2026-04-05 16:20:27 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "chore(webpanel): 更新ChmlFrp配置信息"
},
{
"commitId": "2a929e8f3171de2580fbf4323a36286e02fb79cd",
"commitTime": "2026-04-05 16:13:33 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "feat(webpanel): 关于页面新增贡献者鸣谢列表"
},
{
"commitId": "9062e78ac42e2c17e76a6b29cb95ae037b42def5",
"commitTime": "2026-04-05 16:05:49 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "fix(webpanel): 移除背景美化模式下顶部导航栏异常的毛玻璃效果"
},
{
"commitId": "c300e7e1c328cb6c6df414dc98280e5578b9ad80",
"commitTime": "2026-04-05 11:45:21 +0800",
"commitAuthor": "小宇",
"commitMsg": "Merge pull request #103 from Hongbro886/fix-102"
},
{
"commitId": "c5fff9f57225756a4a2bb6c522368480346b2b6d",
"commitTime": "2026-04-05 09:49:55 +0800",
"commitAuthor": "whoa",
"commitMsg": "fix(webpanel):将MEFrp的注册链接指向正确的地址"
},
{
"commitId": "60d17acdee98442370ca866dee54daa4838ff6c0",
"commitTime": "2026-04-05 00:05:38 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "perf(webpanel): 优化ChmlFrp登录弹窗的的方式"
},
{
"commitId": "b1a5b1bbebfe4e933db7bae99c96313091eea7f4",
"commitTime": "2026-04-01 15:54:46 +0800",
"commitAuthor": "小宇",
"commitMsg": "Merge pull request #100 from chaoji233/feature/chmlfrp-auth"
},
{
"commitId": "798b57d659b02a8443c23927676c300e255c33ad",
"commitTime": "2026-04-01 03:55:57 +0800",
"commitAuthor": "chaoji233",
"commitMsg": "feat(daemon & webpanel): 重构 ChmlFrp 模块以支持新版 OAuth 设备码授权"
},
{
"commitId": "d1fabaf6232f0d6984b6ffba22105ea8bc06b913",
"commitTime": "2026-03-29 17:57:53 +0800",
"commitAuthor": "小宇",
"commitMsg": "Merge pull request #97 from Hongbro886/fix-95"
},
{
"commitId": "b9a75129f00c5413514c8a090018b02f5c75a84e",
"commitTime": "2026-03-29 17:36:14 +0800",
"commitAuthor": "whoa",
"commitMsg": "fix(webpanel):修复更新程序无法正确检测所有实例是否都被退出的问题"
},
{
"commitId": "bf48af318ef07e971049c83adda3be83379ac05f",
"commitTime": "2026-03-29 16:10:20 +0800",
"commitAuthor": "小宇",
"commitMsg": "Merge pull request #94 from MSLTeam/dev"
},
{
"commitId": "129b1e3ec2f119cd4ed1b155af94dfc463c5cc93",
"commitTime": "2026-03-29 16:07:33 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "bumpver(daemon & webpanel): 更新版本号到 v1.3.4"
},
{
"commitId": "956ff76a6e454d8f110ca758e758486a13f25585",
"commitTime": "2026-03-29 15:57:04 +0800",
Expand Down Expand Up @@ -299,84 +377,6 @@
"commitTime": "2026-03-15 18:06:09 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "fix(webpanel): 修复实例设置-更多功能内容无法正常重载的问题"
},
{
"commitId": "d43e6df5b34df0e96c2eb99dc290b76cb62f9e57",
"commitTime": "2026-03-15 17:56:36 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "feat(webpanel): 支持批量启动/停止/重启/删除服务端实例 #52"
},
{
"commitId": "f99fe398fdeb72ad223f3f4855e9540c648ac854",
"commitTime": "2026-03-15 17:43:55 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "fix(webpanel): 修复全局定时任务页面动画闪烁的问题"
},
{
"commitId": "f77344cd225ae6e4b13c9e021dd2414d4be10ed7",
"commitTime": "2026-03-15 17:22:49 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "feat(webpanel): chmlfrp配置文件自动转换为toml格式"
},
{
"commitId": "358b61c1bd1d129dbfea8873af884b965c70b154",
"commitTime": "2026-03-15 17:14:57 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "fix(webpanel): 修正SakuraFrp添加隧道中远程端口描述"
},
{
"commitId": "0fa9507184a2effd78ae3e0061ef5aef23c91768",
"commitTime": "2026-03-15 17:11:51 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "feat(webpanel & daemon): 隧道服务新增ChmlFrp支持 #73"
},
{
"commitId": "d9514c3a3b154d47ff5f59551b5f11354370ae8b",
"commitTime": "2026-03-15 16:35:52 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "feat(webpanel): 隧道服务链接失败时自动清理登录记录"
},
{
"commitId": "cf4f325a8deb095df13916d82ce01d9d72bcbc74",
"commitTime": "2026-03-15 16:30:38 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "feat(webpanel & daemon): 隧道服务新增SakuraFrp支持"
},
{
"commitId": "355b6e2a1d07fae68007ba5143eb956b79d2b4de",
"commitTime": "2026-03-15 15:13:41 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "feat(webpanel): NeoForge/Forge纯模组服务端下载时支持选择具体子版本 #85"
},
{
"commitId": "0ef5d633d9fb6ec765eb30cec9ebe00c00fd74cb",
"commitTime": "2026-03-15 14:25:33 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "fix(webpanel): 修复更新实例进度的弹窗未正常显示的问题"
},
{
"commitId": "caf8c46f2d95f92992125ef7e7e1dd7a7e102275",
"commitTime": "2026-03-14 00:08:02 +0800",
"commitAuthor": "小宇",
"commitMsg": "Merge pull request #81 from MSLTeam/dev"
},
{
"commitId": "cbb0dd811dd933f199cd61ddac2969a4237f59a2",
"commitTime": "2026-03-14 00:06:56 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "bumpver(daemon & webpanel): 更新版本号到 v1.3.1-release"
},
{
"commitId": "503d96cc1789605adfd95d987944885168877bbf",
"commitTime": "2026-03-13 23:59:42 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "style(webpanel): 调高二级文本透明度"
},
{
"commitId": "87635410801aafa17b50a60e03858bbc9137abd8",
"commitTime": "2026-03-13 23:57:43 +0800",
"commitAuthor": "luluxiaoyu",
"commitMsg": "style(webpanel): 优化Frp服务商登录窗口的毛玻璃效果"
}
]
}
6 changes: 3 additions & 3 deletions MSLX.Daemon/Frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MSLX Web Panel</title>
<script type="module" crossorigin src="/assets/js/mslx-entry.DKRpSAlo.js"></script>
<script type="module" crossorigin src="/assets/js/mslx-entry.rmwTM72S.js"></script>
<link rel="modulepreload" crossorigin href="/assets/js/mslx-libs.BfFW5N8o.js">
<link rel="modulepreload" crossorigin href="/assets/js/mslx-editor.DiM-SrP0.js">
<link rel="modulepreload" crossorigin href="/assets/js/mslx-core.DZWTbFWd.js">
<link rel="modulepreload" crossorigin href="/assets/js/mslx-charts.ByXhkWPm.js">
<link rel="modulepreload" crossorigin href="/assets/js/mslx-formatter.DCunR7Lr.js">
<link rel="modulepreload" crossorigin href="/assets/js/mslx-app-main.BIAT6j6O.js">
<link rel="modulepreload" crossorigin href="/assets/js/mslx-app-main.Cdym3WOG.js">
<link rel="stylesheet" crossorigin href="/assets/css/mslx-libs.CPsQRpQt.css">
<link rel="stylesheet" crossorigin href="/assets/css/mslx-core.D9pUfBh0.css">
<link rel="stylesheet" crossorigin href="/assets/css/mslx-app-main.KzYct4rk.css">
<link rel="stylesheet" crossorigin href="/assets/css/mslx-app-main.KGY2rMx0.css">
</head>
<body>
<div id="app"></div>
Expand Down
6 changes: 3 additions & 3 deletions MSLX.Daemon/MSLX.Daemon.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
<ImplicitUsings>enable</ImplicitUsings>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<ApplicationIcon>icon.ico</ApplicationIcon>
<Version>1.3.4-release</Version>
<FileVersion>1.3.4</FileVersion>
<AssemblyVersion>1.3.4</AssemblyVersion>
<Version>1.3.5-release</Version>
<FileVersion>1.3.5</FileVersion>
<AssemblyVersion>1.3.5</AssemblyVersion>
<Copyright>Copyright © 2021 - 2026 MSLTeam</Copyright>
<AssemblyName>MSLX-Daemon</AssemblyName>
<AssemblyTitle>MSLX.Daemon</AssemblyTitle>
Expand Down
2 changes: 1 addition & 1 deletion MSLX.WebPanel/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mslx-webpanel",
"version": "1.3.4",
"version": "1.3.5",
"scripts": {
"dev": "vite --mode development",
"dev:linux": "vite --mode development",
Expand Down
18 changes: 17 additions & 1 deletion MSLX.WebPanel/src/components/UpdateModal.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { computed, ref, onUnmounted } from 'vue';
import { computed, ref, onUnmounted, watch } from 'vue';
import {
DownloadIcon,
CloseIcon,
Expand Down Expand Up @@ -41,6 +41,16 @@ const errorMessage = ref('');
// SignalR 实例
let hubConnection: HubConnection | null = null;

// 当弹窗重新打开时,重置状态
const resetErrorStates = () => {
hasRunningServers.value = false;
isDockerEnv.value = false;
errorMessage.value = '';
isUpdating.value = false;
updateSuccess.value = false;
updateProgress.value = 0;
};

// === 计算属性 ===
const isBeta = computed(() => props.updateInfo?.status === 'beta');

Expand Down Expand Up @@ -86,6 +96,12 @@ const handleSkip = () => {
const reloadPage = () => {
window.location.reload();
};
watch(() => props.visible, (newVal, oldVal) => {
if (newVal && !oldVal) {
// 弹窗打开时重置状态
resetErrorStates();
}
});

// === SignalR 逻辑 ===
const stopSignalR = async () => {
Expand Down
Loading
Loading