📋 目录

  • 项目概述

  • 技术架构深度解析

  • 核心功能模块详解

  • 代码实现分析

  • 使用场景与实战案例

  • 性能优化与最佳实践

  • 扩展开发指南

  • 总结与展望

项目概述

什么是Windows-MCP.Net?

Windows MCP.Net是一个基于.NET 10.0开发的Windows桌面自动化MCP(Model Context Protocol)服务器,专为AI助手提供与Windows桌面环境交互的强大能力。该项目通过标准化的MCP协议,让AI助手能够直接操控Windows系统,实现真正的桌面自动化。

项目亮点

  • 🚀 基于最新技术栈:采用.NET 10.0框架,性能卓越

  • 🔧 模块化设计:清晰的分层架构,易于扩展和维护

  • 🎯 功能全面:涵盖桌面操作、文件系统、OCR识别、系统控制等多个领域

  • 📊 标准化协议:遵循MCP协议规范,与各种AI客户端无缝集成

  • 🛡️ 安全可靠:完善的错误处理和日志记录机制

技术架构深度解析

整体架构设计

Windows MCP.Net采用经典的分层架构模式,主要包含以下几个层次:

┌─────────────────────────────────────┐
│           MCP Protocol Layer        │  ← 协议通信层
├─────────────────────────────────────┤
│              Tools Layer            │  ← 工具实现层
├─────────────────────────────────────┤
│            Services Layer           │  ← 业务服务层
├─────────────────────────────────────┤
│           Interface Layer           │  ← 接口定义层
├─────────────────────────────────────┤
│         Windows API Layer           │  ← 系统API层
└─────────────────────────────────────┘

核心组件分析

1. 接口定义层(Interface Layer)

项目定义了清晰的服务接口,实现了良好的解耦:

// 桌面服务接口
public interface IDesktopService
{Task<string> GetDesktopStateAsync(bool useVision = false);Task<(string Response, int Status)> ClickAsync(int x, int y, string button = "left", int clickCount = 1);Task<(string Response, int Status)> TypeAsync(int x, int y, string text, bool clear = false, bool pressEnter = false);// ... 更多方法
}// 文件系统服务接口
public interface IFileSystemService
{Task<(string Response, int Status)> CreateFileAsync(string path, string content);Task<(string Content, int Status)> ReadFileAsync(string path);Task<(string Response, int Status)> WriteFileAsync(string path, string content, bool append = false);// ... 更多方法
}// 系统控制服务接口
public interface ISystemControlService
{Task<string> SetVolumeAsync(bool increase);Task<string> SetVolumePercentAsync(int percent);Task<string> SetBrightnessAsync(bool increase);// ... 更多方法
}
2. 服务实现层(Services Layer)

服务层是项目的核心,实现了具体的业务逻辑:

public class DesktopService : IDesktopService
{private readonly ILogger<DesktopService> _logger;// Windows API 声明[DllImport("user32.dll")]private static extern bool SetCursorPos(int x, int y);[DllImport("user32.dll")]private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);// 实现具体的桌面操作逻辑public async Task<(string Response, int Status)> ClickAsync(int x, int y, string button = "left", int clickCount = 1){try{SetCursorPos(x, y);await Task.Delay(50); // 短暂延迟确保光标移动完成uint mouseDown, mouseUp;switch (button.ToLower()){case "left":mouseDown = MOUSEEVENTF_LEFTDOWN;mouseUp = MOUSEEVENTF_LEFTUP;break;case "right":mouseDown = MOUSEEVENTF_RIGHTDOWN;mouseUp = MOUSEEVENTF_RIGHTUP;break;default:return ("Invalid button type", 1);}for (int i = 0; i < clickCount; i++){mouse_event(mouseDown, 0, 0, 0, 0);mouse_event(mouseUp, 0, 0, 0, 0);if (i < clickCount - 1) await Task.Delay(100);}return ($"Successfully clicked at ({x}, {y}) with {button} button {clickCount} time(s)", 0);}catch (Exception ex){_logger.LogError(ex, "Error clicking at ({X}, {Y})", x, y);return ($"Error: {ex.Message}", 1);}}
}
3. 工具实现层(Tools Layer)

工具层将服务功能封装为MCP工具,提供标准化的接口:

