DDD 领域驱动设计
文章目录
- 请解释下什么是 DDD 领域驱动设计
- DDD 的四层领域模型是怎样的?包含哪些基础概念?
- DDD 中的贫血模型和充血模型有什么区别
- 在 DDD 中,如何处理模型的聚合和聚合根
- DDD 中的实体和值对象有什么区别?
- 在 DDD 中,如何处理领域对象的持久化?
- 什么是领域驱动设计中的 CQRS 模式?
- 在 DDD 中,如何处理跨多个实体的复杂业务?
- DDD 中的限界上下文是什么?有什么用?
- 如何在微服务架构中使用领域驱动设计?
请解释下什么是 DDD 领域驱动设计
领域驱动设计(Domain-Driven Design,DDD)是一种软件设计方法,它重点关注软件开发中涉及的领域概念,旨在帮助团队在复杂系统中实现业务逻辑。
DDD 的核心思想是将实现连接到持续进化的模型,通过领域模型驱动系统设计。它倡导统一语言,提出了一系列概念,包括实体、值对象、聚合根等,以帮助团队更好地理解和表达业务模型。
领域驱动设计的目标是通过清晰的领域模型、领域语言和领域边界来理解和解决业务问题。它鼓励跨职能团队的合作,以确保软件系统与业务需求保持一致,并且能够应对变化和复杂性。通过领域驱动设计,开发团队可以更好地与业务领域专家进行沟通,减少误解,提高软件的质量和可维护性。
DDD 打破了传统软件开发中需求分析和系统设计之间的隔阂,使得软件能够更灵活、快速地跟随需求变化。它在国外已成为主流,是解决复杂大型软件问题的一套行之有效的方法。
DDD 的四层领域模型是怎样的?包含哪些基础概念?
DDD的四层领域模型如下所示:
- 展现层:这一层负责向用户显示信息和解释用户命令,完成前端界面逻辑。并将用户请求传递给应用层。
- 应用层:这一层是很薄的一层,负责协调领域层中的领域对象,组成具体应用场景。应用层要尽量简单,不包含业务规则或者知识,不保留业务对象的状态,只保留有应用任务的进度状态,更注重流程性的东西。应用层直接依赖于领域层,由领域层提供具体的业务能力。
- 领域层:这是业务软件的核心所在,包含了业务所涉及的领域对象(实体、值对象)、领域服务以及它们之间的关系,负责表达业务概念、业务状态信息以及业务规则,具体表现形式就是领域模型。DDD 强调领域层不需要任何外部依赖,只是反应软件核心的业务能力。
- 基础设施层:这一层向其他层提供通用的技术能力,为应用层传递消息(API 网关等),为领域层提供持久化机制(如数据库资源)等。
在四层领域模型中,展现层与应用层组成了前端应用,领域层与基础设施层组成了后端应用。前后端应用通过API进行通信。
在DDD中,还有一些基础概念需要了解。其中,聚合根是一个很重要的概念,它代表了一个业务对象群在领域模型中的根节点,可以包含其他多个实体和值对象。聚合根负责管理其包含的对象的状态,以保证其整体的一致性。另外,DDD还提倡使用限界上下文来构建子域,每个限界上下文代表了一个独立的业务能力或主题,可以包含特定的业务逻辑和数据。这些基础概念可以帮助开发人员更好地理解和构建领域模型。
DDD 中的贫血模型和充血模型有什么区别
DDD中的贫血模型和充血模型都是领域模型的表现形式,但是它们在设计和实现上有着显著的区别。
- **贫血模型(Anemic Domain Model)**是面向过程编程的一种表现形式。贫血模型的实体只包含数据属性和对应的 getter 以及 setter,而具体的业务逻辑交由服务层或其他外部组件负责。贫血模型将数据与操作分离,其好处是模型足够简单,开发上手比较快。团队内多人协作时,设计不容易变形。比较适合轻量级应用。但坏处是贫血模型的实体无法直接体现对应的业务能力,在复杂业务中,梳理业务逻辑将变得非常困难,不利于项目后期的业务演进。
- **充血模型(Rich Domain Model)**则是面向对象编程的一种表现形式。充血模型的实体通常包含了数据属性以及引起属性发生变化的核心业务动作。充血模型将数据与业务能力绑定在一起,非常符合业务人员的思考方式,因此其好处是对业务非常友好,有助于更好的封装和保护领域内部的业务规则,尤其适合业务复杂的应用场景。充血模型的坏处是对业务的熟悉程度要求很高,需要在上手之初就设计好针对不同的业务场景,设计好具体的模型实体,并且规划好需要暴露哪些操作,定义哪些业务逻辑。而这些在贫血模型中则不需要,可以边实现边修改。
总的来说,贫血模型更注重简单性和易上手,而充血模型更注重业务复杂的系统开发。选择使用哪种模型取决于具体的业务需求和开发团队的技术能力。
在 DDD 中,如何处理模型的聚合和聚合根
在DDD中,聚合是指一组紧密关联的实体和值对象,它们共同完成一个特定的业务逻辑,并由一个聚合根进行管理。聚合根是聚合的根节点,它作为聚合内堆外暴露的唯一访问入口,负责管理聚合内部的对象状态,并协调它们之间的交互。
处理模型的聚合和聚合根主要涉及以下步骤:
- 识别聚合:在领域模型中,识别出具有紧密关联的实体和值对象,它们共同构成了一个聚合。这些实体和值对象应该符合高内聚、低耦合的设计原则,具有一致的业务语义和行为。
- 定义聚合根:在确定了聚合之后,需要选择一个合适的对象作为聚合根。聚合根应该是一个具有全局唯一性的对象,例如一个订单聚合,包含订单、商品、地址、用户等多个实体,而这其中订单就是一个很好的聚合根。
- 保证聚合内部的一致性:确保聚合内部的对象之间保持一致性,即要么一起成功创建、修改、删除,要么一起失败。聚合根负责协调聚合内部的操作。
- 限制聚合外部访问:聚合形成之后,外部对象只能通过聚合根来访问聚合内的对象。聚合跟负责限制对聚合内部对象的直接访问,以维护聚合的完整性。例如形成订单聚合后,对订单聚合内部的商品、用户进行访问,都必须通过订单实体进行。
- 合理规划业务行为:DDD的设计过程中,更强调对实体状态的变化梳理。因此,一些不会引起实体状态变化的操作,例如查询,就不必要严格按照聚合进行划分。例如,想要一天内卖出了哪些商品,这个操作并不会引起实体状态发生变化,因此就不需要严格按照聚合的要求,先访问订单这个聚合根,再统计订单中的商品。而可以跨过订单,直接统计卖出的商品。
- 暴露聚合的服务:在聚合根中暴露一些服务,以便其他应用程序可以访问聚合内部的数据和业务逻辑。这些服务可以是领域服务或者应用服务,它们应该遵循统一的接口规范,并且应该保证安全性。
总之,在DDD中,处理模型的聚合和聚合根需要仔细考虑聚合的设计和实现,包括聚合的组成、聚合根的选择、聚合内部的关系、聚合的行为以及聚合服务的暴露等方面。通过合理的设计和实现,可以提高系统的可维护性、可扩展性和可重用性。
DDD 中的实体和值对象有什么区别?
在DDD中,实体 Entity 和值对象 Value Object 是两个基本的概念,它们之间有一些重要的区别。
- 唯一性:实体是唯一的,每个实体都有一个唯一的标识符,即使它的属性在一段时间内发生了变化,它仍然是这个实体。与之不同,值对象可以有一组属性,这些属性可以描述一个事物的状态或特征,但它们没有唯一的标识符,即使两个值对象的属性完全相同,它们也被视为两个不同的对象。
- 状态变化:实体可以有状态,并且可以在不同的时间或场景下有不同的状态。例如,一个订单实体可能在创建时是一个待支付状态,支付后变为已支付状态,而值对象通常只有固定的属性,不会有状态变化。
- 生命周期:实体有一个明确的生命周期,它可能随着时间的推移而创建、更新或删除,而值对象没有自己的生命周期,它们通常是在需要时创建,并在不再需要时被垃圾回收。
- 相等性:对于实体来说,两个具有相同标识符的实体是相同的,无论它们的状态如何。对于值对象,两个具有相同属性的值对象被认为是相等的,但这需要通过比较它们的属性来确定。
综上所述,实体和值对象在DDD中是两种不同的概念。在 DDD 中,实体通常用于表示有唯一表示以及状态变化的领域概念,而值对象通常用于表示无唯一标识以及不可变的属性集合。值对象形式上是一个对象,但是其本质则和一个属性值是等价的。
在 DDD 中,如何处理领域对象的持久化?
在 DDD 中,领域对象的持久化工作通常是通过仓库 Repository 和工厂 Factory 实现的。仓库是一种用于访问领域对象的机制。他负责将领域对象从内存中保存到持久存储,如数据库,中,以及从持久存储中检索领域对象。而工厂则负责从持久存储中组装领域对象。
在处理领域对象的持久化时,通常需要注意以下几个问题:
- 定义仓库接口:为每个需要持久化的领域对象创建一个对应的仓库接口。这个接口通常包含了一组方法,用于对领域对象进行存储和检索操作。而在实现仓库接口时,通常可以使用泛型,扩大接口的适用场景。
- 通过工厂组装实体:DDD中的实体包含很多面向对象的业务特色,而数据库中的数据往往带有很多技术特色。这时,通过工厂的设计,可以让实体设计摆脱具体数据库的限制,从而让实体能够真正面向业务进行构建而不用考虑具体数据库技术的影响。
- 合理进行业务隔离:在DDD中,数据的访问和修改应该通过仓库和工厂来完成,而不是直接访问数据库。仓库和工厂应该提供统一的接口来访问和修改数据,这样可以保证数据的完整性和一致性。
- 事务管理:在处理领域对象的持久化时,通常需要考虑事务管理。确保在保存或检索领域对象时,事务能够正确地提交或回滚,以保持数据一致性。
- 隔离异常:与数据库的交互过程中产生的异常,应该在仓库和工厂中进行封装。这些业务异常尽量不要蔓延到领域层。
总之,在DDD中,仓库和工厂是两个核心的概念,它们的设计应该考虑到应用的需求、领域模型的结构、数据的访问和修改等方面。通过合理的设计,可以提高系统的可维护性、可扩展性和可重用性。
什么是领域驱动设计中的 CQRS 模式?
领域驱动设计(DDD)中的CQRS模式是一种架构模式,它将系统中的操作分为两类:命令(Command)与查询(Query)。CQRS 模式强调了应用程序要将命令和查询愤慨处理。
- 命令是对会引起数据发生变化的操作的总称,如新增、更新、删除等操作。命令通常是不返回数据的,它们只用于触发状态变化。
- 查询则是对不会对数据产生变化的操作的总称,例如按照某些条件查找数据。它们用于获取系统状态的快照或特定信息。查询通常返回数据给客户端
在CQRS模式中,命令和查询应在两个独立的系统中处理,这两个系统一般是指两个独立部署的应用程序,在某些特殊情况下,也可以部署在同一个应用内的不同接口上。通过分离职责、使用不同的数据存储和事件驱动的方式,允许更好地满足系统的性能和可伸缩性需求。
在使用CQRS模式时,通常也需要面临一些问题,例如事务和查询模型的设计。在事务方面,由于命令和查询分别在不同的系统中处理,因此需要解决时间差问题以及更新操作失败可能导致的数据不一致性问题。在查询模型设计方面,需要解决查询接口过多的问题,可以将属于同一领域的查询集中管理作为整个查询系统的一个上下文,或者将它们独立出来作为一个微服务。
总之,在DDD中,CQRS模式可以将领域模型与查询功能进行分离,使一些复杂的查询摆脱领域模型的限制,以更为简单的DTO形式展现查询结果。同时也可以分离不同的数据存储结构,使开发者更加自由地选择数据存储引擎。虽然引入CQRS模式会引入额外的复杂性和技能要求,但在面对大型业务系统和复杂的业务流程时,使用CQRS模式可以帮助将命令和查询进行拆分,使领域模型与数据模型的边界更加清晰。
在 DDD 中,如何处理跨多个实体的复杂业务?
在DDD中,跨多个实体的复杂业务通常需要交由领域服务进行协调。领域服务的设计应该遵循以下原则:
- 定义服务接口。领域服务应该定义一个清晰的接口,这个接口应该包含需要实现的方法和参数。这样可以使得其他模块能够使用这个服务而不需要关心具体的实现细节。
- 实现业务逻辑。领域服务的实现应该包含具体的业务逻辑,这是领域服务的核心。业务逻辑应该根据业务需求进行设计和实现,可以跨越多个聚合或领域。
- 暴露业务数据。领域服务可以暴露一些业务数据给其他模块使用,但是需要注意数据的封装和安全性。对于敏感数据,应该遵循最小权限原则,限制其他模块的访问权限。
- 尽量减少依赖。领域服务应该尽量减少对其他模块的依赖,这样可以使得领域服务更加独立和可维护。
- 考虑可测试性。领域服务的实现应该考虑可测试性,使得我们可以方便地对领域服务进行单元测试和集成测试。
- 定义服务调用方式。领域服务可以定义为本地服务或远程服务,根据业务需求和系统架构进行选择。对于远程服务,需要考虑网络通信、服务调用的性能和安全性等方面的问题。
处理跨多个实体的复杂业务是DDD中的一个关键挑战,需要深入理解业务领域、合理划分聚合、制定适当的领域服务和规则,以及不断进行建模和迭代来满足实际需求。领域驱动设计的方法和模式可以帮助团队更好地理解和应对这种复杂性。
DDD 中的限界上下文是什么?有什么用?
在DDD中,"限界上下文"是一个非常重要的概念,它指的是一个边界内的领域模型和与之相关的语义环境。限界上下文(Bounded Context)是一种用于定义和隔离领域模型的概念。每个限界上下文都代表了一个明确定义的、有边界的领域模型,用于描述业务领域的一部分。限界上下文有助于在大型系统中管理和组织复杂的领域模型,并确保不同部分之间的一致性和清晰性。
限界上下文可以看作是一种语义上的边界,它可以将领域模型与外部环境隔离开来,保证领域模型的独立性和纯净性。在这个边界内,领域模型的概念和操作都有着明确的含义,不会受到外部因素的干扰和影响。
通过限界上下文,团队成员可以更加清晰地了解业务领域,并在这个边界内进行交流和协作。限界上下文可以帮助团队成员避免使用不准确或歧义性的术语,使交流更加准确、高效。
另外,限界上下文还可以作为微服务设计的重要参考。在微服务设计中,不同服务之间的边界是很重要的,而限界上下文可以帮助我们更好地理解和规划这些服务的边界。在很多情况下,限界上下文的边界往往就是微服务的边界,这可以帮助我们更好地拆分和设计微服务。
总之,限界上下文是DDD中的关键概念之一,它可以帮助我们更好地描述和理解业务领域,提高团队成员的协作效率,同时也可以作为微服务设计的重要参考。
如何在微服务架构中使用领域驱动设计?
在微服务架构中使用领域驱动设计(DDD)可以帮助我们更好地理解和设计业务领域,以下是在微服务架构中使用DDD的一些简洁的步骤:
- 定义微服务边界,每个微服务对应一个限界上下文,有自己的领域模型和语言。
- 使用领域模型来建模每个微服务的核心业务逻辑,包括实体、值对象、聚合、领域服务等。并定义它们之间的关系和交互。
- 明确微服务之间的接口和通信协议,如HTTP/REST或AMQP等。基于领域模型定义接口。
- 使用事件驱动架构来确保微服务之间的数据同步。
- 每个微服务拥有自己的仓库与工厂,负责数据的管理和持久化。
- 团队结构应该反映微服务的划分,每个团队专注于自己的微服务。
- 自动化部署和运维,使用监控工具来跟踪微服务性能。
- 不断迭代和改进微服务,根据反馈优化系统。
总之,在微服务架构中使用领域驱动设计可以提高系统的可维护性和可扩展性,通过定义领域模型、识别限界上下文、设计聚合根和聚合、实现领域服务、实现微服务接口、使用通信协议进行微服务交互以及实现数据存储等步骤来构建出高质量的微服务架构。
相关文章:
DDD 领域驱动设计
文章目录 请解释下什么是 DDD 领域驱动设计DDD 的四层领域模型是怎样的?包含哪些基础概念?DDD 中的贫血模型和充血模型有什么区别在 DDD 中,如何处理模型的聚合和聚合根DDD 中的实体和值对象有什么区别?在 DDD 中,如何…...
转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。
1,今天特别记录下,B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错,最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代:从写博客到录视频,粉丝大涨,突破200个&…...
小众市场:探索跨境电商中的利基领域
随着全球数字化和互联网的普及,跨境电子商务已经成为了一个蓬勃发展的产业。从亚马逊到阿里巴巴,大型电商平台已经占据了很大一部分市场份额。 然而,在这个竞争激烈的领域,寻找小众市场和利基领域可能是一种成功的策略。本文将探…...
C++中的mutable关键字
mutable是C中的一个关键字,它用来修饰类的成员变量。 当我们将一个成员变量声明为mutable时,就意味着这个成员变量可以被类的任何方法修改,即使这个方法是const类型的。这是因为mutable关键字可以打破const类型的限制,使得const类…...
java: 无效的目标发行版: 17 问题解决
今天在写完类点击运行后显示java: 无效的目标发行版: 17 网上查询了一番,发现有几个地方需要注意。 还有一个就是设置中,下面的就是我本次问题所在,不知道为什么,他自动添加了下面的东西 一个方法是把目标字节码版本改为正确的&a…...
C#的LINQ查询
当使用LINQ(Language Integrated Query)查询时,我们可以在C#中以一种类似于SQL的语法来查询数据。LINQ提供了一种统一的方式来查询各种数据源,如集合、数据库、XML等。 在上述示例中,我们使用LINQ查询来将两个列表根据…...
Python不会调试不够丝滑?那事你不会logging---剖析!
前言: 一直都是手动debug进行调试,F8都按烂了;最近用logging进行提前布置,发现这样更能让代码走得丝滑,同时也能尽早发现问题! 基本概念: Logger - 日志记录接口 Handler - 确定日志记录发送到不同的地方(文件、控制台等) Level - 定义了日…...
OpenAI的Whisper蒸馏:蒸馏后的Distil-Whisper速度提升6倍
1 Distil-Whisper诞生 Whisper 是 OpenAI 研发并开源的一个自动语音识别(ASR,Automatic Speech Recognition)模型,他们通过从网络上收集了 68 万小时的多语言(98 种语言)和多任务(multitask&am…...
Ubuntu18.04安装LeGO-LOAM保姆级教程
系统环境:Ubuntu18.04.6 LTS 1.LeGO-LOAM的安装前要求: 1.1 ROS安装:参考我的另一篇博客Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客文章浏览阅读168次。Ubuntu18.04安装ROS-melodic保姆级教程https://blog.csdn.net/…...
git修改commit历史提交时间、作者
1、修改最近的几条记录,进入提交记录列表,修改提交记录模式 git rebase -i HEAD~3 // 修改最近的三条记录,顺序排列按提交时间升序 指令说明: pick:保留该commit(缩写:p) reword:…...
【C++历练之路】list的重要接口||底层逻辑的三个封装以及模拟实现
W...Y的主页 😊 代码仓库分享💕 🍔前言: 在C的世界中,有一种数据结构,它不仅像一个神奇的瑰宝匣,还像一位能够在数据的海洋中航行的智慧舵手。这就是C中的list,一个引人入胜的工具…...
Kubeadm部署Kubernetes Containerd集群
文章目录 概述一、硬件系统二、基础配置设置主机名配置主机名与IP地址解析关闭防火墙与selinux时间同步(ntp)升级系统内核配置内核转发及网桥过滤*安装ipset及ipvsadm关闭SWAP分区 三、Containerd准备Containerd获取下载解压Containerd配置文件生成并修改Containerd启动及开机自…...
OpenCV入门9——目标识别(车辆统计)
文章目录 图像轮廓查找轮廓绘制轮廓轮廓的面积与周长多边形逼近与凸包外接矩形项目总览【车辆统计】视频加载【车辆统计】去背景【车辆统计】形态学处理【车辆统计】逻辑处理【车辆统计】显示信息【车辆统计】 图像轮廓 查找轮廓 # -*- coding: utf-8 -*- import cv2 import n…...
2023前端大厂高频面试题之JavaScript篇(5)
系列文章: 2023前端大厂高频面试题之JavaScript篇(1) 2023前端大厂高频面试题之JavaScript篇(2) 2023前端大厂高频面试题之JavaScript篇(3) 2023前端大厂高频面试题之JavaScript篇(4) 2023前端大厂高频面试题之JavaScript篇(5) 2023前端大厂高频面试题之HTML篇 2023前端大厂高…...
物联网网关在工业行业的应用案例
物联网网关在工业行业的应用案例 随着物联网技术的不断发展,物联网网关在工业行业的应用越来越广泛。本文将介绍一个物联网网关在工业行业的应用案例,以期为相关领域的研究和实践提供借鉴和启示。 一、案例背景 某大型制造企业是一家全球知名的汽车制…...
5、基础入门——资产架构端口应用WAF站库分离负载均衡
资产架构 目录型网站安全:一个IP对应一个域名(bbs.xiaodi8.com),该域名(bbs.xiaodi8.com)下有一个网站,该域名的某个目录下(bbs.xiaodi8.com/blog)也有一个网站。 端口型…...
golang学习笔记——接口和继承比较1
继承 Go 语言的设计之初,就不打算支持面向对象的编程特性,因此 Go 不支持面向对象的三大特性之一——继承。但是 Go 可以通过组合的思想去实现 “继承”。继承是面向对象的三大特性之一,继承是从已有的类中派生出新的类,新的类能…...
chatGPT快捷键(最新版本)
chatGPT 快捷键,可以用于获取最新的一条回复内容 ChatGPT的API接口相当贵,有了快捷键功能,我们可以使用python的selenium控件模拟点击来实现自动化功能,通过发送快捷键来获取最新的回复内容 快捷键介绍如下: windows…...
77基于matlab的蚁群优化路径算法,二维路径和三维路径优化
基于matlab的蚁群优化路径算法,二维路径和三维路径优化。输出可视化最优路径和距离迭代曲线。数据可更换自己的,程序已调通,可直接运行。 77三维和二维路径可视化 (xiaohongshu.com)...
PyTorch中并行训练的几种方式
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
Neo4j 完全指南:从入门到精通
第1章:Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...
AWSLambda之设置时区
目标 希望Lambda运行的时区是东八区。 解决 只需要设置lambda的环境变量TZ为东八区时区即可,即Asia/Shanghai。 参考 使用 Lambda 环境变量...
