当前位置: 首页 > article >正文

鸡翅Club项目学习文档 - 第一部分

## 学习进度 - [x] 第一部分项目整体架构与核心概念 - [ ] 第二部分设计模式详解 - [ ] 第三部分代码实战演练 --- ## 一、项目概述 ### 1.1 项目定位 | 项目名称 | 鸡翅Club刷题系统 | |----------|------------------| | 英文名 | jc-clubjingdianjichi club | | 项目类型 | 刷题系统类似刷题宝、题库系统 | | 架构风格 | 微服务 DDD领域驱动设计 | | 核心功能 | 题目管理、刷题练习、社交圈子、用户认证 | ### 1.2 类比理解 把这个项目想象成一个程序员版的刷题APP就像考研刷题软件但专门刷Java面试题。 --- ## 二、微服务架构 ### 2.1 什么是微服务 **核心特点**每个服务独立运行 **类比理解**想象一家大型餐厅 - 前台服务接待客人、安排座位 - 厨房服务负责做菜 - 收银服务负责结账 - 采购服务负责买菜 每个部门独立运行这就是微服务的思想——按**业务职责**划分。 ### 2.2 本项目的微服务划分 | 服务名 | 业务职责 | 类比 | |--------|----------|------| | jc-club-gateway | 统一入口、路由转发 | 餐厅大门引导员 | | jc-club-auth | 用户登录、权限管理 | 前台验票员 | | jc-club-subject | 题目增删改查 | 厨房管理菜谱 | | jc-club-practice | 刷题练习、记录成绩 | 上菜服务员 | | jc-club-circle | 发动态、评论、点赞 | 餐厅社交区 | | jc-club-oss | 文件上传下载 | 仓库管理员 | ### 2.3 区分服务的关键 看它负责什么**业务功能** --- ## 三、DDD分层架构 ### 3.1 什么是DDD **DDD** Domain-Driven Design领域驱动设计 **对比MVC和DDD** | MVC技术视角 | DDD业务视角 | 类比角色 | |----------------|----------------|----------| | Controller | application层应用层 | 服务员接单转达 | | Service | domain层领域层 | 厨师核心业务逻辑 | | DAO/Mapper | infra层基础设施层 | 采购员提供原材料 | | Entity | BO业务对象 | 菜谱里的菜品 | | DTO | DTO数据传输对象 | 顾客菜单上看到的菜名 | **核心区别** - MVC按代码类型划分 - DDD按业务含义划分Domain层承载核心业务知识 ### 3.2 DDD六层架构 | 层级 | 职责 | 类比 | |------|------|------| | **api层** | 定义给其他服务调用的接口 | 餐厅外卖窗口 | | **application层** | 接收请求、转换数据、MQ消费者 | 服务员 | | **domain层** | 核心业务逻辑、策略处理器 | 厨师 | | **infra层** | 数据库操作、外部服务调用 | 采购员 | | **common层** | 公共工具、枚举 | 公共设施 | | **starter层** | SpringBoot启动入口 | 餐厅开门营业 | ### 3.3 各层分割点重点 **Controller和Domain Service的分割** | Controller | Domain Service | |------------|----------------| | ✅ 接收HTTP请求参数 | ✅ 写业务判断逻辑if-else | | ✅ DTO转BO | ✅ 调用Infra层查数据 | | ✅ 调用Domain Service | ✅ 组合多个数据 | | ✅ BO转DTO返回 | ❌ 不接收HTTP请求参数 | | ❌ 不写业务判断逻辑 | ❌ 不返回HTTP响应 | | ❌ 不直接查数据库 | ❌ 不写SQL语句 | **Domain Service和Infra的分割** | Domain Service | Infra/Mapper | |----------------|--------------| | ✅ 决定要查什么数据 | ✅ 写SQL语句 | | ✅ 决定要存什么数据 | ✅ 直接操作数据库 | | ✅ 写业务判断逻辑 | ❌ 不写业务判断 | | ❌ 不写SQL语句 | ❌ 不写业务逻辑 | **一句话记住边界** | 层 | 边界口诀 | |----|----------| | Controller | 只管进门出门不写业务判断 | | Domain Service | 只管业务怎么干不写SQL | | Infra/Mapper | 只管数据库操作不写业务判断 | ### 3.4 BO和Domain Service的分割重点 **BO**数据对象 **Domain Service**操作对象 | 情况 | 写在BO | 写在Domain Service | |------|--------|---------------------| | 只涉及自己如我是单选题吗 | ✅ | ❌ | | 涉及多个对象如题目分类标签 | ❌ | ✅ | | 需要查数据库 | ❌ | ✅ | | 简单判断 | ✅ | 都可以 | | 复杂业务流程 | ❌ | ✅ | **简单记忆法** | BO | Domain Service | |-----|----------------| | 自己的事自己管 | 多个对象的事我来管 | | 不查数据库 | 可以查数据库 | | 简单判断 | 复杂流程 | --- ## 四、核心技术栈 ### 4.1 技术概览 | 技术 | 版本 | 作用 | |------|------|------| | Spring Boot | 2.4.2 | 基础框架 | | Spring Cloud | 2020.0.6 | 微服务框架 | | Spring Cloud Alibaba | 2021.1 | Nacos服务发现/配置 | | Java | 1.8 | 开发语言 | | Sa-Token | - | 认证授权 | | MySQL | - | 主数据库 | | Redis | - | 缓存 | | RocketMQ | - | 消息队列 | | XXL-Job | - | 定时任务 | | Elasticsearch | - | 全文搜索 | | MinIO | - | 对象存储 | ### 4.2 各技术详解 #### MySQL - 主数据库 **类比**图书馆书架存得多但找书慢 **用途**存储题目、用户、分类等核心数据 --- #### Redis - 内存缓存 **类比**手边的笔记本存得少但翻开就能看到 **用途** - 缓存热点数据题目分类、标签列表 - 用户登录态存储 - 点赞计数 - 分布式锁 --- #### RocketMQ - 消息队列 **类比**奶茶店排队系统 **用途**异步处理、削峰填谷 **举例**用户点赞 用户点赞 → 发到RocketMQ排队 → 后台慢慢处理 → 写入数据库 **好处** 1. 削峰填谷高峰期不崩溃 2. 解耦各模块独立 3. 可靠消息不丢失 --- #### XXL-Job - 定时任务 **类比**系统闹钟 **用途**定时执行后台任务 **举例**同步点赞数据 Redis点赞数据 → 定时任务 → 同步到MySQL --- #### Elasticsearch - 全文搜索 **类比**超级目录 **用途**全文搜索 **对比MySQL** | MySQL | Elasticsearch | |-------|---------------| | 精确查询按ID查 | 全文搜索按关键词搜 | | 存数据为主 | 搜索为主 | | 翻书找内容 | 翻目录找内容 | --- #### Nacos - 服务发现/配置中心 **类比**微服务的电话簿 配置公告栏 **两个作用** | 功能 | 说明 | |------|------| | 服务发现 | 各服务启动时告诉Nacos我在哪其他服务通过Nacos找到它 | | 配置中心 | 所有服务的配置文件放在Nacos统一管理 | **流程** jc-club-subject启动 → 告诉Nacos我在IP 192.168.1.100 jc-club-auth想调用subject → 问Nacossubject在哪 → Nacos回答 --- ## 五、数据库设计 ### 5.1 题目相关表 | 表名 | 作用 | |------|------| | subject_info | 题目基本信息题目名、类型、难度 | | subject_radio | 单选题的选项和答案 | | subject_multiple | 多选题的选项和答案 | | subject_judge | 判断题的答案对/错 | | subject_brief | 简答题的答案文本 | | subject_category | 题目分类 | | subject_label | 题目标签 | | subject_mapping | 题目与分类、标签的关联关系 | | subject_liked | 题目点赞记录 | ### 5.2 设计要点 **题型字段区分** - subject_type 1 → 单选题 - subject_type 2 → 多选题 - subject_type 3 → 判断题 - subject_type 4 → 简答题 **答案分开存储** 每种题型一张表因为答案格式不同 - 单选题选项A、B、C、D - 简答题一段文字 **关联表设计** subject_mapping用于记录题目、分类、标签的多对多关系。 --- ## 六、BO/DTO/Entity详解 ### 6.1 三者对比 | 对象 | 全称 | 作用 | 所在层级 | 类比 | |------|------|------|----------|------| | **Entity** | 实体对象 | 直接映射数据库表字段 | infra层 | 仓库里的货物 | | **BO** | 业务对象 | 承载业务数据带业务含义 | domain层 | 分拣中心的包裹 | | **DTO** | 数据传输对象 | 给前端/其他服务用的数据 | application层 | 送到客户手里的包裹 | ### 6.2 举例说明 **Entity**infra层 java // 和数据库字段一一对应 public class SubjectInfo { private Long id; private String subjectName; private Integer subjectType; private Integer isDeleted; // 用户不需要看到 } **BO**domain层 java // 带业务含义过滤无用字段 public class SubjectInfoBO { private Long id; private String subjectName; private Integer subjectType; // 不需要isDeleted // 可能加上分类名、标签列表 } **DTO**application层 java // 给前端展示用 public class SubjectInfoDTO { private Long id; private String subjectName; private String subjectTypeDesc; // 简答题而不是数字4 } ### 6.3 为什么要转换 1. **隔离变化**数据库改字段不影响业务层和前端 2. **安全**isDeleted敏感字段不会传给用户 3. **业务含义**BO可以加业务逻辑DTO可以加展示格式化 4. **复用**同一业务逻辑可被多处调用Controller、MQ、定时任务 ### 6.4 转换流程 数据库数据(Entity) ↓ BOConverter转换 业务处理(BO) ↓ DTOConverter转换 返回前端(DTO) --- ## 七、完整请求流程 ### 7.1 流程图 用户发起请求 ↓ 【Gateway网关】路由到对应服务 ↓ 【Controller】接收HTTP请求DTO转BO ↓ 【Domain Service】处理业务逻辑 ↓ 【Infra/Mapper】查询数据库 ↓ 【数据库/Redis】返回数据Entity ↓ 【Infra层】Entity转BO ↓ 【Domain Service】组合业务数据 ↓ 【Controller】BO转DTO ↓ 返回给用户 ### 7.2 代码示例 **Controller** java GetMapping(/query) public Result query(RequestParam Long id) { // 调用Domain Service SubjectInfoBO bo domainService.query(id); // BO转DTO SubjectInfoDTO dto converter.convert(bo); return Result.success(dto); } **Domain Service** java public SubjectInfoBO query(Long id) { // 业务判断 if (id null) throw new Exception(); // 调用Infra查数据 SubjectInfo entity subjectInfoService.getById(id); Integer likedCount redisUtil.get(liked: id); // 组合成BO SubjectInfoBO bo convert(entity); bo.setLikedCount(likedCount); return bo; } **Infra/Mapper** java Select(select * from subject_info where id #{id}) SubjectInfo selectById(Long id); ### 7.3 涉及技术 | 步骤 | 用到的技术 | |------|------------| | 网关路由 | Spring Cloud Gateway | | 登录认证 | Sa-Token | | 数据库查询 | MySQL MyBatis | | 缓存点赞数 | Redis | | 转换对象 | BO/DTO Converter | --- ## 八、学习小结 ### 8.1 已掌握内容 - [x] 项目整体定位鸡翅Club刷题系统 - [x] 微服务概念与划分 - [x] DDD六层架构 - [x] 各层分割点 - [x] BO/DTO/Entity区别与转换 - [x] 核心技术栈MySQL、Redis、RocketMQ、XXL-Job、ES、Nacos - [x] 数据库表结构设计 - [x] 完整请求流程 ### 8.2 核心概念速记 | 概念 | 一句话总结 | |------|------------| | 微服务 | 按业务职责划分独立运行 | | DDD | 按业务含义分层Domain层承载业务知识 | | Controller | 只管进门出门不写业务判断 | | Domain Service | 只管业务怎么干不写SQL | | Infra | 只管数据库操作不写业务判断 | | BO | 自己的事自己管不查数据库 | | Redis | 内存缓存加速查询 | | RocketMQ | 消息队列异步排队 | | XXL-Job | 定时任务系统闹钟 | | Elasticsearch | 全文搜索超级目录 | | Nacos | 服务发现电话簿 | --- ## 九、下一部分预告 - 设计模式详解策略模式 - 代码实战演练 - 添加新功能实践