[McpServerToolType]
public class ClickTool
{private readonly IDesktopService _desktopService;private readonly ILogger<ClickTool> _logger;public ClickTool(IDesktopService desktopService, ILogger<ClickTool> logger){_desktopService = desktopService;_logger = logger;}[McpServerTool, Description("Click at specific coordinates on the screen")]public async Task<string> ClickAsync([Description("X coordinate")] int x,[Description("Y coordinate")] int y,[Description("Mouse button: left, right, or middle")] string button = "left",[Description("Number of clicks: 1=single, 2=double, 3=triple")] int clickCount = 1){_logger.LogInformation("Clicking at ({X}, {Y}) with {Button} button, {ClickCount} times", x, y, button, clickCount);var (response, status) = await _desktopService.ClickAsync(x, y, button, clickCount);var result = new{success = status == 0,message = response,coordinates = new { x, y },button,clickCount};return JsonSerializer.Serialize(result, new JsonSerializerOptions { WriteIndented = true });}
}

核心功能模块详解

1. 桌面操作模块(Desktop Tools)

桌面操作模块是项目的核心,提供了丰富的Windows桌面交互功能:

鼠标操作
  • ClickTool:支持左键、右键、中键的单击、双击、三击操作

  • DragTool:实现拖拽操作,支持文件拖拽、窗口移动等

  • MoveTool:精确控制鼠标光标位置

  • ScrollTool:支持垂直和水平滚动操作

键盘操作
  • TypeTool:智能文本输入,支持清除现有内容和自动回车

  • KeyTool:单个按键操作,支持所有键盘按键

  • ShortcutTool:快捷键组合操作,如Ctrl+C、Alt+Tab等

应用程序管理
  • LaunchTool:从开始菜单启动应用程序,支持多语言环境

  • SwitchTool:智能窗口切换,支持窗口标题模糊匹配

  • ResizeTool:窗口大小和位置调整

2. 文件系统模块(FileSystem Tools)

文件系统模块提供了完整的文件和目录操作功能:

// 文件操作示例
[McpServerTool, Description("Write content to a file")]
public async Task<string> WriteFileAsync([Description("The file path to write to")] string path,[Description("The content to write to the file")] string content,[Description("Whether to append to existing content (true) or overwrite (false)")] bool append = false)
{try{_logger.LogInformation("Writing to file: {Path}, Append: {Append}", path, append);var (response, status) = await _fileSystemService.WriteFileAsync(path, content, append);var result = new{success = status == 0,message = response,path,contentLength = content?.Length ?? 0,append};return JsonSerializer.Serialize(result, new JsonSerializerOptions { WriteIndented = true });}catch (Exception ex){_logger.LogError(ex, "Error in WriteFileAsync");var errorResult = new{success = false,message = $"Error writing to file: {ex.Message}",path,append};return JsonSerializer.Serialize(errorResult, new JsonSerializerOptions { WriteIndented = true });}
}

3. 系统控制模块(SystemControl Tools)

系统控制模块提供了Windows系统级别的控制功能:

音量控制
[McpServerTool, Description("Set system volume to a specific percentage")]
public async Task<string> SetVolumePercentAsync([Description("Volume percentage (0-100)")] int percent)
{_logger.LogInformation("Setting volume to {Percent}%", percent);return await _systemControlService.SetVolumePercentAsync(percent);
}
亮度控制
[McpServerTool, Description("Set screen brightness to a specific percentage")]
public async Task<string> SetBrightnessPercentAsync([Description("Brightness percentage (0-100)")] int percent)
{_logger.LogInformation("Setting brightness to {Percent}%", percent);return await _systemControlService.SetBrightnessPercentAsync(percent);
}
分辨率控制
[McpServerTool, Description("Set screen resolution")]
public async Task<string> SetResolutionAsync([Description("Resolution type: \"high\", \"medium\", or \"low\"")] string type)
{_logger.LogInformation("Setting resolution to: {Type}", type);return await _systemControlService.SetResolutionAsync(type);
}

4. OCR识别模块(OCR Tools)

OCR模块提供了强大的文字识别功能,支持屏幕文字提取和定位:

  • ExtractTextFromScreenTool:全屏文字提取

  • ExtractTextFromRegionTool:指定区域文字提取

  • FindTextOnScreenTool:屏幕文字查找

  • GetTextCoordinatesTool:获取文字坐标位置

代码实现分析

依赖注入与服务注册

