基础篇

讲解该项目的基础部分

MVC 和三层架构的区别

MVC 流程

  1. 用户通过 View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等。
  2. 服务端的 Controller 控制器接收到请求后对请求进行解析,找到相应的 Model,对用户请求进行处理。
  3. 处理结果再交给 Controller(控制器其实只是起到了承上启下的作用)。
  4. 根据处理结果找到要作为向客户端发回的响应 View 页面,页面渲染后发送给客户端。

全局架构

├── paicoding-api
│ └── context // 请求上下文
│ └── entity // 通用实体
│ └── enums // 枚举值
│ └── exception // 异常类
│ └── vo // 返回值
├── paicoding-core
│ └── cache // 缓存
│ └── common // 通用常量
│ └── config // 配置文件
│ └── permission // 权限
│ └── region // 区域信息
│ └── util // 通用方法
│ └── resources
│ └── META-INF
├── paicoding-service // 后端核心逻辑
│ └── article // 文章
│ └── conveter // 类型转换
│ └── repository // 厂库
│ └── dao // DAO层,DB操作类
│ └── entity // 实体
│ └── mapper // mapper
│ └── service // 基于DAO上层封装,对标Service层
│ └── impl
│ └── comment // 评论
│ └── config // 配置
│ └── image // 图片
│ └── notify // 消息通知
│ └── sidebar // 侧边栏
│ └── sitemap // 站点
│ └── statistics // 数据统计
│ └── user // 用户
│ └── resources
│ └── META-INF
│ └── mapper
├── paicoding-ui // view层,PC 界面
├── paicoding-web // Controller层,界面与后端交互逻辑
│ └── admin // 运营后台接口
│ └── rest
│ └── common // 通用接口
│ └── component // 组件接口
│ └── config // 配置接口
│ └── init
│ └── error // 异常接口
│ └── front // 前端界面接口
│ └── article // 文章
│ └── rest // api接口
│ └── view // 页面嵌入接口
│ └── vo // 返回值
│ └── comment // 评论
│ └── home
│ └── image
│ └── login
│ └── notice
│ └── search
│ └── user
│ └── global // 全局接口
│ └── vo
│ └── hook // 勾子,框架方法
│ └── filter // 处理请求
│ └── interceptor // 注入全局的配置信息
│ └── resources // 资源信息
│ └── data
│ └── liquibase // 初始化DB数据
│ └── changelog // DB变更
│ └── data // DB数据
│ └── resources-env // 环境配置
│ └── dev // 本地环境
│ └── pre // 预上线环境(目前不用)
│ └── prod // 线上配置
│ └── test // 测试环境
└── test // 测试用例

数据存储对象

这些术语通常在软件开发中用于描述不同层次的对象和数据传输。以下是它们的含义:

  • DO (Domain Object):领域对象,用于表示业务领域中的实体或概念。它们通常与数据库中的表或实体对应,包含业务逻辑和数据操作。

  • DTO (Data Transfer Object):数据传输对象,用于在不同层之间传输数据。它们通常是轻量级的对象,仅包含需要传输的数据,而不包含业务逻辑。

  • BO (Business Object):业务对象,用于表示业务逻辑的实体或概念。它们封装了业务逻辑,并与领域对象交互来实现具体的业务功能。

  • PO (Persistence Object):持久化对象,用于表示与数据库交互的实体或数据。它们通常与数据库中的表或实体对应,并提供数据持久化的功能。

  • VO (View Object):视图对象,用于表示用户界面中的数据。它们通常用于在前端界面显示数据,与用户交互。

  • Req (Request Parameter Object):请求参数对象,用于封装 HTTP 请求中的参数数据。它们通常用于在服务端接收和处理 HTTP 请求。

  • Rsp (Response Object):返回结果对象,用于封装服务端处理结果并返回给客户端的数据。它们通常包含操作结果和相关的状态信息。

差异性

vo与dto

在大多数情况下,DTO(数据传输对象)和VO(视图对象)的属性基本相同,都是简单的POJO。但是从概念上来说,它们有着本质的区别。DTO代表服务层需要接收和返回的数据,而VO代表展示层需要显示的数据。通常来说:

  • 展示层向服务层传递数据时使用DTO。
  • 服务层向展示层返回数据时使用VO。

dto与do

DTO和DO(领域对象)在设计上有区别,但在实现上通常不会有明显的区别。DTO用于服务层接收和返回数据,而DO代表领域层的实体对象。尽管它们的属性可能相同,但DTO主要用于展示层和服务层之间的数据传递,而DO主要用于领域逻辑和数据持久化。

do与po

DO和PO(持久化对象)在大多数情况下是一一对应的,代表着数据库中的持久化对象。它们之间的区别通常不大,但有时PO可能包含一些与业务无关的持久化属性,而DO则更关注领域逻辑。

po与entity

PO和实体(Entity)通常是对应的,表示数据库中的持久化对象。它们之间的区别在于项目规范的不同,有些项目中使用PO表示持久化对象,而有些项目使用Entity表示。

dto与bo

DTO主要用于数据传输,而BO(业务对象)通常用于保存业务相关的数据。在调用外部服务接口时,通常会将外部服务返回的DTO转换为内部的BO对象进行使用。这样做的好处在于,可以更好地控制内部业务逻辑,同时降低对外部服务变化的敏感度。

AOP

让我们来了解一下 AOP(面向切面编程)涉及到的 5 个关键术语:

1)横切关注点:指从每个方法中抽取出来的同一类非核心业务。

2)切面(Aspect):是对横切关注点进行封装的类,每个关注点体现为一个通知方法。通常使用 @Aspect 注解来定义切面。

3)通知(Advice):切面必须要完成的具体工作,比如记录接口调用前后的时长。通知的方式有五种:

  • @Before:在目标方法调用之前执行通知方法。
  • @After:在目标方法调用后执行通知方法。
  • @AfterReturning:在目标方法返回后执行通知方法。
  • @AfterThrowing:在目标方法抛出异常后执行通知方法。
  • @Around:包裹目标方法,在调用前后执行通知方法。

4)连接点(JoinPoint):通知应用的时机,比如接口方法被调用时就是日志切面的连接点。

5)切点(Pointcut):通知功能被应用的范围,比如日志切面的应用范围是所有 controller 的接口。通常使用 @Pointcut 注解来定义切点表达式。