ms-vite-plugin 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/build.js +6 -0
  2. package/dist/cli.js +91 -1
  3. package/dist/mcp/device-config.d.ts +55 -0
  4. package/dist/mcp/device-config.js +183 -0
  5. package/dist/mcp/docs-service.d.ts +65 -0
  6. package/dist/mcp/docs-service.js +168 -0
  7. package/dist/mcp/project.d.ts +16 -0
  8. package/dist/mcp/project.js +74 -0
  9. package/dist/mcp/tools.d.ts +18 -0
  10. package/dist/mcp/tools.js +825 -0
  11. package/dist/mcp/types.d.ts +32 -0
  12. package/dist/mcp/types.js +11 -0
  13. package/dist/mcp-server.d.ts +2 -0
  14. package/dist/mcp-server.js +86 -0
  15. package/dist/project.d.ts +89 -0
  16. package/dist/project.js +306 -0
  17. package/dist/version.d.ts +12 -0
  18. package/dist/version.js +63 -0
  19. package/docs/api/action.md +922 -0
  20. package/docs/api/appleocr.md +229 -0
  21. package/docs/api/config.md +122 -0
  22. package/docs/api/cryptoUtils.md +232 -0
  23. package/docs/api/device.md +374 -0
  24. package/docs/api/file.md +516 -0
  25. package/docs/api/global.md +617 -0
  26. package/docs/api/hid.md +1032 -0
  27. package/docs/api/hotUpdate.md +166 -0
  28. package/docs/api/http.md +548 -0
  29. package/docs/api/image.md +907 -0
  30. package/docs/api/ime.md +290 -0
  31. package/docs/api/logger.md +324 -0
  32. package/docs/api/media.md +248 -0
  33. package/docs/api/mysql.md +441 -0
  34. package/docs/api/netCard.md +200 -0
  35. package/docs/api/node.md +353 -0
  36. package/docs/api/paddleocr.md +246 -0
  37. package/docs/api/pip.md +242 -0
  38. package/docs/api/system.md +572 -0
  39. package/docs/api/thread.md +269 -0
  40. package/docs/api/tomatoocr.md +425 -0
  41. package/docs/api/tts.md +334 -0
  42. package/docs/api/ui.md +947 -0
  43. package/docs/api/utils.md +265 -0
  44. package/docs/api/yolo.md +310 -0
  45. package/docs/apicn/action.md +919 -0
  46. package/docs/apicn/appleocr.md +233 -0
  47. package/docs/apicn/config.md +120 -0
  48. package/docs/apicn/device.md +385 -0
  49. package/docs/apicn/file.md +511 -0
  50. package/docs/apicn/global.md +613 -0
  51. package/docs/apicn/hid.md +1033 -0
  52. package/docs/apicn/hotUpdate.md +170 -0
  53. package/docs/apicn/http.md +672 -0
  54. package/docs/apicn/image.md +924 -0
  55. package/docs/apicn/ime.md +290 -0
  56. package/docs/apicn/logger.md +332 -0
  57. package/docs/apicn/media.md +252 -0
  58. package/docs/apicn/mysql.md +445 -0
  59. package/docs/apicn/netCard.md +200 -0
  60. package/docs/apicn/node.md +362 -0
  61. package/docs/apicn/paddleocr.md +255 -0
  62. package/docs/apicn/pip.md +242 -0
  63. package/docs/apicn/system.md +575 -0
  64. package/docs/apicn/thread.md +269 -0
  65. package/docs/apicn/tts.md +338 -0
  66. package/docs/apicn/ui.md +933 -0
  67. package/docs/apicn/utils.md +265 -0
  68. package/docs/apicn/yolo.md +314 -0
  69. package/docs/apipython/action.md +901 -0
  70. package/docs/apipython/appleocr.md +226 -0
  71. package/docs/apipython/config.md +126 -0
  72. package/docs/apipython/cryptoUtils.md +246 -0
  73. package/docs/apipython/device.md +365 -0
  74. package/docs/apipython/file.md +476 -0
  75. package/docs/apipython/g.md +154 -0
  76. package/docs/apipython/hid.md +1059 -0
  77. package/docs/apipython/hotUpdate.md +154 -0
  78. package/docs/apipython/image.md +938 -0
  79. package/docs/apipython/ime.md +306 -0
  80. package/docs/apipython/logger.md +330 -0
  81. package/docs/apipython/media.md +221 -0
  82. package/docs/apipython/mysql.md +432 -0
  83. package/docs/apipython/netCard.md +219 -0
  84. package/docs/apipython/node.md +331 -0
  85. package/docs/apipython/overview.md +66 -0
  86. package/docs/apipython/paddleocr.md +211 -0
  87. package/docs/apipython/pip.md +231 -0
  88. package/docs/apipython/system.md +458 -0
  89. package/docs/apipython/tomatoocr.md +444 -0
  90. package/docs/apipython/tts.md +331 -0
  91. package/docs/apipython/ui.md +949 -0
  92. package/docs/apipython/utils.md +284 -0
  93. package/docs/apipython/yolo.md +281 -0
  94. package/package.json +8 -4