相关文章:

鸡翅Club项目学习文档 - 第一部分

## 学习进度- [x] 第一部分:项目整体架构与核心概念 - [ ] 第二部分:设计模式详解 - [ ] 第三部分:代码实战演练---## 一、项目概述### 1.1 项目定位| 项目名称 | 鸡翅Club刷题系统 | |----------|------------------| | 英文名 | jc-club&am…...

【AutoSAR】详解PDUR模块

所谓梦想,就是让你感到痛苦的事情不再发生。一、前言在学习AUTOSAR通信栈时,我们会遇到多种PDU相关的缩写,如L-PDU、N-PDU、I-PDU等。理解这些缩写及其相互关系、以及它们与OSI七层模型的对应关系,对于掌握通信部分至关重要。接下…...

你的SSH密钥可能已经过期了评

引言 在现代软件开发中,性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序,性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言,性能优化涉及多个层面&#x…...

HLS高层次综合开发应用

一、HLS高层次综合开发应用 1.怎么利用编译指令(pragma)来控制各种粗细粒度的流水和并行,怎么把数组进行分块等等。这样的设计结果就会远远好于使用通用CPU。然而还有一个问题是,最后性能优化的HLS C/C代码可能会很长,…...

前端面试题(九九八十一难)

⼀、JavaScript核⼼原理1.computed与watch监听变化的原理核⼼:均依赖Vue响应式系统(Proxy/Object.defifineProperty)。 -computed:⾃动收集内部依赖的响应式数据,依赖变化⾃动重新计算,有缓存。 -watch&…...