项目使用了.NET的依赖注入容器,实现了良好的解耦:

// Program.cs 中的服务注册
var builder = Host.CreateApplicationBuilder(args);// 配置日志输出到stderr(stdout用于MCP协议消息)
builder.Logging.AddConsole(o => o.LogToStandardErrorThreshold = LogLevel.Trace);// 注册MCP服务和工具
builder.Services.AddSingleton<IDesktopService, DesktopService>().AddSingleton<IFileSystemService, FileSystemService>().AddSingleton<IOcrService, OcrService>().AddSingleton<ISystemControlService, SystemControlService>().AddMcpServer().WithStdioServerTransport().WithToolsFromAssembly(Assembly.GetExecutingAssembly());

错误处理与日志记录

项目采用了统一的错误处理模式:

try
{// 业务逻辑var result = await SomeOperation();return ("Success message", 0);
}
catch (Exception ex)
{_logger.LogError(ex, "Error in operation with parameters {Param1}, {Param2}", param1, param2);return ($"Error: {ex.Message}", 1);
}

Windows API集成

项目大量使用了Windows API来实现底层功能:

// Windows API 声明
[DllImport("user32.dll")]
private static extern bool SetCursorPos(int x, int y);[DllImport("user32.dll")]
private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);// 常量定义
private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
private const uint MOUSEEVENTF_LEFTUP = 0x04;
private const uint MOUSEEVENTF_RIGHTDOWN = 0x08;
private const uint MOUSEEVENTF_RIGHTUP = 0x10;

使用场景与实战案例

场景1:自动化办公任务

{"tool": "launch_app","params": {"name": "notepad"}
}{"tool": "type","params": {"x": 400,"y": 300,"text": "这是一个自动化生成的报告\n\n日期:2024年1月15日\n内容:系统运行正常","clear": true}
}{"tool": "key","params": {"key": "ctrl+s"}
}

场景2:批量文件处理

{"tool": "list_directory","params": {"path": "C:\\Documents","includeFiles": true,"recursive": false}
}{"tool": "search_files_by_extension","params": {"directory": "C:\\Documents","extension": ".txt","recursive": true}
}{"tool": "copy_file","params": {"source": "C:\\Documents\\report.txt","destination": "C:\\Backup\\report_backup.txt","overwrite": true}
}

场景3:系统监控与控制

{"tool": "get_desktop_state","params": {"useVision": false}
}{"tool": "set_volume_percent","params": {"percent": 50}
}{"tool": "set_brightness_percent","params": {"percent": 80}
}

性能优化与最佳实践

1. 异步编程模式

项目全面采用异步编程模式,提高了并发性能:

public async Task<string> ProcessLargeFileAsync(string filePath)
{// 使用异步I/O操作var content = await File.ReadAllTextAsync(filePath);// 异步处理var processedContent = await ProcessContentAsync(content);// 异步写入await File.WriteAllTextAsync(filePath + ".processed", processedContent);return "Processing completed";
}

2. 资源管理

