|
|
@@ -1,7 +1,7 @@
|
|
1
|
1
|
# 店铺商品列表 — 技术方案
|
|
2
|
2
|
|
|
3
|
|
-> **依据:** 《商品列表功能需求.md》v1.3
|
|
4
|
|
-> **关联:** 《关联需求分析.md》v1.6;平台《商品审核技术方案》v1.1、《商品分类技术方案》v1.3、《商品服务管理技术方案》v1.0.1;商家《店铺商品分类技术方案》v1.2、《属性模版技术方案》v1.2
|
|
|
3
|
+> **依据:** 《商品列表功能需求.md》v1.4
|
|
|
4
|
+> **关联:** 《关联需求分析.md》v1.6;平台《商品审核技术方案》v1.1、《商品分类技术方案》v1.3、《商品服务管理技术方案》v1.0.1;商家《店铺商品分类技术方案》v1.2、《属性模版技术方案》v1.3
|
|
5
|
5
|
> **范围:** 商家端 **当前店铺** 商品列表、检索、发品、编辑、提交上架、下架、删除;**复用** 平台商品主表与状态机,**不另建** 商家商品表。
|
|
6
|
6
|
> **原则:** `goods_status` 仅经 submit / audit / offShelf 变更(P17);`X-Shop-Id` 店铺上下文;批量含非法状态 **整批失败**。
|
|
7
|
7
|
|
|
|
@@ -56,7 +56,7 @@ biz_goods_category
|
|
56
|
56
|
| **商品分类** | `category_id` ← `IPlatformCategoryService.selectPlatformLevel2Options()` |
|
|
57
|
57
|
| **店铺商品分类** | `shop_category_id` ← `IShopGoodsCategoryFacade.listOptionsByShopId()` |
|
|
58
|
58
|
| **商品服务** | 发品多选 ← `IGoodsServiceFacade`;保存写快照 |
|
|
59
|
|
-| **属性模版** | `attr_template_id` ← 保存时 `assertAttrTemplateIfPresent`;下拉 ← `/agri/seller/attrTemplate/options` 或 `IAttrTemplateFacade` |
|
|
|
59
|
+| **属性模版** | 选用模版预填 `attributes`/`specs`;保存 `attr_template_id` + **先删后插** `biz_goods_attr` |
|
|
60
|
60
|
| **店铺设置** | `IShopGlobalConfigFacade.getDefaultAuditPass()` 决定 submit 目标态 |
|
|
61
|
61
|
| **订单管理** | 下架前校验 **O10 未完成订单**(**待实现**,`IGoodsOrderFacade` 占位) |
|
|
62
|
62
|
| **店铺管理** | `IGoodsShopFacade.hasBlockingGoodsForShopDelete`(`GoodsFacadeImpl`)删店前置 |
|
|
|
@@ -73,12 +73,14 @@ baqing-shop/src/main/java/com/ruoyi/web/modules/goods/
|
|
73
|
73
|
│ └── GoodsAuditController.java # /agri/goodsAudit(平台审核菜单薄封装)
|
|
74
|
74
|
├── service/
|
|
75
|
75
|
│ ├── IGoodsService.java
|
|
76
|
|
-│ └── impl/GoodsServiceImpl.java # 商家 + 平台共用;注入 template 模块 Mapper 校验 attrTemplateId
|
|
|
76
|
+│ └── impl/GoodsServiceImpl.java # saveServiceSnapshots + saveGoodsAttrs
|
|
77
|
77
|
├── domain/
|
|
78
|
78
|
│ ├── BizGoods.java
|
|
79
|
|
-│ └── BizGoodsServiceSnapshot.java
|
|
|
79
|
+│ ├── BizGoodsServiceSnapshot.java
|
|
|
80
|
+│ └── BizGoodsAttr.java
|
|
80
|
81
|
├── dto/
|
|
81
|
82
|
│ ├── GoodsSaveDTO.java
|
|
|
83
|
+│ ├── GoodsAttrItemDTO.java # attributes[] / specs[] 项
|
|
82
|
84
|
│ ├── GoodsAuditDTO.java
|
|
83
|
85
|
│ ├── GoodsBatchIdsDTO.java # 批量提交 / 批量删除
|
|
84
|
86
|
│ └── GoodsOffShelfDTO.java # 批量下架
|
|
|
@@ -89,7 +91,8 @@ baqing-shop/src/main/java/com/ruoyi/web/modules/goods/
|
|
89
|
91
|
│ └── GoodsPurchaseVO.java # C 端/采购 Facade 用
|
|
90
|
92
|
├── mapper/
|
|
91
|
93
|
│ ├── BizGoodsMapper.java
|
|
92
|
|
-│ └── BizGoodsServiceSnapshotMapper.java
|
|
|
94
|
+│ ├── BizGoodsServiceSnapshotMapper.java
|
|
|
95
|
+│ └── BizGoodsAttrMapper.java
|
|
93
|
96
|
├── facade/
|
|
94
|
97
|
│ ├── IGoodsOrderFacade.java # 下架 O10(DefaultGoodsOrderFacade 占位)
|
|
95
|
98
|
│ ├── IGoodsPurchaseFacade.java
|
|
|
@@ -101,16 +104,19 @@ baqing-shop/src/main/java/com/ruoyi/web/modules/goods/
|
|
101
|
104
|
├── support/
|
|
102
|
105
|
│ ├── GoodsSnGenerator.java
|
|
103
|
106
|
│ ├── GoodsStatusUtils.java
|
|
|
107
|
+│ ├── GoodsAttrSupport.java # 属性/规格校验与扁平化/聚合
|
|
104
|
108
|
│ └── GoodsBatchResponseSupport.java
|
|
105
|
109
|
├── exception/GoodsBatchOperationException.java
|
|
106
|
110
|
└── constant/GoodsConstants.java
|
|
107
|
111
|
|
|
108
|
112
|
baqing-shop/src/main/resources/mapper/goods/
|
|
109
|
113
|
├── BizGoodsMapper.xml
|
|
110
|
|
-└── BizGoodsServiceSnapshotMapper.xml
|
|
|
114
|
+├── BizGoodsServiceSnapshotMapper.xml
|
|
|
115
|
+└── BizGoodsAttrMapper.xml
|
|
111
|
116
|
|
|
112
|
117
|
sql/biz_goods.sql # 含 shop_category_id、attr_template_id
|
|
113
|
118
|
sql/biz_goods_service_snapshot.sql
|
|
|
119
|
+sql/biz_goods_attr.sql
|
|
114
|
120
|
```
|
|
115
|
121
|
|
|
116
|
122
|
**跨模块依赖(接口与实现分离):**
|
|
|
@@ -121,8 +127,7 @@ sql/biz_goods_service_snapshot.sql
|
|
121
|
127
|
| 店铺商品分类下拉 | `category/facade/IShopGoodsCategoryFacade.java` | `category/facade/impl/ShopGoodsCategoryFacadeImpl.java` |
|
|
122
|
128
|
| 平台二级分类下拉 | `category/service/IPlatformCategoryService.java` | `SellerGoodsController` 或 `SellerPlatformCategoryController` |
|
|
123
|
129
|
| 分类路径 | `category/facade/ICategoryFacade.java` | `CategoryFacadeImpl` |
|
|
124
|
|
-| 属性模版校验 | `template/mapper/BizGoodsAttrTemplateMapper.java` | `GoodsServiceImpl` 直接注入 |
|
|
125
|
|
-| 属性模版下拉 | `template/facade/IAttrTemplateFacade.java` | 前端亦可调 `/agri/seller/attrTemplate/options` |
|
|
|
130
|
+| 属性模版校验/预填 | `template/facade/IAttrTemplateFacade.java` | `SellerGoodsController` `/attrTemplateOptions`、`/attrTemplate/{id}`;亦可调 `/agri/seller/attrTemplate/*` |
|
|
126
|
131
|
| 商品服务目录 | `goodsservice/facade/IGoodsServiceFacade.java` | 发品 `serviceOptions` |
|
|
127
|
132
|
| 店铺上下文 | `category/support/SellerShopContext.java` | 拦截器 `SellerShopContextInterceptor` |
|
|
128
|
133
|
| 店铺上下文 API | `store/controller/SellerShopContextController.java` | `GET /agri/seller/context` |
|
|
|
@@ -139,6 +144,7 @@ sql/biz_goods_service_snapshot.sql
|
|
139
|
144
|
|------|------------|
|
|
140
|
145
|
| **`biz_goods`** | 商品主表;商家 CRUD + 状态字段 |
|
|
141
|
146
|
| **`biz_goods_service_snapshot`** | 发品勾选服务的 **展示快照** |
|
|
|
147
|
+| **`biz_goods_attr`** | 发品属性/规格 **展示快照**(选用模版后可改) |
|
|
142
|
148
|
| `biz_goods_category` | join 分类路径;**不** 由本模块维护 |
|
|
143
|
149
|
| `biz_shop` | 店铺上下文、删店 join |
|
|
144
|
150
|
| `biz_shop_global_config` | 全局默认审核开关 |
|
|
|
@@ -169,7 +175,7 @@ sql/biz_goods_service_snapshot.sql
|
|
169
|
175
|
| del_flag | char(1) | 0 存在 2 逻辑删除 |
|
|
170
|
176
|
| create_by / create_time / update_by / update_time | | 审计 |
|
|
171
|
177
|
|
|
172
|
|
-**首期未落库、后续扩展(需求 §8 完整表单):** 多图、重量、条码、关键词、简述、多规格 SKU、运费模版、**属性/规格键值(`biz_goods_attr`)** 等 → 见 §2.5;**`attr_template_id` 引用已实现**,不阻塞 v1.0 列表/单规格发品。
|
|
|
178
|
+**首期未落库、后续扩展(需求 §8 完整表单):** 多图、重量、条码、关键词、简述、多规格 SKU、运费模版等 → 见 §2.5;**`attr_template_id` + `biz_goods_attr` 已实现**。
|
|
173
|
179
|
|
|
174
|
180
|
### 2.3 增量 DDL
|
|
175
|
181
|
|
|
|
@@ -187,7 +193,20 @@ ALTER TABLE `biz_goods`
|
|
187
|
193
|
|
|
188
|
194
|
完整建表见 `sql/biz_goods.sql`。
|
|
189
|
195
|
|
|
190
|
|
-### 2.4 `biz_goods_service_snapshot`
|
|
|
196
|
+### 2.4 `biz_goods_attr`
|
|
|
197
|
+
|
|
|
198
|
+| 字段 | 类型 | 说明 |
|
|
|
199
|
+|------|------|------|
|
|
|
200
|
+| attr_id | bigint PK | |
|
|
|
201
|
+| goods_id | bigint NOT NULL | 商品 ID |
|
|
|
202
|
+| attr_type | char(1) | **1** 属性项 **2** 规格项 |
|
|
|
203
|
+| item_name | varchar(64) | 项名称 |
|
|
|
204
|
+| value_text | varchar(128) | 单值一行;多项多行 |
|
|
|
205
|
+| sort_no | int | 展示顺序 |
|
|
|
206
|
+
|
|
|
207
|
+保存商品时 **先删后插** 该商品全部属性行;删除商品时物理删除关联行。模版编辑 **不追溯** 已保存商品(AT8)。
|
|
|
208
|
+
|
|
|
209
|
+### 2.5 `biz_goods_service_snapshot`
|
|
191
|
210
|
|
|
192
|
211
|
| 字段 | 说明 |
|
|
193
|
212
|
|------|------|
|
|
|
@@ -198,18 +217,17 @@ ALTER TABLE `biz_goods`
|
|
198
|
217
|
|
|
199
|
218
|
保存商品时 **先删后插** 该商品全部快照行。
|
|
200
|
219
|
|
|
201
|
|
-### 2.5 扩展表(非 v1.0 · 概要)
|
|
|
220
|
+### 2.6 扩展表(非 v1.0 · 概要)
|
|
202
|
221
|
|
|
203
|
222
|
| 表(规划) | 用途 |
|
|
204
|
223
|
|------------|------|
|
|
205
|
224
|
| `biz_goods_pic` | 多图 gallery |
|
|
206
|
225
|
| `biz_goods_sku` | 多规格 SKU(市场价、库存) |
|
|
207
|
226
|
| `biz_goods_freight` | 固定运费 / 运费模版 ID |
|
|
208
|
|
-| `biz_goods_attr` | 属性项/规格项键值 |
|
|
209
|
227
|
|
|
210
|
|
-v1.0 **仅** 使用主表 `sale_price`/`stock`/`main_pic`/`detail_content`。
|
|
|
228
|
+v1.0 **使用** 主表 `sale_price`/`stock`/`main_pic`/`detail_content` + 服务快照 + **属性/规格快照**。
|
|
211
|
229
|
|
|
212
|
|
-### 2.6 索引
|
|
|
230
|
+### 2.7 索引
|
|
213
|
231
|
|
|
214
|
232
|
| 索引 | 字段 | 用途 |
|
|
215
|
233
|
|------|------|------|
|
|
|
@@ -218,9 +236,10 @@ v1.0 **仅** 使用主表 `sale_price`/`stock`/`main_pic`/`detail_content`。
|
|
218
|
236
|
| idx_category_id | category_id, del_flag | 分类检索 |
|
|
219
|
237
|
| idx_shop_category_id | shop_category_id, del_flag | 店铺分类删校验 |
|
|
220
|
238
|
| idx_attr_template_id | attr_template_id, del_flag | 属性模版删校验 |
|
|
|
239
|
+| idx_goods_attr | goods_id, attr_type, sort_no | 详情聚合属性/规格 |
|
|
221
|
240
|
| idx_submit_time | submit_time | 待审核排序(平台侧) |
|
|
222
|
241
|
|
|
223
|
|
-### 2.7 商家列表 SQL 约定
|
|
|
242
|
+### 2.8 商家列表 SQL 约定
|
|
224
|
243
|
|
|
225
|
244
|
```sql
|
|
226
|
245
|
WHERE g.del_flag = '0'
|
|
|
@@ -228,7 +247,7 @@ WHERE g.del_flag = '0'
|
|
228
|
247
|
-- 含 goods_status='0',与平台列表不同
|
|
229
|
248
|
```
|
|
230
|
249
|
|
|
231
|
|
-### 2.8 字典
|
|
|
250
|
+### 2.9 字典
|
|
232
|
251
|
|
|
233
|
252
|
| dict_type | 说明 |
|
|
234
|
253
|
|-----------|------|
|
|
|
@@ -337,6 +356,7 @@ WHERE g.del_flag = '0'
|
|
337
|
356
|
| 列表字段 | 同 §5.1 |
|
|
338
|
357
|
| shopId, categoryId, shopCategoryId | |
|
|
339
|
358
|
| attrTemplateId, attrTemplateName | 选用模版 ID 与名称(详情回显) |
|
|
|
359
|
+| attributes[], specs[] | 属性/规格快照(`GoodsAttrItemDTO`:`itemName` + `values[]`) |
|
|
340
|
360
|
| detailContent, stock | |
|
|
341
|
361
|
| rejectReason, submitTime, auditTime, offShelfTime | |
|
|
342
|
362
|
| services[] | 服务快照列表 |
|
|
|
@@ -351,7 +371,7 @@ WHERE g.del_flag = '0'
|
|
351
|
371
|
| 权限 | `agri:seller:goods:add` |
|
|
352
|
372
|
| 日志 | title=商家商品 |
|
|
353
|
373
|
|
|
354
|
|
-**Body(GoodsSaveDTO · v1.0):**
|
|
|
374
|
+**Body(GoodsSaveDTO):**
|
|
355
|
375
|
|
|
356
|
376
|
```json
|
|
357
|
377
|
{
|
|
|
@@ -363,7 +383,13 @@ WHERE g.del_flag = '0'
|
|
363
|
383
|
"detailContent": "<p>详情</p>",
|
|
364
|
384
|
"salePrice": 128.00,
|
|
365
|
385
|
"stock": 500,
|
|
366
|
|
- "serviceIds": [1, 3]
|
|
|
386
|
+ "serviceIds": [1, 3],
|
|
|
387
|
+ "attributes": [
|
|
|
388
|
+ { "itemName": "品牌", "values": ["华为"] }
|
|
|
389
|
+ ],
|
|
|
390
|
+ "specs": [
|
|
|
391
|
+ { "itemName": "内存", "values": ["8G", "16G"] }
|
|
|
392
|
+ ]
|
|
367
|
393
|
}
|
|
368
|
394
|
```
|
|
369
|
395
|
|
|
|
@@ -372,6 +398,7 @@ WHERE g.del_flag = '0'
|
|
372
|
398
|
| categoryId | 须为 **平台二级** 有效分类 |
|
|
373
|
399
|
| shopCategoryId | 若传,须属 **当前店** 二级分类 |
|
|
374
|
400
|
| attrTemplateId | 若传,须属 **当前店** 有效属性模版 |
|
|
|
401
|
+| attributes / specs | 可选;若传则项名非空、每项至少一值、同段项名/值不重复、属性与规格项名不可相同 |
|
|
375
|
402
|
| serviceIds | 须全部存在于未删除服务目录 |
|
|
376
|
403
|
| goodsStatus | **禁止** 传入 |
|
|
377
|
404
|
|
|
|
@@ -387,7 +414,7 @@ WHERE g.del_flag = '0'
|
|
387
|
414
|
| Body | 同 §5.3 + **goodsId** 必填 |
|
|
388
|
415
|
|
|
389
|
416
|
- **不修改** `goods_status`、`shop_id`、`goods_sn`。
|
|
390
|
|
-- 各状态均可编辑(P14);保存后刷新服务快照。
|
|
|
417
|
+- 各状态均可编辑(P14);保存后刷新服务快照与 **属性/规格快照**。
|
|
391
|
418
|
|
|
392
|
419
|
---
|
|
393
|
420
|
|
|
|
@@ -459,9 +486,9 @@ WHERE g.del_flag = '0'
|
|
459
|
486
|
| GET | `/agri/seller/goods/shopCategoryOptions` | `list` | 本店二级「店铺商品分类」`IShopGoodsCategoryFacade.listOptionsByShopId(shopId, false)` |
|
|
460
|
487
|
| GET | `/agri/seller/category/platformLevel2Options` | 同上 | 与上同源(分类模块只读入口,可选) |
|
|
461
|
488
|
| GET | `/agri/seller/goods/serviceOptions` | `list` | `{ all: [], defaultShow: [] }` |
|
|
462
|
|
-| GET | `/agri/seller/attrTemplate/options` | 属性模版模块 | 本店属性模版下拉(**非** goods 子路径;见《属性模版技术方案》§3.6) |
|
|
463
|
|
-
|
|
464
|
|
-> **规划(可选挂载):** `GET /agri/seller/goods/attrTemplateOptions` 委托 `IAttrTemplateFacade`,与上同源。
|
|
|
489
|
+| GET | `/agri/seller/goods/attrTemplateOptions` | `list` / `add` / `edit` | 本店属性模版下拉;委托 `IAttrTemplateFacade.listOptionsByShopId` |
|
|
|
490
|
+| GET | `/agri/seller/goods/attrTemplate/{templateId}` | 同上 | 选用模版预填;返回 `attributes`、`specs`(委托 `getDetailForGoods`) |
|
|
|
491
|
+| GET | `/agri/seller/attrTemplate/options` | 属性模版模块 | 与 `attrTemplateOptions` **同源**(亦可直调) |
|
|
465
|
492
|
|
|
466
|
493
|
---
|
|
467
|
494
|
|
|
|
@@ -490,6 +517,11 @@ insertSellerGoods
|
|
490
|
517
|
→ goodsSn = GoodsSnGenerator.next()
|
|
491
|
518
|
→ insert status=0(含 attr_template_id)
|
|
492
|
519
|
→ saveServiceSnapshots
|
|
|
520
|
+ → saveGoodsAttrs(先删后插 biz_goods_attr)
|
|
|
521
|
+
|
|
|
522
|
+updateSellerGoods
|
|
|
523
|
+ → 同上校验(goodsId 属当前店)
|
|
|
524
|
+ → updateSeller + saveServiceSnapshots + saveGoodsAttrs
|
|
493
|
525
|
|
|
494
|
526
|
submitGoods
|
|
495
|
527
|
→ status in (0,3,4)
|
|
|
@@ -504,6 +536,7 @@ offShelfSeller
|
|
504
|
536
|
deleteSellerGoodsBatch
|
|
505
|
537
|
→ status in (0,3,4)
|
|
506
|
538
|
→ logic delete + 整批失败策略
|
|
|
539
|
+ → delete service snapshot + goods_attr rows
|
|
507
|
540
|
→ [待] orderFacade 校验 O10(下架时)
|
|
508
|
541
|
```
|
|
509
|
542
|
|
|
|
@@ -515,6 +548,8 @@ deleteSellerGoodsBatch
|
|
515
|
548
|
| shop_category_id | `biz_goods_category.category_id`,`shop_id = #{shopId}`,`parent_id > 0` |
|
|
516
|
549
|
| attr_template_id | `biz_goods_attr_template.template_id`,`shop_id = #{shopId}`,`del_flag = '0'` |
|
|
517
|
550
|
|
|
|
551
|
+**错误 msg(属性/规格):** 项名为空 / 重复 / 与对端重名 / 值为空 / 值重复 → 见 `GoodsConstants.MSG_ATTR_*`。
|
|
|
552
|
+
|
|
518
|
553
|
**错误 msg(属性模版):** 无效或非本店模版 → `请选择本店有效属性模版`(`GoodsConstants.MSG_ATTR_TEMPLATE_INVALID`)。
|
|
519
|
554
|
|
|
520
|
555
|
---
|
|
|
@@ -542,9 +577,9 @@ deleteSellerGoodsBatch
|
|
542
|
577
|
| **v1.0** | 列表/详情/单规格 CRUD/单独 submit·offShelf/服务快照/平台分类与服务下拉 | **已实现** |
|
|
543
|
578
|
| **v1.0 补全** | `shop_category_id` + 店铺分类下拉 + 删除 + 批量 submit/offShelf/delete | **已实现** |
|
|
544
|
579
|
| **v1.0 补全·模版引用** | `attr_template_id` 保存/详情回显 + 本店模版校验 | **已实现** |
|
|
|
580
|
+| **v1.0 补全·属性快照** | `biz_goods_attr` 写入/详情回显;预填接口;`GoodsAttrSupport` | **已实现** |
|
|
545
|
581
|
| **v1.0 补全·O10** | 下架前未完成订单校验(`IGoodsOrderFacade`) | **待实现** |
|
|
546
|
|
-| **v1.x** | 多图、多规格 SKU、运费、`biz_goods_attr` 写入、关键词检索扩展 | 规划 |
|
|
547
|
|
-| **v1.x·可选** | `/agri/seller/goods/attrTemplateOptions` 挂载 | 规划 |
|
|
|
582
|
+| **v1.x** | 多图、多规格 SKU、运费、关键词检索扩展 | 规划 |
|
|
548
|
583
|
|
|
549
|
584
|
---
|
|
550
|
585
|
|
|
|
@@ -563,6 +598,7 @@ deleteSellerGoodsBatch
|
|
563
|
598
|
| T9 | 跨店 goodsId → MSG_NOT_OWNER |
|
|
564
|
599
|
| T10 | 服务快照:保存后详情与目录变更隔离 |
|
|
565
|
600
|
| T11 | attrTemplateId:本店有效模版写入;跨店/无效 ID → 失败 |
|
|
|
601
|
+| T12 | attributes/specs:保存后详情回显;校验项名/值 |
|
|
566
|
602
|
|
|
567
|
603
|
---
|
|
568
|
604
|
|
|
|
@@ -574,7 +610,8 @@ deleteSellerGoodsBatch
|
|
574
|
610
|
| **v1.1** | 同步代码:v1.0 补全已实现;统一平台/店铺分类口径;O10 仍标待实现 |
|
|
575
|
611
|
| **v1.2** | 同步 `attr_template_id`:GoodsSaveDTO/详情/Mapper/校验;下拉走属性模版模块 `/options` |
|
|
576
|
612
|
| **v1.3** | §1.3 模块落位与代码对齐:`IGoodsFacade` 跨包、`template` 依赖、快照/订单 Facade |
|
|
|
613
|
+| **v1.4** | `biz_goods_attr` 保存/回显;`attributes`/`specs` 请求体;`/goods/attrTemplateOptions` 与预填接口 |
|
|
577
|
614
|
|
|
578
|
615
|
---
|
|
579
|
616
|
|
|
580
|
|
-*文档版本:v1.3 · 关联《商品列表功能需求.md》v1.3、《商品审核技术方案.md》v1.1、《商品分类技术方案.md》v1.3、《商品服务管理技术方案.md》v1.0.1、《店铺商品分类技术方案.md》v1.2、《属性模版技术方案.md》v1.2 · 技术栈 RuoYi v3.9.2-springboot2 + MySQL 5.7.39。*
|
|
|
617
|
+*文档版本:v1.4 · 关联《商品列表功能需求.md》v1.4、《属性模版技术方案.md》v1.3 · 技术栈 RuoYi v3.9.2-springboot2 + MySQL 5.7.39。*
|