万字长文+示例代码详解DDD中常用的架构(含代码示例)
目录
分层架构(Layered Architecture)
概念
示例代码
总结
领域驱动设计的六边形架构(Hexagonal Architecture)
概念
示例代码
总结
CQRS(Command Query Responsibility Segregation)
概念
示例代码
总结
微服务架构(Microservices Architecture)
概念
示例代码
总结
领域事件驱动架构(Domain Event-Driven Architecture)
概念
示例代码
总结
如何选择?
分层架构(Layered Architecture)
概念
分层架构是一种常见的架构模式,将应用程序分为不同的层次,每个层次有特定的职责。典型的分层架构包括表示层(Presentation Layer)、应用层(Application Layer)、领域层(Domain Layer)和基础设施层(Infrastructure Layer)。分层架构能够将关注点分离,提高系统的可维护性和可扩展性。
常见的分层架构通常包括以下几个层次:
-
表示层(Presentation Layer):表示层负责处理用户界面和用户交互。它可以是Web界面、移动应用程序界面或其他用户界面。表示层负责接收用户的请求,将其转发给应用层进行处理,并将应用层的响应反馈给用户。
-
应用层(Application Layer):应用层是系统的核心,负责协调业务逻辑的执行。它接收来自表示层的请求,将请求转化为适当的领域操作,并协调领域层的对象进行处理。应用层不包含具体的业务逻辑,而是将业务逻辑委托给领域层。
-
领域层(Domain Layer):领域层包含系统的核心业务逻辑和领域模型。它包含了领域对象、实体、值对象以及领域服务。领域层负责实现业务规则、验证和状态变更等核心领域逻辑。
-
基础设施层(Infrastructure Layer):基础设施层提供与外部系统的交互,如数据库、文件系统、消息队列等。它包含了各种技术实现和框架,用于支持应用程序的运行。基础设施层还可以包括数据访问层、消息传递层、日志记录等。
示例代码
举一个栗子,如下:
// 表示层
public class UserController {private UserService userService;public UserController(UserService userService) {this.userService = userService;}public void createUser(String name, String email, String password) {// 处理用户创建请求userService.createUser(name, email, password);// 返回响应给用户}// 其他用户相关操作的方法
}// 应用层
public class UserService {private UserRepository userRepository;// 可能还有其他依赖注入的服务或组件public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public void createUser(String name, String email, String password) {// 执行业务逻辑,如验证、密码加密等User user = new User(name, email, password);userRepository.save(user);}// 其他用户相关操作的方法
}// 领域层
public class User {private String name;private String email;private String password;public User(String name, String email, String password) {// 属性赋值和验证等逻辑}// 其他领域逻辑和操作的方法
}// 基础设施层
public class UserRepository {public void save(User user) {// 将用户保存到数据库}// 其他数据库操作的方法
}// 在应用程序的入口点或配置中,组装和注入各个层次的对象
public class Application {public static void main(String[] args) {UserRepository userRepository = new UserRepository();UserService userService = new UserService(userRepository);UserController userController = new UserController(userService);// 启动应用程序,处理用户请求等}
}
将应用程序分为表示层、应用层、领域层和基础设施层。每个层次都有明确的职责,表示层处理用户界面和交互,应用层协调业务逻辑的执行,领域层包含核心业务逻辑和领域模型,基础设施层处理与外部系统的交互。
总结
通过分层架构,我们可以将关注点分离,使代码更易于维护、测试和扩展。每个层次可以独立变化,而不会对其他层次产生过多影响。这种组织方式可以帮助我们更好地遵循领域驱动设计的原则,并支持清晰的代码组织和职责划分。
领域驱动设计的六边形架构(Hexagonal Architecture)
概念
领域驱动设计的六边形架构(Hexagonal Architecture),也被称为端口和适配器模式(Ports and Adapters Pattern),是一种用于构建可测试、可扩展和松耦合系统的架构模式。它强调将领域模型作为核心,并将其与外部系统隔离开来,以便更好地实现领域模型的独立演化。
在六边形架构中,系统被视为一个六边形,核心领域模型位于中心,与外部系统通过适配器(Adapter)进行交互。领域模型定义了系统的核心业务逻辑和领域对象,而适配器负责将外部系统与领域模型连接起来。
示例代码
// 领域模型
public class Product {private String name;private String description;private BigDecimal price;// 构造函数、属性和方法等
}// 适配器接口
public interface ProductRepository {void save(Product product);Product getById(String id);List<Product> getAll();// 其他与数据存储相关的方法
}// 适配器实现
public class InMemoryProductRepository implements ProductRepository {private Map<String, Product> productMap = new HashMap<>();@Overridepublic void save(Product product) {productMap.put(product.getId(), product);}@Overridepublic Product getById(String id) {return productMap.get(id);}@Overridepublic List<Product> getAll() {return new ArrayList<>(productMap.values());}
}// 领域服务接口
public interface ProductService {void createProduct(String name, String description, BigDecimal price);Product getProductById(String id);List<Product> getAllProducts();// 其他领域服务方法
}// 领域服务实现
public class ProductServiceImpl implements ProductService {private ProductRepository productRepository;public ProductServiceImpl(ProductRepository productRepository) {this.productRepository = productRepository;}@Overridepublic void createProduct(String name, String description, BigDecimal price) {Product product = new Product(name, description, price);productRepository.save(product);}@Overridepublic Product getProductById(String id) {return productRepository.getById(id);}@Overridepublic List<Product> getAllProducts() {return productRepository.getAll();}// 其他领域服务方法的实现
}// 在应用程序的入口点或配置中,组装和注入适配器和领域服务
public class Application {public static void main(String[] args) {ProductRepository productRepository = new InMemoryProductRepository();ProductService productService = new ProductServiceImpl(productRepository);// 启动应用程序,使用领域服务进行业务操作}
}
在上面的栗子中,我们有一个核心的领域模型Product
,它表示产品实体。然后,我们定义了适配器接口ProductRepository
,它定义了与数据存储相关的操作。InMemoryProductRepository
是一个适配器的实现,它使用内存来存储产品数据。在领域服务方面,我们定义了ProductService
接口,它提供了对产品领域的操作。ProductServiceImpl
是领域服务的具体实现,它依赖于ProductRepository
适配器进行数据存储。领域模型和领域服务就位于系统的核心位置,与外部系统通过适配器进行交互。
总结
六边形架构的优势在于它的灵活性和可测试性。通过将领域模型与外部系统隔离开来,我们可以独立地测试领域逻辑,并对外部系统进行模拟或替代。此外,六边形架构还支持领域模型的独立演化,使系统更具灵活性和可扩展性。
CQRS(Command Query Responsibility Segregation)
概念
CQRS 是一种将读操作(Query)和写操作(Command)分离的架构模式。它通过将读模型和写模型分开来优化系统的可扩展性和性能。在 CQRS 中,读操作可以通过专门的查询模型进行处理,而写操作则由领域模型负责。
在传统的 CRUD(Create, Read, Update, Delete)模式中,通常将读写操作合并在同一个接口或服务中。而在 CQRS 中,将读操作和写操作分离为独立的接口和服务,分别针对不同的需求进行优化。
示例代码
// Command 模型
public class CreateUserCommand {private String name;private String email;private String password;// 构造函数、属性和方法等
}// Command 处理器
public class UserCommandHandler {public void handleCreateUserCommand(CreateUserCommand command) {// 执行创建用户的业务逻辑,包括验证、密码加密等User user = new User(command.getName(), command.getEmail(), command.getPassword());// 将用户保存到数据库或事件日志等}// 其他 Command 处理器的方法
}// Query 模型
public class GetUserQuery {private String userId;// 构造函数、属性和方法等
}// Query 处理器
public class UserQueryHandler {public User handleGetUserQuery(GetUserQuery query) {// 查询用户的业务逻辑,可能涉及数据库查询、缓存等User user = // 从数据库或缓存中获取用户信息return user;}// 其他 Query 处理器的方法
}// 在应用程序的入口点或配置中,组装和注入 Command 处理器和 Query 处理器
public class Application {public static void main(String[] args) {UserCommandHandler commandHandler = new UserCommandHandler();UserQueryHandler queryHandler = new UserQueryHandler();// 启动应用程序,处理命令和查询}
}
代码中,Command 模型和对应的 Command 处理器,用于处理写操作。CreateUserCommand
表示创建用户的命令,UserCommandHandler
负责处理该命令并执行相应的业务逻辑。Query 模型和对应的 Query 处理器,用于处理读操作。GetUserQuery
表示获取用户的查询,UserQueryHandler
负责处理该查询并返回相应的结果。
总结
CQRS 的优势在于它能够根据不同的操作类型进行优化,提高系统的性能和可伸缩性。通过将读写操作分离,可以针对不同的操作类型采用不同的数据存储和处理方式。此外,CQRS 还能够帮助实现更好的领域模型设计,使系统更加灵活和可扩展。
微服务架构(Microservices Architecture)
概念
微服务架构是一种将应用程序拆分为一组小型、独立部署的服务的架构模式。每个微服务都专注于某个特定的业务领域,并通过轻量级的通信机制进行交互。微服务架构有助于团队的自治性和系统的可扩展性,但也增加了系统的复杂性。
微服务架构的主要特点包括:
-
服务拆分:应用程序被拆分为多个小型服务,每个服务具有清晰的边界和独立的责任。
-
独立部署:每个服务可以独立地进行开发、测试、部署和扩展,不会影响其他服务。
-
松耦合通信:服务之间使用轻量级的通信机制进行通信,如RESTful API、消息队列等。
-
基础设施自治:每个服务可以选择适合自身需求的技术栈和基础设施,不受其他服务的限制。
示例代码
// 用户服务
public class UserService {public User createUser(String name, String email) {// 创建用户的业务逻辑User user = new User(name, email);// 保存用户到数据库return user;}public User getUserById(String userId) {// 根据用户ID查询用户的业务逻辑// 从数据库或缓存中获取用户信息return user;}// 其他用户相关的业务逻辑和操作方法
}// 订单服务
public class OrderService {public Order createOrder(String userId, List<Product> products) {// 创建订单的业务逻辑User user = userService.getUserById(userId);// 根据产品信息计算订单金额等Order order = new Order(user, products);// 保存订单到数据库return order;}public Order getOrderById(String orderId) {// 根据订单ID查询订单的业务逻辑// 从数据库或缓存中获取订单信息return order;}// 其他订单相关的业务逻辑和操作方法
}// 在应用程序的入口点或配置中,组装和注入各个微服务对象
public class Application {public static void main(String[] args) {UserService userService = new UserService();OrderService orderService = new OrderService(userService);// 启动应用程序,处理用户请求等}
}
两个微服务:用户服务(UserService)和订单服务(OrderService)。每个服务都有自己的业务逻辑和操作方法,并通过依赖注入的方式组装和协调。微服务之间可以使用RESTful API或其他通信机制进行通信。例如,在订单服务中,我们通过调用用户服务的getUserById方法来获取用户信息。
总结
通过微服务架构,我们可以将大型应用程序拆分为多个小型服务,每个服务专注于特定的业务功能。这样做有助于提高系统的灵活性、可伸缩性和可维护性,同时也可以加快开发速度和团队的独立性。
需要注意的是,微服务架构需要仔细考虑服务之间的边界、通信机制、数据一致性等方面的设计。此外,微服务架构也引入了一些挑战,如服务发现、负载均衡、错误处理等,需要合适的工具和框架来支持。
领域事件驱动架构(Domain Event-Driven Architecture)
概念
领域事件驱动架构(Domain Event-Driven Architecture)是一种架构模式,它基于领域事件的概念,将领域模型中的事件作为系统中的核心驱动力。领域事件表示领域中发生的重要事实或状态变化,它们被捕获并在系统中传播,以影响其他部分的行为和状态。在领域事件驱动架构中,系统中的各个模块(或领域服务)都可以订阅感兴趣的领域事件,并根据事件进行相应的处理。这样做的好处是,模块之间的耦合度降低,各模块之间可以更灵活地协同工作,同时也能更好地支持系统的扩展和演进。
示例代码
// 领域事件
public class OrderCreatedEvent {private String orderId;private String customerId;private BigDecimal amount;// 构造函数、属性和方法等
}// 领域服务
public class OrderService {private EventPublisher eventPublisher;public OrderService(EventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void createOrder(String customerId, List<Product> products) {// 创建订单的业务逻辑Order order = new Order(customerId, products);// 订单创建后发布订单创建事件OrderCreatedEvent event = new OrderCreatedEvent(order.getId(), order.getCustomerId(), order.getAmount());eventPublisher.publish(event);}// 其他订单相关的业务逻辑和操作方法
}// 订单处理器,订阅订单创建事件并进行相应的处理
public class OrderCreatedEventHandler {public void handle(OrderCreatedEvent event) {// 处理订单创建事件的业务逻辑String orderId = event.getOrderId();String customerId = event.getCustomerId();BigDecimal amount = event.getAmount();// 执行相应的操作,如发送通知、更新报表等}
}// 领域事件发布者接口
public interface EventPublisher {void publish(DomainEvent event);
}// 领域事件发布者的具体实现
public class EventPublisherImpl implements EventPublisher {private List<EventHandler> handlers;public EventPublisherImpl() {this.handlers = new ArrayList<>();}public void registerHandler(EventHandler handler) {handlers.add(handler);}@Overridepublic void publish(DomainEvent event) {for (EventHandler handler : handlers) {if (handler.canHandle(event)) {handler.handle(event);}}}
}// 在应用程序的入口点或配置中,组装和注入事件发布者和事件处理器
public class Application {public static void main(String[] args) {EventPublisher eventPublisher = new EventPublisherImpl();eventPublisher.registerHandler(new OrderCreatedEventHandler());OrderService orderService = new OrderService(eventPublisher);// 启动应用程序,处理用户请求等}
}
在上面的栗子中,定义了一个领域事件OrderCreatedEvent
表示订单创建的事件。在OrderService
中,当创建订单时,会发布OrderCreatedEvent
。EventPublisher
负责将事件传播给对应的事件处理器。OrderCreatedEventHandler
是一个事件处理器,它订阅并处理订单创建事件。在EventPublisherImpl
中,我们注册了OrderCreatedEventHandler
作为事件处理器,并在事件发布时触发相应的处理逻辑。
总结
通过领域事件驱动架构,系统中的各个模块可以根据感兴趣的事件进行订阅和处理,从而实现模块之间的解耦和灵活性。事件的传播机制可以基于同步或异步方式进行,取决于系统的需求和性能要求。
如何选择?
-
分层架构:
- 简要说明:分层架构是一种经典的架构模式,将应用程序按照功能划分为多个层次,通常包括表示层、应用层、领域层和基础设施层。每个层次具有不同的职责和关注点,通过层与层之间的解耦来实现可维护性和可扩展性。
- 使用场景:适用于小型和中型应用程序,领域模型相对简单,没有明显的复杂性和高性能要求的场景。
-
领域驱动设计的六边形架构:
- 简要说明:六边形架构是一种基于领域驱动设计原则的架构模式,将应用程序划分为三个主要部分:应用服务(Application Services)、领域模型(Domain Model)和基础设施(Infrastructure)。通过六边形架构,可以更好地实现领域模型的解耦、灵活性和可测试性。
- 使用场景:适用于具有复杂领域模型和高度可扩展性要求的应用程序,强调领域模型的核心性和业务驱动设计。
-
CQRS:
- 简要说明:CQRS(Command Query Responsibility Segregation)是一种架构模式,将读操作(查询)和写操作(命令)分离到不同的模块中。通过使用不同的数据模型和处理机制来处理读写操作,可以提高系统的性能、可伸缩性和灵活性。
- 使用场景:适用于需要高性能读操作和复杂写操作的应用程序,例如具有高并发查询需求或需要实时分析的场景。
-
微服务架构:
- 简要说明:微服务架构将大型应用程序拆分为一组小型、独立的服务,每个服务都运行在自己的进程中,并通过轻量级的通信机制进行通信。每个服务专注于单个业务功能,可以独立开发、部署和扩展。
- 使用场景:适用于大型和复杂应用程序,需要高度的可扩展性和自治性。适合团队之间的独立开发和部署,以及使用不同技术栈和基础设施的情况。
-
领域事件驱动架构:
- 简要说明:领域事件驱动架构将领域事件作为系统的核心驱动力,通过事件的发布和订阅来实现模块之间的解耦。模块可以订阅感兴趣的事件,并根据事件进行相应的处理。
- 使用场景:适用于需要实现领域模型的事件驱动、模块之间的松耦合和灵活协同工作的应用程序。特别适合领域模型复杂、演进频繁的领域。
相关文章:
万字长文+示例代码详解DDD中常用的架构(含代码示例)
目录 分层架构(Layered Architecture) 概念 示例代码 总结 领域驱动设计的六边形架构(Hexagonal Architecture) 概念 示例代码 总结 CQRS(Command Query Responsibility Segregation) 概念 示例…...
Debezium UI On ECS编译安装及开放Web访问
1. 访问debezium-ui的代码仓库,下载源码 GitHub - debezium/debezium-ui: A web UI for Debezium; Please log issues at https://issues.redhat.com/browse/DBZ. 2. 解压zip源码包: TEST[hadoopshdcvfsla1894 ~]$ cd /data/module TEST[hadoopshd…...
【支付系统】核心支付流程
支付在产品中常见的用处为购买和充值.这两种功能操作大相径庭,其中购买相对充值多了很多步骤,它需要锁商品或者库存,还需要超时未支付取消订单等操作.在这篇文章中主要探讨支付部分,属于购买和充值公共部分. 下面是绘制的简易支付时序图 以上时序图并非完整,其实核心步骤就是, …...
电脑系统可以直接备份到其它硬盘上吗
在日常使用电脑的过程中,我们都希望能够保护好重要的系统数据,以防止意外数据丢失或系统崩溃。那么,能否将电脑系统直接备份到其他硬盘上呢?本文将为您解答这个问题,并探讨备份系统的方法和注意事项。 工具/原料&…...
springboot项目如何优雅停机
文章目录 前言kill -9 pid的危害如何优雅的停机理论步骤优雅方式1、kill -15 pid 命令停机2、ApplicationContext close停机3、actuator shutdown 停机4、ApplicationListener 监听延时停机 前言 相信很多同学都会用Kill -9 PID来杀死进程,如果用在我们微服务项目里…...
springboot mybatis-plus 代码生成工具
介绍 基于mybatis-plus代码生成工具 后续会不断完善 规划 后续会基于此功能搞低代码平台,会有前端VUE mybatis-plus介绍&特性 • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 • 损耗小࿱…...
超全、超详细的Redis学习笔记总结
❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…...
Day05 04-MySQL分库分表介绍
文章目录 第十七章 MySQL分库分表17.1 什么是分库分表17.2 为什么要分库分表17.3 垂直切分17.3.1 垂直分库17.3.2 垂直分表 17.4 水平切分17.4.1 水平分库17.4.2 水平分表17.4.3 常见的水平切分规则 第十七章 MySQL分库分表 17.1 什么是分库分表 MySQL数据库常见的优化方案中…...
基于SpringBoot+vue的毕业生信息招聘平台设计和实现
博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…...
git一定要学会,加油
gitgit文档http://file:///F:/%E8%B5%84%E6%96%99%E5%A4%8D%E4%B9%A0/Git%E4%BC%98%E7%A7%80%E5%BC%80%E6%BA%90%E4%B9%A6%E7%B1%8D/Git%E5%BC%80%E6%BA%90%E4%B9%A6%E7%B1%8D/Pro%20Git%E4%B8%AD%E6%96%87PDF%E7%89%88.pdf init 初始化仓库 这个命令在当前目录下初始化一个 G…...
TVM面试题
1、TVM中的调度器(Scheduler)是什么?请简要解释TVM调度器的作用和工作原理。 TVM中的调度器(Scheduler)是负责将计算图映射到特定硬件目标上的组件。调度器在TVM中起着关键的作用,它决定了计算图的执行方式、并行化策略以及内存布局等,以优化…...
CSS相关面试题
1、标准盒子模型和IE怪异盒子模型? 标准盒子模型就是指的元素的宽度和高度仅包括的内容区域,不包括边框和内边距,也就是说,元素的实际宽度和高度等于内容区域的宽度和高度IE怪异盒子是指元素的高度和宽度,包括内容区域…...
6.11总结
这周准备了蓝桥杯,主要看了一些以前学过的东西,看了二分,树状数组,树状数组二分,复习了利用倍增相关的算法。 周六去打的蓝桥杯,总体来说也就一般吧,出了考场突然想起来我b题中间的称号写成了加…...
Hazel游戏引擎(008-009)事件系统
文中若有代码、术语等错误,欢迎指正 文章目录 008、事件系统-设计009、事件系统-自定义事件前言自定义事件类与使用声明与定义类代码包含头文件使用事件 事件调度器代码 C知识:FunctionBind用法function基本使用 012、事件系统-DemoLayer用EventDispache…...
【C++】 STL(上)STL简述、STL容器
文章目录 简述STL容器list链表vector向量deque双端队列map映射表set集合hash_map哈希表 简述 STL是“Standard Template Library”的缩写,中文译为“标准模板库”。STL是C标准库的一部分,位与各个C的头文件中,即他并非以二进制代码的形式提供…...
【002 基础知识】什么是原子操作?
一、原子操作 原子操作就是指不能再进一步分割的操作。 二、为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行? 不行。如果在一个线程正持有锁时(2处),线程上下文发生切换,…...
English Learning - L3 作业打卡 Lesson5 Day32 2023.6.5 周一
English Learning - L3 作业打卡 Lesson5 Day32 2023.6.5 周一 引言🍉句1: What do you read when you are travelling by train or bus?成分划分弱读爆破语调 🍉句2: What are other passengers reading?成分划分弱读连读语调 🍉句3: Perh…...
深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)【上篇】
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…...
腾讯安全SOC+荣获“鑫智奖”,助力金融业数智化转型
近日,由金科创新社主办,全球金融专业人士协会支持的“2023鑫智奖第五届金融数据智能优秀解决方案评选”榜单正式发布。腾讯安全申报的“SOC基于新一代安全日志大数据平台架构的高级威胁安全治理解决方案”获评“鑫智奖网络信息安全创新优秀解决方案”。 …...
Python绘制气泡图示例
部分数据来源:ChatGPT 引言 在数据可视化领域中,气泡图是一种能够同时展示三维信息的图表类型,常用于表示数据集中的两个变量之间的关系。Python中提供了许多用于绘制气泡图的可视化库,比如pyecharts。在本篇文章中,我们将介绍如何使用pyecharts库绘制一个简单的气泡图,…...
数学建模经历-程序人生
引言 即将大四毕业(现在大三末),闲来无事(为了冲粽子)就写一篇记录数学建模经历的博客吧。其实经常看到一些大佬的博客里会有什么"程序人生"、"人生感想"之类的专栏,但是由于我只是一个小趴菜没什么阅历因此也就没有写过类似的博客…...
数字电子电路绪论
博主介绍:一个爱打游戏的计算机专业学生 博主主页:夏驰和徐策 所属专栏:程序猿之数字电路 1.科技革命促生互联网时代 科技革命对互联网时代的兴起产生了巨大的推动作用。以下是一些科技革命对互联网时代的促进因素: 1. 计算机技…...
电脑丢失dll文件一键修复需要什么软件?快速修复dll文件的方法
在使用电脑的过程中,我们经常会遇到程序无法正常运行的情况,提示“XXX.dll文件丢失”的错误。这时候,很多人会感到困惑,不知道该如何解决。本文将详细介绍dll文件丢失的各种原因、如何使用dll修复工具进行一键修复dll丢失问题以及…...
你知道微信的转账是可以退回的吗
微信作为当今最受欢迎的即时通讯软件之一,其转账功能得到了广泛的应用。在使用微信转账时,我们可能会遇到一些问题,例如误操作、支付失败或者需要退款等等。 首先需要注意的是,微信转账退回的操作只能在“一天内未确认”时进行。如…...
【链表Part01】| 203.移除链表元素、707.设计链表、206.反转链表
目录 ✿LeetCode203.移除链表元素❀ ✿LeetCode707.设计链表❀ ✿LeetCode206.反转链表❀ ✿LeetCode203.移除链表元素❀ 链接:203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点ÿ…...
如何使用Postman生成curl?
生成在Lunix系统调接口的curl 直接看图操作 点击</>即可!...
CSS灯光效果,背景黑金效果
先看效果 再看代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>灯光效果</title><link href"https://fonts.googleapis.com/css2?familyCinzel:wght700&dis…...
这里推荐几个前端icon网站(动图网站)
1. Loading.ioLoading.io 是一个免费的加载动效(Loading animations)图标库。它提供了多种风格的加载动效图标,包括 SVG、CSS 和 Lottie 动画格式。这些加载图标可以增强用户体验,为网站和应用程序添加更佳的视觉效果。 网站地址:loading.io - Your SVG GIF PNG Ajax Loading…...
【图神经网络】用PyG实现图机器学习的可解释性
Graph Machine Learning Explainability with PyG 框架总览示例:解释器The Explanation ClassThe Explainer Class and Explanation SettingsExplanation评估基准数据集Explainability Visualisation实现自己的ExplainerAlgorithm对于异质图的扩展解释链路预测 总结…...
HarmonyOS ArkTS Ability内页面的跳转和数据传递
HarmonyOS ArkTS Ability的数据传递包括有Ability内页面的跳转和数据传递、Ability间的数据跳转和数据传递。本节主要讲解Ability内页面的跳转和数据传递。 打开DevEco Studio,选择一个Empty Ability工程模板,创建一个名为“ArkUIPagesRouter”的工程为…...
网站建设类公/网络推广赚钱
谷歌地图位置偏移You’re meeting a friend downtown in a new city, and he asks you where you are. Be honest: you have no clue. Luckily, Google Maps can help you both out. 您在一个新城市的市区遇到一个朋友,他问您现在在哪里。 老实说:您没有…...
深圳装修公司排名前十口碑推荐/河北seo网络优化师
SQL Server 2005 新增 cross apply 和 outer apply 联接语句,增加这两个东东有啥作用呢? 我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的。实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集…...
便宜建站方法/深圳网络推广优化
题目标签:String 利用left, right 两个pointers, 从左右开始 互换 字母。如果遇到的不是字母,那么继续移动到下一个。 Java Solution: Runtime beats 29.87% 完成日期:12/08/2018 关键点:two pointers 1 c…...
eclipse sdk做网站/微营销推广方案
1,从spark的example中找到KafkaWordCount.scala文件复制到idea编辑器中,引入包:2,编辑configuration,(1)KafkaWordCountProducer选择KafkaWordCount.scala中的KafkaWordCountProducer方法VM options 设置为:-Dspark.masterlocal设置程序输入参数,Program arguments: localhost:…...
wordpress script/seo搜索优化专员
情景案例 其实我们身处的团队已经是非常年轻、有活力的高效合作的团队了,但是在集体工作中,有时也会出现一些问题和阻碍,如以下案例所示: 1、需求三方评审会议上,策划口若悬河,其他职能昏昏欲睡。 策划问…...
加速wordpress 插件/网络推广引流是做什么工作
香蕉苹果是一种服用以后会令人造成愉快情绪的新鲜水果,它能够对脑神经传出激动的数据信号,进而使大家维持愉快,产生欢乐。那麼怀孕可以吃香蕉苹果吗?接下去一起来瞧瞧吧。怀孕可以吃香蕉苹果吗怀孕可以吃香蕉苹果,可是…...