using Coravel; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System.Collections.Generic; using System.Net.NetworkInformation; using VideoAnalysisCore.Common; using VideoAnalysisCore.Job; namespace VideoAnalysisCore.Common.Expand { public static class AppConfigExpand { public static ushort GenerateIdFromIpPower() { var mac = NetworkInterface.GetAllNetworkInterfaces() .Where(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback) .Select(n => n.GetPhysicalAddress()) .FirstOrDefault(addr => addr.GetAddressBytes().Length > 0); if (mac == null) return 0; byte[] bytes = mac.GetAddressBytes(); // 取 MAC 地址的最后两个字节生成 ushort return (ushort)((bytes[^2] << 8) | bytes[^1]); } public static ushort GetPersistentDeviceId() { string path = "device_id.config"; if (File.Exists(path)) { return ushort.Parse(File.ReadAllText(path)); } // 首次启动,生成 ID (比如用你之前的 IP 幂运算法) ushort newId = GenerateIdFromIpPower(); File.WriteAllText(path, newId.ToString()); return newId; } public static void AddAppConfig(this IHostApplicationBuilder hb, string[] args) { Console.WriteLine($"{DateTime.Now}=>初始化 AppConfig"); hb.Configuration.GetSection("AppConfig").Bind(AppCommon.Config); AppCommon.Config.ID = GetPersistentDeviceId(); var argList = args.ToList(); var eArgs = Environment.GetEnvironmentVariable("va_args"); if (!string.IsNullOrEmpty(eArgs)) argList.AddRange(eArgs.Split(",")); Console.WriteLine("==========================================="); Console.WriteLine($"设备ID:{AppCommon.Config.ID}"); Console.WriteLine($"当前环境: {hb.Environment.EnvironmentName}"); Console.WriteLine("启动参数如下:"); Console.WriteLine(string.Join(',', args)); Console.WriteLine("==========================================="); if (args.Contains("IS_Server")) AppCommon.Config.TaskSetting.IS_Server = true; } /// /// 交互式环境选择函数 /// public static void SelectEnvironment(ref string[] args) { // 如果没有控制台(如在某些后台服务或重定向中),则跳过交互 if (Console.IsInputRedirected) return; Console.Title = "ASP.NET Core 环境选择器"; Console.WriteLine("=================================================="); Console.WriteLine(" 请选择程序运行环境 (直接回车默认使用开发环境)"); Console.WriteLine("=================================================="); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(" [1] 生产环境 (Production)"); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(" [2] 测试环境 (Staging)"); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(" [3] 开发环境 (Development)"); Console.ResetColor(); Console.WriteLine("=================================================="); Console.Write(" 请输入编号 [1/2/3] (默认 3): "); // 获取输入 string? input = Console.ReadLine()?.Trim(); // 映射逻辑 string selectedEnv = input switch { "1" => Environments.Production, "2" => Environments.Staging, "3" => Environments.Development, _ => Environments.Development // 输入错误或直接回车,默认走开发环境 }; // 核心:在 Build 之前覆盖环境名 args = args.Concat( new[] { "--environment", selectedEnv }).ToArray(); // 成功反馈 Console.Clear(); Console.BackgroundColor = ConsoleColor.DarkBlue; Console.ForegroundColor = ConsoleColor.White; Console.WriteLine($" 已确认切换至: {selectedEnv} 模式 "); Console.ResetColor(); Console.WriteLine(); } } }