public class DesktopService : IDesktopService, IDisposable
{private bool _disposed = false;public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!_disposed){if (disposing){// 释放托管资源}// 释放非托管资源_disposed = true;}}
}

3. 缓存策略

private readonly ConcurrentDictionary<string, WindowInfo> _windowCache = new();public async Task<WindowInfo> GetWindowInfoAsync(string windowTitle)
{return _windowCache.GetOrAdd(windowTitle, title => {// 获取窗口信息的昂贵操作return GetWindowInfoFromSystem(title);});
}

扩展开发指南

1. 添加新的工具

要添加新的MCP工具,需要遵循以下步骤:

// 1. 在相应的服务接口中添加方法
public interface IDesktopService
{Task<(string Response, int Status)> NewOperationAsync(string parameter);
}// 2. 在服务实现中添加具体逻辑
public class DesktopService : IDesktopService
{public async Task<(string Response, int Status)> NewOperationAsync(string parameter){try{// 实现具体逻辑return ("Operation completed", 0);}catch (Exception ex){_logger.LogError(ex, "Error in NewOperation");return ($"Error: {ex.Message}", 1);}}
}// 3. 创建MCP工具类
[McpServerToolType]
public class NewOperationTool
{private readonly IDesktopService _desktopService;private readonly ILogger<NewOperationTool> _logger;public NewOperationTool(IDesktopService desktopService, ILogger<NewOperationTool> logger){_desktopService = desktopService;_logger = logger;}[McpServerTool, Description("Description of the new operation")]public async Task<string> ExecuteAsync([Description("Parameter description")] string parameter){_logger.LogInformation("Executing new operation with parameter: {Parameter}", parameter);var (response, status) = await _desktopService.NewOperationAsync(parameter);var result = new{success = status == 0,message = response,parameter};return JsonSerializer.Serialize(result, new JsonSerializerOptions { WriteIndented = true });}
}

2. 单元测试编写

public class NewOperationToolTest
{private readonly IDesktopService _desktopService;private readonly ILogger<NewOperationTool> _logger;private readonly NewOperationTool _tool;public NewOperationToolTest(){var services = new ServiceCollection();services.AddLogging(builder => builder.AddConsole());services.AddSingleton<IDesktopService, DesktopService>();var serviceProvider = services.BuildServiceProvider();_desktopService = serviceProvider.GetRequiredService<IDesktopService>();_logger = serviceProvider.GetRequiredService<ILogger<NewOperationTool>>();_tool = new NewOperationTool(_desktopService, _logger);}[Fact]public async Task ExecuteAsync_ValidParameter_ReturnsSuccess(){// Arrangevar parameter = "test";// Actvar result = await _tool.ExecuteAsync(parameter);// AssertAssert.NotNull(result);var jsonResult = JsonSerializer.Deserialize<JsonElement>(result);Assert.True(jsonResult.GetProperty("success").GetBoolean());}
}

3. 配置管理

// appsettings.json
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"WindowsMcp": {"DefaultTimeout": 5000,"MaxRetries": 3,"EnableCaching": true}
}// 配置类
public class WindowsMcpOptions
{public int DefaultTimeout { get; set; } = 5000;public int MaxRetries { get; set; } = 3;public bool EnableCaching { get; set; } = true;
}// 在Program.cs中注册配置
builder.Services.Configure<WindowsMcpOptions>(builder.Configuration.GetSection("WindowsMcp"));

总结与展望

项目优势

  1. 技术先进性:基于.NET 10.0,采用最新的C#语言特性

  2. 架构合理性:清晰的分层架构,良好的可扩展性

  3. 功能完整性:涵盖桌面自动化的各个方面

  4. 标准化程度:遵循MCP协议,具有良好的互操作性

  5. 代码质量:完善的错误处理、日志记录和单元测试

技术创新点

  1. MCP协议集成:率先将MCP协议应用于Windows桌面自动化

  2. 多模块设计:模块化的工具设计,便于按需使用

  3. 异步优化:全面的异步编程,提升性能表现

  4. 智能识别:结合OCR技术,实现智能UI元素识别

未来发展方向

  1. AI集成增强

    • 集成更多AI模型,提升自动化的智能程度

    • 支持自然语言指令转换为操作序列

    • 增加机器学习能力,自动优化操作路径

  2. 跨平台支持

    • 扩展到Linux和macOS平台

    • 统一的跨平台API接口

    • 平台特定功能的适配层

  3. 云端集成

    • 支持云端部署和远程控制

    • 分布式任务执行能力

    • 云端AI服务集成

  4. 安全性增强

    • 操作权限细粒度控制

    • 操作审计和合规性检查

    • 数据加密和安全传输

  5. 性能优化

    • GPU加速的图像处理

    • 更高效的内存管理

    • 并行处理能力提升

对开发者的价值

Windows MCP.Net不仅是一个功能强大的桌面自动化工具,更是一个优秀的.NET项目实践案例。通过学习这个项目,开发者可以:

  • 掌握现代.NET应用程序的架构设计模式

  • 学习Windows API的集成和使用技巧

  • 了解MCP协议的实现和应用

  • 获得桌面自动化开发的实战经验

社区贡献

项目采用开源模式,欢迎社区贡献:

  • 功能扩展:添加新的工具和功能模块

  • 性能优化:提升现有功能的性能表现

  • 文档完善:改进项目文档和使用指南

  • 测试覆盖:增加单元测试和集成测试

  • Bug修复:发现和修复项目中的问题


如果这篇文章对您有帮助,请点赞👍、收藏⭐、分享📤!您的支持是我们持续改进的动力!

项目地址Windows-MCP.Net GitHub仓库https://github.com/AIDotNet/Windows-MCP.Net

相关链接

  • Model Context Protocol官方文档

  • .NET 10.0官方文档

  • Windows API参考文档


本文基于Windows MCP.Net项目源码分析编写,旨在为.NET开发者提供桌面自动化开发的技术参考。如有问题或建议,欢迎在评论区交流讨论!

更多AIGC文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95733.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95733.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95733.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Boost.Asio学习(7):Boost.Beast实现简易http服务器

namespace beast boost::beast;beast::flat_buffer是一个用于 Boost.Asio 和 Boost.Beast 网络读写的缓冲区实现。专为 一次性顺序读取 / 消费 场景设计&#xff0c;比 std::string 或 std::vector 高效&#xff0c;因为它是扁平内存结构&#xff08;contiguous memory&#x…

深入解析JVM内存区域划分:从理论到实践

Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的核心环境&#xff0c;它负责管理内存分配、垃圾回收、字节码执行等关键任务。理解JVM的内存区域划分&#xff0c;对于优化Java应用性能、排查内存问题&#xff08;如OutOfMemoryError、StackOverflowError&#xff09;至…

滑窗|贪心|✅滚动数组

lc17.08pair按身高升序、相同时体重降序排序结果是找体重序列的最长递增子序列长度核心&#xff1a;转化为二维最长递增子序列问题求解vector<int> dp;for (auto& p : hw) {int w p.second;auto it lower_bound(dp.begin(), dp.end(), w);if (it dp.end()) {dp.pu…

深入理解数据库架构:从原理到实践的完整指南

一、数据库存储架构的多维度分类体系 1.1 基于数据组织方式的存储架构分类 数据库的存储架构从根本上决定了其性能特征、适用场景和扩展能力。理解不同的数据组织方式是选择合适数据库技术的基础&#xff0c;这种分类不仅反映了技术实现的差异&#xff0c;更体现了对不同业务需…

体彩排列三第2025218期号码分析

大家好&#xff0c;本人蔡楚门来此平台分享一下本期得经验和思路&#xff0c;希望能够给大家带来好的运气和灵感&#xff01;体彩排列三第2025218期号码分析&#xff0c;大小号码数字分析&#xff0c;上期开出全小号码最多&#xff0c;最近两期的开奖号码全部都是全小号码最多&…

java设计模式之迪米特法则介绍与说明

一、核心概念与目标 基本定义 迪米特法则的核心思想是&#xff1a;一个对象应该对其他对象尽可能少地了解&#xff0c;仅与直接关联的对象&#xff08;即“朋友”&#xff09;通信&#xff0c;避免与“陌生人”产生直接交互。 直接朋友&#xff1a;包括当前对象的成员变量、方法…

2024-2025华为ICT大赛中国区 实践赛昇腾AI赛道(高职组)全国总决赛 理论部分真题+解析

Part 1 昇腾AI全栈系统模块(共6题)&#xff1a;1、许多计算芯片可以设计作为人工智能的计算芯片&#xff0c;但不同的芯片计算性能不同&#xff0c;昇腾计算芯片是一种()芯片。(单选题)A.CPU B.GPU C. NPU D.TPU正确答案&#xff1a;C解析&#xff1a;A项CPU中央处理器的架…

网络安全和基础设施安全局 (CISA) 表示微分段不再是可选的

网络安全和基础设施安全局 (CISA) 最近发布了一系列指导文件中的第一份&#xff0c;旨在帮助联邦机构实施微分段&#xff0c;作为其零信任架构 (ZTA) 战略的一部分&#xff0c;以遵守2022 年白宫的授权。 该文件《零信任中的微分段&#xff0c;第一部分&#xff1a;介绍和规划…

Spring Boot SseEmitter 重复请求问题深度分析与解决方案

1. 前言 在使用 Spring Boot 开发流式接口(Server-Sent Events)时,我们遇到了一个令人困惑的问题:每次 SseEmitter 完成后,都会触发第二次请求,导致重复请求检测机制误报。本文将详细记录问题的发现、分析过程以及最终的解决方案。 2. 系统架构背景 2.1 请求处理架构 …

心路历程-三个了解敲开linux的大门

学习前都爱唠叨一番&#xff1a; 了解一下&#xff1a;互联网的发展是离不开服务器的&#xff0c;而服务器的系统主流的还是Linux&#xff1b;这个是有数据进行支撑的&#xff1b;这个只是作为了解而已&#xff0c;我们并不买课&#xff0c;也不做什么买卖的行为&#xff0c;仅…

关于“双指针法“的总结

笔者这些天终于达成了只狼的全成就&#xff0c;甚是欢喜。然而乐极生悲&#xff0c;最近做了些算法题&#xff0c;竟没有一道靠自己做出来。感觉算法题常常用到“双指针法”呢……为什么到现在我还是做不出来这些算法题……今天就来试着总结一下它的使用场景吧。快慢指针法又名…

基于51单片机的智能吊灯

基于 51 单片机的智能吊灯设计与实现论文简纲一、引言1.1 研究背景与意义阐述传统照明设备在节能性、智能化方面的不足&#xff0c;结合智能家居产业发展趋势&#xff0c;说明设计基于 51 单片机的智能吊灯对提升生活便利性、降低能耗的现实意义。1.2 国内外研究现状简要介绍当…

CF每日三题(1500-1700)

1792C 逆向思维1036D 前缀和尺取1598D 组合数学取三元组 将二元组放在坐标系中更好找到规律 1792C 思维 1500 参考题解 正难则反 注意是对一个排列进行操作&#xff0c;最后还原成1,2,…,n 每次选两个数字很难想&#xff0c;反着想就是把1-n的排列变成所给数组的逆操作&#x…

Boost搜索引擎项目(详细思路版)

目录 项目相关背景 搜索引擎原理技术栈和项目环境 导入数据到自己的本地 数据去标签与数据清洗模块 Enumfile(src_path, &file_list)递归式写入 Parsehtml(file_list, &results)去标签 bool Parsetitle(const string& file, string* title)拆分标题 bool Pa…

AI产品经理面试宝典第69天:大模型稳定性评估与AI伦理挑战面试题全解析

1. AI伦理与技术挑战 1.1 问:你认为AI的最大挑战是什么? 答:AI面临的最大挑战是算法偏见与模型黑箱问题。具体表现为: 数据偏见放大:训练数据中隐含的性别、种族等偏见会被模型继承,如招聘算法中的性别歧视案例 决策透明性缺失:深度学习模型的可解释性不足,医疗诊断场…

【build】RDK构建系统v0.1 (持续更新。。。。)

一、 项目概述RDK构建系统是一个用于构建和定制嵌入式系统的自动化工具&#xff0c;通过简单的命令行操作&#xff0c;您可以完成从下载依赖包、定制根文件系统、构建内核到打包镜像的完整流程。该系统采用模块化设计&#xff0c;提供了丰富的配置选项&#xff0c;适用于不同的…

关于RSA和AES加密

RSA非对称加密 非对称加密不能传输大数据量&#xff0c;但比对称加密要安全&#xff0c;所以传输密码一般就是用的非对称加密 接口拿到RSA公钥然后再加密之后传给后端就好了 let crypt new JSEncrypt(); crypt.setPublicKey(res.message); // console.log(加密前:, data); let…

云蝠智能VoiceAgent:AI赋能售后服务场景的创新实践

引言&#xff1a;售后服务数字化转型的必然趋势在数字经济时代&#xff0c;售后服务已成为企业核心竞争力的重要组成部分。据统计&#xff0c;优质的售后服务能够提升客户留存率高达67%&#xff0c;同时降低客户获取成本约30%。然而&#xff0c;传统售后服务模式面临着人力成本…

C#控制台输入(Read()、ReadKey()和ReadLine())

下面我们来详细讲解 C# 中三种控制台输入方法&#xff1a;Console.Read()、Console.ReadKey() 和 Console.ReadLine() 的区别、原理、使用场景&#xff0c;并配上清晰的代码例子和运行结果说明。✅ 一、三者的根本区别&#xff08;一句话总结&#xff09;方法返回值读取方式是否…

Windows的Roaming文件夹的作用和Local/LocalLow的区别

&#x1f4c1; Roaming 文件夹的核心意义✅ 什么是“漫游”&#xff08;Roaming&#xff09;&#xff1f;跨设备同步&#xff1a;当用户登录到同一域内的不同 Windows 设备&#xff08;如公司或学校的办公电脑&#xff09;时&#xff0c;Roaming 文件夹中的数据会自动通过网络同…