Chemmy's Blog

chengming0916@outlook.com

一、设计核心原则

  1. Git 拆分友好:前后端、公共库物理隔离,可直接拆分为 3 个独立 Git 仓库
  2. 职责单一清晰:前后端彻底解耦,不交叉耦合业务/持久化代码
  3. 分层标准规范:遵循 DDD 领域驱动设计,兼容现有业务模块
  4. 可维护可扩展:支持多客户端、多服务端、插件化开发

二、根目录结构(总仓库)

1
2
3
4
5
项目根目录/
├── .gitignore、README.md、.editorconfig # 全局配置文件
├── Client/ # 【独立仓库】客户端(纯UI+接口调用)
├── Server/ # 【独立仓库】服务端(纯业务+数据持久化)
└── Shared/ # 【独立仓库】公共库(前后端共享代码)

三、客户端模块(Client)- 纯前端展示层

1
2
3
4
5
6
7
8
9
10
11
12
Client/
├── src/
│ ├── Presentation/ # 表现层(UI核心)
│ │ ├── Controls/ # 控件、样式库
│ │ ├── Modules/ # 业务模块(页面、本地逻辑)
│ │ └── Addons/ # 客户端插件/扩展
│ ├── Services/ # 服务封装层
│ │ ├── Api/ # 远程接口调用
│ │ └── Local/ # 本地服务(缓存、文件)
│ ├── Utils/ # 客户端专属工具
│ └── Assets/ # 静态资源
└── tests/ # 客户端测试

四、服务端模块(Server)- 纯业务数据层

1
2
3
4
5
6
7
8
Server/
├── src/
│ ├── Api/ # 接口层(对外提供服务)
│ ├── Application/ # 应用层(业务编排)
│ ├── Domain/ # 领域层(核心实体、业务规则)
│ ├── Persistence/ # 数据持久层(数据库、仓储)
│ └── Infrastructure/# 基础层(日志、缓存、通用组件)
└── tests/ # 服务端测试

五、公共库模块(Shared)- 前后端通用层

1
2
3
4
5
Shared/
├── src/
│ ├── Shared.Core/ # 核心共享(DTO、枚举、常量、接口)
│ └── Shared.Utils/ # 通用工具(加密、序列化、验证)
└── tests/ # 公共库测试

六、单体应用结构

