地图监控改为固定双栏并可收起侧栏,编辑对齐改走内核 CAD,并接通 428 确认票。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
黄兆尉
2026-08-27 17:30:26 +08:00
co-authored by Cursor
parent 3968f5dc1f
commit 0788fad74a
5 changed files with 372 additions and 428 deletions
+41 -1
View File
@@ -385,6 +385,13 @@ public class OpsController : ControllerBase
try
{
var call = await CallLiteAsync(HttpMethod.Post, path, actor);
if (TryReadConfirmTicket(call.Body, out var token))
{
call = await CallLiteAsync(HttpMethod.Post, path, actor, new Dictionary<string, string>
{
[ConfirmTokenHeader] = token
});
}
var success = call.Ok && ParseSuccess(call.Body);
return success
? new ForwardOutcome(true, "ok", null)
@@ -397,7 +404,32 @@ public class OpsController : ControllerBase
}
}
private async Task<(bool Ok, int Status, string Body)> CallLiteAsync(HttpMethod method, string path, string? actor)
private const string ConfirmTokenHeader = "X-Platform-Confirm-Token";
private static bool TryReadConfirmTicket(string body, out string token)
{
token = "";
try
{
using var doc = JsonDocument.Parse(body);
var root = doc.RootElement;
var code = root.TryGetProperty("code", out var c) && c.TryGetInt32(out var n) ? n : 0;
if (code != 428) return false;
if (!root.TryGetProperty("data", out var data) || data.ValueKind != JsonValueKind.Object)
return false;
token = data.TryGetProperty("confirmToken", out var t) && t.ValueKind == JsonValueKind.String
? t.GetString() ?? ""
: "";
return !string.IsNullOrWhiteSpace(token);
}
catch
{
return false;
}
}
private async Task<(bool Ok, int Status, string Body)> CallLiteAsync(
HttpMethod method, string path, string? actor, IReadOnlyDictionary<string, string>? extraHeaders = null)
{
var url = $"http://127.0.0.1:{_sl.ProjectionPort}{path}";
using var client = _httpFactory.CreateClient();
@@ -409,6 +441,14 @@ public class OpsController : ControllerBase
msg.Headers.TryAddWithoutValidation("X-Platform-Confirmed", "1");
if (!string.IsNullOrWhiteSpace(actor))
msg.Headers.TryAddWithoutValidation("X-Platform-User", actor);
if (extraHeaders != null)
{
foreach (var kv in extraHeaders)
{
if (string.IsNullOrWhiteSpace(kv.Key) || kv.Value is null) continue;
msg.Headers.TryAddWithoutValidation(kv.Key, kv.Value);
}
}
using var resp = await client.SendAsync(msg);
var body = await resp.Content.ReadAsStringAsync();
return (resp.IsSuccessStatusCode, (int)resp.StatusCode, body);