.Net 优秀框架 ABP全面详解

在这里插入图片描述

文章目录

    • 第一部分:ABP框架概述与核心架构
      • 1.1 ABP框架简介
      • 1.2 ABP框架架构解析
        • 1.2.1 表现层(Presentation Layer)
        • 1.2.2 分布式服务层(Distributed Service Layer)
        • 1.2.3 应用层(Application Layer)
        • 1.2.4 领域层(Domain Layer)
        • 1.2.5 基础设施层(Infrastructure Layer)
      • 1.3 ABP模块系统深度解析
    • 第二部分:ABP核心功能详解
      • 2.1 领域驱动设计(DDD)实现
        • 2.1.1 实体(Entity)
        • 2.1.2 仓储(Repository)
      • 2.2 应用服务与DTO
      • 2.3 工作单元与事务管理
    • 第三部分:ABP高级特性与集成
      • 3.1 多租户系统实现
      • 3.2 身份认证与授权
      • 3.3 后台作业与实时服务
    • 第四部分:ABP实战与最佳实践
      • 4.1 项目结构与组织
      • 4.2 异常处理与验证
      • 4.3 性能优化技巧
    • 第五部分:ABP生态系统与扩展
      • 5.1 ABP商业版特性
      • 5.2 常用模块推荐
      • 5.3 社区资源与工具
    • 第六部分:ABP框架未来展望
      • 6.1 技术路线图
      • 6.2 与其他技术的比较
      • 6.3 何时选择ABP框架
    • 结论

在这里插入图片描述

第一部分:ABP框架概述与核心架构

1.1 ABP框架简介

ABP(ASP.NET Boilerplate)是一个开源的、模块化的应用程序框架,旨在简化现代Web应用程序的开发。它基于领域驱动设计(DDD)和SOLID原则,提供了一套完整的架构和最佳实践,帮助开发人员快速构建企业级应用程序。

发展历程

  • 2014年:首次发布,由Halil İbrahim Kalkan创建
  • 2016年:推出ABP Commercial商业版本
  • 2018年:重大更新,支持ASP.NET Core
  • 2020年:ABP Framework 4.0发布,完全模块化重构
  • 2023年:最新稳定版ABP 7.0,支持.NET 7

核心设计理念

  1. 模块化:应用程序由可重用模块组成
  2. 领域驱动:强调领域模型和业务逻辑
  3. 分层架构:清晰的分层结构(表示层、应用层、领域层、基础设施层)
  4. 约定优于配置:减少样板代码
  5. 可扩展性:易于定制和扩展

1.2 ABP框架架构解析

ABP采用经典的分层架构,但比传统三层架构更加精细:

1.2.1 表现层(Presentation Layer)
  • Web项目(MVC/Razor Pages/Blazor)
  • API项目(RESTful API)
  • 移动客户端接口
1.2.2 分布式服务层(Distributed Service Layer)
  • 应用服务(Application Services)
  • DTO自动映射
  • API版本控制
  • 动态Web API
1.2.3 应用层(Application Layer)
  • 应用服务实现
  • 数据传输对象(DTOs)
  • 工作单元(Unit of Work)
  • 授权和验证
1.2.4 领域层(Domain Layer)
  • 实体(Entities)
  • 值对象(Value Objects)
  • 聚合根(Aggregate Roots)
  • 领域服务(Domain Services)
  • 规约(Specifications)
  • 仓储接口(Repository Interfaces)
1.2.5 基础设施层(Infrastructure Layer)
  • 数据访问实现(Entity Framework Core)
  • 缓存实现(Redis)
  • 后台作业(Hangfire/Quartz)
  • 文件存储(Blob Storage)

1.3 ABP模块系统深度解析

ABP的核心是模块化设计,每个功能都封装为独立模块。

模块生命周期

  1. 配置服务(ConfigureServices)
  2. 初始化(OnApplicationInitialization)
  3. 关闭(OnApplicationShutdown)

