diff --git a/UserManual.md b/UserManual.md
index ab3a9cf..f5a1f3b 100644
--- a/UserManual.md
+++ b/UserManual.md
@@ -16,7 +16,7 @@ git clone "https://github.com/rymcu/forest"
- `Redis v7.x +`
### 手动搭建 MySQL 和 Redis 环境
-> 手动安装 MySQL 时,需初始化数据库。
+> 手动安装 MySQL 时,需初始化数据库, sql 文件创建的用户密码都是 admin。
在配置好 MySQL 和 Redis 的环境之后,在运行项目前,你还需要初始化好数据库中数据。通过执行 `src/main/resources/static`
目录下的 `forest.sql` 文件进行数据库初始化操作。
diff --git a/docker/dev/forest.sql b/docker/dev/forest.sql
index ff72ce3..7b321eb 100644
--- a/docker/dev/forest.sql
+++ b/docker/dev/forest.sql
@@ -481,15 +481,15 @@ create index forest_topic_tag_id_topic_index
create table forest_transaction_record
(
- id bigint auto_increment comment '交易主键'
+ id bigint auto_increment comment '交易主键'
primary key,
- transaction_no varchar(32) null comment '交易流水号',
- funds varchar(32) null comment '款项',
- form_bank_account varchar(32) null comment '交易发起方',
- to_bank_account varchar(32) null comment '交易收款方',
- money decimal(32, 8) null comment '交易金额',
- transaction_type char default '0' null comment '交易类型',
- transaction_time datetime null comment '交易时间'
+ transaction_no varchar(32) null comment '交易流水号',
+ funds varchar(32) null comment '款项',
+ form_bank_account varchar(32) null comment '交易发起方',
+ to_bank_account varchar(32) null comment '交易收款方',
+ money decimal(32, 8) null comment '交易金额',
+ transaction_type char default '0' null comment '交易类型',
+ transaction_time datetime null comment '交易时间'
) comment '交易记录表 ' collate = utf8mb4_unicode_ci;
create table forest_user
@@ -591,7 +591,8 @@ INSERT INTO `forest`.`forest_user` (`id`, `account`, `password`, `nickname`, `re
`avatar_url`, `email`, `phone`, `status`, `created_time`, `updated_time`,
`last_login_time`, `signature`, `last_online_time`, `bg_img_url`)
VALUES (65001, 'testUser1', '8ce2dd866238958ac4f07870766813cdaa39a9b83a8c75e26aa50f23', 'testUser', 'testUser1', '0',
- '0', NULL, 'testUser@rymcu.com', NULL, '0', '2021-01-25 18:21:51', '2021-01-25 18:21:54', '2021-01-25 18:21:54',
+ '0', NULL, 'testUser1@rymcu.com', NULL, '0', '2021-01-25 18:21:51', '2021-01-25 18:21:54',
+ '2021-01-25 18:21:54',
NULL, NULL, NULL);
insert into forest.forest_user_role (id_user, id_role, created_time)
@@ -603,11 +604,11 @@ create table forest_file
md5_value varchar(40) not null comment '文件md5值',
file_path varchar(255) not null comment '文件上传路径',
file_url varchar(255) not null comment '网络访问路径',
- created_time datetime null comment '创建时间',
- updated_time datetime null comment '更新时间',
- created_by int null comment '创建人',
- file_size int null comment '文件大小',
- file_type varchar(10) null comment '文件类型'
+ created_time datetime null comment '创建时间',
+ updated_time datetime null comment '更新时间',
+ created_by int null comment '创建人',
+ file_size int null comment '文件大小',
+ file_type varchar(10) null comment '文件类型'
) comment '文件上传记录表' collate = utf8mb4_unicode_ci;
create index index_md5_value_created_by
@@ -646,6 +647,8 @@ create table forest_product
weights tinyint default 50 null comment '权重,数值越小权限越大;0:无权限',
created_time datetime null comment '创建时间',
updated_time datetime null comment '更新时间',
+ tags varchar(64) null comment '标签集合',
+ status tinyint default 0 not null comment '状态',
constraint forest_product_id_uindex
unique (id)
)
@@ -662,13 +665,32 @@ create table forest_product_content
comment '产品详情表';
INSERT INTO forest.forest_product (id, product_title, product_price, product_img_url, product_description, weights,
- created_time, updated_time)
-VALUES (1, 'Nebula Pi', 2000000, 'https://static.rymcu.com/article/1648960741563.jpg', '产品描述', 20,
- '2022-06-13 22:35:33', '2022-06-13 22:35:33');
+ created_time, updated_time, tags, status)
+VALUES (1, 'Nebula Pi 51', 2000000, 'https://static.rymcu.com/article/1648960741563.jpg',
+ 'Nebula Pi 51 是社区独家设计的一款一机双芯、资源丰富的 51 单片机入门级开发板, 也是社区的第一款产品。', 20,
+ '2022-06-13 22:35:33', '2022-06-13 22:35:33', '51 单片机', 1);
+INSERT INTO forest.forest_product (id, product_title, product_price, product_img_url, product_description, weights,
+ created_time, updated_time, tags, status)
+VALUES (2, 'ESP32-S3-DevKitC-1', 398000, 'https://static.rymcu.com/article/1706094905846.png',
+ 'ESP32-S3-DevKitC-1 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32-S3-WROOM-1/1U 或 ESP32-S3-WROOM-2/2U 模组的入门级开发板。',
+ 60, '2023-05-14 08:01:12', '2023-05-14 08:01:16', 'ESP32,ESP32S3', 1);
+INSERT INTO forest.forest_product (id, product_title, product_price, product_img_url, product_description, weights,
+ created_time, updated_time, tags, status)
+VALUES (3, 'RYDAPLink', 2000000, 'https://static.rymcu.com/article/1706081416691.png',
+ 'RYDAPLink 是社区独家设计的一款集 下载、调试、串口、3.3V/5V 供电、串口 ISP 功能于一身的 DAPLink 下载器。', 80,
+ '2024-01-24 19:28:43', '2024-01-24 19:28:43', '开源,DAPLink', 1);
+INSERT INTO forest.forest_product (id, product_title, product_price, product_img_url, product_description, weights,
+ created_time, updated_time, tags, status)
+VALUES (4, 'ESP32-DevKitC', 398000, 'https://static.rymcu.com/article/1706922435052.png',
+ 'ESP32-DevKitC 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32 模组的入门级开发板。', 40,
+ '2024-02-03 09:10:49', '2024-02-03 09:10:49', '开源,ESP32', 1);
+INSERT INTO forest.forest_product (id, product_title, product_price, product_img_url, product_description, weights,
+ created_time, updated_time, tags, status)
+VALUES (5, 'ESP32-C3-DevKitM-1', 398000, 'https://static.rymcu.com/article/1706922639664.png',
+ 'ESP32-C3-DevKitM-1 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32-C3-MINI-1 模组的入门级开发板。', 50,
+ '2024-02-03 09:10:49', '2024-02-03 09:10:49', 'ESP32,ESP32C3', 1);
-INSERT INTO forest.forest_product_content (id_product, product_content, product_content_html, created_time,
- updated_time)
-VALUES (1, '![nebula pi](https://static.rymcu.com/article/1640531590770)
+INSERT INTO forest.forest_product_content (id_product, product_content, product_content_html, created_time, updated_time) VALUES (1, '![nebula pi](https://static.rymcu.com/article/1640531590770)
Nebula-Pi 开发板平台
@@ -827,6 +849,1275 @@ Nebula-Pi 开发板平台
表 1-1 主板元器件说明
', '2022-06-13 22:35:34', '2022-06-13 22:35:34');
+INSERT INTO forest.forest_product_content (id_product, product_content, product_content_html, created_time, updated_time) VALUES (2, 'ESP32-S3-DevKitC-1 —— 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32S3 模组的入门级开发板。
+
+> 获取地址: [GitHub](https://github.com/rymcu/ESP32-Open) | [Gitee](https://gitee.com/rymcu/ESP32-Open) | [RYMCU](https://rymcu.com/product/4)
+
+![](https://static.rymcu.com/article/1706094905846.png)
+
+## 功能介绍
+
+ESP32-S3-DevKitC-1 开发板的主要组件、接口及控制方式见下。
+
+| 主要组件 | 介绍 |
+|------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ESP32-S3-WROOM-1/1U/2 | ESP32-S3-WROOM-1、ESP32-S3-WROOM-1U 和 ESP32-S3-WROOM-2 是通用型 Wi-Fi + 低功耗蓝牙 MCU 模组,具有丰富的外设接口、强大的神经网络运算能力和信号处理能力,专为人工智能和 AIoT 市场打造。ESP32-S3-WROOM-1 和 ESP32-S3-WROOM-2 采用 PCB 板载天线,ESP32-S3-WROOM-1U 采用连接器连接外部天线。 |
+| 5 V to 3.3 V LDO(5 V 转 3.3 V LDO) | 电源转换器,输入 5 V,输出 3.3 V。 |
+| Pin Headers(排针) | 所有可用 GPIO 管脚(除 flash 的 SPI 总线)均已引出至开发板的排针。请查看 排针 获取更多信息。 |
+| USB-to-UART Port(USB 转 UART 接口) | USB Type-C 接口,可用作开发板的供电接口,可烧录固件至芯片,也可作为通信接口,通过板载 USB 转 UART 桥接器与芯片通信。 |
+| Boot Button(Boot 键) | 下载按键。按住 Boot 键的同时按一下 Reset 键进入“固件下载”模式,通过串口下载固件。 |
+| Reset Button(Reset 键) | 复位按键。 |
+| USB Port(USB 接口) | ESP32-S3 USB OTG 接口,支持全速 USB 1.1 标准。ESP32-S3 USB 接口可用作开发板的供电接口,可烧录固件至芯片,可通过 USB 协议与芯片通信,也可用于 JTAG 调试。 |
+| USB-to-UART Bridge(USB 转 UART 桥接器) | 单芯片 USB 至 UART 桥接器,可提供高达 3 Mbps 的传输速率。 |
+| RGB LED | 可寻址 RGB 发光二极管,由 GPIO38 驱动。 |
+| 3.3 V Power On LED(3.3 V 电源指示灯) | 开发板连接 USB 电源后,该指示灯亮起。 |
+
+> 在板载 ESP32-S3-WROOM-1/1U 模组系列(使用 8 线 SPI flash/PSRAM)的开发板和板载 ESP32-S3-WROOM-2 模组系列的开发板中,管脚 GPIO35、GPIO36 和 GPIO37 已用于内部 ESP32-S3 芯片与 SPI flash/PSRAM 之间的通信,外部不可使用。
+
+## 排针
+
+下表列出了开发板两侧排针(J1 和 J3)的名称和功能,排针名称如图 ESP32-S3-DevKitC-1(板载 ESP32-S3-WROOM-1) 中所示。
+
+### J1
+
+| 序号 | 名称 | 类型 [^1] | 功能 |
+|----|-----|-------|--------------------------------------------------------------------|
+| 1 | 3V3 | P | 3.3 V 电源 |
+| 2 | 3V3 | P | 3.3 V 电源 |
+| 3 | RST | I | EN |
+| 4 | 4 | I/O/T | RTC_GPIO4, GPIO4, TOUCH4, ADC1_CH3 |
+| 5 | 5 | I/O/T | RTC_GPIO5, GPIO5, TOUCH5, ADC1_CH4 |
+| 6 | 6 | I/O/T | RTC_GPIO6, GPIO6, TOUCH6, ADC1_CH5 |
+| 7 | 7 | I/O/T | RTC_GPIO7, GPIO7, TOUCH7, ADC1_CH6 |
+| 8 | 15 | I/O/T | RTC_GPIO15, GPIO15, U0RTS, ADC2_CH4, XTAL_32K_P |
+| 9 | 16 | I/O/T | RTC_GPIO16, GPIO16, U0CTS, ADC2_CH5, XTAL_32K_N |
+| 10 | 17 | I/O/T | RTC_GPIO17, GPIO17, U1TXD, ADC2_CH6 |
+| 11 | 18 | I/O/T | RTC_GPIO18, GPIO18, U1RXD, ADC2_CH7, CLK_OUT3 |
+| 12 | 8 | I/O/T | RTC_GPIO8, GPIO8, TOUCH8, ADC1_CH7, SUBSPICS1 |
+| 13 | 3 | I/O/T | RTC_GPIO3, GPIO3, TOUCH3, ADC1_CH2 |
+| 14 | 46 | I/O/T | GPIO46 |
+| 15 | 9 | I/O/T | RTC_GPIO9, GPIO9, TOUCH9, ADC1_CH8, FSPIHD, SUBSPIHD |
+| 16 | 10 | I/O/T | RTC_GPIO10, GPIO10, TOUCH10, ADC1_CH9, FSPICS0, FSPIIO4, SUBSPICS0 |
+| 17 | 11 | I/O/T | RTC_GPIO11, GPIO11, TOUCH11, ADC2_CH0, FSPID, FSPIIO5, SUBSPID |
+| 18 | 12 | I/O/T | RTC_GPIO12, GPIO12, TOUCH12, ADC2_CH1, FSPICLK, FSPIIO6, SUBSPICLK |
+| 19 | 13 | I/O/T | RTC_GPIO13, GPIO13, TOUCH13, ADC2_CH2, FSPIQ, FSPIIO7, SUBSPIQ |
+| 20 | 14 | I/O/T | RTC_GPIO14, GPIO14, TOUCH14, ADC2_CH3, FSPIWP, FSPIDQS, SUBSPIWP |
+| 21 | 5V | P | 5 V 电源 |
+| 22 | G | G | 接地 |
+
+### J3
+
+| 序号 | 名称 | 类型 | 功能 |
+|----|----|-------|-------------------------------------------------------|
+| 1 | G | G | 接地 |
+| 2 | TX | I/O/T | U0TXD, GPIO43, CLK_OUT1 |
+| 3 | RX | I/O/T | U0RXD, GPIO44, CLK_OUT2 |
+| 4 | 1 | I/O/T | RTC_GPIO1, GPIO1, TOUCH1, ADC1_CH0 |
+| 5 | 2 | I/O/T | RTC_GPIO2, GPIO2, TOUCH2, ADC1_CH1 |
+| 6 | 42 | I/O/T | MTMS, GPIO42 |
+| 7 | 41 | I/O/T | MTDI, GPIO41, CLK_OUT1 |
+| 8 | 40 | I/O/T | MTDO, GPIO40, CLK_OUT2 |
+| 9 | 39 | I/O/T | MTCK, GPIO39, CLK_OUT3, SUBSPICS1 |
+| 10 | 38 | I/O/T | GPIO38, FSPIWP, SUBSPIWP, RGB LED |
+| 11 | 37 | I/O/T | SPIDQS, GPIO37, FSPIQ, SUBSPIQ |
+| 12 | 36 | I/O/T | SPIIO7, GPIO36, FSPICLK, SUBSPICLK |
+| 13 | 35 | I/O/T | SPIIO6, GPIO35, FSPID, SUBSPID |
+| 14 | 0 | I/O/T | RTC_GPIO0, GPIO0 |
+| 15 | 45 | I/O/T | GPIO45 |
+| 16 | 48 | I/O/T | GPIO48, SPICLK_N, SUBSPICLK_N_DIFF |
+| 17 | 47 | I/O/T | GPIO47, SPICLK_P, SUBSPICLK_P_DIFF |
+| 18 | 21 | I/O/T | RTC_GPIO21, GPIO21 |
+| 19 | 20 | I/O/T | RTC_GPIO20, GPIO20, U1CTS, ADC2_CH9, CLK_OUT1, USB_D+ |
+| 20 | 19 | I/O/T | RTC_GPIO19, GPIO19, U1RTS, ADC2_CH8, CLK_OUT2, USB_D- |
+| 21 | G | G | 接地 |
+| 22 | G | G | 接地 |
+
+## 管脚布局
+
+![ESP32S3DevKitC1pinlayoutv1.1.jpg](https://static.rymcu.com/article/1708056462709.jpg)
+
+## 相关文档
+
+- [电路原理图](https://static.rymcu.com/article/1686045860275.pdf)
+
+[^1]: P:电源;I:输入;O:输出;T:可设置为高阻。
+
+', 'ESP32-S3-DevKitC-1 —— 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32S3 模组的入门级开发板。
+
+获取地址: GitHub | Gitee | RYMCU
+
+
+功能介绍
+ESP32-S3-DevKitC-1 开发板的主要组件、接口及控制方式见下。
+
+
+
+主要组件 |
+介绍 |
+
+
+
+
+ESP32-S3-WROOM-1/1U/2 |
+ESP32-S3-WROOM-1、ESP32-S3-WROOM-1U 和 ESP32-S3-WROOM-2 是通用型 Wi-Fi + 低功耗蓝牙 MCU 模组,具有丰富的外设接口、强大的神经网络运算能力和信号处理能力,专为人工智能和 AIoT 市场打造。ESP32-S3-WROOM-1 和 ESP32-S3-WROOM-2 采用 PCB 板载天线,ESP32-S3-WROOM-1U 采用连接器连接外部天线。 |
+
+
+5 V to 3.3 V LDO(5 V 转 3.3 V LDO) |
+电源转换器,输入 5 V,输出 3.3 V。 |
+
+
+Pin Headers(排针) |
+所有可用 GPIO 管脚(除 flash 的 SPI 总线)均已引出至开发板的排针。请查看 排针 获取更多信息。 |
+
+
+USB-to-UART Port(USB 转 UART 接口) |
+USB Type-C 接口,可用作开发板的供电接口,可烧录固件至芯片,也可作为通信接口,通过板载 USB 转 UART 桥接器与芯片通信。 |
+
+
+Boot Button(Boot 键) |
+下载按键。按住 Boot 键的同时按一下 Reset 键进入“固件下载”模式,通过串口下载固件。 |
+
+
+Reset Button(Reset 键) |
+复位按键。 |
+
+
+USB Port(USB 接口) |
+ESP32-S3 USB OTG 接口,支持全速 USB 1.1 标准。ESP32-S3 USB 接口可用作开发板的供电接口,可烧录固件至芯片,可通过 USB 协议与芯片通信,也可用于 JTAG 调试。 |
+
+
+USB-to-UART Bridge(USB 转 UART 桥接器) |
+单芯片 USB 至 UART 桥接器,可提供高达 3 Mbps 的传输速率。 |
+
+
+RGB LED |
+可寻址 RGB 发光二极管,由 GPIO38 驱动。 |
+
+
+3.3 V Power On LED(3.3 V 电源指示灯) |
+开发板连接 USB 电源后,该指示灯亮起。 |
+
+
+
+
+在板载 ESP32-S3-WROOM-1/1U 模组系列(使用 8 线 SPI flash/PSRAM)的开发板和板载 ESP32-S3-WROOM-2 模组系列的开发板中,管脚 GPIO35、GPIO36 和 GPIO37 已用于内部 ESP32-S3 芯片与 SPI flash/PSRAM 之间的通信,外部不可使用。
+
+排针
+下表列出了开发板两侧排针(J1 和 J3)的名称和功能,排针名称如图 ESP32-S3-DevKitC-1(板载 ESP32-S3-WROOM-1) 中所示。
+J1
+
+
+
+序号 |
+名称 |
+类型 |
+功能 |
+
+
+
+
+1 |
+3V3 |
+P |
+3.3 V 电源 |
+
+
+2 |
+3V3 |
+P |
+3.3 V 电源 |
+
+
+3 |
+RST |
+I |
+EN |
+
+
+4 |
+4 |
+I/O/T |
+RTC_GPIO4, GPIO4, TOUCH4, ADC1_CH3 |
+
+
+5 |
+5 |
+I/O/T |
+RTC_GPIO5, GPIO5, TOUCH5, ADC1_CH4 |
+
+
+6 |
+6 |
+I/O/T |
+RTC_GPIO6, GPIO6, TOUCH6, ADC1_CH5 |
+
+
+7 |
+7 |
+I/O/T |
+RTC_GPIO7, GPIO7, TOUCH7, ADC1_CH6 |
+
+
+8 |
+15 |
+I/O/T |
+RTC_GPIO15, GPIO15, U0RTS, ADC2_CH4, XTAL_32K_P |
+
+
+9 |
+16 |
+I/O/T |
+RTC_GPIO16, GPIO16, U0CTS, ADC2_CH5, XTAL_32K_N |
+
+
+10 |
+17 |
+I/O/T |
+RTC_GPIO17, GPIO17, U1TXD, ADC2_CH6 |
+
+
+11 |
+18 |
+I/O/T |
+RTC_GPIO18, GPIO18, U1RXD, ADC2_CH7, CLK_OUT3 |
+
+
+12 |
+8 |
+I/O/T |
+RTC_GPIO8, GPIO8, TOUCH8, ADC1_CH7, SUBSPICS1 |
+
+
+13 |
+3 |
+I/O/T |
+RTC_GPIO3, GPIO3, TOUCH3, ADC1_CH2 |
+
+
+14 |
+46 |
+I/O/T |
+GPIO46 |
+
+
+15 |
+9 |
+I/O/T |
+RTC_GPIO9, GPIO9, TOUCH9, ADC1_CH8, FSPIHD, SUBSPIHD |
+
+
+16 |
+10 |
+I/O/T |
+RTC_GPIO10, GPIO10, TOUCH10, ADC1_CH9, FSPICS0, FSPIIO4, SUBSPICS0 |
+
+
+17 |
+11 |
+I/O/T |
+RTC_GPIO11, GPIO11, TOUCH11, ADC2_CH0, FSPID, FSPIIO5, SUBSPID |
+
+
+18 |
+12 |
+I/O/T |
+RTC_GPIO12, GPIO12, TOUCH12, ADC2_CH1, FSPICLK, FSPIIO6, SUBSPICLK |
+
+
+19 |
+13 |
+I/O/T |
+RTC_GPIO13, GPIO13, TOUCH13, ADC2_CH2, FSPIQ, FSPIIO7, SUBSPIQ |
+
+
+20 |
+14 |
+I/O/T |
+RTC_GPIO14, GPIO14, TOUCH14, ADC2_CH3, FSPIWP, FSPIDQS, SUBSPIWP |
+
+
+21 |
+5V |
+P |
+5 V 电源 |
+
+
+22 |
+G |
+G |
+接地 |
+
+
+
+J3
+
+
+
+序号 |
+名称 |
+类型 |
+功能 |
+
+
+
+
+1 |
+G |
+G |
+接地 |
+
+
+2 |
+TX |
+I/O/T |
+U0TXD, GPIO43, CLK_OUT1 |
+
+
+3 |
+RX |
+I/O/T |
+U0RXD, GPIO44, CLK_OUT2 |
+
+
+4 |
+1 |
+I/O/T |
+RTC_GPIO1, GPIO1, TOUCH1, ADC1_CH0 |
+
+
+5 |
+2 |
+I/O/T |
+RTC_GPIO2, GPIO2, TOUCH2, ADC1_CH1 |
+
+
+6 |
+42 |
+I/O/T |
+MTMS, GPIO42 |
+
+
+7 |
+41 |
+I/O/T |
+MTDI, GPIO41, CLK_OUT1 |
+
+
+8 |
+40 |
+I/O/T |
+MTDO, GPIO40, CLK_OUT2 |
+
+
+9 |
+39 |
+I/O/T |
+MTCK, GPIO39, CLK_OUT3, SUBSPICS1 |
+
+
+10 |
+38 |
+I/O/T |
+GPIO38, FSPIWP, SUBSPIWP, RGB LED |
+
+
+11 |
+37 |
+I/O/T |
+SPIDQS, GPIO37, FSPIQ, SUBSPIQ |
+
+
+12 |
+36 |
+I/O/T |
+SPIIO7, GPIO36, FSPICLK, SUBSPICLK |
+
+
+13 |
+35 |
+I/O/T |
+SPIIO6, GPIO35, FSPID, SUBSPID |
+
+
+14 |
+0 |
+I/O/T |
+RTC_GPIO0, GPIO0 |
+
+
+15 |
+45 |
+I/O/T |
+GPIO45 |
+
+
+16 |
+48 |
+I/O/T |
+GPIO48, SPICLK_N, SUBSPICLK_N_DIFF |
+
+
+17 |
+47 |
+I/O/T |
+GPIO47, SPICLK_P, SUBSPICLK_P_DIFF |
+
+
+18 |
+21 |
+I/O/T |
+RTC_GPIO21, GPIO21 |
+
+
+19 |
+20 |
+I/O/T |
+RTC_GPIO20, GPIO20, U1CTS, ADC2_CH9, CLK_OUT1, USB_D+ |
+
+
+20 |
+19 |
+I/O/T |
+RTC_GPIO19, GPIO19, U1RTS, ADC2_CH8, CLK_OUT2, USB_D- |
+
+
+21 |
+G |
+G |
+接地 |
+
+
+22 |
+G |
+G |
+接地 |
+
+
+
+管脚布局
+
+相关文档
+
+', '2023-05-14 08:14:23', '2023-05-14 08:14:27');
+INSERT INTO forest.forest_product_content (id_product, product_content, product_content_html, created_time, updated_time) VALUES (3, 'RYDAPLink —— 集`下载`、`调试`、`串口`、`3.3V/5V 供电`、`串口 ISP` 功能于一身的 DAPLink 下载器, 由 RYMCU 社区 ( https://rymcu.com ) 倾情打造。
+
+> 获取地址: [GitHub](https://github.com/rymcu/RYDAPLink) | [Gitee](https://gitee.com/rymcu/RYDAPLink) | [RYMCU](https://rymcu.com/article/21)
+
+## 背景
+
+在开发 STM32 等基于 ARM 内核的单片机时,几乎所有人都会遇到同一个问题。[那就是选择一款什么样的下载调试器呢?](https://rymcu.com/article/22) 市面上有各式各样的下载调试器可供我们选择,我觉得选择一款最合适自己的,才是重要的。常用的下载器包括 J-Link ,ST-Link ,J-Link0B ,CMSIS-DAP ,DAPLink 等。
+
+当接触到 DAPLink 这个方案后,我们根据官方开源的原理图,设计了一版下载调试并且开始了一段时间的试用。实物非常的小巧,尺寸为:50mm x 50mm ,实物长下面这样了。
+
+![RYDAPLink.png](https://static.rymcu.com/article/1706081416691.png)
+
+同时,我们在源码的基础上进行了一些改进,实现了串口 ISP 功能。另外,原来方案的基础上,增加了板载自恢复保险丝,保证即使短路也不会烧坏主板,这样心里踏实多了。项目经过了长时间的使用测试,固件非常稳定。五合一功能:下载、调试、串口、3.3V/5V 供电,串口 ISP 。
+
+本文基于 ARMmebed 官方开源代码打造了一款 DAPLink 下载调试器,并做了些许改进,无论初学与否,跟随下面教程,你也可以打造属于你自己的 DAPLink!
+
+## RYDAPLink 项目简介
+
+### 功能介绍
+
+这是一款 ARM 官方开源的仿真器,可以实现全系列 Cortex-M0/M3/M4/M7 内核芯片的程序下载和调试。特性如下:
+
+* 官方开源,无版权限制,稳定不丢失固件
+* SWD 接口,全系列 Cortex-M0/M3/M4/M7 下载和调试( HID )
+* 自带 USB 虚拟串口,方便程序调试( CDC )
+* 拖拽下载功能,模拟 U 盘,将 Hex 或 bin 格式文件拖拽或拷贝至 U 盘完成下载(MSC)
+* 串口下载程序,改进官方程序实现(串口 ISP )
+* 输出 5.0V 电源,可供电目标电路
+* 输出 3.3V 电源,可供电目标器件
+* 板载自恢复保险丝,短路自保护
+* Win10 即插即用,无需驱动
+
+', 'RYDAPLink —— 集 下载
、调试
、串口
、3.3V/5V 供电
、串口 ISP
功能于一身的 DAPLink 下载器, 由 RYMCU 社区 ( https://rymcu.com ) 倾情打造。
+
+获取地址: GitHub | Gitee | RYMCU
+
+背景
+在开发 STM32 等基于 ARM 内核的单片机时,几乎所有人都会遇到同一个问题。那就是选择一款什么样的下载调试器呢? 市面上有各式各样的下载调试器可供我们选择,我觉得选择一款最合适自己的,才是重要的。常用的下载器包括 J-Link ,ST-Link ,J-Link0B ,CMSIS-DAP ,DAPLink 等。
+当接触到 DAPLink 这个方案后,我们根据官方开源的原理图,设计了一版下载调试并且开始了一段时间的试用。实物非常的小巧,尺寸为:50mm x 50mm ,实物长下面这样了。
+
+同时,我们在源码的基础上进行了一些改进,实现了串口 ISP 功能。另外,原来方案的基础上,增加了板载自恢复保险丝,保证即使短路也不会烧坏主板,这样心里踏实多了。项目经过了长时间的使用测试,固件非常稳定。五合一功能:下载、调试、串口、3.3V/5V 供电,串口 ISP 。
+本文基于 ARMmebed 官方开源代码打造了一款 DAPLink 下载调试器,并做了些许改进,无论初学与否,跟随下面教程,你也可以打造属于你自己的 DAPLink!
+RYDAPLink 项目简介
+功能介绍
+这是一款 ARM 官方开源的仿真器,可以实现全系列 Cortex-M0/M3/M4/M7 内核芯片的程序下载和调试。特性如下:
+
+- 官方开源,无版权限制,稳定不丢失固件
+- SWD 接口,全系列 Cortex-M0/M3/M4/M7 下载和调试( HID )
+- 自带 USB 虚拟串口,方便程序调试( CDC )
+- 拖拽下载功能,模拟 U 盘,将 Hex 或 bin 格式文件拖拽或拷贝至 U 盘完成下载(MSC)
+- 串口下载程序,改进官方程序实现(串口 ISP )
+- 输出 5.0V 电源,可供电目标电路
+- 输出 3.3V 电源,可供电目标器件
+- 板载自恢复保险丝,短路自保护
+- Win10 即插即用,无需驱动
+
+', '2024-01-24 19:31:43', '2024-01-24 19:31:46');
+INSERT INTO forest.forest_product_content (id_product, product_content, product_content_html, created_time, updated_time) VALUES (4, 'ESP32-DevKitC —— 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32 模组的入门级开发板。
+
+> 获取地址: [GitHub](https://github.com/rymcu/ESP32-Open) | [Gitee](https://gitee.com/rymcu/ESP32-Open) | [RYMCU](https://rymcu.com/product/4/#相关文档)
+
+![](https://static.rymcu.com/article/1706922435052.png)
+
+## 功能介绍
+
+ESP32-DevKitC V4 开发板的主要组件、接口及控制方式见下。
+
+| 主要组件 | 基本介绍 |
+|-----------------|---------------------------------------------------------------------------|
+| ESP32-WROOM-32 | 基于 ESP32 的模组。更多详情,请见 [《ESP32-WROOM-32 技术规格书》](https://espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_cn.pdf)。 |
+| EN | 复位按键。 |
+| Boot | 下载按键。按下 Boot 键并保持,同时按一下 EN 键(此时不要松开 Boot 键)进入“固件下载”模式,通过串口下载固件。 |
+| USB-to-UART 桥接器 | 单芯片 USB-UART 桥接器,可提供高达 3 Mbps 的传输速率。 |
+| USB Type-C 接口 | USB 接口,可用作电路板的供电电源,或连接 PC 和 ESP32-WROOM-32 模组的通信接口。 |
+| 5V Power On LED | 开发板通电后(USB 或外部 5 V),该指示灯将亮起。更多信息,请见 相关文档 中的原理图。 |
+| I/O | 板上模组的绝大部分管脚均已引出至开发板的排针。用户可以对 ESP32 进行编程,实现 PWM、ADC、DAC、I2C、I2S、SPI 等多种功能。 |
+
+## 排针
+
+下表列出了开发板两侧排针(J1 和 J3)的名称和功能,排针名称如图 ESP32-DevKitC V4(板载 ESP32-WROOM-32) 中所示。
+
+### J1
+
+| 编号 | 名称 | 类型[^1] | 功能 |
+|----|------|--------|-----------------------------------------|
+| 1 | 3V3 | P | 3.3 V 电源 |
+| 2 | EN | I | CHIP_PU, Reset |
+| 3 | VP | I | GPIO36, ADC1_CH0, S_VP |
+| 4 | VN | I | GPIO39, ADC1_CH3, S_VN |
+| 5 | IO34 | I | GPIO34, ADC1_CH6, VDET_1 |
+| 6 | IO35 | I | GPIO35, ADC1_CH7, VDET_2 |
+| 7 | IO32 | I/O | GPIO32, ADC1_CH4, TOUCH_CH9, XTAL_32K_P |
+| 8 | IO33 | I/O | GPIO33, ADC1_CH5, TOUCH_CH8, XTAL_32K_N |
+| 9 | IO25 | I/O | GPIO25, ADC1_CH8, DAC_1 |
+| 10 | IO26 | I/O | GPIO26, ADC2_CH9, DAC_2 |
+| 11 | IO27 | I/O | GPIO27, ADC2_CH7, TOUCH_CH7 |
+| 12 | IO14 | I/O | GPIO14, ADC2_CH6, TOUCH_CH6, MTMS |
+| 13 | IO12 | I/O | GPIO12, ADC2_CH5, TOUCH_CH5, MTDI |
+| 14 | GND | G | 接地 |
+| 15 | IO13 | I/O | GPIO13, ADC2_CH4, TOUCH_CH4, MTCK |
+| 16 | D2 | I/O | GPIO9, D2 [^2] |
+| 17 | D3 | I/O | GPIO10, D3 [^2] |
+| 18 | CMD | I/O | GPIO11, CMD [^2] |
+| 19 | 5V | P | 5 V 电源 |
+
+### J3
+
+| 编号 | 名称 | 类型 [^1] | 功能 |
+|----|------|---------|-----------------------------------|
+| 1 | GND | G | 接地 |
+| 2 | IO23 | I/O | GPIO23 |
+| 3 | IO22 | I/O | GPIO22 |
+| 4 | TX | I/O | GPIO1, U0TXD |
+| 5 | RX | I/O | GPIO3, U0RXD |
+| 6 | IO21 | I/O | GPIO21 |
+| 7 | GND | G | 接地 |
+| 8 | IO19 | I/O | GPIO19 |
+| 9 | IO18 | I/O | GPIO18 |
+| 10 | IO5 | I/O | GPIO5 |
+| 11 | IO17 | I/O | GPIO17 [^3] |
+| 12 | IO16 | I/O | GPIO16 [^3] |
+| 13 | IO4 | I/O | GPIO4, ADC2_CH0, TOUCH_CH0 |
+| 14 | IO0 | I/O | GPIO0, ADC2_CH1, TOUCH_CH1, Boot |
+| 15 | IO2 | I/O | GPIO2, ADC2_CH2, TOUCH_CH2 |
+| 16 | IO15 | I/O | GPIO15, ADC2_CH3, TOUCH_CH3, MTDO |
+| 17 | D1 | I/O | GPIO8, D1 [^2] |
+| 18 | D0 | I/O | GPIO7, D0 [^2] |
+| 19 | CLK | I/O | GPIO6, CLK [^2] |
+
+[^1]: P:电源;I:输入;O:输出。
+
+[^2]: 管脚 D0、D1、D2、D3、CMD 和 CLK 用于 ESP32 芯片与 SPI flash 间的内部通信,集中分布在开发板两侧靠近 USB 端口的位置。通常而言,这些管脚最好不连,否则可能影响 SPI flash/SPI RAM 的工作。
+
+[^3]: 管脚 GPIO16 和 GPIO17 仅适用于板载 ESP32-WROOM 系列和 ESP32-SOLO-1 的开发板,板载 ESP32-WROVER 系列开发板的管脚 GPIO16 和 GPIO17 保留内部使用。
+
+## 管脚布局
+
+![](https://static.rymcu.com/article/1706927881092.png)
+
+## 相关文档
+
+- [电路原理图](https://static.rymcu.com/article/1686043415890.pdf)
+- [PCB 源文件](https://static.rymcu.com/article/1691599744950.epro)
+
+
+', 'ESP32-DevKitC —— 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32 模组的入门级开发板。
+
+获取地址: GitHub | Gitee | RYMCU
+
+
+功能介绍
+ESP32-DevKitC V4 开发板的主要组件、接口及控制方式见下。
+
+
+
+主要组件 |
+基本介绍 |
+
+
+
+
+ESP32-WROOM-32 |
+基于 ESP32 的模组。更多详情,请见 《ESP32-WROOM-32 技术规格书》。 |
+
+
+EN |
+复位按键。 |
+
+
+Boot |
+下载按键。按下 Boot 键并保持,同时按一下 EN 键(此时不要松开 Boot 键)进入“固件下载”模式,通过串口下载固件。 |
+
+
+USB-to-UART 桥接器 |
+单芯片 USB-UART 桥接器,可提供高达 3 Mbps 的传输速率。 |
+
+
+USB Type-C 接口 |
+USB 接口,可用作电路板的供电电源,或连接 PC 和 ESP32-WROOM-32 模组的通信接口。 |
+
+
+5V Power On LED |
+开发板通电后(USB 或外部 5 V),该指示灯将亮起。更多信息,请见 相关文档 中的原理图。 |
+
+
+I/O |
+板上模组的绝大部分管脚均已引出至开发板的排针。用户可以对 ESP32 进行编程,实现 PWM、ADC、DAC、I2C、I2S、SPI 等多种功能。 |
+
+
+
+排针
+下表列出了开发板两侧排针(J1 和 J3)的名称和功能,排针名称如图 ESP32-DevKitC V4(板载 ESP32-WROOM-32) 中所示。
+J1
+
+
+
+编号 |
+名称 |
+类型 |
+功能 |
+
+
+
+
+1 |
+3V3 |
+P |
+3.3 V 电源 |
+
+
+2 |
+EN |
+I |
+CHIP_PU, Reset |
+
+
+3 |
+VP |
+I |
+GPIO36, ADC1_CH0, S_VP |
+
+
+4 |
+VN |
+I |
+GPIO39, ADC1_CH3, S_VN |
+
+
+5 |
+IO34 |
+I |
+GPIO34, ADC1_CH6, VDET_1 |
+
+
+6 |
+IO35 |
+I |
+GPIO35, ADC1_CH7, VDET_2 |
+
+
+7 |
+IO32 |
+I/O |
+GPIO32, ADC1_CH4, TOUCH_CH9, XTAL_32K_P |
+
+
+8 |
+IO33 |
+I/O |
+GPIO33, ADC1_CH5, TOUCH_CH8, XTAL_32K_N |
+
+
+9 |
+IO25 |
+I/O |
+GPIO25, ADC1_CH8, DAC_1 |
+
+
+10 |
+IO26 |
+I/O |
+GPIO26, ADC2_CH9, DAC_2 |
+
+
+11 |
+IO27 |
+I/O |
+GPIO27, ADC2_CH7, TOUCH_CH7 |
+
+
+12 |
+IO14 |
+I/O |
+GPIO14, ADC2_CH6, TOUCH_CH6, MTMS |
+
+
+13 |
+IO12 |
+I/O |
+GPIO12, ADC2_CH5, TOUCH_CH5, MTDI |
+
+
+14 |
+GND |
+G |
+接地 |
+
+
+15 |
+IO13 |
+I/O |
+GPIO13, ADC2_CH4, TOUCH_CH4, MTCK |
+
+
+16 |
+D2 |
+I/O |
+GPIO9, D2 |
+
+
+17 |
+D3 |
+I/O |
+GPIO10, D3 |
+
+
+18 |
+CMD |
+I/O |
+GPIO11, CMD |
+
+
+19 |
+5V |
+P |
+5 V 电源 |
+
+
+
+J3
+
+
+
+编号 |
+名称 |
+类型 |
+功能 |
+
+
+
+
+1 |
+GND |
+G |
+接地 |
+
+
+2 |
+IO23 |
+I/O |
+GPIO23 |
+
+
+3 |
+IO22 |
+I/O |
+GPIO22 |
+
+
+4 |
+TX |
+I/O |
+GPIO1, U0TXD |
+
+
+5 |
+RX |
+I/O |
+GPIO3, U0RXD |
+
+
+6 |
+IO21 |
+I/O |
+GPIO21 |
+
+
+7 |
+GND |
+G |
+接地 |
+
+
+8 |
+IO19 |
+I/O |
+GPIO19 |
+
+
+9 |
+IO18 |
+I/O |
+GPIO18 |
+
+
+10 |
+IO5 |
+I/O |
+GPIO5 |
+
+
+11 |
+IO17 |
+I/O |
+GPIO17 |
+
+
+12 |
+IO16 |
+I/O |
+GPIO16 |
+
+
+13 |
+IO4 |
+I/O |
+GPIO4, ADC2_CH0, TOUCH_CH0 |
+
+
+14 |
+IO0 |
+I/O |
+GPIO0, ADC2_CH1, TOUCH_CH1, Boot |
+
+
+15 |
+IO2 |
+I/O |
+GPIO2, ADC2_CH2, TOUCH_CH2 |
+
+
+16 |
+IO15 |
+I/O |
+GPIO15, ADC2_CH3, TOUCH_CH3, MTDO |
+
+
+17 |
+D1 |
+I/O |
+GPIO8, D1 |
+
+
+18 |
+D0 |
+I/O |
+GPIO7, D0 |
+
+
+19 |
+CLK |
+I/O |
+GPIO6, CLK |
+
+
+
+管脚布局
+
+相关文档
+
+', '2024-02-03 10:43:43', '2024-02-03 10:43:45');
+INSERT INTO forest.forest_product_content (id_product, product_content, product_content_html, created_time, updated_time) VALUES (5, 'ESP32-C3-DevKitM-1 —— 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32C3 模组的入门级开发板。
+
+> 获取地址: [GitHub](https://github.com/rymcu/ESP32-Open) | [Gitee](https://gitee.com/rymcu/ESP32-Open) | [RYMCU](https://rymcu.com/product/4)
+
+![](https://static.rymcu.com/article/1706922639664.png)
+
+## 功能介绍
+
+ESP32-C3-DevKitM-1 开发板的主要组件、接口及控制方式见下。
+
+| 主要组件 | 介绍 |
+|------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|
+| ESP32-C3-MINI-1 | ESP32-C3-MINI-1 是一款通用型 Wi-Fi 和低功耗蓝牙双模模组,采用 PCB 板载天线。该款模组集成配置 4 MB 嵌入式 flash 的 ESP32-C3FN4 芯片。由于 flash 直接封装在芯片中,ESP32-C3-MINI-1 模组具有更小的封装尺寸。 |
+| 5 V to 3.3 V LDO(5 V 转 3.3 V LDO) | 电源转换器,输入 5 V,输出 3.3 V。 |
+| 5 V Power On LED(5 V 电源指示灯) | 开发板连接 USB 电源后,该指示灯亮起。 |
+| Pin Headers(排针) | 所有可用 GPIO 管脚(除 flash 的 SPI 总线)均已引出至开发板的排针。请查看 排针 获取更多信息。 |
+| Boot Button(Boot 键) | 下载按键。按住 Boot 键的同时按一下 Reset 键进入“固件下载”模式,通过串口下载固件。 |
+| Micro-USB Port(Micro-USB 接口) | USB 接口。可用作开发板的供电电源或 PC 和 ESP32-C3FN4 芯片的通信接口。 |
+| Reset Button(Reset 键) | 复位按键。 |
+| USB-to-UART Bridge(USB 至 UART 桥接器) | 单芯片 USB 至 UART 桥接器,可提供高达 3 Mbps 的传输速率。 |
+| RGB LED | 可寻址 RGB 发光二极管,由 GPIO8 驱动。 |
+
+## 排针
+
+下表列出了开发板两侧排针(J1 和 J3)的名称和功能,排针名称如图 ESP32-C3-DevKitM-1 中所示。
+
+### J1
+
+| 序号 | 名称 | 类型 [^1] | 功能 |
+|----|------|-------|-----------------------------|
+| 1 | GND | G | 接地 |
+| 2 | 3V3 | P | 3.3 V 电源 |
+| 3 | 3V3 | P | 3.3 V 电源 |
+| 4 | IO2 | I/O/T | GPIO2 2 , ADC1_CH2, FSPIQ |
+| 5 | IO3 | I/O/T | GPIO3, ADC1_CH3 |
+| 6 | GND | G | 接地 |
+| 7 | RST | I | CHIP_PU |
+| 8 | GND | G | 接地 |
+| 9 | IO0 | I/O/T | GPIO0, ADC1_CH0, XTAL_32K_P |
+| 10 | IO1 | I/O/T | GPIO1, ADC1_CH1, XTAL_32K_N |
+| 11 | IO10 | I/O/T | GPIO10, FSPICS0 |
+| 12 | GND | G | 接地 |
+| 13 | 5V | P | 5 V 电源 |
+| 14 | 5V | P | 5 V 电源 |
+| 15 | GND | G | 接地 |
+
+### J3
+
+| 序号 | 名称 | 类型 [^1] | 功能 |
+|----|------|-------|-------------------------------|
+| 1 | GND | G | 接地 |
+| 2 | TX | I/O/T | GPIO21, U0TXD |
+| 3 | RX | I/O/T | GPIO20, U0RXD |
+| 4 | GND | G | 接地 |
+| 5 | IO9 | I/O/T | GPIO9 [^2] |
+| 6 | IO8 | I/O/T | GPIO8 [^2], RGB LED |
+| 7 | GND | G | 接地 |
+| 8 | IO7 | I/O/T | GPIO7, FSPID, MTDO |
+| 9 | IO6 | I/O/T | GPIO6, FSPICLK, MTCK |
+| 10 | IO5 | I/O/T | GPIO5, ADC2_CH0, FSPIWP, MTDI |
+| 11 | IO4 | I/O/T | GPIO4, ADC1_CH4, FSPIHD, MTMS |
+| 12 | GND | G | 接地 |
+| 13 | IO18 | I/O/T | GPIO18 |
+| 14 | IO19 | I/O/T | GPIO19 |
+| 15 | GND | G | 接地 |
+
+## 管脚布局
+
+![esp32c3devkitm1v1pinout.png](https://static.rymcu.com/article/1708083360388.png)
+
+## 相关文档
+
+- [电路原理图](https://static.rymcu.com/article/1686045790604.pdf)
+
+[^1]: P:电源;I:输入;O:输出;T:可设置为高阻。
+
+[^2]: GPIO2、GPIO8、GPIO9 为 ESP32-C3FN4 芯片的 Strapping 管脚。在芯片上电和系统复位过程中,Strapping 管脚根据管脚的二进制电压值控制芯片功能。Strapping 管脚的具体描述和应用,请参考 [ESP32-C3 技术规格书](https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_cn.pdf) 的 Strapping 管脚章节。
+
+', 'ESP32-C3-DevKitM-1 —— 是社区在乐鑫官方设计方案上进行升级后推出的一款基于 ESP32C3 模组的入门级开发板。
+
+获取地址: GitHub | Gitee | RYMCU
+
+
+功能介绍
+ESP32-C3-DevKitM-1 开发板的主要组件、接口及控制方式见下。
+
+
+
+主要组件 |
+介绍 |
+
+
+
+
+ESP32-C3-MINI-1 |
+ESP32-C3-MINI-1 是一款通用型 Wi-Fi 和低功耗蓝牙双模模组,采用 PCB 板载天线。该款模组集成配置 4 MB 嵌入式 flash 的 ESP32-C3FN4 芯片。由于 flash 直接封装在芯片中,ESP32-C3-MINI-1 模组具有更小的封装尺寸。 |
+
+
+5 V to 3.3 V LDO(5 V 转 3.3 V LDO) |
+电源转换器,输入 5 V,输出 3.3 V。 |
+
+
+5 V Power On LED(5 V 电源指示灯) |
+开发板连接 USB 电源后,该指示灯亮起。 |
+
+
+Pin Headers(排针) |
+所有可用 GPIO 管脚(除 flash 的 SPI 总线)均已引出至开发板的排针。请查看 排针 获取更多信息。 |
+
+
+Boot Button(Boot 键) |
+下载按键。按住 Boot 键的同时按一下 Reset 键进入“固件下载”模式,通过串口下载固件。 |
+
+
+Micro-USB Port(Micro-USB 接口) |
+USB 接口。可用作开发板的供电电源或 PC 和 ESP32-C3FN4 芯片的通信接口。 |
+
+
+Reset Button(Reset 键) |
+复位按键。 |
+
+
+USB-to-UART Bridge(USB 至 UART 桥接器) |
+单芯片 USB 至 UART 桥接器,可提供高达 3 Mbps 的传输速率。 |
+
+
+RGB LED |
+可寻址 RGB 发光二极管,由 GPIO8 驱动。 |
+
+
+
+排针
+下表列出了开发板两侧排针(J1 和 J3)的名称和功能,排针名称如图 ESP32-C3-DevKitM-1 中所示。
+J1
+
+
+
+序号 |
+名称 |
+类型 |
+功能 |
+
+
+
+
+1 |
+GND |
+G |
+接地 |
+
+
+2 |
+3V3 |
+P |
+3.3 V 电源 |
+
+
+3 |
+3V3 |
+P |
+3.3 V 电源 |
+
+
+4 |
+IO2 |
+I/O/T |
+GPIO2 2 , ADC1_CH2, FSPIQ |
+
+
+5 |
+IO3 |
+I/O/T |
+GPIO3, ADC1_CH3 |
+
+
+6 |
+GND |
+G |
+接地 |
+
+
+7 |
+RST |
+I |
+CHIP_PU |
+
+
+8 |
+GND |
+G |
+接地 |
+
+
+9 |
+IO0 |
+I/O/T |
+GPIO0, ADC1_CH0, XTAL_32K_P |
+
+
+10 |
+IO1 |
+I/O/T |
+GPIO1, ADC1_CH1, XTAL_32K_N |
+
+
+11 |
+IO10 |
+I/O/T |
+GPIO10, FSPICS0 |
+
+
+12 |
+GND |
+G |
+接地 |
+
+
+13 |
+5V |
+P |
+5 V 电源 |
+
+
+14 |
+5V |
+P |
+5 V 电源 |
+
+
+15 |
+GND |
+G |
+接地 |
+
+
+
+J3
+
+
+
+序号 |
+名称 |
+类型 |
+功能 |
+
+
+
+
+1 |
+GND |
+G |
+接地 |
+
+
+2 |
+TX |
+I/O/T |
+GPIO21, U0TXD |
+
+
+3 |
+RX |
+I/O/T |
+GPIO20, U0RXD |
+
+
+4 |
+GND |
+G |
+接地 |
+
+
+5 |
+IO9 |
+I/O/T |
+GPIO9 |
+
+
+6 |
+IO8 |
+I/O/T |
+GPIO8 , RGB LED |
+
+
+7 |
+GND |
+G |
+接地 |
+
+
+8 |
+IO7 |
+I/O/T |
+GPIO7, FSPID, MTDO |
+
+
+9 |
+IO6 |
+I/O/T |
+GPIO6, FSPICLK, MTCK |
+
+
+10 |
+IO5 |
+I/O/T |
+GPIO5, ADC2_CH0, FSPIWP, MTDI |
+
+
+11 |
+IO4 |
+I/O/T |
+GPIO4, ADC1_CH4, FSPIHD, MTMS |
+
+
+12 |
+GND |
+G |
+接地 |
+
+
+13 |
+IO18 |
+I/O/T |
+GPIO18 |
+
+
+14 |
+IO19 |
+I/O/T |
+GPIO19 |
+
+
+15 |
+GND |
+G |
+接地 |
+
+
+
+管脚布局
+
+相关文档
+
+', '2024-02-03 10:54:25', '2024-02-03 10:54:27');
+
+
INSERT INTO forest.forest_bank (id, bank_name, bank_owner, bank_description, created_by, created_time)
VALUES (1, '社区中央银行', 1, '社区中央银行', 1, '2020-11-26 21:24:19');
diff --git a/src/main/java/com/rymcu/forest/enumerate/FileDataType.java b/src/main/java/com/rymcu/forest/enumerate/FileDataType.java
new file mode 100644
index 0000000..1d9c342
--- /dev/null
+++ b/src/main/java/com/rymcu/forest/enumerate/FileDataType.java
@@ -0,0 +1,14 @@
+package com.rymcu.forest.enumerate;
+
+/**
+ * Created on 2024/3/6 10:07.
+ *
+ * @author ronger
+ * @email ronger-x@outlook.com
+ * @desc : com.rymcu.forest.enumerate
+ */
+public class FileDataType {
+ public final static String URL = "0";
+ public final static String BASE64 = "1";
+
+}
diff --git a/src/main/java/com/rymcu/forest/enumerate/FilePath.java b/src/main/java/com/rymcu/forest/enumerate/FilePath.java
new file mode 100644
index 0000000..b924bc3
--- /dev/null
+++ b/src/main/java/com/rymcu/forest/enumerate/FilePath.java
@@ -0,0 +1,38 @@
+package com.rymcu.forest.enumerate;
+
+import java.util.Arrays;
+
+/**
+ * Created on 2024/3/6 10:51.
+ *
+ * @author ronger
+ * @email ronger-x@outlook.com
+ * @desc : com.rymcu.forest.enumerate
+ */
+public enum FilePath {
+ AVATAR,
+ ARTICLE,
+ TAG,
+ TOPIC,
+ PORTFOLIO,
+ PRODUCT,
+ IMAGES;
+
+ public static FilePath getFilePath(int type) {
+ for (FilePath filePath : FilePath.values()) {
+ if (filePath.ordinal() == type) {
+ return filePath;
+ }
+ }
+ return FilePath.IMAGES;
+ }
+
+ public static String getPath(int type) {
+ for (FilePath filePath : FilePath.values()) {
+ if (filePath.ordinal() == type) {
+ return filePath.name().toLowerCase();
+ }
+ }
+ return FilePath.IMAGES.name().toLowerCase();
+ }
+}
diff --git a/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java
index 7d417fb..5edcdb3 100644
--- a/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java
+++ b/src/main/java/com/rymcu/forest/service/impl/PortfolioServiceImpl.java
@@ -8,6 +8,8 @@ import com.rymcu.forest.core.exception.UltraViresException;
import com.rymcu.forest.core.service.AbstractService;
import com.rymcu.forest.dto.*;
import com.rymcu.forest.entity.Portfolio;
+import com.rymcu.forest.enumerate.FilePath;
+import com.rymcu.forest.enumerate.FileDataType;
import com.rymcu.forest.lucene.model.PortfolioLucene;
import com.rymcu.forest.lucene.util.PortfolioIndexUtil;
import com.rymcu.forest.mapper.PortfolioMapper;
@@ -16,7 +18,6 @@ import com.rymcu.forest.service.PortfolioService;
import com.rymcu.forest.service.UserService;
import com.rymcu.forest.util.XssUtils;
import com.rymcu.forest.web.api.common.UploadController;
-import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -63,8 +64,8 @@ public class PortfolioServiceImpl extends AbstractService implements
@Override
public Portfolio postPortfolio(Portfolio portfolio) {
- if (StringUtils.isNotBlank(portfolio.getHeadImgType())) {
- String headImgUrl = UploadController.uploadBase64File(portfolio.getHeadImgUrl(), 0);
+ if (FileDataType.BASE64.equals(portfolio.getHeadImgType())) {
+ String headImgUrl = UploadController.uploadBase64File(portfolio.getHeadImgUrl(), FilePath.PORTFOLIO);
portfolio.setHeadImgUrl(headImgUrl);
}
if (portfolio.getIdPortfolio() == null || portfolio.getIdPortfolio() == 0) {
diff --git a/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java
index 789cf93..8c7152e 100644
--- a/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java
+++ b/src/main/java/com/rymcu/forest/service/impl/ProductServiceImpl.java
@@ -3,11 +3,12 @@ package com.rymcu.forest.service.impl;
import com.rymcu.forest.core.service.AbstractService;
import com.rymcu.forest.dto.ProductDTO;
import com.rymcu.forest.entity.Product;
+import com.rymcu.forest.enumerate.FilePath;
+import com.rymcu.forest.enumerate.FileDataType;
import com.rymcu.forest.mapper.ProductMapper;
import com.rymcu.forest.service.ProductService;
import com.rymcu.forest.util.BeanCopierUtil;
import com.rymcu.forest.web.api.common.UploadController;
-import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -49,8 +50,8 @@ public class ProductServiceImpl extends AbstractService implements Prod
@Override
public Product postProduct(ProductDTO product) {
boolean isUpdate = product.getIdProduct() > 0;
- if (StringUtils.isNotBlank(product.getProductImgType())) {
- String headImgUrl = UploadController.uploadBase64File(product.getProductImgUrl(), 0);
+ if (FileDataType.BASE64.equals(product.getProductImgType())) {
+ String headImgUrl = UploadController.uploadBase64File(product.getProductImgUrl(), FilePath.PRODUCT);
product.setProductImgUrl(headImgUrl);
}
Product newProduct;
@@ -67,6 +68,7 @@ public class ProductServiceImpl extends AbstractService implements Prod
newProduct = new Product();
BeanCopierUtil.convert(product, newProduct);
newProduct.setCreatedTime(new Date());
+ productMapper.insertSelective(newProduct);
// 创建产品详情
productMapper.insertProductContent(newProduct.getIdProduct(), product.getProductContent(), product.getProductContentHtml());
}
diff --git a/src/main/java/com/rymcu/forest/service/impl/TagServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/TagServiceImpl.java
index 0f53f6f..d060687 100644
--- a/src/main/java/com/rymcu/forest/service/impl/TagServiceImpl.java
+++ b/src/main/java/com/rymcu/forest/service/impl/TagServiceImpl.java
@@ -10,6 +10,7 @@ import com.rymcu.forest.dto.ArticleTagDTO;
import com.rymcu.forest.dto.LabelModel;
import com.rymcu.forest.entity.Article;
import com.rymcu.forest.entity.Tag;
+import com.rymcu.forest.enumerate.FilePath;
import com.rymcu.forest.mapper.ArticleMapper;
import com.rymcu.forest.mapper.TagMapper;
import com.rymcu.forest.service.TagService;
@@ -126,7 +127,7 @@ public class TagServiceImpl extends AbstractService implements TagService {
}
}
if (StringUtils.isNotBlank(tag.getTagIconPath()) && tag.getTagIconPath().contains("base64")) {
- String tagIconPath = UploadController.uploadBase64File(tag.getTagIconPath(), 2);
+ String tagIconPath = UploadController.uploadBase64File(tag.getTagIconPath(), FilePath.TAG);
tag.setTagIconPath(tagIconPath);
} else {
tag.setTagIconPath(tag.getTagIconPath());
@@ -137,7 +138,7 @@ public class TagServiceImpl extends AbstractService implements TagService {
} else {
tag.setUpdatedTime(new Date());
if (StringUtils.isNotBlank(tag.getTagIconPath()) && tag.getTagIconPath().contains("base64")) {
- String tagIconPath = UploadController.uploadBase64File(tag.getTagIconPath(), 2);
+ String tagIconPath = UploadController.uploadBase64File(tag.getTagIconPath(), FilePath.TAG);
tag.setTagIconPath(tagIconPath);
}
result = tagMapper.update(tag.getIdTag(), tag.getTagUri(), tag.getTagIconPath(), tag.getTagStatus(), tag.getTagDescription(), tag.getTagReservation());
diff --git a/src/main/java/com/rymcu/forest/service/impl/TopicServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/TopicServiceImpl.java
index 450f4cf..787d9df 100644
--- a/src/main/java/com/rymcu/forest/service/impl/TopicServiceImpl.java
+++ b/src/main/java/com/rymcu/forest/service/impl/TopicServiceImpl.java
@@ -8,6 +8,7 @@ import com.rymcu.forest.dto.admin.TopicDTO;
import com.rymcu.forest.dto.admin.TopicTagDTO;
import com.rymcu.forest.entity.Tag;
import com.rymcu.forest.entity.Topic;
+import com.rymcu.forest.enumerate.FilePath;
import com.rymcu.forest.mapper.TopicMapper;
import com.rymcu.forest.service.TopicService;
import com.rymcu.forest.util.XssUtils;
@@ -59,7 +60,7 @@ public class TopicServiceImpl extends AbstractService implements TopicSer
}
}
if (StringUtils.isNotBlank(topic.getTopicIconPath()) && topic.getTopicIconPath().contains("base64")) {
- String topicIconPath = UploadController.uploadBase64File(topic.getTopicIconPath(), 3);
+ String topicIconPath = UploadController.uploadBase64File(topic.getTopicIconPath(), FilePath.TOPIC);
topic.setTopicIconPath(topicIconPath);
} else {
topic.setTopicIconPath(topic.getTopicIconPath());
@@ -74,7 +75,7 @@ public class TopicServiceImpl extends AbstractService implements TopicSer
result = topicMapper.insertSelective(topic);
} else {
if (StringUtils.isNotBlank(topic.getTopicIconPath()) && topic.getTopicIconPath().contains("base64")) {
- String topicIconPath = UploadController.uploadBase64File(topic.getTopicIconPath(), 3);
+ String topicIconPath = UploadController.uploadBase64File(topic.getTopicIconPath(), FilePath.TOPIC);
topic.setTopicIconPath(topicIconPath);
}
topic.setUpdatedTime(new Date());
diff --git a/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java b/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java
index aaa674c..bae90bf 100644
--- a/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/rymcu/forest/service/impl/UserServiceImpl.java
@@ -9,6 +9,8 @@ import com.rymcu.forest.dto.*;
import com.rymcu.forest.entity.Role;
import com.rymcu.forest.entity.User;
import com.rymcu.forest.entity.UserExtend;
+import com.rymcu.forest.enumerate.FilePath;
+import com.rymcu.forest.enumerate.FileDataType;
import com.rymcu.forest.lucene.model.UserLucene;
import com.rymcu.forest.lucene.util.UserIndexUtil;
import com.rymcu.forest.mapper.RoleMapper;
@@ -191,8 +193,8 @@ public class UserServiceImpl extends AbstractService implements UserServic
if (number > 0) {
throw new NicknameOccupyException("该昵称已使用!");
}
- if (StringUtils.isNotBlank(user.getAvatarType()) && AVATAR_SVG_TYPE.equals(user.getAvatarType())) {
- String avatarUrl = UploadController.uploadBase64File(user.getAvatarUrl(), 0);
+ if (FileDataType.BASE64.equals(user.getAvatarType())) {
+ String avatarUrl = UploadController.uploadBase64File(user.getAvatarUrl(), FilePath.AVATAR);
user.setAvatarUrl(avatarUrl);
user.setAvatarType("0");
}
diff --git a/src/main/java/com/rymcu/forest/web/api/common/UploadController.java b/src/main/java/com/rymcu/forest/web/api/common/UploadController.java
index 376f655..5d5d30d 100644
--- a/src/main/java/com/rymcu/forest/web/api/common/UploadController.java
+++ b/src/main/java/com/rymcu/forest/web/api/common/UploadController.java
@@ -6,6 +6,7 @@ import com.rymcu.forest.core.result.GlobalResult;
import com.rymcu.forest.core.result.GlobalResultGenerator;
import com.rymcu.forest.dto.LinkToImageUrlDTO;
import com.rymcu.forest.dto.TokenUser;
+import com.rymcu.forest.enumerate.FilePath;
import com.rymcu.forest.service.ForestFileService;
import com.rymcu.forest.util.FileUtils;
import com.rymcu.forest.util.SpringContextHolder;
@@ -29,6 +30,7 @@ import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
+
import com.rymcu.forest.util.SSRFUtil;
/**
@@ -48,38 +50,18 @@ public class UploadController {
@Resource
private ForestFileService forestFileService;
- private static String getTypePath(Integer type) {
- String typePath;
- switch (type) {
- case 0:
- typePath = "avatar";
- break;
- case 1:
- typePath = "article";
- break;
- case 2:
- typePath = "tag";
- break;
- case 3:
- typePath = "topic";
- break;
- default:
- typePath = "images";
- }
- return typePath;
- }
-
- public static String uploadBase64File(String fileStr, Integer type) {
+ public static String uploadBase64File(String fileStr, FilePath filePath) {
if (StringUtils.isBlank(fileStr)) {
return "";
}
- String typePath = getTypePath(type);
+ String typePath = filePath.name().toLowerCase();
//图片存储路径
String ctxHeadPicPath = env.getProperty("resource.pic-path");
String dir = ctxHeadPicPath + "/" + typePath;
File file = new File(dir);
if (!file.exists()) {
- file.mkdirs();// 创建文件根目录
+ // 创建文件根目录
+ file.mkdirs();
}
String localPath = Utils.getProperty("resource.file-path") + "/" + typePath + "/";
@@ -98,9 +80,9 @@ public class UploadController {
/**
* 从输入流中获取字节数组
*
- * @param inputStream
- * @return
- * @throws IOException
+ * @param inputStream 输入流
+ * @return byte[]
+ * @throws IOException IO 异常
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
@@ -134,20 +116,10 @@ public class UploadController {
data.put("url", fileUrl);
return GlobalResultGenerator.genSuccessResult(data);
}
- String typePath = getTypePath(type);
- //图片存储路径
- String ctxHeadPicPath = env.getProperty("resource.pic-path");
- String dir = ctxHeadPicPath + "/" + typePath;
- File file = new File(dir);
- if (!file.exists()) {
- file.mkdirs();// 创建文件根目录
- }
-
+ File file = genFile(type);
+ String typePath = FilePath.getPath(type);
String localPath = Utils.getProperty("resource.file-path") + "/" + typePath + "/";
-
-
String fileName = System.currentTimeMillis() + fileType;
-
String savePath = file.getPath() + File.separator + fileName;
fileUrl = localPath + fileName;
File saveFile = new File(savePath);
@@ -162,11 +134,8 @@ public class UploadController {
}
- @PostMapping("/file/batch")
- @Transactional(rollbackFor = Exception.class)
- public GlobalResult batchFileUpload(@RequestParam(value = "file[]", required = false) MultipartFile[] multipartFiles, @RequestParam(defaultValue = "1") Integer type, HttpServletRequest request) {
- TokenUser tokenUser = getTokenUser(request);
- String typePath = getTypePath(type);
+ private File genFile(Integer type) {
+ String typePath = FilePath.getPath(type);
//图片存储路径
String ctxHeadPicPath = env.getProperty("resource.pic-path");
String dir = ctxHeadPicPath + "/" + typePath;
@@ -174,13 +143,20 @@ public class UploadController {
if (!file.exists()) {
file.mkdirs();// 创建文件根目录
}
+ return file;
+ }
+ @PostMapping("/file/batch")
+ @Transactional(rollbackFor = Exception.class)
+ public GlobalResult batchFileUpload(@RequestParam(value = "file[]", required = false) MultipartFile[] multipartFiles, @RequestParam(defaultValue = "1") Integer type, HttpServletRequest request) {
+ TokenUser tokenUser = getTokenUser(request);
+ File file = genFile(type);
+ String typePath = FilePath.getPath(type);
String localPath = Utils.getProperty("resource.file-path") + "/" + typePath + "/";
- Map successMap = new HashMap(16);
- Set errFiles = new HashSet();
+ Map successMap = new HashMap<>(16);
+ Set errFiles = new HashSet<>();
- for (int i = 0, len = multipartFiles.length; i < len; i++) {
- MultipartFile multipartFile = multipartFiles[i];
+ for (MultipartFile multipartFile : multipartFiles) {
String orgName = multipartFile.getOriginalFilename();
if (multipartFile.getSize() == 0) {
@@ -247,12 +223,10 @@ public class UploadController {
@PostMapping("/file/link")
@Transactional(rollbackFor = Exception.class)
- public GlobalResult linkToImageUrl(@RequestBody LinkToImageUrlDTO linkToImageUrlDTO, HttpServletRequest request) throws IOException {
-
+ public GlobalResult