针对无需拆分前后端独立仓库的单体式应用场景,设计如下标准化目录结构,兼顾分层规范与开发便捷性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
单体应用根目录/
├── Solution Item/ # 解决方案级配置项
│ ├── .gitignore # Git忽略规则
│ ├── README.md # 项目说明文档
│ ├── .editorconfig # 编辑器格式统一配置
│ └── Solution.sln # 解决方案文件(如.NET)
├── Presentation Layer/ # 展示层(UI交互核心)
│ ├── 1.1 Controls/ # 控件、样式库
│ │ ├── Common/ # 通用基础控件(按钮、表格、弹窗等)
│ │ ├── Business/ # 业务专属控件(定制化表单、图表等)
│ │ └── Styles/ # 样式文件(主题、布局、全局样式)
│ ├── 1.2 Modules/ # 业务模块(按功能域划分)
│ │ ├── User/ # 用户模块(登录、注册、个人中心)
│ │ ├── Order/ # 订单模块(下单、支付、物流)
│ │ └── Product/ # 商品模块(列表、详情、库存)
│ └── 1.3 Addons/ # 插件扩展(非核心功能)
│ ├── Print/ # 打印插件
│ ├── Export/ # 导出插件
│ └── Notification/ # 消息通知插件
├── 2. Service Layer/ # 服务层(业务逻辑编排)
│ ├── UserService/ # 用户相关服务
│ ├── OrderService/ # 订单相关服务
│ ├── ProductService/# 商品相关服务
│ └── ServiceBase/ # 服务基类(通用方法、异常处理)
├── 3. Persistence Layer/ # 数据层(数据存取)
│ ├── Repositories/ # 仓储实现
│ │ ├── UserRepository.cs
│ │ ├── OrderRepository.cs
│ │ └── ProductRepository.cs
│ ├── DataContext/ # 数据上下文(数据库连接、ORM配置)
│ ├── Migrations/ # 数据迁移脚本(如EF Core迁移)
│ └── SqlScripts/ # 原生SQL脚本(复杂查询、批量操作)
├── 4. Domain Layer/ # 领域层(核心业务规则)
│ ├── Entities/ # 领域实体(User、Order、Product)
│ ├── ValueObjects/ # 值对象(Address、Money、DateTimeRange)
│ ├── Aggregates/ # 聚合根(OrderAggregate、UserAggregate)
│ ├── DomainEvents/ # 领域事件(OrderCreatedEvent、UserUpdatedEvent)
│ └── DomainServices/# 领域服务(跨实体业务规则)
├── 5. Infrastructure Layer/ # 基础设施层(通用能力支撑)
│ ├── Logging/ # 日志组件(日志记录、存储、查询)
│ ├── Caching/ # 缓存组件(Redis、MemoryCache)
│ ├── Authentication/# 认证授权(Token、权限验证)
│ ├── HttpClient/ # 第三方接口调用
│ └── Configuration/ # 配置管理(配置读取、动态更新)
├── 6. Tools/ # 工具层(通用工具类)
│ ├── Encryption/ # 加密解密(MD5、RSA、AES)
│ ├── Serialization/ # 序列化(JSON、XML、Protobuf)
│ ├── Validation/ # 数据验证(参数校验、规则验证)
│ └── Extensions/ # 扩展方法(字符串、集合、日期扩展)
├── 7. Examples/ # 示例代码(参考用例)
│ ├── ApiExamples/ # 接口调用示例
│ ├── BusinessExamples/ # 业务场景示例
│ ├── IntegrationExamples/ # 第三方集成示例
│ └── UnitTestExamples/ # 单元测试示例
└── Tests/ # 测试目录
├── UnitTests/ # 单元测试
├── IntegrationTests/ # 集成测试
└── UiTests/ # UI测试

单体应用分层职责说明

  1. Solution Item:统一存放解决方案级的配置文件,确保项目根目录整洁,配置文件全局复用;

  2. Presentation Layer:仅负责UI展示、用户交互,不包含业务逻辑,通过调用服务层完成功能,其中:

    1. Controls:封装可复用的UI控件和样式,降低页面开发重复度;

    2. Modules:按业务功能域划分页面模块,边界清晰;

    3. Addons:封装非核心的扩展功能,支持插件化启停;

  3. Service Layer:承接展示层的调用请求,编排领域层能力完成业务逻辑,是展示层与领域层的中间层,解耦UI与核心业务;

  4. Persistence Layer:仅负责数据的持久化和读取,不包含业务规则,通过仓储模式封装数据操作,适配不同数据源;

  5. Domain Layer:核心业务规则层,包含实体、值对象、聚合根等领域模型,是整个应用的业务核心,不依赖其他层;

  6. Infrastructure Layer:为各层提供通用技术能力,如日志、缓存、认证等,封装第三方组件,降低耦合;

  7. Tools:提供全项目通用的工具类,无业务耦合,可独立复用;

  8. Examples:提供各类场景的示例代码,降低新开发者的上手成本,包含接口调用、业务场景、测试等示例。

七、分层职责说明(通用)

  1. 客户端:只负责 UI 展示、本地交互、远程接口调用,无业务/数据库代码

  2. 服务端:只负责业务逻辑、数据存储、接口提供,无 UI 代码

  3. 公共库:只提供前后端通用代码,无业务耦合,可独立打包复用

  4. 单体应用:各分层职责与上述一致,通过一体化结构整合前后端能力,适配小型项目、快速开发场景,同时保留DDD分层思想,便于后续拆分为分布式架构。

总结

  • 结构极简:拆分模式下3大核心模块,单体模式下8大分层,均做到边界清晰、一目了然;

  • 拆分便捷:分布式结构可直接独立为Git仓库,单体结构可按需拆分为分布式架构,零成本解耦;

  • 分工明确:前后端/各分层各司其职,后期维护、扩展更高效;

  • 场景适配:同时覆盖分布式拆分、单体一体化两种场景,兼顾大型项目解耦需求和小型项目快速开发需求。