典型模块结构示例

[DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreModule),typeof(AbpEntityFrameworkCoreModule)
)]
public class MyApplicationModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// 模块服务配置context.Services.AddTransient<IMyService, MyService>();// 配置DbContextConfigure<AbpDbContextOptions>(options =>{options.UseSqlServer();});}public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();var env = context.GetEnvironment();if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseConfiguredEndpoints();}
}

模块依赖机制

  • [DependsOn]属性声明模块依赖
  • ABP自动解析依赖顺序
  • 支持循环依赖检测
  • 模块服务自动注册

第二部分:ABP核心功能详解

2.1 领域驱动设计(DDD)实现

ABP深度集成了DDD的核心概念和实践:

2.1.1 实体(Entity)
public class Product : AggregateRoot<Guid>, IMustHaveTenant
{public int TenantId { get; set; }public string Name { get; set; }public float Price { get; set; }public int Stock { get; set; }public Product(string name, float price, int stock){Name = Check.NotNullOrWhiteSpace(name, nameof(name));Price = price;Stock = stock;}public void UpdateStock(int quantity){if (quantity <= 0){throw new ArgumentException("Quantity must be positive");}Stock += quantity;}
}

关键特性

  • 继承AggregateRootEntity基类
  • 内置审计属性(CreationTime, CreatorId等)
  • 领域事件支持
  • 多租户集成
  • 验证逻辑内置
2.1.2 仓储(Repository)

ABP为每个聚合根自动创建仓储接口:

public interface IProductRepository : IRepository<Product, Guid>
{Task<List<Product>> GetOutOfStockProductsAsync();Task<List<Product>> GetPriceRangeProductsAsync(float minPrice, float maxPrice);
}public class ProductRepository : EfCoreRepository<MyDbContext, Product, Guid>, IProductRepository
{public ProductRepository(IDbContextProvider<MyDbContext> dbContextProvider) : base(dbContextProvider){}public async Task<List<Product>> GetOutOfStockProductsAsync(){return await (await GetDbSetAsync()).Where(p => p.Stock <= 0).ToListAsync();}// 其他自定义方法实现...
}

仓储优势

  • 自动实现基本CRUD操作
  • 工作单元集成
  • 支持异步编程
  • 可扩展查询能力

2.2 应用服务与DTO

ABP应用服务充当领域层和表示层之间的中介:

public interface IProductAppService : IApplicationService
{Task<ProductDto> GetAsync(Guid id);Task<PagedResultDto<ProductDto>> GetListAsync(PagedAndSortedResultRequestDto input);Task<ProductDto> CreateAsync(CreateProductDto input);Task<ProductDto> UpdateAsync(Guid id, UpdateProductDto input);Task DeleteAsync(Guid id);
}public class ProductAppService : ApplicationService, IProductAppService
{private readonly IRepository<Product, Guid> _productRepository;public ProductAppService(IRepository<Product, Guid> productRepository){_productRepository = productRepository;}public async Task<ProductDto> GetAsync(Guid id){var product = await _productRepository.GetAsync(id);return ObjectMapper.Map<Product, ProductDto>(product);}public async Task<PagedResultDto<ProductDto>> GetListAsync(PagedAndSortedResultRequestDto input){var query = (await _productRepository.GetQueryableAsync()).OrderBy(input.Sorting ?? "Name");var products = await AsyncExecuter.ToListAsync(query.Skip(input.SkipCount).Take(input.MaxResultCount));var totalCount = await _productRepository.GetCountAsync();return new PagedResultDto<ProductDto>(totalCount,ObjectMapper.Map<List<Product>, List<ProductDto>>(products));}// 其他方法实现...
}

DTO自动映射

[AutoMap(typeof(Product))]
public class ProductDto : EntityDto<Guid>
{public string Name { get; set; }public float Price { get; set; }public int Stock { get; set; }public DateTime CreationTime { get; set; }
}[AutoMapTo(typeof(Product))]
public class CreateProductDto
{[Required][StringLength(128)]public string Name { get; set; }[Range(0.1, float.MaxValue)]public float Price { get; set; }[Range(0, int.MaxValue)]public int Stock { get; set; }
}