@@ -0,0 +1,248 @@
1
+ # 媒体模块 (Media)
2
+
3
+ 媒体模块提供了丰富的媒体操作功能,包括图片和视频的相册管理,以及音频播放控制等功能。
4
+
5
+ ## 功能概览
6
+
7
+ - **相册管理**: 保存图片和视频到相册,清理相册内容
8
+ - **音频播放**: MP3 音频的播放、停止和循环控制
9
+ - **同步/异步**: 支持异步播放和同步等待播放结束
10
+
11
+ ## API 参考
12
+
13
+ ### 相册操作
14
+
15
+ #### saveImageToAlbum - 保存图像到系统相册。
16
+
17
+ ```typescript
18
+ function saveImageToAlbum(imageId: string): boolean;
19
+ ```
20
+
21
+ **参数:**
22
+
23
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
24
+ | --------- | ------ | -------- | ------ | ------------------------------ |
25
+ | `imageId` | string | 是 | | 图像 ID(通过 image 模块获取) |
26
+
27
+ **返回值:**
28
+
29
+ | 类型 | 描述 |
30
+ | --------- | ------------ |
31
+ | `boolean` | 是否保存成功 |
32
+
33
+ **示例:**
34
+
35
+ ```javascript
36
+ // 保存截图到相册
37
+ media.saveImageToAlbum("screen");
38
+
39
+ const documentsDir = file.getInternalDir("documents");
40
+ // 读取图像并保存到相册
41
+ const imageId = image.readImage(`${documentsDir}/screenshot.png`);
42
+ if (imageId) {
43
+ const saved = media.saveImageToAlbum(imageId);
44
+ if (saved) {
45
+ logi("图片已保存到相册");
46
+ } else {
47
+ logi("保存失败");
48
+ }
49
+ }
50
+ ```
51
+
52
+ #### saveVideoToAlbumPath - 保存视频文件到系统相册。
53
+
54
+ ```typescript
55
+ function saveVideoToAlbumPath(path: string): boolean;
56
+ ```
57
+
58
+ **参数:**
59
+
60
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
61
+ | ------ | ------ | -------- | ------ | ------------ |
62
+ | `path` | string | 是 | | 视频文件路径 |
63
+
64
+ **返回值:**
65
+
66
+ | 类型 | 描述 |
67
+ | --------- | ------------ |
68
+ | `boolean` | 是否保存成功 |
69
+
70
+ **示例:**
71
+
72
+ ```javascript
73
+ // 保存视频到相册 (从 documents 目录读取)
74
+ const documentsDir = file.getInternalDir("documents");
75
+ const videoName = "video.mp4";
76
+ const videoPath = `${documentsDir}/${videoName}`;
77
+ const saved = media.saveVideoToAlbumPath(videoPath);
78
+ if (saved) {
79
+ logi("视频已保存到相册");
80
+ } else {
81
+ logi("保存失败");
82
+ }
83
+ ```
84
+
85
+ #### deleteAllPhotos - 清空相册中的所有图片。
86
+
87
+ ```typescript
88
+ function deleteAllPhotos(): boolean;
89
+ ```
90
+
91
+ **返回值:**
92
+
93
+ | 类型 | 描述 |
94
+ | --------- | ------------ |
95
+ | `boolean` | 是否删除成功 |
96
+
97
+ **示例:**
98
+
99
+ ```javascript
100
+ // 清空相册图片
101
+ const deleted = media.deleteAllPhotos();
102
+ if (deleted) {
103
+ logi("相册图片已清空");
104
+ } else {
105
+ logi("清空失败");
106
+ }
107
+ ```
108
+
109
+ #### deleteAllVideos - 清空相册中的所有视频。
110
+
111
+ ```typescript
112
+ function deleteAllVideos(): boolean;
113
+ ```
114
+
115
+ **返回值:**
116
+
117
+ | 类型 | 描述 |
118
+ | --------- | ------------ |
119
+ | `boolean` | 是否删除成功 |
120
+
121
+ **示例:**
122
+
123
+ ```javascript
124
+ // 清空相册视频
125
+ const deleted = media.deleteAllVideos();
126
+ if (deleted) {
127
+ logi("相册视频已清空");
128
+ } else {
129
+ logi("清空失败");
130
+ }
131
+ ```
132
+
133
+ #### deleteAllScreenshots - 清空相册中的所有截图。
134
+
135
+ ```typescript
136
+ function deleteAllScreenshots(): boolean;
137
+ ```
138
+
139
+ **返回值:**
140
+
141
+ | 类型 | 描述 |
142
+ | --------- | ------------ |
143
+ | `boolean` | 是否删除成功 |
144
+
145
+ **示例:**
146
+
147
+ ```javascript
148
+ // 清空相册截图
149
+ const deleted = media.deleteAllScreenshots();
150
+ if (deleted) {
151
+ logi("相册截图已清空");
152
+ } else {
153
+ logi("清空失败");
154
+ }
155
+ ```
156
+
157
+ ### 音频播放
158
+
159
+ #### playMp3 - 异步播放 MP3 音频文件。
160
+
161
+ ```typescript
162
+ function playMp3(path: string, loop: boolean): boolean;
163
+ ```
164
+
165
+ **参数:**
166
+
167
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
168
+ | ------ | ------- | -------- | ------ | ------------ |
169
+ | `path` | string | 是 | | MP3 文件路径 |
170
+ | `loop` | boolean | 是 | | 是否循环播放 |
171
+
172
+ **返回值:**
173
+
174
+ | 类型 | 描述 |
175
+ | --------- | ---------------- |
176
+ | `boolean` | 是否开始播放成功 |
177
+
178
+ **示例:**
179
+
180
+ ```javascript
181
+ // 播放背景音乐(循环)
182
+ const played = media.playMp3("/path/to/background.mp3", true);
183
+ if (played) {
184
+ logi("背景音乐开始播放");
185
+ }
186
+
187
+ // 播放音效(不循环)
188
+ const soundPlayed = media.playMp3("/path/to/sound.mp3", false);
189
+ if (soundPlayed) {
190
+ logi("音效播放中");
191
+ }
192
+ ```
193
+
194
+ #### stopMp3 - 停止当前播放的 MP3 音频。
195
+
196
+ ```typescript
197
+ function stopMp3(): boolean;
198
+ ```
199
+
200
+ **返回值:**
201
+
202
+ | 类型 | 描述 |
203
+ | --------- | ------------ |
204
+ | `boolean` | 是否停止成功 |
205
+
206
+ **示例:**
207
+
208
+ ```javascript
209
+ // 停止音乐播放
210
+ const stopped = media.stopMp3();
211
+ if (stopped) {
212
+ logi("音乐已停止");
213
+ } else {
214
+ logi("停止失败或没有正在播放的音乐");
215
+ }
216
+ ```
217
+
218
+ #### playMp3WaitEnd - 同步播放 MP3 音频文件(等待播放结束)。
219
+
220
+ ```typescript
221
+ function playMp3WaitEnd(path: string, loop: boolean): boolean;
222
+ ```
223
+
224
+ **参数:**
225
+
226
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
227
+ | ------ | ------- | -------- | ------ | -------------------------------------------------------------------- |
228
+ | `path` | string | 是 | | MP3 文件路径 |
229
+ | `loop` | boolean | 是 | | 是否循环播放 注意:循环播放会阻塞线程,慎用,不要在主线程设置为 true |
230
+
231
+ **返回值:**
232
+
233
+ | 类型 | 描述 |
234
+ | --------- | ------------ |
235
+ | `boolean` | 是否播放成功 |
236
+
237
+ **示例:**
238
+
239
+ ```javascript
240
+ // 同步播放音频,等待播放完成
241
+ logi("开始播放音频...");
242
+ const played = media.playMp3WaitEnd("/path/to/notification.mp3", false);
243
+ if (played) {
244
+ logi("音频播放完成");
245
+ } else {
246
+ logi("播放失败");
247
+ }
248
+ ```
@@ -0,0 +1,441 @@
1
+ # MySQL 数据库模块 (MySQL)
2
+
3
+ MySQL 模块提供了完整的 MySQL 数据库连接和操作功能,支持连接管理、查询执行、事务处理等核心数据库操作。
4
+
5
+ ## 功能概览
6
+
7
+ - **连接管理**: 创建、连接、断开数据库连接
8
+ - **数据查询**: 执行 SELECT 查询操作
9
+ - **数据更新**: 执行 CREATE INSERT、UPDATE、DELETE 操作
10
+ - **事务支持**: 完整的事务管理功能
11
+ - **参数绑定**: 支持参数化查询,防止 SQL 注入
12
+
13
+ ## 类型定义
14
+
15
+ ### MySQLConfig
16
+
17
+ 数据库连接配置接口。
18
+
19
+ ```typescript
20
+ interface MySQLConfig {
21
+ host: string; // 数据库主机地址
22
+ port?: number; // 数据库端口,默认 3306
23
+ username: string; // 用户名
24
+ password: string; // 密码
25
+ database: string; // 数据库名
26
+ charset?: string; // 字符集,默认 utf8mb4
27
+ connectTimeout?: number; // 连接超时时间,默认 5000 毫秒
28
+ queryTimeout?: number; // 查询超时时间,默认 30000 毫秒
29
+ }
30
+ ```
31
+
32
+ **数据类型说明:**
33
+
34
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
35
+ | ---------------- | ------ | -------- | ------- | ----------------------------- |
36
+ | `host` | string | 是 | | 数据库主机地址,必填 |
37
+ | `port` | number | 否 | 3306 | 数据库端口,默认 3306 |
38
+ | `username` | string | 是 | | 用户名,必填 |
39
+ | `password` | string | 是 | | 密码,必填 |
40
+ | `database` | string | 是 | | 数据库名,必填 |
41
+ | `charset` | string | 否 | utf8mb4 | 字符集,默认 utf8mb4 |
42
+ | `connectTimeout` | number | 否 | 5000 | 连接超时时间,默认 5000 毫秒 |
43
+ | `queryTimeout` | number | 否 | 30000 | 查询超时时间,默认 30000 毫秒 |
44
+
45
+ ### MySQLResult
46
+
47
+ 查询结果接口。
48
+
49
+ ```typescript
50
+ interface MySQLResult {
51
+ rows: Record<string, any>[]; // 查询结果数据行
52
+ affectedRows: number; // 受影响的行数
53
+ insertId?: number; // 插入ID(仅适用于INSERT操作)
54
+ success: boolean; // 查询是否成功
55
+ error?: string; // 错误信息
56
+ }
57
+ ```
58
+
59
+ **数据类型说明:**
60
+
61
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
62
+ | -------------- | --------------------- | -------- | ------ | ------------------------------- |
63
+ | `rows` | Record<string, any>[] | 否 | | 查询结果数据行 |
64
+ | `affectedRows` | number | 否 | | 受影响的行数 |
65
+ | `insertId` | number | 否 | | 插入 ID(仅适用于 INSERT 操作) |
66
+ | `success` | boolean | 否 | | 查询是否成功 |
67
+ | `error` | string | 否 | | 错误信息 |
68
+
69
+ ## API 参考
70
+
71
+ ### 连接管理
72
+
73
+ #### connect - 连接到数据库
74
+
75
+ ```typescript
76
+ function connect(config: MySQLConfig): boolean;
77
+ ```
78
+
79
+ **参数:**
80
+
81
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
82
+ | -------- | ----------- | -------- | ------ | ------------------ |
83
+ | `config` | MySQLConfig | 是 | | 数据库连接配置对象 |
84
+
85
+ **返回值:**
86
+
87
+ | 类型 | 描述 |
88
+ | --------- | ------------ |
89
+ | `boolean` | 是否连接成功 |
90
+
91
+ **示例:**
92
+
93
+ ```javascript
94
+ const success = mysql.connect({
95
+ host: "localhost",
96
+ port: 3306,
97
+ username: "root",
98
+ password: "password",
99
+ database: "test_db",
100
+ charset: "utf8mb4",
101
+ connectTimeout: 5000,
102
+ queryTimeout: 30000,
103
+ });
104
+
105
+ if (success) {
106
+ logi("数据库连接成功");
107
+ } else {
108
+ loge("数据库连接失败");
109
+ }
110
+ ```
111
+
112
+ #### disconnect - 断开数据库连接
113
+
114
+ ```typescript
115
+ function disconnect(): void;
116
+ ```
117
+
118
+ **示例:**
119
+
120
+ ```javascript
121
+ mysql.disconnect();
122
+ logi("数据库连接已断开");
123
+ ```
124
+
125
+ #### isConnected - 检查连接状态
126
+
127
+ ```typescript
128
+ function isConnected(): boolean;
129
+ ```
130
+
131
+ **返回值:**
132
+
133
+ | 类型 | 描述 |
134
+ | --------- | ---------- |
135
+ | `boolean` | 是否已连接 |
136
+
137
+ **示例:**
138
+
139
+ ```javascript
140
+ if (mysql.isConnected()) {
141
+ logi("数据库已连接");
142
+ } else {
143
+ logw("数据库未连接");
144
+ }
145
+ ```
146
+
147
+ ### 数据操作
148
+
149
+ #### query - 执行查询操作
150
+
151
+ 执行 SELECT 查询操作,用于数据检索。
152
+
153
+ ```typescript
154
+ function query(sql: string, params?: any[]): MySQLResult;
155
+ ```
156
+
157
+ **参数:**
158
+
159
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
160
+ | -------- | ------ | -------- | ------ | ------------------ |
161
+ | `sql` | string | 是 | | SQL 查询语句 |
162
+ | `params` | any[] | 否 | | 查询参数数组,可选 |
163
+
164
+ **返回值:**
165
+
166
+ | 类型 | 描述 |
167
+ | ------------- | ------------ |
168
+ | `MySQLResult` | 查询结果对象 |
169
+
170
+ **示例:**
171
+
172
+ ```javascript
173
+ // 简单查询
174
+ const result1 = mysql.query("SELECT * FROM users");
175
+ if (result1.success) {
176
+ logi(`查询到 ${result1.rows.length} 条用户记录`);
177
+ result1.rows.forEach((user) => {
178
+ logi(`用户: ${user.name}, 邮箱: ${user.email}`);
179
+ });
180
+ }
181
+
182
+ // 带参数查询
183
+ const result2 = mysql.query("SELECT * FROM users WHERE age > ? AND city = ?", [
184
+ 18,
185
+ "北京",
186
+ ]);
187
+ if (result2.success) {
188
+ logi(`找到 ${result2.rows.length} 个符合条件的用户`);
189
+ } else {
190
+ loge(`查询失败: ${result2.error}`);
191
+ }
192
+ ```
193
+
194
+ #### execute - 执行更新操作
195
+
196
+ 执行 CREATE、INSERT、UPDATE、DELETE 等数据修改操作。
197
+
198
+ ```typescript
199
+ function execute(sql: string, params?: any[]): MySQLResult;
200
+ ```
201
+
202
+ **参数:**
203
+
204
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
205
+ | -------- | ------ | -------- | ------ | -------------- |
206
+ | `sql` | string | 是 | | SQL 语句 |
207
+ | `params` | any[] | 否 | | 参数数组,可选 |
208
+
209
+ **返回值:**
210
+
211
+ | 类型 | 描述 |
212
+ | ------------- | ------------ |
213
+ | `MySQLResult` | 执行结果对象 |
214
+
215
+ **示例:**
216
+
217
+ ```javascript
218
+ // 创建表
219
+ const createTableResult = mysql.execute(`
220
+ CREATE TABLE IF NOT EXISTS users (
221
+ id INT AUTO_INCREMENT PRIMARY KEY,
222
+ name VARCHAR(255),
223
+ email VARCHAR(255),
224
+ age INT
225
+ )
226
+ `);
227
+ if (createTableResult.success) {
228
+ logi("用户表创建成功");
229
+ } else {
230
+ loge(`用户表创建失败: ${createTableResult.error}`);
231
+ }
232
+
233
+ // 插入数据
234
+ const insertResult = mysql.execute(
235
+ "INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
236
+ ["张三", "zhangsan@example.com", 25],
237
+ );
238
+ if (insertResult.success) {
239
+ logi(`用户插入成功,ID: ${insertResult.insertId}`);
240
+ logi(`影响行数: ${insertResult.affectedRows}`);
241
+ }
242
+
243
+ // 更新数据
244
+ const updateResult = mysql.execute("UPDATE users SET age = ? WHERE name = ?", [
245
+ 26,
246
+ "张三",
247
+ ]);
248
+ if (updateResult.success) {
249
+ logi(`更新了 ${updateResult.affectedRows} 条记录`);
250
+ }
251
+
252
+ // 删除数据
253
+ const deleteResult = mysql.execute("DELETE FROM users WHERE age < ?", [18]);
254
+ if (deleteResult.success) {
255
+ logi(`删除了 ${deleteResult.affectedRows} 条记录`);
256
+ } else {
257
+ loge(`删除失败: ${deleteResult.error}`);
258
+ }
259
+ ```
260
+
261
+ ### 事务管理
262
+
263
+ #### beginTransaction - 开始事务
264
+
265
+ ```typescript
266
+ function beginTransaction(): boolean;
267
+ ```
268
+
269
+ **返回值:**
270
+
271
+ | 类型 | 描述 |
272
+ | --------- | ---------------- |
273
+ | `boolean` | 是否成功开始事务 |
274
+
275
+ **示例:**
276
+
277
+ ```javascript
278
+ if (mysql.beginTransaction()) {
279
+ logi("事务开始");
280
+ } else {
281
+ loge("事务开始失败");
282
+ }
283
+ ```
284
+
285
+ #### commit - 提交事务
286
+
287
+ ```typescript
288
+ function commit(): boolean;
289
+ ```
290
+
291
+ **返回值:**
292
+
293
+ | 类型 | 描述 |
294
+ | --------- | ---------------- |
295
+ | `boolean` | 是否成功提交事务 |
296
+
297
+ **示例:**
298
+
299
+ ```javascript
300
+ if (mysql.commit()) {
301
+ logi("事务提交成功");
302
+ } else {
303
+ loge("事务提交失败");
304
+ }
305
+ ```
306
+
307
+ #### rollback - 回滚事务
308
+
309
+ ```typescript
310
+ function rollback(): boolean;
311
+ ```
312
+
313
+ **返回值:**
314
+
315
+ | 类型 | 描述 |
316
+ | --------- | ---------------- |
317
+ | `boolean` | 是否成功回滚事务 |
318
+
319
+ **示例:**
320
+
321
+ ```javascript
322
+ if (mysql.rollback()) {
323
+ logi("事务回滚成功");
324
+ } else {
325
+ loge("事务回滚失败");
326
+ }
327
+ ```
328
+
329
+ ## 完整使用示例
330
+
331
+ ### 基本数据库操作
332
+
333
+ ```javascript
334
+ // 1. 创建连接配置
335
+ const dbConfig = {
336
+ host: "localhost",
337
+ port: 3306,
338
+ username: "root",
339
+ password: "password",
340
+ database: "my_app",
341
+ charset: "utf8mb4",
342
+ };
343
+
344
+ // 2. 连接数据库
345
+ if (mysql.connect(dbConfig)) {
346
+ logi("数据库连接成功");
347
+
348
+ // 3. 查询数据
349
+ const users = mysql.query("SELECT * FROM users WHERE status = ?", ["active"]);
350
+ if (users.success) {
351
+ logi(`找到 ${users.rows.length} 个活跃用户`);
352
+ }
353
+
354
+ // 4. 插入新用户
355
+ const newUser = mysql.execute(
356
+ "INSERT INTO users (name, email, status) VALUES (?, ?, ?)",
357
+ ["新用户", "newuser@example.com", "active"],
358
+ );
359
+ if (newUser.success) {
360
+ logi(`新用户创建成功,ID: ${newUser.insertId}`);
361
+ }
362
+
363
+ // 5. 断开连接
364
+ mysql.disconnect();
365
+ } else {
366
+ loge("数据库连接失败");
367
+ }
368
+ ```
369
+
370
+ ### 事务处理示例
371
+
372
+ ```javascript
373
+ // 转账操作示例
374
+ function transferMoney(fromUserId, toUserId, amount) {
375
+ if (!mysql.beginTransaction()) {
376
+ loge("事务开始失败");
377
+ return false;
378
+ }
379
+
380
+ try {
381
+ // 扣除转出账户余额
382
+ const debitResult = mysql.execute(
383
+ "UPDATE accounts SET balance = balance - ? WHERE user_id = ? AND balance >= ?",
384
+ [amount, fromUserId, amount],
385
+ );
386
+
387
+ if (!debitResult.success || debitResult.affectedRows === 0) {
388
+ throw new Error("余额不足或扣款失败");
389
+ }
390
+
391
+ // 增加转入账户余额
392
+ const creditResult = mysql.execute(
393
+ "UPDATE accounts SET balance = balance + ? WHERE user_id = ?",
394
+ [amount, toUserId],
395
+ );
396
+
397
+ if (!creditResult.success || creditResult.affectedRows === 0) {
398
+ throw new Error("转入账户不存在或转账失败");
399
+ }
400
+
401
+ // 记录转账日志
402
+ const logResult = mysql.execute(
403
+ "INSERT INTO transfer_logs (from_user, to_user, amount, created_at) VALUES (?, ?, ?, NOW())",
404
+ [fromUserId, toUserId, amount],
405
+ );
406
+
407
+ if (!logResult.success) {
408
+ throw new Error("转账日志记录失败");
409
+ }
410
+
411
+ // 提交事务
412
+ if (mysql.commit()) {
413
+ logi(`转账成功: ${fromUserId} -> ${toUserId}, 金额: ${amount}`);
414
+ return true;
415
+ } else {
416
+ throw new Error("事务提交失败");
417
+ }
418
+ } catch (error) {
419
+ // 回滚事务
420
+ mysql.rollback();
421
+ loge(`转账失败: ${error.message}`);
422
+ return false;
423
+ }
424
+ }
425
+
426
+ // 使用示例
427
+ if (mysql.isConnected()) {
428
+ const success = transferMoney(1, 2, 100.0);
429
+ if (success) {
430
+ logi("转账操作完成");
431
+ }
432
+ }
433
+ ```
434
+
435
+ ## 注意事项
436
+
437
+ 1. **连接管理**: 使用全局单例连接,确保在应用生命周期内正确管理连接状态
438
+ 2. **参数绑定**: 始终使用参数化查询来防止 SQL 注入攻击
439
+ 3. **事务处理**: 在事务中发生错误时,确保调用 `rollback()` 来回滚事务
440
+ 4. **错误处理**: 检查每个操作的 `success` 字段,并适当处理错误信息
441
+ 5. **资源清理**: 在应用结束时调用 `disconnect()` 来释放数据库连接资源