基于.NET MAUI与ChatGPT API的跨平台AI对话应用开发实战

news2026/5/8 7:04:31
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的开源项目叫danielmonettelli/dotnetmaui-chatgpt-app-oss。光看名字就能拆解出几个关键信息这是一个基于 .NET MAUI 框架开发的、集成了 ChatGPT 功能的跨平台桌面应用并且是开源的。对于咱们 .NET 开发者尤其是对移动和桌面跨端开发感兴趣的朋友来说这个项目就像一块“活化石”它完整地展示了如何将一个前沿的AI能力用微软最新的跨平台UI框架给“包装”成一个可用的产品。我花了不少时间把它的代码仓库翻了个底朝天也自己动手编译运行了一遍发现它远不止是一个简单的“调用API的壳子”。这个项目麻雀虽小五脏俱全从项目结构设计、MVVM模式的应用、到与OpenAI API的深度集成、本地状态管理甚至是一些提升用户体验的细节都值得拿出来好好聊聊。无论你是想学习 .NET MAUI 的实战技巧还是想了解如何将大语言模型LLM优雅地集成到客户端应用中这个项目都是一个绝佳的参考样本。2. 技术栈深度解析为什么是 .NET MAUI ChatGPT2.1 .NET MAUI 的选择跨平台的统一与性能权衡这个项目选择 .NET MAUI 作为客户端框架是一个非常典型的现代 .NET 技术选型思路。MAUI 的全称是 .NET Multi-platform App UI你可以把它理解为 Xamarin.Forms 的进化版和官方正统继承者。它的核心价值在于允许开发者用一套 C# 和 XAML 代码构建可以运行在 Android、iOS、macOS 和 Windows 上的原生应用。对于dotnetmaui-chatgpt-app这样一个以文本交互为核心、对原生控件依赖度不极端高的应用来说MAUI 的性价比非常高。我仔细看了项目的*.csproj文件它明确指定了TargetFrameworks为net8.0-android、net8.0-ios、net8.0-maccatalyst和net8.0-windows。这意味着它瞄准的是 .NET 8 这一长期支持版本保证了技术的先进性和稳定性。选择 MAUI 而非常见的 Electron 或 Flutter对于 .NET 技术栈的团队而言有几个显著优势首先是开发语言统一前后端都可以用 C#降低了上下文切换成本其次是能深度利用 .NET 生态的成熟库比如依赖注入、配置管理、序列化等再者对于需要调用一些特定平台原生能力比如系统通知、本地文件存取的场景MAUI 通过DependencyService或新的MAUI Essentials提供了相对标准的访问方式。当然MAUI 的缺点也很明显比如相对年轻的社区、在某些平台上的性能开销和控件丰富度可能不如原生开发或更成熟的跨平台框架。但这个项目作为一个技术演示完美地避开了这些短板专注于展示其核心能力。2.2 ChatGPT API 集成不仅仅是发送 HTTP 请求项目的核心功能是对话自然离不开与 OpenAI 的 ChatGPT API或兼容 API交互。翻看其服务层代码你会发现它并没有简单粗暴地用一个HttpClient把请求发出去就完事。它构建了一个相对完整的抽象层。通常这类集成会涉及几个关键部分API 客户端封装项目里应该有一个OpenAIService或类似的类它内部封装了HttpClient负责设置认证头Authorization: Bearer sk-xxx、构建请求体包含模型、消息列表、温度、最大令牌数等参数、发送请求并处理响应。这里的关键是错误处理比如网络超时、API 配额不足、模型不可用等都需要有友好的用户提示。对话上下文管理ChatGPT 的对话能力依赖于上下文。项目需要维护一个“会话”Conversation或“聊天记录”Chat History的概念。每次用户发送新消息不仅要把这条消息发出去通常还要附带上一定轮数的历史对话以节省 Token 并保持连贯性。在dotnetmaui-chatgpt-app中我看到了它用 ObservableCollection 来绑定 UI 列表同时这个集合也是构建 API 请求消息列表的数据来源。流式响应处理为了获得类似 ChatGPT 官网那种一个字一个字“打字”出来的效果必须使用 API 的流式响应Streaming Response功能。这意味着不能简单等待整个响应完成再显示而是要监听 HTTP 响应的流每收到一个数据块chunk就解析并追加到界面上。这在 MAUI 中涉及到异步流IAsyncEnumerable的处理和 UI 线程的同步更新是技术实现上的一个小难点也是体验好坏的关键。配置与密钥管理API 密钥是敏感信息。项目通常会提供一个设置界面让用户填入自己的密钥。密钥的存储必须安全在移动端应使用平台提供的安全存储 API如 Android 的 Keystore、iOS 的 Keychain在 MAUI 中可以通过SecureStorage来实现。项目开源但绝不会包含有效的 API 密钥。注意在实际开发中强烈建议不要在客户端应用中硬编码或直接存储未加密的 API 密钥。更安全的架构是自建一个轻量的后端代理服务客户端将请求发送到你的代理由代理添加密钥后转发给 OpenAI。这样既能隐藏密钥也能方便地做请求日志、限流、费用分摊等管理。不过对于这个开源演示项目让用户自行配置密钥是最简单直接的方式。3. 项目架构与 MVVM 模式实践3.1 清晰的分层结构打开项目的解决方案你会发现一个非常标准的 MAUI 项目结构这体现了良好的架构意识Models定义核心数据模型比如ChatMessage包含角色、内容、时间戳、Conversation、ApiConfiguration等。这些是纯数据对象。ViewModels这是 MVVM 模式的核心。你会找到MainViewModel、SettingsViewModel等。它们包含了视图的状态如消息列表、输入框文本、是否正在加载和命令如发送消息命令、清空历史命令。ViewModel 通过INotifyPropertyChanged接口通知视图更新。Views对应 XAML 页面如MainPage.xaml、SettingsPage.xaml。它们的数据上下文DataContext被设置为对应的 ViewModel通过数据绑定将 UI 控件与 ViewModel 的属性连接起来。XAML 中大量使用了Binding语法。Services存放业务逻辑服务如前面提到的IOpenAIServiceAI 对话服务、ILocalDataService本地数据持久化服务等。这些服务通过依赖注入DI的方式注入到 ViewModel 中实现了关注点分离便于测试和维护。Converters可能包含一些值转换器IValueConverter用于在数据绑定过程中转换数据格式比如将DateTime转换为更友好的“几分钟前”显示。PlatformsMAUI 特有的平台特定代码目录用于处理 Android、iOS、Windows 等平台在实现某些功能时的差异。3.2 数据绑定与命令驱动MVVM 的精髓是数据绑定。在这个聊天应用中体现得淋漓尽致消息列表绑定MainViewModel中有一个ObservableCollectionChatMessage Messages属性。XAML 中的CollectionView或ListView的ItemsSource就绑定到这个属性。当在 ViewModel 中向Messages添加或删除项时UI 列表会自动刷新。输入控件绑定输入框的Text属性可能绑定到 ViewModel 的UserInputText属性。按钮的Command属性绑定到 ViewModel 的SendMessageCommand一个ICommand的实现。状态指示绑定一个表示“正在加载”的动画或控件其IsVisible属性可能绑定到 ViewModel 的IsBusy属性。当开始发送请求时IsBusy设为trueUI 就显示加载状态收到响应后再设为false。这种模式使得 ViewModel 完全不依赖具体的 UI 框架可以独立进行单元测试。例如你可以测试“当SendMessageCommand执行时是否会使用正确的参数调用IOpenAIService并在成功后向Messages集合添加新的消息”。3.3 依赖注入与生命周期管理.NET MAUI 内置了对依赖注入的良好支持通常体现在MauiProgram.cs文件中。在这个项目里你会看到类似以下的代码builder.Services.AddSingletonIOpenAIService, OpenAIService(); builder.Services.AddSingletonMainViewModel(); builder.Services.AddSingletonMainPage();这里IOpenAIService和MainViewModel都被注册为单例Singleton。对于OpenAIService单例是合理的因为它可能内部维护了一个HttpClient。对于MainViewModel注册为单例意味着整个应用生命周期内只有一个实例这保证了聊天状态消息历史在页面导航时不会丢失。然后在MainPage.xaml.cs的构造函数中通过[Inject]特性或从Application.Current.Handler.MauiContext.Services获取服务容器来解析出MainViewModel的实例并赋值给页面的BindingContext。这种模式使得代码高度可测试和可维护。如果你想替换 AI 服务提供商比如从 OpenAI 换成 Claude只需要实现一个新的IOpenAIService并在MauiProgram.cs中修改注册即可ViewModel 和 View 的代码完全不用动。4. 核心功能实现细节与踩坑实录4.1 流式对话的实现与 UI 更新这是项目中最具技术含量和体验提升的部分。非流式对话很简单用户点击发送 - 显示用户消息 - 显示一个加载指示器 - 调用 API - 等待完整响应 - 隐藏加载器 - 显示 AI 回复。但流式对话完全不同目标是实现“打字机”效果。实现原理 OpenAI 的 Chat Completions API 在请求时设置stream: true返回的就不是一个完整的 JSON而是一个text/event-stream格式的流。每个数据块是一个 SSEServer-Sent Events消息以data:开头。当内容块是[DONE]时表示流结束。在 .NET MAUI 中的实现步骤创建可取消的请求因为流式响应可能很长需要允许用户中途取消。使用CancellationTokenSource。使用HttpClient发送请求并读取流调用HttpClient.SendAsync时传入HttpCompletionOption.ResponseHeadersRead这样一旦收到响应头就可以开始读取内容体而不是等待整个响应体下载完。逐块读取与解析使用StreamReader逐行读取响应流。识别data:行解析其后的 JSON。关键的增量内容在choices[0].delta.content字段里。增量更新 UI每解析出一段新的content就将其追加到当前正在回复的ChatMessage对象的Content属性末尾。由于Content属性实现了INotifyPropertyChangedUI 上绑定的Label或TextBlock就会实时更新。我踩过的坑UI 线程更新从网络流中读取数据是在后台线程。直接更新绑定到 UI 的ViewModel属性会引发跨线程访问异常。必须使用MainThread.BeginInvokeOnMainThread或Dispatcher.Dispatch来将更新操作封送到 UI 线程。在 MAUI 中更优雅的方式是在 ViewModel 的属性 setter 里或者使用社区工具包中的ObservableProperty特性如果项目用了CommunityToolkit.Mvvm它们内部通常会处理线程调度。性能与流畅度如果每收到一个字符就更新一次 UI在低端设备上可能会导致卡顿。一个常见的优化是设置一个小的缓冲区比如累积 5-10 个字符或等待一个很短的时间间隔如 50ms再更新一次 UI在实时性和流畅度之间取得平衡。错误处理流式响应过程中网络中断怎么办API 返回错误怎么办代码必须健壮地处理这些异常并给用户明确的反馈例如“网络连接中断已停止接收”同时可能还要保留已收到的部分内容。4.2 对话历史的管理与持久化用户肯定不希望每次关闭应用聊天记录就没了。因此本地持久化是必备功能。数据结构设计 通常一个Conversation对象包含一个Id如 GUID、一个Title可以自动用第一条消息生成、一个CreatedAt时间戳以及一个ListChatMessage。ChatMessage则包含Role(user/assistant)、Content、Timestamp。持久化方案选择SQLite关系型数据库适合结构复杂、需要查询的场景。.NET MAUI 对 SQLite 支持很好可以通过sqlite-net-pcl或Microsoft.EntityFrameworkCore.Sqlite库来操作。如果应用需要支持复杂的对话管理如搜索历史消息、按标签分类SQLite 是首选。文件序列化将ListConversation直接序列化为 JSON 文件保存在应用本地目录。实现简单适合数据量不大的场景。dotnetmaui-chatgpt-app项目很可能采用了这种方式因为它足够轻量。Preferences / SecureStorageMAUI 提供的轻量级键值对存储。适合存储简单的配置不适合存储大量的结构化历史数据。在项目中的实现 我推测项目中会有一个ILocalDataService接口定义了SaveConversationAsync、LoadConversationsAsync、DeleteConversationAsync等方法。其实现类会使用System.Text.Json或Newtonsoft.Json进行序列化文件路径则通过FileSystem.AppDataDirectory获取这是一个跨平台的、应用私有的目录。注意事项序列化循环引用如果Conversation和ChatMessage互相引用序列化时要小心处理循环引用问题或者使用[JsonIgnore]特性忽略某些属性。数据迁移如果未来更新了数据模型比如给ChatMessage加了个新字段需要考虑旧版本数据如何迁移到新格式。简单的应用可以忽略或者清空旧数据。复杂的应用需要写迁移脚本。性能当历史记录非常多时一次性加载所有 JSON 文件可能内存压力大。可以考虑分页加载或者改用数据库。4.3 设置页面的实现与安全考量设置页面通常包含API 密钥输入一个Entry控件其Text属性绑定到SettingsViewModel.ApiKey。为了安全这个Entry的IsPassword属性应设为true以隐藏明文。保存时应调用SecureStorage.SetAsync(“api_key”, value)。模型选择一个Picker数据源绑定到AvailableModels列表如[“gpt-3.5-turbo”, “gpt-4”]选中项绑定到SelectedModel。参数调节如Temperature创造性、MaxTokens最大生成长度等可以用Slider或带步进的Entry来绑定。安全存储实操 在 MAUI 中使用SecureStorage非常简单// 保存 await SecureStorage.SetAsync(“openai_api_key”, apiKey); // 读取 var apiKey await SecureStorage.GetAsync(“openai_api_key”);在 Android 上这背后会使用 Android Keystore在 iOS 上使用 Keychain在 Windows 上使用 Data Protection API。这比直接存到Preferences或文件里要安全得多。配置的加载与生效SettingsViewModel在初始化时应从SecureStorage和Preferences中加载保存的配置。而MainViewModel中的IOpenAIService实例应该在构造时或通过一个方法接收这些配置参数。这里有一个设计选择是每次调用 AI 服务时都从设置中读取最新值还是只在应用启动/设置保存时更新服务实例的内部状态前者更灵活后者性能稍好。在这个项目中考虑到设置不会频繁变更很可能采用后者当用户在设置页面点击“保存”时不仅持久化配置还会通过消息机制如WeakReferenceMessenger或直接调用服务层的方法来更新OpenAIService实例的配置。5. 跨平台适配与性能优化要点5.1 平台特定代码与条件编译尽管 MAUI 追求最大化的代码共享但总有需要处理平台差异的时候。例如状态栏/刘海屏适配在 iOS 和部分 Android 机型上需要设置页面内容避开顶部状态栏。这通常在App.xaml.cs或特定页面的 XAML 中通过设置UseSafeArea等属性或平台特定的样式来处理。键盘交互在移动端当输入框获取焦点时键盘弹出可能会遮挡输入框。需要滚动页面或将输入框定位到可视区域。MAUI 社区有一些现成的行为Behavior或效果Effect可以帮助处理。应用生命周期在移动平台应用切换到后台可能被暂停或终止。需要在App.xaml.cs中重写OnSleep和OnResume方法及时保存当前对话状态防止数据丢失。对于必须写平台特定代码的情况MAUI 提供了条件编译和部分类partial class的机制。例如你可以在共享项目中声明一个接口IPlatformSpecificService然后在Platforms/Android和Platforms/iOS文件夹下分别实现它最后在MauiProgram.cs中根据平台注册对应的实现。5.2 内存管理与响应式优化聊天应用是典型的数据列表应用随着对话轮数增加Messages集合可能变得很大尤其是当消息内容很长时比如 AI 生成了长篇大论。优化策略虚拟化列表确保用于显示消息的CollectionView或ListView开启了CachingStrategy缓存策略和虚拟化。这能保证只有屏幕上可见的项才会被创建和渲染滚动时复用视图极大提升性能。限制历史消息加载不一定每次启动都要加载全部历史的所有对话的所有消息。可以改为只加载最近 N 条对话的摘要当用户点开某个对话时再懒加载该对话的详细消息。图片与资源处理如果应用支持 Markdown 并渲染其中的图片要注意图片的下载和缓存。避免重复下载也要注意及时释放不再使用的图片资源的内存。流式响应时的频繁更新如前所述流式响应会导致Content属性频繁更新进而触发 UI 重绘。确保绑定的是纯文本控件避免在每次属性更新时触发复杂的布局计算。5.3 离线处理与网络状态感知一个健壮的应用应该考虑网络异常情况。网络状态检查在发送消息前可以使用Connectivity.Current.NetworkAccess检查当前网络状态。如果为None应提示用户“网络不可用”。队列与重试对于发送失败的消息可以将其加入一个待发送队列等网络恢复后自动重试。这需要更复杂的本地状态管理将消息标记为“发送中”、“发送失败”、“已发送”。部分功能的离线可用性即使没有网络用户也应该能查看历史对话、编辑未发送的草稿。这要求本地数据层设计得足够独立和健壮。6. 项目构建、调试与扩展建议6.1 从零开始运行项目如果你想把项目拉下来自己跑一遍通常的步骤是环境准备确保安装了最新版本的 Visual Studio 2022 或 VS Code with .NET MAUI 扩展以及 .NET 8 SDK。克隆项目git clone https://github.com/danielmonettelli/dotnetmaui-chatgpt-app-oss.git还原 NuGet 包在项目根目录运行dotnet restore。配置 API 密钥运行应用找到设置页面填入你自己的 OpenAI API 密钥。切记不要将包含真实密钥的代码提交到任何公开仓库选择启动项目在 Visual Studio 中解决方案可能会有多个启动项Android、iOS、Windows 等。根据你的开发环境选择对应的项目。在 Windows 上开发通常直接调试 Windows 项目最方便。编译与运行点击运行。第一次构建 MAUI 项目可能会花费一些时间因为它需要下载对应的平台工具链和依赖。6.2 调试技巧与常见问题调试 MAUI UI可以使用 Live Visual Tree 和 Live Property Explorer 工具在 Visual Studio 的调试会话中可用来实时查看和修改运行中的 UI 元素属性对于排查布局问题非常有用。查看网络请求调试 API 调用时可以使用像HttpClient的日志处理器或者更简单地在OpenAIService中关键位置打上日志输出请求和响应的摘要。也可以使用外部工具如 Fiddler 或 Charles 来抓包但需要注意配置 MAUI 应用的网络代理。平台特定问题Android如果遇到“无法连接 localhost”的问题记得 Android 模拟器或设备将localhost指向自身要连接宿主机的服务需使用10.0.2.2这个特殊 IP。iOS需要 Apple 开发者账号和证书才能部署到真机。在模拟器上调试则简单很多。Windows通常是最容易调试的平台但要注意应用打包和分发时的证书签名问题。6.3 可能的扩展方向这个开源项目提供了一个坚实的起点你可以基于它探索更多有趣的方向多模型支持除了 OpenAI可以集成 Anthropic Claude、Google Gemini、国内的大模型等。设计一个通用的IChatAIService接口然后为每个提供商实现适配器。本地模型集成随着 Ollama、LM Studio 等工具的流行可以在设置中增加“本地端点”选项让应用连接到本地运行的 Llama、Phi 等开源模型实现完全离线的智能对话。功能增强对话管理支持对话重命名、分组、置顶、搜索。消息操作复制单条消息、重新生成上一条回复、编辑用户历史消息后重新生成后续对话。上下文长度管理自动计算 Token 数当接近模型上限时智能地总结或移除最早的历史消息。Prompt 模板库内置一些常用的角色扮演或任务执行 Prompt方便用户一键使用。UI/UX 优化代码高亮如果 AI 回复包含代码块实现语法高亮。Markdown 富渲染更完整地支持 Markdown 表格、列表、数学公式等。语音输入/输出集成语音识别和合成实现语音对话。云同步通过自建后端或利用云服务如 Azure Cosmos DB实现聊天记录在不同设备间的同步。这个danielmonettelli/dotnetmaui-chatgpt-app-oss项目就像一份精心编写的“食谱”不仅告诉你如何用 .NET MAUI 炒出一盘“AI 对话”的菜更展示了组织厨房项目结构、选择食材技术栈、控制火候状态管理的整套方法论。对于想要进入跨平台 AI 应用开发领域的 .NET 开发者来说仔细研读并动手实践这个项目远比看十篇泛泛而谈的教程更有收获。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…