2.3 工作单元与事务管理

ABP的工作单元(UOW)模式:

public class OrderAppService : ApplicationService
{private readonly IRepository<Order, Guid> _orderRepository;private readonly IRepository<Product, Guid> _productRepository;public OrderAppService(IRepository<Order, Guid> orderRepository,IRepository<Product, Guid> productRepository){_orderRepository = orderRepository;_productRepository = productRepository;}[UnitOfWork]public async Task<OrderDto> CreateOrderAsync(CreateOrderDto input){// 自动事务开始var order = new Order(input.CustomerId);foreach (var item in input.Items){var product = await _productRepository.GetAsync(item.ProductId);product.UpdateStock(-item.Quantity);await _productRepository.UpdateAsync(product);order.AddItem(product.Id, item.Quantity, product.Price);}await _orderRepository.InsertAsync(order);// 如果所有操作成功,事务自动提交// 如果发生异常,事务自动回滚return ObjectMapper.Map<Order, OrderDto>(order);}
}

UOW特性

  • 方法级控制([UnitOfWork]特性)
  • 自动事务管理
  • 支持嵌套工作单元
  • 可配置隔离级别
  • 跨仓储事务一致性

第三部分:ABP高级特性与集成

3.1 多租户系统实现

ABP提供完善的多租户支持:

[DependsOn(typeof(AbpMultiTenancyModule))]
public class MyModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){Configure<AbpMultiTenancyOptions>(options =>{options.IsEnabled = true;});}
}public class Product : AggregateRoot<Guid>, IMustHaveTenant
{public int TenantId { get; set; }// 其他属性...
}public class ProductManager : DomainService
{private readonly IRepository<Product, Guid> _productRepository;public ProductManager(IRepository<Product, Guid> productRepository){_productRepository = productRepository;}public async Task<Product> CreateAsync(string name, float price){// 自动过滤当前租户的数据var existingProduct = await _productRepository.FirstOrDefaultAsync(p => p.Name == name);if (existingProduct != null){throw new BusinessException("ProductAlreadyExists").WithData("Name", name);}return new Product(name, price){TenantId = CurrentTenant.Id};}
}

多租户特性

  • 租户数据自动过滤
  • 租户解析策略(子域名、请求头、Cookie等)
  • 租户特定配置
  • 租户间数据隔离
  • 宿主与租户不同处理

3.2 身份认证与授权

ABP集成IdentityServer4和ASP.NET Core Identity:

[DependsOn(typeof(AbpIdentityApplicationModule))]
public class MyApplicationModule : AbpModule
{// 模块配置...
}[Authorize(Policy = "MyPolicy")]
public class SecureAppService : ApplicationService
{[AllowAnonymous]public async Task<string> PublicMethod(){return "Public data";}[Authorize("RequireAdminRole")]public async Task<string> AdminMethod(){return "Admin data";}[RequiresFeature("MyFeatureFlag")]public async Task<string> FeatureMethod(){return "Feature enabled data";}
}

权限配置

public override void ConfigureServices(ServiceConfigurationContext context)
{Configure<AuthorizationOptions>(options =>{options.AddPolicy("MyPolicy", policy =>{policy.RequireAuthenticatedUser();policy.Requirements.Add(new MinimumAgeRequirement(18));});});context.Services.AddSingleton<IAuthorizationHandler, MinimumAgeHandler>();
}

3.3 后台作业与实时服务

后台作业系统

public class MyReportGenerationJob : AsyncBackgroundJob<ReportGenerationArgs>, ITransientDependency
{private readonly IReportGenerator _reportGenerator;public MyReportGenerationJob(IReportGenerator reportGenerator){_reportGenerator = reportGenerator;}public override async Task ExecuteAsync(ReportGenerationArgs args){var report = await _reportGenerator.GenerateAsync(args.UserId,args.StartDate,args.EndDate);await _reportGenerator.SendEmailAsync(args.UserId, report);}
}// 作业调度
public class MySchedulerService : ITransientDependency
{private readonly IBackgroundJobManager _backgroundJobManager;public MySchedulerService(IBackgroundJobManager backgroundJobManager){_backgroundJobManager = backgroundJobManager;}public async Task ScheduleReportGenerationAsync(Guid userId){await _backgroundJobManager.EnqueueAsync<MyReportGenerationJob, ReportGenerationArgs>(new ReportGenerationArgs{UserId = userId,StartDate = DateTime.Now.AddDays(-7),EndDate = DateTime.Now});}
}

实时通知系统

public class OrderNotificationService : ITransientDependency
{private readonly INotificationPublisher _notificationPublisher;public OrderNotificationService(INotificationPublisher notificationPublisher){_notificationPublisher = notificationPublisher;}public async Task NotifyOrderStatusAsync(Order order){await _notificationPublisher.PublishAsync("OrderStatusChanged",new OrderStatusChangedNotificationData(order.Id, order.Status){// 仅发送给订单创建者UserIds = new[] { order.CreatorId.Value }});}
}// 客户端处理
public class OrderNotificationHandler : INotificationHandler<OrderStatusChangedNotificationData>,ITransientDependency
{private readonly ILogger<OrderNotificationHandler> _logger;public OrderNotificationHandler(ILogger<OrderNotificationHandler> logger){_logger = logger;}public async Task HandleEventAsync(OrderStatusChangedNotificationData eventData){_logger.LogInformation($"Order {eventData.OrderId} status changed to {eventData.NewStatus}");// 可以在这里触发UI更新或其他业务逻辑}
}

第四部分:ABP实战与最佳实践

4.1 项目结构与组织

推荐项目结构

MyCompany.MyProject
├── src
│   ├── MyCompany.MyProject.Application
│   ├── MyCompany.MyProject.Domain
│   ├── MyCompany.MyProject.EntityFrameworkCore
│   ├── MyCompany.MyProject.Web
│   └── MyCompany.MyProject.DbMigrator
├── test
│   ├── MyCompany.MyProject.Application.Tests
│   ├── MyCompany.MyProject.Domain.Tests
│   └── MyCompany.MyProject.Web.Tests
└── docs

领域层组织

Domain
├── Products
│   ├── Product.cs
│   ├── IProductRepository.cs
│   ├── ProductManager.cs
│   └── Specifications
├── Orders
│   ├── Order.cs
│   ├── OrderItem.cs
│   ├── IOrderRepository.cs
│   └── OrderManager.cs
└── Shared├── ValueObjects└── Services

4.2 异常处理与验证

自定义业务异常

public class ProductAlreadyExistsException : BusinessException
{public ProductAlreadyExistsException(string productName): base("PM:00001", $"The product '{productName}' already exists!"){WithData("productName", productName);}
}// 使用
public async Task CreateProductAsync(CreateProductDto input)
{if (await _productRepository.AnyAsync(p => p.Name == input.Name)){throw new ProductAlreadyExistsException(input.Name);}// 创建逻辑...
}

自动验证

public class CreateProductDto : IValidatableObject
{[Required][StringLength(128)]public string Name { get; set; }[Range(0.1, float.MaxValue)]public float Price { get; set; }[Range(0, int.MaxValue)]public int Stock { get; set; }public IEnumerable<ValidationResult> Validate(ValidationContext validationContext){if (Name.StartsWith("Test") && Price > 100){yield return new ValidationResult("Test products cannot have price over 100",new[] { nameof(Name), nameof(Price) });}}
}

4.3 性能优化技巧

  1. 仓储查询优化
// 不好的做法 - 加载所有数据到内存
var products = await _productRepository.GetAllListAsync();
var filtered = products.Where(p => p.Price > 100).ToList();// 推荐做法 - 数据库端过滤
var queryable = await _productRepository.GetQueryableAsync();
var filtered = await AsyncExecuter.ToListAsync(queryable.Where(p => p.Price > 100));
  1. DTO映射优化
// 不好的做法 - 逐个属性映射
public class ProductDto
{public static ProductDto MapFromProduct(Product product){return new ProductDto{Id = product.Id,Name = product.Name,// 其他属性...};}
}// 推荐做法 - 使用AutoMapper
CreateMap<Product, ProductDto>().ForMember(dest => dest.Price, opt => opt.MapFrom(src => src.Price * 1.2f)) // 添加增值税.ForMember(dest => dest.StockStatus, opt => opt.MapFrom(src => src.Stock > 0 ? "InStock" : "OutOfStock"));
  1. 缓存策略
[CacheName("ProductCache")]
public interface IProductCache
{Task<ProductDto> GetAsync(Guid productId);Task<List<ProductDto>> GetFeaturedProductsAsync();
}public class ProductCache : IProductCache, ITransientDependency
{private readonly IDistributedCache<ProductDto> _cache;private readonly IRepository<Product, Guid> _productRepository;public ProductCache(IDistributedCache<ProductDto> cache,IRepository<Product, Guid> productRepository){_cache = cache;_productRepository = productRepository;}public async Task<ProductDto> GetAsync(Guid productId){return await _cache.GetOrAddAsync(productId.ToString(),async () => await GetProductFromDatabaseAsync(productId),() => new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddHours(1)});}private async Task<ProductDto> GetProductFromDatabaseAsync(Guid productId){var product = await _productRepository.GetAsync(productId);return ObjectMapper.Map<Product, ProductDto>(product);}
}

第五部分:ABP生态系统与扩展

5.1 ABP商业版特性

ABP Commercial提供额外功能:

  • ABP Suite:代码生成工具
  • ABP CLI:命令行工具
  • 主题系统:专业UI主题
  • 高级模块
    • 支付集成
    • 聊天模块
    • CMS系统
    • 工作流引擎

5.2 常用模块推荐

  1. Volo.Abp.Identity:身份管理
  2. Volo.Abp.TenantManagement:租户管理
  3. Volo.Abp.FeatureManagement:功能开关
  4. Volo.Abp.PermissionManagement:权限管理
  5. Volo.Abp.SettingManagement:系统设置
  6. Volo.Abp.BackgroundJobs.Hangfire:Hangfire集成
  7. Volo.Abp.AspNetCore.SignalR:SignalR集成

5.3 社区资源与工具

  1. 官方文档:https://docs.abp.io
  2. 示例项目:https://github.com/abpframework/abp-samples
  3. ABP社区:https://community.abp.io
  4. ABP IO平台:https://abp.io
  5. Gitter聊天:https://gitter.im/abpframework/abp

第六部分:ABP框架未来展望

6.1 技术路线图

  1. .NET 8支持:优化性能和新特性集成
  2. 增强微服务支持:更好的Dapr集成
  3. Serverless架构:AWS Lambda/Azure Functions适配
  4. 更强大的Blazor支持:完善WASM体验
  5. AI集成:机器学习模型支持

6.2 与其他技术的比较

特性ABP FrameworkASP.NET Boilerplate.NET MAUIClean Architecture
模块化★★★★★★★★★☆★★☆☆☆★★★☆☆
DDD支持★★★★★★★★★☆★★☆☆☆★★★★☆
多租户★★★★★★★★★☆★☆☆☆☆★★☆☆☆
代码生成★★★★☆ (商业版)★★★☆☆★★☆☆☆★☆☆☆☆
前端集成★★★★☆★★★☆☆★★★★★★★☆☆☆
学习曲线★★★☆☆★★★★☆★★★☆☆★★★★☆

6.3 何时选择ABP框架

适合场景

  • 企业级复杂应用开发
  • 需要快速启动的标准业务系统
  • 多租户SaaS应用
  • 需要严格分层架构的项目
  • 长期维护的大型系统

不适合场景

  • 小型简单应用(可能过度设计)
  • 性能极端敏感的实时系统
  • 需要完全自定义架构的特殊项目
  • 资源有限的短期项目

结论

ABP框架为.NET开发者提供了一套完整的、基于最佳实践的企业级应用开发解决方案。通过其模块化设计、领域驱动支持、丰富的功能模块和活跃的社区,ABP能够显著提高开发效率,同时保证应用程序的质量和可维护性。无论是初创公司还是大型企业,ABP都能为不同类型的项目提供合适的架构基础和功能组件,是现代.NET全栈开发的强大工具集。

随着.NET生态系统的不断发展和ABP框架的持续演进,我们可以预见ABP将在未来企业应用开发中扮演更加重要的角色,特别是在云原生、微服务和跨平台应用领域。对于寻求高效、规范且可扩展开发体验的团队,ABP无疑是一个值得深入研究和采用的技术选择。

在这里插入图片描述

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

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

相关文章

力扣-198.打家劫舍

题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋…

windows 安装vllm cuda版本

windows 安装cuda版本 查看window cuda版本 nvidia-smi vllm 获取镜像,此版本需要cuda 版本12.8 或以上 docker pull vllm/vllm-openai:latest下载模型 git lfs installcd e:\ai mkdir vllm\models\qwen2cd vllm\models#通过git下载git clone https://www.modelscope.c…

Node.js特训专栏-基础篇:1. Node.js环境搭建与项目初始化详细指南

我将为你详细讲解 Node.js 环境搭建与项目初始化的步骤&#xff0c;包含常见问题解决和最佳实践&#xff0c;帮助你快速上手。 详细步骤说明 1. 环境搭建 Windows用户&#xff1a; 访问Node.js官网(https://nodejs.org)下载LTS版本安装包&#xff08;推荐长期支持版&#xf…

13.安卓逆向2-frida hook技术-HookJava构造方法

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

php基础:常见函数

内建函数 文章目录 内建函数1、文件操作函数&#xff1a;2、代码执行函数&#xff1a;3、反序列化函数&#xff1a;4、数据库操作函数&#xff1a;5、类型转换与比较函数&#xff1a;6、其他常见函数&#xff1a; 1、文件操作函数&#xff1a; include(): 导入并执行指定的 PHP…

教程:PyCharm 中搭建多级隔离的 Poetry 环境(从 Anaconda 到项目专属.venv)

核心思维&#xff1a;为什么需要 “多级隔离”&#xff1f; 在复杂项目中&#xff0c;环境冲突是最棘手的问题&#xff08;比如系统 Python 版本不同、依赖包版本冲突&#xff09;。通过 “Anaconda 虚拟环境 → 项目 Poetry 环境 → 工具级隔离” 的三层架构&#xff0c;实现…

Rollup vs Webpack 深度对比:前端构建工具终极指南

前端工程领域始终面临一个根本选择&#xff1a;如何在模块化编码规范与工程化构建效率之间取得最佳平衡。Rollup与Webpack分别代表着两种不同维度的解决方案&#xff0c;本文将揭示它们的真实应用场景与核心差异。 一、核心差异全景图&#xff08;附最新对比&#xff09; 核心能…

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…

Easy Excel

Easy Excel 一、依赖引入二、基本使用1. 定义实体类&#xff08;导入/导出共用&#xff09;2. 写 Excel3. 读 Excel 三、常用注解说明&#xff08;完整列表&#xff09;四、进阶&#xff1a;自定义转换器&#xff08;Converter&#xff09; 其它自定义转换器没生效 Easy Excel在…

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…

AI高考志愿助手应用架构设计并上线实施运行

环境: AI高考志愿助手 问题描述: AI高考志愿助手应用架构设计并上线实施运行 业务需求:开发一个AI升学助手,功能是帮助用户模拟填报高考志愿等功能,数据是历年各专业的录取分数线表格。数据确认: 近3年约100多万条数据,原始数据是excel表格数据。解决方案: 一、项…

深入浅出掌握 Axios(持续更新)

在了解ajax和axios之前&#xff0c;我们先观察一下他们是什么英文的缩写 ajax 的名字为 asynchroanous JavaScript and XML 而axios的名称来源于英文单词“axis”与“I/O”的结合&#xff0c;并非直接缩写自某个特定短语。 先导知识 在本文我们简单的介绍一下ajax后着重讲解…

windows10下搭建nfs服务器

windows10下搭建nfs服务器 有参考这篇博客 Windows10搭建NFS服务 - fuzidage - 博客园 下载 NFS Server这个app 通过网盘分享的文件&#xff1a;nfs1268 (1).exe 链接: https://pan.baidu.com/s/1rE4h710Uh-13kWGXvjkZzw 提取码: mwa4 --来自百度网盘超级会员v5的分享 下载后…

npm符号链接

前言 最近在写一个快应用项目&#xff0c;demo中依赖了本地文件&#xff0c;package.json如下&#xff1a; 此时 node_modules 下出现了 mysdk&#xff0c;复制整个项目&#xff0c;但是copy的项目中的node_modules并未出现该文件&#xff0c;导致报错。 解决方案 观察 pa…

SQL 中 IDENTITY 列的特殊处理.

SQL 处理中,遇到提示: "消息 544,级别 16,状态 1,第 3 行 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 BM 中的标识列插入显式值。" 即当 SQL Server 表中的 ​​标识列(Identity Column)​​ 插入显式值,但未启用 IDENTITY_INSERT 选项。由此报错,以下是详…

网络安全等级保护中关于SSL证书的整改如何处理?

SSL证书在网络安全等级保护&#xff08;等保&#xff09;体系中扮演着至关重要的角色&#xff0c;是实现多个等保核心要求&#xff08;尤其是三级及以上&#xff09;的关键技术手段之一。其重要性主要体现在以下几个方面&#xff1a; 满足“身份鉴别”要求&#xff08;等保要求…

Docker容器化打造elasticsearch8.18.2集群企业实战(含kibana+证书认证)

主机信息 主机配置4Core8GB硬盘大于80GB 主机名IP地址角色10-0-17-12310.0.17.123es-node110-0-17-15810.0.17.158es-node2kibana-15610.0.17.156kibana 一、环境准备 1. 安装 Docker 这里就不介绍如何安装docker了&#xff0c;本文docker版本为20 2. 主机名与网络与内核配置…

JAVA语言的学习(Day_1)

写一个项目并运行&#xff1a; 第一步&#xff1a;新建一个.txt文本。右击点开用Notepad打开&#xff0c;并编辑。 编辑并保存后&#xff0c;可以在文件的查看中&#xff0c;显示出文件的类型&#xff08;eg: .txt / .java)。将txt文本的.txt类型改为.java。 之后在下面的截…

JS 原型与原型链详解

JavaScript 原型与原型链详解 文章目录 JavaScript 原型与原型链详解一、基础概念类1.1 什么是原型&#xff1f;JavaScript 中如何访问一个对象的原型&#xff1f;1.2 构造函数、实例对象和原型对象之间的关系是什么&#xff1f;1.3 prototype 和 **proto** 的区别是什么&#…

DEVICENET转MODBUS TCP网关连接DeviceNet数字远程IO模块配置案例

设备与网络架构&#xff0c;主控设备&#xff1a;支持Modbus TCP协议的PLC&#xff08;如西门子S7-1200&#xff09;。网关设备&#xff1a;开疆智能Modbus TCP转DeviceNet网关KJ-DVCZ-MTCPS&#xff08;需支持DeviceNet从站功能&#xff09;。目标设备&#xff1a;DeviceNet数…