不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构,或改进的DDD四层架构,有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构风格,有些在实践中可能引入CQRS解决读模型与写模型的差异化等等。即使无法制定通用的、标准的工程应用架构,但为团队制定一个遵循领域驱动设计思想的参考架构依然有价值。基于以下原因:
虽然无法制定完全通用的DDD参考架构,但制定某个特定上下文下的参考架构却具有可行性和实践价值。针对于上下文的选择要尽量贴合实际的工程实践场景并考虑多维度的因素。
本文所述参考工程架构遵循以下原则:
希望工程参考架构能涵盖以下范围
参考架构要遵循技术和业务隔离的特性,可以参考多种架构风格。业务与技术关注点的分离并不是DDD独有的特点,在六边形、整洁架构、洋葱架构中都遵循了这一重要原则。
大多数团队基于DDD进行微服务拆分的时候,特别是系统建设初期,对单个微服务应用内的限界上下文的粒度需要权衡。由于团队组织架构因素及微服务成本问题,单个应用容纳的限界上下文一般是多个(理想情况下是1:1)。这些限界上下文随着后续的逐步迭代有可能会迁移至独立应用。因此,参考架构将多上下文的应用场景作为重要考量因素。
基于以上原则,参考工程考虑单个应用内多上下文的场景,以期在模块化和服务粒度及成本间进行权衡折衷。应用架构对多上下文的支持的逻辑示意图如下所示,在解决方案域对限界上下文进行识别和划分之后,基于其业务内聚性和关联性,把多个上下文实现单个工程应用中。单个应用内的多个限界上下文间可能存在交互,交互的形式可以是基于事件驱动,也可以是基于进程内调用。采用事件驱动的方式上下文间的耦合性对低一些,但一般需要引入事件总线的支持,额外组件的引入必然会导致复杂性的上升。进程内调用则耦合性会高一些,但从实现角度复杂度会低一些。具体选择哪种方式开发人员可以基于实际情况进行权衡。
需要再次说明的是,这种应用架构决策是一种多因素的权衡,并没有与子域与限界上下文1:1的理想化实践保持一致。
从上图的逻辑示意图我们再深入一层,从分层的维度去剖析一下详细的应用架构的展现形式,如下图所示:
客户端
客户端与应用处于不同的进程,是应用能力的消费端,在实际项目中可能是APP端、PC端、小程序端、公众号端或三方的业务调用端等等。
接入层
接入层是外部系统与应用内部业务能力的中间层,接入层是应用层对外的门面,是当前应用对外暴露业务能力的入口。该层的组成可能是对外提供的HTTP接口声明、分布式定时任务调度、消息监听器、RPC服务等等。其重要职责包括对外部系统的请求进行基础的参数校验、入参适配和服务路由(转发至系一层的应用服务)以及响应数据的适配。
业务层:
该层是应用的业务逻辑所在层,整个架构风格采用模块化单体风格,在该层不同的限界上下文体现为不同的模块。在每个限界上下文内采用分层架构,独立划分为应用层、领域层和网关层。
应用层:
协调领域对象、领域服务或外部依赖服务完成业务用例,该层只做能力协调,不处理任何领域逻辑。
领域层:
领域层是整个分层的核心,与技术实现无关,主要负责领域模型、领域事件、领域服务定义,以及业务相关外部服务的接口抽象以及仓库的接口抽象等。
领域层与应用服务的本质区别是:应用层不包含领域逻辑,领域逻辑全部下沉到领域层实现。
网关层:
网关层定位是应用的出口网关,是应用与外部基础设施交互的防腐层,处理所有技术相关实现。
该组件的命名有多种方式,比如有些团队将其命名为 “rpc”,也有些团队将其命名为 “infrastructure”,不同的命名体现了团队对其背后所表达的隐喻的决策选择。在本文的参考架构中选择了 网关-Gateway这一命名,决策原因是:限界上下文自身是高内聚的,其与外部的交互需要统一出口,Gateway所表达的网关的含义恰当的表现了这种统一出口的理念。如果Facade层是应用的北向网关,是外部系统请求进入内部的入口。则此时的Gateway则表达的是限界上下文的南向网关,是内部应用连接外部的出口。
从宏观的分层我们再深入一层看下每层的组件划分。如下图所示:
Start组件:
整个应用的启动入口、加载应用配置信息等等。
Common组件
提供在不同的限界上下文间复用的领域模型元素的抽象,比如对Command、Query、Event、Entity、ValueObjec通用抽象等。当然,领域模型的通用抽象不是必须在Common组件内以提供复用,也可以作为一个独立的限界上下文,并以共享内核方式与其它上下文进行共享,或者也可以实现为独立的jar包组件。
API 组件
RPC类型服务的接口声明组件,以公司内部使用的JSF为例,该组件是应用对外部系统暴露的JSF API的组件。该组件可以是独立的工程,当然,有些团队会将其作为一个Module放入应用工程中。
统一门面组件:Facade
外部客户端触达应用系统的入口,也是内部应用服务的统一门面,类似于六边形架构风格下的适配器。参考架构中基于不同场景划分为 provider(RPC服务)、task(定时任务)、listener(MQ监听)、rest(http接口)等几个子包。外部请求进入系统后,由Facade组件完成入参基本校验、入参转换、服务路由以及出参转换等操作。另外,还可以承担处理登录态、鉴权以及日志等相关能力。
应用服务组件:Application Service
应用服务代表着用例以及系统行为,其通过委托到领域层和基础设施层(参考架构中的Gateway组件)完成用例的应用逻辑逻辑处理,可以理解为应用服务是领域层的客户端。该组件典型的职责:
从存储层加载领域对象、委托领域对象执行领域逻辑、保存领域对象
External API
应用服务的逻辑不仅仅需要协调领域层,有时还需要依赖于外部的三方服务。External API 组件负责对这些外部服务进行接口声明定义,不做具体实现。
应用服务组件不直接依赖这些外部服务实现,而是依赖其接口抽象。同时,此处的模型定义是基于该限界上下文的语义,是一种对外部模型的适配。
该组件不依赖其它组件,且仅被应用服务组件和Gateway组件依赖。网关组件依赖External API 组件的接口声明并提供底层技术实现,应用服务组件依赖其接口,并通过IOC方式将具体实现注入完成服务调用。
注意,该组件所依赖的服务不涉及领域逻辑,只是用于支撑应用服务的编排。如果是涉及了领域逻辑,则对外部服务依赖的接口定义需要下沉到Domain层。
Query
Query组件解决领域相关的报表查询场景,在限界上下文内作为与应用服务对等的组件存在,两个组件分别负责业务的查询和命令逻辑。
虽然引入了Query组件对报表场景提供支持,但没有完全的引入CQRS这一模式。在很多资料中CQRS与DDD同时提及的概率比较高,因为,在DDD下我们解决了复杂的面向领域的写侧模型,但在报表场景下,这种富领域模型有可能并不是最佳选择。如果读侧和写侧都基于统一的领域模型,一般会导致领域模型的折衷设计。为了满足查询侧诉求,领域模型不得不引入额外的、领域无关的属性,由此造成领域模型的污染。
Domain
Domain组件是领域逻辑核心,承担整个系统领域逻辑的实现,其定义了领域模型、领域服务、领域事件以及仓储层的抽象。该组件不依赖其它组件(除了通用的领域模型抽象组件Common之外。
上图所体现的参考架构使用了DDD的战术设计的经典建模元素,比如聚合、实体、值对象、仓储、工厂以及领域事件等。在实际落地过程中,这些设计元素的抽象具有一定的挑战,设计过程中需要经过不断分析、权衡和重构以完成建模,这正是核心设计所在。
Gateway
网关层承担整个技术相关性的实现,是内部应用的出口网关。
技术相关性是网关组件区别于其它组件的根本特性。在该组件内要处理技术实现的所有细节,比如与外部服务、中间件、DB的交互等。同时,其与Domain组件以及External API组件的接口抽象协作,共同承担了系统与外部依赖间(包括外部服务以及应用依赖的中间件、DB等基础设施)的防腐层职能,负责内部模型到外部模型转化、外部模型到内部模型转化以及具体交互。基于网关组件的特性,也非常适合在该层做统一的外部服务数据缓存及降级熔断处理。
网关层依赖于Domain、Application Service、External API和Query组件,负责上述四个组件定义的接口实现。在Gateway组件通过子包对实现进行隔离:
应用架构模式的选择是系统架构设计的重要维度之一,结构不仅仅是简单的包结构和命名,其传达的是一种顶层抽象,背后包含了大量的实践和知识。制定符合团队情况的工程参考架构,并在团队成员间达成共识非常重要。领域驱动设计并没有统一的、通用的架构,试图定义标准架构是不切实际的。本文描述的工程架构只是一个参考,实践过程中应该基于团队特定情况而有所差异,但原则上都应该遵循业务域与技术域分离的核心理念。
作者:京东科技 倪新明
内容来源:京东云开发者社区
时间过得好快呀,已经是五月最后一天了,很久没有写博客了,最近工作有些忙,每天下班回来都筋疲力尽的?,感觉身体被掏空。眼看博客就要这么荒废了,决定还是在明天?之前水一篇博客吧,分享一下平时用到的JavaScript代码,铲一下博客里的草。话说今年又是儿童节,嗯,我还没长大?。(PS.最近被李荣浩的嗯洗脑了)1.JavaScript正则表达式筛选字符串/元素内容给String对象添加一个isLike的prototype方法,用于判断参数内容和字符串是否相似(符合正则表达式),类似SQL中的like:js源码1/** 2*为字符串添加模糊比较的方法 3*@paramexp模糊查询字符串,支持正则表达式 4*@parami是否区分大小写 5*@returns 6*/ 7String.prototype.isLike=function(exp,i){ 8varstr=this; 9i=i==null?false:i; 10if(exp.constructor==String){ 11/*首先将表达式中的‘_’替换成‘.’,但是‘[_]’表示对‘_’的转义,所以做特殊处理*/ 12vars=exp
引言Qt键盘事件可能会遇到无法响应方向键、一直产生按下或者释放事件等问题,如何解决呢?Jungle笔记为您解答。01问题描述在Jungle的上一篇文章中(Qt键盘事件(一)——检测按键输入),Jungle简单实现了利用qt检测用户按键操作并将键按下\释放操作打印在Qt界面上的一个小程序。但是在测试过程中会出现一个现象,那就是长按某个键不放,界面一直在刷新press、release、press、release……(如下图)也就是说,在长按某个键不释放的情况下,keyPressEvent和keyReleaseEvent事件会不断被触发。尽管这是Qt设计实现好的事件机制,但在用户体验上,这是不合常理的。我们希望实现的是:按下某个键(比如Tab键),界面只打印一次"Key_TabPress";当手松开时,界面上才打印"Key_TabRelease"。02问题说明为此,Jungle查询了Qt官方文档和几篇博客。官方文档上提到一个QKeyEvent的成员函数isAutoRepeat:可以看到,当event来自于auto-repeatingkey,isAuto
P0事故安排上了原来以为内存溢出这种事情只会发生在书本上,没想到在我们生产环境发生了,而且是618,P0事故安排上了。先回顾一下内存溢出排查的基本思路,然后再来复盘一下内存溢出发生的原因内存溢出排查我们先来了解一下Java堆的组成机构。对于大多数应用来说,Java堆(JavaHeap)是Java虚拟机锁管理的内存中最大的一块。Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存「堆的结构如下」「新生代老年代的具体划分比例如下」「分代的主要作用就是为了更高效的管理内存」内存泄漏和内存溢出是2个不同的概念内存泄漏:对象已经不使用了,但是还占用着内存空间,没有被释放内存溢出:堆空间不够用了,通常表现为OutOfMemoryError,内存泄漏通常会导致内存溢出使用JavaVisualVM分析排查「我们可以通过jdk自带的jvisualvm命令来分析堆的使用情况」我们写一个程序,来演示内存不断增加的场景publicclassOomDemo{ privatestaticfinalintNUM=1024; publ
由于"mutablenoalias"的逻辑错误bug导致回归当前本来可以在这个版本下工作的代码:Stable Beta nightly-2021-03-22复制但在这两个版本上就不能正常工作了:cargo1.52.0-nightly(90691f2bf2021-03-16) release:1.52.0 commit-hash:90691f2bfe9a50291a98983b1ed2feab51d5ca55 commit-date:2021-03-16复制rustc1.53.0-nightly(5d04957a42021-03-22) binary:rustc commit-hash:5d04957a4b4714f71d38326fc96a0b0ef6dc5800 commit-date:2021-03-22 host:x86_64-pc-windows-msvc release:1.53.0-nightly LLVMversion:12.0.0复制因此需要对这部分升级的代码进行回归,具体原由看这里:https://github.com/rust-lang/rust
编译|陈彩娴编辑|陈大鑫在过去的十年里,机器学习确实取得了巨大的突破,计算机视觉与语言处理方面也因此出现了许多改变世界的重要应用。但是,这股“春风”却没有吹到智能机器人领域。针对机器人学习所面临的瓶颈,麻省理工学院机器人专家LesliePackKaebling在《Science》上发表一篇名为《Thefoundationofefficientrobotlearning》的文章。她认为,造成这一现象的一个关键因素在于:机器人学习的数据只能通过在现实世界的操作中获得,成本非常高昂。为此,Leslie女士提出,实现下一代机器人学习的技术革新,需要应用新的算法、从自然体系中获取灵感,并灵活使用多项机器学习技术。1强化学习是否真的那么灵?尽管监督学习取得了许多重要的成果,但在机器人学习领域,强化学习(RL)更具有优势,因为机器人要在人类世界中执行一系列不同的任务。在监督学习中,学习算法被赋予输入与期望输出的配对示例,并学会将输入与期望输出关联起来。而在强化学习中,智能体能够根据事先设置的奖励信号来判断自己的表现是出色的,或是差劲的,进而选择恰当的行动方式,这与机器人所应用的复杂环境有利相关。简而
来源:公众号机器之心授权转谷歌机器人团队利用进化算法,获得低计算成本、高性能的视频网络架构TVN,该网络运行高效,速度可达之前视频模型的100倍。视频理解是计算机视觉领域中的重要问题,它有很多应用,如视频自动标注、行为识别和机器人感知。视频理解对自动智能体在现实世界中的应用有重大影响,目前它仍是一道难题。现有的解决方案计算成本高昂,最快速的算法需要在强大的GPU上运行才能处理超过0.5秒的视频片段。为了解决该问题,谷歌机器人团队提出使用进化算法,自动设计出以原来计算成本的一部分提供相当性能的网络(即低计算成本、高性能)。具体来说,谷歌研究者提出了一种为视频理解任务设计「微」神经网络(tinyneuralnetwork)族的通用方法。论文链接:https://arxiv.org/abs/1910.06961v1这些微神经网络可实现相当高的准确率,且运行高效,可实时或者以更快的速度运行。它们在一块CPU上处理约1秒的视频片段需要37-100ms,在一块GPU上仅需10ms,速度是当前模型的100倍(见下图1、2)。研究者将这些网络称为TinyVideoNetworks(TVN),因为此类网
HDFS结构imagenamenode保存文件树 保存file->block(file==idnode) 不保存block->locationdatanodeFile->block1block2(128M)block存储在不同datenode保存副本(1)secondaryNamenode:其实起初我对SN的理解也和大部分人相同,认为SN是NN(nameNode)的一个实时热备份实现HA,并且在一次笔试的过程中还写错了,尴尬,后台经过查看相关的书籍发现其实并不是这么一回事,SN主要是完成的Edits和fsImage的合并工作,以减少NN的工作压力。对于错误的理解其实并不是没有道理,现在版本的hadoop支持进行HA的实时备份。后面的章节后说。 (2)fsImage和edits:虽然说不希望在这讲一些概念,但是该说的还是得说。简单的解释:fsimage包含Hadoop文件系统中的所有目录和文件idnode的序列化信息,其中对于文件包含了文件的修改时间、访问时间、块大小和组成一个文件块信息等。对于文件夹而言包含的信息主要有修改时间、访问控制权限等信息。而Edits文件主要
这个应该算作失真,或者也不算。情况就是用了toFixed后再进行相关计算,得不到预期的结果 具体看例子比如想动态计算百分比,保留一位小数如94.4%这样子varblobTo=409600; vartotalSize=433927; varpercent=(blobTo/totalSize).toFixed(3)*100; percent//94.39999999999999复制恰巧碰到这个,然而percent并不是预期的结果。于是,测试各段数据varblobTo=409600; vartotalSize=433927; varpercent1=(blobTo/totalSize); varpercent2=(blobTo/totalSize).toFixed(3); varpercent3=(blobTo/totalSize).toFixed(3)*100; varpercent4=(blobTo/totalSize).toFixed(3)*1; varpercent5=(blobTo/totalSize).toFixed(3)*10; console.log(percent1,t
2016年12月21日,凭借着行业领先规格的基础设施和运维水平,互联港湾自建的M7云数据中心正式通过数据中心联盟“5A级服务能力认证”,成为具有官方最高等级认证的高可靠数据中心。互联港湾“5A级服务认证” 据了解,“数据中心分级评估”是由数据中心联盟发起的专业评估,综合考证了参评企业数据中心能源效率、节能技术、绿色管理等多方面因素,以专业评测指标检验数据中心运营能力(包括基础设施保障能力、IT运维保障、资源调配及扩展),运营区段网络质量(包括丢包、时延、抖动、中断次数、中断时长)和服务提供能力(包括服务资质、服务产品、服务支持、技术能力、流程规范)各方面指标。此次“5A级服务能力认证”的通过,充分证明了互联港湾在数据中心领域领先的技术实力和服务水平。互联港湾M7云数据中心 数据中心领域稳扎稳打凝聚着互联港湾多年的行业经验,M7云数据中心在位置选址、前期设计、基础设施配置、交付落地方面都保持行业领先水平。值得一提的还有M7云数据中心的网络品质。在网络连接方面,互联港湾具有丰富的资源优势和品质保障。为了充分满足用户的业务需求,M7云数据中心采用了八线BGP网络,并提供丰富的光缆资源,以及C
在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能。有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常。但是在查看这些API的文档时,我们却没有办法找到有关这些异常的详尽解释。在这种情况下,我们不能简单地忽略这些由throws所声明的异常:publicvoidshouldNotThrowCheckedException(){ //该API调用可能抛出一个不明原因的CheckedException exceptionalAPI(); } 否则Java编译器会由于shouldNotThrowCheckedException()函数没有声明其可能抛出的CheckedException而报错。但是如果通过throws标明了该函数所可能抛出的CheckedException,那么其它对shouldNotThrowCheckedException()函数的调用同样需要通过throws标明其可能抛出该CheckedException。那我们应该如何对这些CheckedException进行处理呢?在本文中,我们将对如何在Java
大家好,又见面了,我是你们的朋友全栈君。 (1)第一步:打开CCS5.2,新建一个工程。(2)第二步: 输入工程名后点击“finish”如图(3)第三步:右键单击工程名-“properties“如图 (4)第四步:所有头文件路径添加完成后,点击“ok”,如图(5)第五步:添加工程所需头文件,如图依次添加需要头文件,添加时按下图添加:添加完成后,如图:(6)第六步:程序编写 (7)第七步:对程序进行编译。编译结果:版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至举报,一经查实,本站将立刻删除。发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196323.html原文链接:https://javaforall.cn
当两条线段有交点的时候,交点坐标可以用叉乘来求。思路就是连接线段的端点,构造向量,从而构造出相似三角形,然后求出交点在一条线段上的位置(用比例t来表示),然后再加到线段端点上就可以了。题目:CGL_2_CAC代码:#include<iostream> #include<cstdio> #include<math.h> usingnamespacestd; #defineCOUNTER_CLOCKWISE-1//逆时针 #defineCLOCKWISE1//顺时针 #defineONLINE_BACK-2//p2p0p1依次排列在一条直线上 #defineONLINE_FRONT2//p0p1p2依次排列在一条直线上 #defineON_SEGMENT0//p2在线段p0p1上 #defineEPS1E-8 classPoint { public: doublex,y; Point() { } Point(doublex,doubley) { (*this).x=x; (*this).y=y; } doubleoperator^(constPo
Mycat是什么? Mycat是数据库中间件。主要是做数据分布式存储,也有Atlas普通版的读写分离功能,其最重要还是分布式 Mycat是java语言开发的。是一个开源的分布式数据库系统,是一个实现了MySQL协议的的Server,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里 支持Mysql集群,可以作为Proxy使用 支持JDBC连接多数据库 支持各种数据库,包括Mysql、mongodb、oracle、sqlserver、hive、db2、postgresql。 支持galeraformysql集群,percona-cluster或者mariadbcluster,提供高可用性数据分片集群 自动故障切换,高可用性 支持读写分离,支持Mysql双主多从,以及一主多从的模式 支持全局表,数据自动分片到多个节点,
ASP.NETMVCModel元数据(一) 前言 在我初学的时候对Model元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退缩了,对的我退缩了准备跳过这个部分去学其他的,在这过程中干什么都没精神,就跟有一根刺插在心上一样,最终我还是回头了,现在来和大家分享一下什么是Model元数据,希望看完能对有的朋友有点帮助,大概的了解一下Model元数据到底是个什么玩意。 Model元数据 什么是Model元数据? 生成Model元数据的过程【一】 生成Model元数据的过程【二】 ModelMetaData的定义、详解 Model元数据应用(常用特性应用)-1 Model元数据应用(自定义视图模板)-2 Model元数据应用(IMetadataAware接口使用)-3 什么是Model元数据? 前面耽搁了这么久,不废话了我们直接切入主题。 既然叫Model元数据就按照字面的意思得先要有Model吧(Model指的是视图模型)。那我们就先定义Model,请看代码1-1: 代码1-1
AotucCrawler快速爬取图片 今天介绍一款自动化爬取图片项目。 GitHub:https://github.com/YoongiKim/AutoCrawler Google,Navermultiprocessimagewebcrawler(Selenium) 关键字 爬虫网站:Google、Naver(美、韩两大搜索引擎) 运行方式:Multiprocess(多进程) 爬取格式:image(图片) 基于自动化工具:Selenium(不解释) 如何使用 Git克隆AutoCrawler项目到本地 自行安装Chrome浏览器 安装依赖 >pip-rrequirements.txt 复制 certifi:包含了很多可信任知名公司的证书/公钥。 chardet:提供自动检测字符编码的功能。 idna:提供"对于RFC5891中定义的IDNA协议(InternationalisedDomainNamesinApplications)的支持"。 requests:依赖于上面三个基础库,他主要用于根据图片链接下载图片。 selenium:用于启动浏览器,爬取图
看到一个重构的例子,还能重温json数据解析#defGreetUser(): #filename='/Users/zhangxl/Desktop/union.json' #try: #withopen(filename)asf_obj: #username=json.load(f_obj) #exceptFileNotFoundError: #username=input("Whatisyourname?:") #withopen(filename,'w')asf_obj: #json.dump(username,f_obj) #print(username) #else: #print("Welcometo"+username) defget_stored_username(): filename='/Users/zhangxl/Desktop/union.json' try: withopen(filename)asf_obj: username=json.load(f_obj) exceptFileNotFoundError: returnNone else: returnus
_id是mongo的对象,python从mongo中读出来的数据类型是str或者object类 _id是str类型时存在使用_id更新数据失败的情况 解决办法时导入 bson里面的 ObjectId importpandasaspd importpymongo frombsonimportObjectId client=pymongo.MongoClient().history_event_old['time_info'] path='history_event_old.xlsx' df=pd.read_excel(path,keep_default_na=False) values=df.values fordatainvalues: _id=data[0] print(_id) start_time=data[2] end_time=data[3] client.update_one({"_id":ObjectId(_id)},{"$set":{"开始时间":start_time,'结束时间':end_time}})复制 bson模块 是一种类j
第一个SpringBoot程序 *创建SpringBoot程序的步骤 -第一步:在pom.xml中导入相关依赖 -Spring核心,表示这是一个SpringBoot程序 <!--SpringBoot核心--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/><!--lookupparentfromrepository--> </parent> -创建SpringBootWeb程序所需所有依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-
/标识从根节点绝对路径的方式复制 /html/body 绝对路径的方式复制 //标识相对路径复制 //div 相对路径方式复制 .一个点, ..两个点 //title/. 表示当前节点 //title/./../ 表示当前节点的父节点复制 多个标签通过索引获取 //div[3] 从1开始复制 获取多个标签中最后一个标签 //div[last()] 可以加减 //div[last()-1]//*[@id="content"]/div/div[2]/div/ul/li[last()]复制 获取多个标签中区间值 //div[position()<5] //*[@id="content"]/div/div[2]/div/ul/li[position()<5]复制 修饰词位置 //*[@id="qiushi_tag_124086601"] 这样表示标记一个标签的特征 //*[@id="qiushi_tag_124086601"]/a/@href复制 //*[@id=