OpenClaw技能扩展教程:Qwen3-14b_int4_awq实现公众号自动发布

OpenClaw技能扩展教程:Qwen3-14b_int4_awq实现公众号自动发布 1. 为什么需要自动化公众号发布 作为一个技术博主,我每周都要在公众号上发布2-3篇技术文章。最让我头疼的不是写作本身,而是发布前的繁琐流程:手动排版Markdown、设…...

Zig : 关于@Vector,slice,array,arraylist实例

最近在看Zig,是一个有意思的语言。以一个字符串容器为例,来尝试了解一下Zig和其它语言有什么不同。 一、代码 const std import("std"); const print std.debug.print; pub fn main() !void {try print_arraylist();_ print_array();_ pri…...

mysql如何对比两个数据库备份的差异_使用mysqldiff工具

不能。mysqldiff 不解析 SQL 备份文件,仅支持连接运行中的两个数据库实例(如 server1:db1 server2:db2)对比结构元数据,需先将 dump 文件导入为库才能使用。mysqldiff 能不能直接比两个 SQL 备份文件?不能。mysqldiff …...

HTML压缩工具本地运行卡顿怎么办_在线替代或参数优化【说明】

本地HTML压缩卡顿时,可调参降载、换轻量工具、用在线服务、分块处理或禁用IDE校验功能。例如调--collapse-whitespace参数、换rust-html-minifier、分块提取body压缩、关闭VS Code HTML格式化。如果您在本地运行HTML压缩工具时遇到卡顿现象,可能是由于工…...

OpenClaw定时任务实战:Qwen3-4B驱动夜间数据抓取与处理

OpenClaw定时任务实战:Qwen3-4B驱动夜间数据抓取与处理 1. 为什么选择OpenClaw做定时数据抓取? 去年我接手了一个市场监测项目,需要每天凌晨3点抓取20多个行业网站的更新内容。最初用Python脚本APScheduler的方案,但遇到三个痛点…...

ESP32驱动MPU-9250 DMP实现硬件级运动处理

1. SparkFun MPU-9250 DMP Arduino库深度解析:面向ESP32平台的嵌入式运动处理实践指南1.1 库定位与工程价值重定义尽管原始README明确声明该库“currently only supports and is tested on SAMD processors”,但其核心设计——基于Invensense官方DMP固件…...

直播带货系统源码开发需要哪些功能?电商直播平台搭建详解

近几年,随着短视频与直播生态的快速发展,直播带货已经从一种营销玩法,逐渐演变为电商行业的重要基础设施。从品牌方自建私域直播平台,到企业打造垂直电商直播系统,越来越多的公司开始选择搭建自己的直播带货系统源码&a…...

基于STM32的多功能温室大棚环境监测系统:实时显示、远程监控与智能调节温湿度

基于stm32多路温室大棚监测 容易制作 主要功能: [1]OLED屏可以实时显示四路温湿度数据 [2]手机APP可以远程监控四路温湿度数据 [3]温度湿度阈值均可手动通过按键设置 温度或者湿度超过阈值上限打开排气扇 温度低于阈值打开加热器 湿度低于阈值打开加湿器 原理图pcb…...

品牌设计没头绪?专业公司来帮你!

“在品牌设计的茫茫大海中,你是否常常感到迷失方向,找不到头绪?别担心,专业的品牌设计公司就是你的灯塔,为你照亮前行的道路!”在当今竞争激烈的市场环境中,品牌设计对于企业的发展至关重要。一…...

后悔没早看!敏感肌日常修护全攻略,轻松养出健康厚脸皮✨

后悔没早看!敏感肌日常修护全攻略,轻松养出健康厚脸皮✨集美们!谁懂啊🥹 作为天生的薄皮敏感肌,换季泛红、刷酸烂脸、遇热就红通通这些破事我全中!折腾了五六年,踩了无数坑,终于总结…...

出海行业热点 | Apple推新款“Ultra”高端产品;Google取消30%分成,开放第三方商店;阿里云登陆MWC,支持众多中国企业出海;

- 热点总览(3.3~3.9) -1. 印尼拟限未成年人用社媒2. Apple推新款“Ultra”高端产品3. Apple限制美区下载ByteDance应用4. Google取消30%分成,开放第三方商店5. 月流水有望过千万,三七开年找到了新爆款6. 阿里云登陆MWC&#xff0c…...

智能建造知识拓展 | 施工阶段AI赋能的十大关键场景

导 读在上期文章《智能建造知识拓展 | 三维激光扫描:为数字孪生构筑精准“空间底座”》中,我们为您介绍了三维激光扫描技术如何以毫米级精度采集现场数据,为数字孪生构建提供可靠的“数字底图”。本期,我们将聚焦人工智能——这位…...

FireRed-OCR Studio部署指南:HuggingFace Spaces免费部署与限流配置

FireRed-OCR Studio部署指南:HuggingFace Spaces免费部署与限流配置 1. 引言 你是不是经常遇到这样的麻烦事?拿到一份纸质表格或者PDF扫描件,想把里面的内容整理成电子文档,结果发现表格结构复杂,手动录入费时费力&a…...

P1464 [PacNW 1999] Function

一、题目描述 题目链接: P1464 [PacNW 1999] Function - 洛谷 二、解题思路 可以使用dfs记忆化搜索的方法来解决这个问题。 通过阅读题目可知,w(a,b,c)的最小值为1,所以可以将memo数组初始化为0,第三、四种情况时,先…...

OpenClaw自动化创作:Qwen3.5-9B-AWQ-4bit生成图文小红书草稿

OpenClaw自动化创作:Qwen3.5-9B-AWQ-4bit生成图文小红书草稿 1. 为什么选择OpenClaw解决内容创作瓶颈 去年开始运营小红书账号时,我每天要花4-5小时在内容创作上——从产品截图整理、卖点提炼到排版设计,整个过程既耗时又重复。直到发现Ope…...

多租户下的ERP系统的仓储管理模块分析设计茸

springboot自动配置 自动配置了大量组件,配置信息可以在application.properties文件中修改。 当添加了特定的Starter POM后,springboot会根据类路径上的jar包来自动配置bean(比如:springboot发现类路径上的MyBatis相关类&#xff…...

OpenClaw容器化部署:Docker打包Kimi-VL-A3B-Thinking多模态服务的完整流程

OpenClaw容器化部署:Docker打包Kimi-VL-A3B-Thinking多模态服务的完整流程 1. 为什么选择容器化部署OpenClaw 去年我在本地尝试部署OpenClaw对接Kimi-VL多模态模型时,经历了整整三天的依赖地狱。不同版本的CUDA驱动、Python包冲突、系统库缺失等问题让…...

python 输出菱形(两种方法)

方法一rows int(input("请输入菱形的边长&#xff1a;")) row 1"""打印上层""" while row < rows:col 1while col < rows - row:print( ,end )col 1for i in range(row): print(*,end )print( ,end )print()row 1"…...

开发者利器:OpenClaw+千问3.5-27B自动生成API文档

开发者利器&#xff1a;OpenClaw千问3.5-27B自动生成API文档 1. 为什么需要自动化API文档生成 作为一个长期维护开源项目的开发者&#xff0c;我深刻体会到维护API文档的痛苦。每次代码更新后&#xff0c;手动同步文档不仅耗时&#xff0c;还容易遗漏细节。直到发现OpenClaw与…...

ILI9225 TFT驱动库:Arduino 2.2英寸SPI显示屏开发指南

1. 项目概述TFT_22_ILI9225 是一款专为基于 ILI9225 显示控制器的 2.2 英寸 TFT LCD 模块设计的 Arduino 驱动库。该模块物理尺寸为 2.2 英寸&#xff0c;分辨率为 176220 像素&#xff0c;采用四线 SPI&#xff08;Serial Peripheral Interface&#xff09;接口与主控通信&…...

OpenClaw学术研究流:Phi-3-mini-128k-instruct自动生成论文综述

OpenClaw学术研究流&#xff1a;Phi-3-mini-128k-instruct自动生成论文综述 1. 为什么需要自动化文献综述 每次开始新的研究课题时&#xff0c;最让我头疼的就是文献综述环节。作为独立研究者&#xff0c;我常常需要花费数周时间阅读上百篇论文&#xff0c;手动整理关键观点和…...

为什么外贸企业需要私域CRM系统?公域CRM差在哪?

摘要&#xff1a;在当今全球化竞争日益激烈、B2B平台流量红利见顶的背景下&#xff0c;传统外贸企业的获客成本正在呈指数级上升。越来越多的外贸人发现&#xff0c;花大价钱在公域平台买来的线索&#xff0c;往往面临着“询盘多、成交少、流失快”的尴尬局面。现在做外贸&…...

工艺智能如何重塑汽车制造全流程?

如果说传统制造工艺是依赖经验的“手工账本”&#xff0c;那么工艺智能就是实时迭代的“智能中枢”。在汽车这个研发复杂度最高、工艺挑战最集中的行业&#xff0c;从设计图纸到车间落地&#xff0c;每一个环节都藏着效率与质量的博弈。当人工智能深度融入行业Know-How&#xf…...

精度套利:藏在盘口缝隙里的稳定机会

我们先来看 BN 上一个交易对。现货侧&#xff0c;PEPE/USDT 的价格精度是 1e-8&#xff1b; 合约侧&#xff0c;1000PEPEUSDT 的价格精度是 1e-7。 如果把合约价格换算回 PEPE/USDT 的单位&#xff0c;那么它对应的价格精度其实是 1e-10。 这意味着&#xff0c;现货和合约在同一…...

开发者效率套件:OpenClaw+千问3.5-27B自动化代码审查

开发者效率套件&#xff1a;OpenClaw千问3.5-27B自动化代码审查 1. 为什么需要AI辅助代码审查&#xff1f; 作为一个长期在开源社区摸爬滚打的开发者&#xff0c;我经历过太多深夜提交代码后第二天被reviewer指出低级错误的尴尬时刻。直到上个月在本地部署了OpenClaw千问3.5-…...