在日常使用Ubuntu系统时,受网络环境(如办公内网、跨境网络)限制,配置代理是高频刚需操作。本文将详细拆解命令行(适合终端用户、服务器场景)和图形界面(适合新手、桌面端)两种代理设置方式,同时同步讲解对应的取消方法,步骤清晰、可直接落地,帮助不同需求的用户快速适配各类网络场景。

一、命令行设置代理(高效便捷,适合终端用户/服务器)

1. 临时设置代理

临时代理仅对当前终端会话生效,关闭终端后自动失效,适合临时测试、短期使用场景,无需修改系统配置。

  • 基础代理设置(无账号密码):

将命令中的proxy.example.com:8080替换为您实际的代理地址和端口(如公司内网代理、第三方代理),执行后立即生效:

1
2
export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080
  • 带用户名密码的代理设置:

若代理需要身份验证(如办公内网代理),按如下格式配置,替换其中的用户名、密码、代理地址和端口即可:

1
2
export http_proxy=http://username:password@proxy.example.com:8080
export https_proxy=http://username:password@proxy.example.com:8080

2. 配置APT更新代理(可选,必看!)

Ubuntu的APT包管理器(用于更新软件、安装依赖)需单独配置代理,否则即使设置了系统代理,APT仍无法正常联网。编辑/etc/apt/apt.conf文件(需管理员权限),添加以下内容,替换为实际代理信息:

1
2
Acquire::http::proxy "http://proxy.example.com:8080/";
Acquire::https::proxy "http://proxy.example.com:8080/";

3. 永久生效代理设置

若需要每次登录系统、打开终端都自动加载代理配置(适合长期使用代理的场景),可将上述export命令写入用户环境变量文件~/.bashrc,无需每次手动输入:

1
2
3
echo 'export http_proxy=http://proxy.example.com:8080' >> ~/.bashrc
echo 'export https_proxy=http://proxy.example.com:8080' >> ~/.bashrc
source ~/.bashrc # 立即生效配置,无需重启终端

二、图形界面设置代理(可视化操作,适合新手/桌面端)

对于不熟悉命令行的用户,图形界面操作更直观,无需输入命令,点击鼠标即可完成配置,适合Ubuntu桌面版用户:

  1. 打开系统设置(点击桌面右上角齿轮图标),找到“网络”选项,点击进入“网络代理”配置页面;

  2. 在“方法”下拉菜单中选择“手动”,分别填写HTTP、HTTPS代理的地址和端口,若代理需要身份验证,点击“细节”补充用户名和密码;

  3. 点击“应用于整个系统”,等待配置生效(部分场景需重启浏览器或应用)。

三、取消代理设置

切换网络环境(如从办公内网切换到家庭网络)时,需及时取消代理,否则可能导致网络无法正常连接,以下是对应取消方法:

1. 命令行临时取消

仅清空当前终端的代理环境变量,关闭终端后无需重复操作,适合临时取消场景:

1
2
unset http_proxy
unset https_proxy

2. 清理APT代理配置(可选,必看!)

若此前配置过APT代理,取消时需同步清理,否则APT无法正常更新软件。编辑/etc/apt/apt.conf文件,删除其中所有关于代理配置的行,保存后APT即恢复无代理状态。

3. 永久取消代理

若此前将代理配置写入了~/.bashrc文件,需删除相关配置才能彻底取消永久代理:编辑~/.bashrc文件,找到添加的代理export命令并删除,保存后执行source ~/.bashrc使修改生效。

4. 生效确认

完成上述操作后,关闭当前终端并重新打开,或执行echo $http_proxy命令(无输出即表示代理已取消);同时可尝试打开浏览器、更新APT,确认网络正常连接,确保所有代理配置完全失效。

总结

Ubuntu系统代理配置可根据自身需求灵活选择方式:命令行适合服务器、批量操作或追求高效的用户,配置快速且不占用图形资源;图形界面适合桌面端新手,操作直观、无需记命令。核心注意点:一是区分“临时生效”与“永久生效”,避免误配置;二是取消代理时,务必同步清理APT配置和~/.bashrc中的相关内容,防止残留配置导致网络异常,确保系统适配不同网络场景。

0%