wok-server 0.5.0 → 0.6.0

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 (372) hide show
  1. package/README.en.md +61 -0
  2. package/README.md +44 -29
  3. package/dist/cache/cache.js +98 -98
  4. package/dist/cache/config.js +19 -19
  5. package/dist/cache/index.js +27 -27
  6. package/dist/cache/purge-task.js +46 -46
  7. package/dist/cache/stat.js +47 -47
  8. package/dist/config/convert.js +36 -36
  9. package/dist/config/exception.js +14 -14
  10. package/dist/config/index.js +81 -81
  11. package/dist/http-client/index.js +136 -136
  12. package/dist/i18n/ar.js +17 -17
  13. package/dist/i18n/de.js +17 -17
  14. package/dist/i18n/en-us.js +17 -17
  15. package/dist/i18n/es.js +17 -17
  16. package/dist/i18n/fr.js +17 -17
  17. package/dist/i18n/i18n.js +231 -231
  18. package/dist/i18n/index.js +52 -52
  19. package/dist/i18n/ja.js +17 -17
  20. package/dist/i18n/ko.js +17 -17
  21. package/dist/i18n/msg.js +2 -2
  22. package/dist/i18n/pt.js +17 -17
  23. package/dist/i18n/ru.js +17 -17
  24. package/dist/i18n/tag.js +18 -18
  25. package/dist/i18n/zh-HK.js +17 -17
  26. package/dist/i18n/zh-TW.js +17 -17
  27. package/dist/i18n/zh-cn.js +17 -17
  28. package/dist/index.js +14 -14
  29. package/dist/lock/index.js +114 -114
  30. package/dist/log/config.js +35 -35
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -198
  33. package/dist/log/index.js +135 -135
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -56
  36. package/dist/log/store.js +19 -19
  37. package/dist/mongodb/collection.js +2 -2
  38. package/dist/mongodb/config.js +34 -34
  39. package/dist/mongodb/doc.js +2 -2
  40. package/dist/mongodb/exception.js +14 -14
  41. package/dist/mongodb/index.js +58 -58
  42. package/dist/mongodb/manager/base.js +563 -563
  43. package/dist/mongodb/manager/index.js +63 -63
  44. package/dist/mongodb/manager/tx-strict.js +84 -84
  45. package/dist/mongodb/manager/tx.js +30 -30
  46. package/dist/mongodb/migration.js +52 -52
  47. package/dist/mvc/access-log.js +33 -33
  48. package/dist/mvc/config.js +27 -27
  49. package/dist/mvc/exchange.js +113 -113
  50. package/dist/mvc/handler/index.js +7 -6
  51. package/dist/mvc/handler/json.js +65 -65
  52. package/dist/mvc/handler/restful.js +35 -35
  53. package/dist/mvc/handler/sse.js +65 -0
  54. package/dist/mvc/handler/upload.js +31 -31
  55. package/dist/mvc/index.js +50 -50
  56. package/dist/mvc/interceptor.js +2 -2
  57. package/dist/mvc/query.js +43 -43
  58. package/dist/mvc/render/file.js +132 -132
  59. package/dist/mvc/render/html/html.js +90 -90
  60. package/dist/mvc/render/html/index.js +18 -18
  61. package/dist/mvc/render/html/style.js +2 -2
  62. package/dist/mvc/render/index.js +7 -7
  63. package/dist/mvc/render/json.js +26 -26
  64. package/dist/mvc/render/text.js +16 -16
  65. package/dist/mvc/router.js +2 -2
  66. package/dist/mvc/server.js +272 -272
  67. package/dist/mvc/static/header.js +67 -67
  68. package/dist/mvc/static/index.js +6 -6
  69. package/dist/mvc/static/mime-type.js +84 -84
  70. package/dist/mvc/static/server-cache-config.js +66 -66
  71. package/dist/mvc/static/server-cache.js +133 -133
  72. package/dist/mvc/static/static-handler.js +372 -372
  73. package/dist/mysql/config.js +51 -51
  74. package/dist/mysql/exception.js +14 -14
  75. package/dist/mysql/index.js +87 -87
  76. package/dist/mysql/manager/base.js +239 -239
  77. package/dist/mysql/manager/index.js +107 -107
  78. package/dist/mysql/manager/ops/count.js +20 -20
  79. package/dist/mysql/manager/ops/criteria.js +356 -356
  80. package/dist/mysql/manager/ops/delete.js +65 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +169 -169
  83. package/dist/mysql/manager/ops/index.js +14 -14
  84. package/dist/mysql/manager/ops/insert.js +106 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/paginate.js +23 -23
  87. package/dist/mysql/manager/ops/query.js +9 -9
  88. package/dist/mysql/manager/ops/update.js +216 -216
  89. package/dist/mysql/manager/ops/utils.js +24 -24
  90. package/dist/mysql/manager/tx-strict.js +103 -103
  91. package/dist/mysql/manager/tx.js +30 -30
  92. package/dist/mysql/manager/utils.js +56 -56
  93. package/dist/mysql/migration.js +136 -136
  94. package/dist/mysql/table-info.js +8 -8
  95. package/dist/task/daily.js +59 -59
  96. package/dist/task/fixed-delay.js +38 -38
  97. package/dist/task/fixed-rate.js +42 -42
  98. package/dist/task/index.js +9 -9
  99. package/dist/task/task.js +56 -56
  100. package/dist/validation/exception.js +36 -36
  101. package/dist/validation/index.js +40 -40
  102. package/dist/validation/validator/array.js +34 -34
  103. package/dist/validation/validator/enum.js +28 -28
  104. package/dist/validation/validator/index.js +14 -14
  105. package/dist/validation/validator/length.js +40 -40
  106. package/dist/validation/validator/max-length.js +35 -35
  107. package/dist/validation/validator/max.js +29 -29
  108. package/dist/validation/validator/min-length.js +33 -33
  109. package/dist/validation/validator/min.js +29 -29
  110. package/dist/validation/validator/not-blank.js +33 -33
  111. package/dist/validation/validator/not-null.js +21 -21
  112. package/dist/validation/validator/plain-obj.js +32 -32
  113. package/dist/validation/validator/regexp.js +34 -34
  114. package/documentation/en/cache.md +56 -0
  115. package/documentation/en/config.md +96 -0
  116. package/documentation/en/engineering.md +256 -0
  117. package/documentation/en/http-client.md +32 -0
  118. package/documentation/en/i18n.md +143 -0
  119. package/documentation/en/index.md +24 -0
  120. package/documentation/en/lock.md +51 -0
  121. package/documentation/en/log.md +109 -0
  122. package/documentation/en/mongodb.md +256 -0
  123. package/documentation/en/mvc.md +688 -0
  124. package/documentation/en/mysql.md +552 -0
  125. package/documentation/en/task.md +45 -0
  126. package/documentation/en/test.md +56 -0
  127. package/documentation/en/validate.md +130 -0
  128. package/documentation/zh-cn/mvc.md +66 -24
  129. package/package.json +3 -1
  130. package/skills/wok-server-api-rules/SKILL.md +350 -0
  131. package/skills/wok-server-cache/SKILL.md +216 -0
  132. package/skills/wok-server-config/SKILL.md +200 -0
  133. package/skills/wok-server-getting-started/SKILL.md +123 -0
  134. package/skills/wok-server-getting-started/references/engineering.md +169 -0
  135. package/skills/wok-server-http-client/SKILL.md +164 -0
  136. package/skills/wok-server-i18n/SKILL.md +214 -0
  137. package/skills/wok-server-lock/SKILL.md +144 -0
  138. package/skills/wok-server-log/SKILL.md +218 -0
  139. package/skills/wok-server-mongodb/SKILL.md +235 -0
  140. package/skills/wok-server-mvc/SKILL.md +251 -0
  141. package/skills/wok-server-mvc/references/respond-html.md +157 -0
  142. package/skills/wok-server-mvc/references/sse.md +121 -0
  143. package/skills/wok-server-mvc/references/static-files.md +47 -0
  144. package/skills/wok-server-mvc/references/upload.md +62 -0
  145. package/skills/wok-server-mvc/references/websocket.md +30 -0
  146. package/skills/wok-server-mysql/SKILL.md +315 -0
  147. package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
  148. package/skills/wok-server-mysql/references/version-control.md +22 -0
  149. package/skills/wok-server-task/SKILL.md +158 -0
  150. package/skills/wok-server-validate/SKILL.md +167 -0
  151. package/src/cache/cache.ts +118 -0
  152. package/src/cache/config.ts +53 -0
  153. package/src/cache/index.ts +27 -0
  154. package/src/cache/purge-task.ts +53 -0
  155. package/src/cache/stat.ts +47 -0
  156. package/src/config/convert.ts +27 -0
  157. package/src/config/exception.ts +8 -0
  158. package/src/config/index.ts +92 -0
  159. package/src/http-client/index.ts +202 -0
  160. package/src/i18n/ar.ts +16 -0
  161. package/src/i18n/de.ts +16 -0
  162. package/src/i18n/en-us.ts +16 -0
  163. package/src/i18n/es.ts +16 -0
  164. package/src/i18n/fr.ts +16 -0
  165. package/src/i18n/i18n.ts +230 -0
  166. package/src/i18n/index.ts +50 -0
  167. package/src/i18n/ja.ts +16 -0
  168. package/src/i18n/ko.ts +16 -0
  169. package/src/i18n/msg.ts +50 -0
  170. package/src/i18n/pt.ts +16 -0
  171. package/src/i18n/ru.ts +16 -0
  172. package/src/i18n/tag.ts +18 -0
  173. package/src/i18n/zh-HK.ts +16 -0
  174. package/src/i18n/zh-TW.ts +16 -0
  175. package/src/i18n/zh-cn.ts +16 -0
  176. package/src/index.ts +11 -0
  177. package/src/lock/index.ts +164 -0
  178. package/src/log/config.ts +71 -0
  179. package/src/log/date.ts +19 -0
  180. package/src/log/file.ts +215 -0
  181. package/src/log/index.ts +136 -0
  182. package/src/log/level.ts +29 -0
  183. package/src/log/log.ts +77 -0
  184. package/src/log/store.ts +31 -0
  185. package/src/mongodb/collection.ts +25 -0
  186. package/src/mongodb/config.ts +69 -0
  187. package/src/mongodb/doc.ts +12 -0
  188. package/src/mongodb/exception.ts +8 -0
  189. package/src/mongodb/index.ts +71 -0
  190. package/src/mongodb/manager/base.ts +674 -0
  191. package/src/mongodb/manager/index.ts +80 -0
  192. package/src/mongodb/manager/tx-strict.ts +153 -0
  193. package/src/mongodb/manager/tx.ts +34 -0
  194. package/src/mongodb/migration.ts +66 -0
  195. package/src/mvc/access-log.ts +33 -0
  196. package/src/mvc/config.ts +70 -0
  197. package/src/mvc/exchange.ts +126 -0
  198. package/src/mvc/handler/index.ts +4 -0
  199. package/src/mvc/handler/json.ts +96 -0
  200. package/src/mvc/handler/restful.ts +39 -0
  201. package/src/mvc/handler/sse.ts +90 -0
  202. package/src/mvc/handler/upload.ts +54 -0
  203. package/src/mvc/index.ts +48 -0
  204. package/src/mvc/interceptor.ts +12 -0
  205. package/src/mvc/query.ts +36 -0
  206. package/src/mvc/render/file.ts +148 -0
  207. package/src/mvc/render/html/html.ts +187 -0
  208. package/src/mvc/render/html/index.ts +16 -0
  209. package/src/mvc/render/html/style.ts +1201 -0
  210. package/src/mvc/render/index.ts +4 -0
  211. package/src/mvc/render/json.ts +24 -0
  212. package/src/mvc/render/text.ts +14 -0
  213. package/src/mvc/router.ts +13 -0
  214. package/src/mvc/server.ts +315 -0
  215. package/src/mvc/static/header.ts +86 -0
  216. package/src/mvc/static/index.ts +3 -0
  217. package/src/mvc/static/mime-type.ts +81 -0
  218. package/src/mvc/static/server-cache-config.ts +92 -0
  219. package/src/mvc/static/server-cache.ts +171 -0
  220. package/src/mvc/static/static-handler.ts +445 -0
  221. package/src/mysql/config.ts +130 -0
  222. package/src/mysql/exception.ts +8 -0
  223. package/src/mysql/index.ts +88 -0
  224. package/src/mysql/manager/base.ts +285 -0
  225. package/src/mysql/manager/index.ts +112 -0
  226. package/src/mysql/manager/ops/count.ts +30 -0
  227. package/src/mysql/manager/ops/criteria.ts +412 -0
  228. package/src/mysql/manager/ops/delete.ts +96 -0
  229. package/src/mysql/manager/ops/exist.ts +41 -0
  230. package/src/mysql/manager/ops/find.ts +226 -0
  231. package/src/mysql/manager/ops/index.ts +11 -0
  232. package/src/mysql/manager/ops/insert.ts +120 -0
  233. package/src/mysql/manager/ops/modify.ts +14 -0
  234. package/src/mysql/manager/ops/paginate.ts +60 -0
  235. package/src/mysql/manager/ops/query.ts +13 -0
  236. package/src/mysql/manager/ops/update.ts +294 -0
  237. package/src/mysql/manager/ops/utils.ts +20 -0
  238. package/src/mysql/manager/tx-strict.ts +138 -0
  239. package/src/mysql/manager/tx.ts +31 -0
  240. package/src/mysql/manager/utils.ts +75 -0
  241. package/src/mysql/migration.ts +149 -0
  242. package/src/mysql/table-info.ts +41 -0
  243. package/src/task/daily.ts +70 -0
  244. package/src/task/fixed-delay.ts +45 -0
  245. package/src/task/fixed-rate.ts +49 -0
  246. package/src/task/index.ts +4 -0
  247. package/src/task/task.ts +70 -0
  248. package/src/validation/exception.ts +27 -0
  249. package/src/validation/index.ts +61 -0
  250. package/src/validation/validator/array.ts +32 -0
  251. package/src/validation/validator/enum.ts +25 -0
  252. package/src/validation/validator/index.ts +11 -0
  253. package/src/validation/validator/length.ts +42 -0
  254. package/src/validation/validator/max-length.ts +33 -0
  255. package/src/validation/validator/max.ts +26 -0
  256. package/src/validation/validator/min-length.ts +31 -0
  257. package/src/validation/validator/min.ts +26 -0
  258. package/src/validation/validator/not-blank.ts +31 -0
  259. package/src/validation/validator/not-null.ts +19 -0
  260. package/src/validation/validator/plain-obj.ts +30 -0
  261. package/src/validation/validator/regexp.ts +32 -0
  262. package/types/cache/cache.d.ts +52 -52
  263. package/types/cache/config.d.ts +32 -32
  264. package/types/cache/index.d.ts +2 -2
  265. package/types/cache/purge-task.d.ts +11 -11
  266. package/types/cache/stat.d.ts +26 -26
  267. package/types/config/convert.d.ts +6 -6
  268. package/types/config/exception.d.ts +7 -7
  269. package/types/config/index.d.ts +25 -25
  270. package/types/http-client/index.d.ts +71 -71
  271. package/types/i18n/ar.d.ts +2 -2
  272. package/types/i18n/de.d.ts +2 -2
  273. package/types/i18n/en-us.d.ts +2 -2
  274. package/types/i18n/es.d.ts +2 -2
  275. package/types/i18n/fr.d.ts +2 -2
  276. package/types/i18n/i18n.d.ts +102 -102
  277. package/types/i18n/index.d.ts +9 -9
  278. package/types/i18n/ja.d.ts +2 -2
  279. package/types/i18n/ko.d.ts +2 -2
  280. package/types/i18n/msg.d.ts +50 -50
  281. package/types/i18n/pt.d.ts +2 -2
  282. package/types/i18n/ru.d.ts +2 -2
  283. package/types/i18n/tag.d.ts +11 -11
  284. package/types/i18n/zh-HK.d.ts +2 -2
  285. package/types/i18n/zh-TW.d.ts +2 -2
  286. package/types/i18n/zh-cn.d.ts +2 -2
  287. package/types/index.d.ts +11 -11
  288. package/types/lock/index.d.ts +64 -64
  289. package/types/log/config.d.ts +35 -35
  290. package/types/log/date.d.ts +2 -2
  291. package/types/log/file.d.ts +13 -13
  292. package/types/log/index.d.ts +53 -53
  293. package/types/log/level.d.ts +14 -14
  294. package/types/log/log.d.ts +40 -40
  295. package/types/log/store.d.ts +19 -19
  296. package/types/mongodb/collection.d.ts +25 -25
  297. package/types/mongodb/config.d.ts +45 -45
  298. package/types/mongodb/doc.d.ts +11 -11
  299. package/types/mongodb/exception.d.ts +7 -7
  300. package/types/mongodb/index.d.ts +29 -29
  301. package/types/mongodb/manager/base.d.ts +188 -188
  302. package/types/mongodb/manager/index.d.ts +38 -38
  303. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  304. package/types/mongodb/manager/tx.d.ts +21 -21
  305. package/types/mongodb/migration.d.ts +12 -12
  306. package/types/mvc/access-log.d.ts +7 -7
  307. package/types/mvc/config.d.ts +42 -42
  308. package/types/mvc/exchange.d.ts +72 -72
  309. package/types/mvc/handler/index.d.ts +4 -3
  310. package/types/mvc/handler/json.d.ts +44 -44
  311. package/types/mvc/handler/restful.d.ts +11 -11
  312. package/types/mvc/handler/sse.d.ts +34 -0
  313. package/types/mvc/handler/upload.d.ts +36 -36
  314. package/types/mvc/index.d.ts +22 -22
  315. package/types/mvc/interceptor.d.ts +11 -11
  316. package/types/mvc/query.d.ts +13 -13
  317. package/types/mvc/render/file.d.ts +10 -10
  318. package/types/mvc/render/html/html.d.ts +98 -98
  319. package/types/mvc/render/html/index.d.ts +11 -11
  320. package/types/mvc/render/html/style.d.ts +1201 -1201
  321. package/types/mvc/render/index.d.ts +4 -4
  322. package/types/mvc/render/json.d.ts +17 -17
  323. package/types/mvc/render/text.d.ts +10 -10
  324. package/types/mvc/router.d.ts +11 -11
  325. package/types/mvc/server.d.ts +90 -90
  326. package/types/mvc/static/header.d.ts +27 -27
  327. package/types/mvc/static/index.d.ts +3 -3
  328. package/types/mvc/static/mime-type.d.ts +2 -2
  329. package/types/mvc/static/server-cache-config.d.ts +30 -30
  330. package/types/mvc/static/server-cache.d.ts +76 -76
  331. package/types/mvc/static/static-handler.d.ts +77 -77
  332. package/types/mysql/config.d.ts +90 -90
  333. package/types/mysql/exception.d.ts +7 -7
  334. package/types/mysql/index.d.ts +16 -16
  335. package/types/mysql/manager/base.d.ts +165 -165
  336. package/types/mysql/manager/index.d.ts +36 -36
  337. package/types/mysql/manager/ops/count.d.ts +13 -13
  338. package/types/mysql/manager/ops/criteria.d.ts +134 -134
  339. package/types/mysql/manager/ops/delete.d.ts +46 -46
  340. package/types/mysql/manager/ops/exist.d.ts +6 -6
  341. package/types/mysql/manager/ops/find.d.ts +86 -86
  342. package/types/mysql/manager/ops/index.d.ts +10 -10
  343. package/types/mysql/manager/ops/insert.d.ts +18 -18
  344. package/types/mysql/manager/ops/modify.d.ts +3 -3
  345. package/types/mysql/manager/ops/paginate.d.ts +36 -36
  346. package/types/mysql/manager/ops/query.d.ts +3 -3
  347. package/types/mysql/manager/ops/update.d.ts +76 -76
  348. package/types/mysql/manager/ops/utils.d.ts +5 -5
  349. package/types/mysql/manager/tx-strict.d.ts +36 -36
  350. package/types/mysql/manager/tx.d.ts +15 -15
  351. package/types/mysql/manager/utils.d.ts +17 -17
  352. package/types/mysql/migration.d.ts +8 -8
  353. package/types/mysql/table-info.d.ts +36 -36
  354. package/types/task/daily.d.ts +16 -16
  355. package/types/task/fixed-delay.d.ts +9 -9
  356. package/types/task/fixed-rate.d.ts +9 -9
  357. package/types/task/index.d.ts +4 -4
  358. package/types/task/task.d.ts +34 -34
  359. package/types/validation/exception.d.ts +38 -38
  360. package/types/validation/index.d.ts +32 -32
  361. package/types/validation/validator/array.d.ts +5 -5
  362. package/types/validation/validator/enum.d.ts +8 -8
  363. package/types/validation/validator/index.d.ts +11 -11
  364. package/types/validation/validator/length.d.ts +10 -10
  365. package/types/validation/validator/max-length.d.ts +8 -8
  366. package/types/validation/validator/max.d.ts +7 -7
  367. package/types/validation/validator/min-length.d.ts +6 -6
  368. package/types/validation/validator/min.d.ts +7 -7
  369. package/types/validation/validator/not-blank.d.ts +7 -7
  370. package/types/validation/validator/not-null.d.ts +6 -6
  371. package/types/validation/validator/plain-obj.d.ts +7 -7
  372. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,226 @@
1
+ import { PoolConnection, RowDataPacket } from 'mysql2'
2
+ import { Table } from '../../table-info'
3
+ import { MixCriteria, buildQuery } from './criteria'
4
+ import { promiseQuery } from '../utils'
5
+ import { MysqlConfig } from '../../config'
6
+
7
+ /**
8
+ * 按 id 查询
9
+ * @param connection
10
+ * @param mapping
11
+ * @param type
12
+ * @param id
13
+ */
14
+ export async function findById<T>(
15
+ config: MysqlConfig,
16
+ connection: PoolConnection,
17
+ table: Table<T>,
18
+ id: string | number
19
+ ): Promise<T | null> {
20
+ const res = await promiseQuery(config, connection, `select * from ?? where ?? = ?`, [
21
+ table.tableName,
22
+ table.id,
23
+ id
24
+ ])
25
+ const rows = res as RowDataPacket[]
26
+ if (!rows.length) {
27
+ return null
28
+ }
29
+ return rows[0] as T
30
+ }
31
+
32
+ /**
33
+ * 查询表中所有数据。需谨慎操作,全表查询有可能会产生大列表问题。
34
+ * @param connection
35
+ * @param mapping
36
+ * @param type
37
+ * @returns
38
+ */
39
+ export async function findAll<T>(
40
+ config: MysqlConfig,
41
+ connection: PoolConnection,
42
+ table: Table<T>
43
+ ): Promise<T[]> {
44
+ const res = await promiseQuery(config, connection, `select * from ??`, [table.tableName])
45
+ return res as RowDataPacket[] as T[]
46
+ }
47
+
48
+ export interface FindOpts<T> {
49
+ /**
50
+ * 表
51
+ */
52
+ table: Table<T>
53
+ /**
54
+ * 查询条件
55
+ * @param criteria
56
+ * @returns
57
+ */
58
+ criteria?: MixCriteria<T>
59
+ /**
60
+ * 偏移,需要 limit 有值才可以
61
+ */
62
+ offset?: number
63
+ /**
64
+ * 限制返回的数量
65
+ */
66
+ limit?: number
67
+ /**
68
+ * 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
69
+ */
70
+ orderBy?: Array<[keyof T, 'asc' | 'desc']>
71
+ }
72
+ /**
73
+ * 条件查询
74
+ * @param opts
75
+ * @returns
76
+ */
77
+ export async function find<T>(
78
+ config: MysqlConfig,
79
+ conn: PoolConnection,
80
+ opts: FindOpts<T>
81
+ ): Promise<T[]> {
82
+ let query = opts.criteria ? buildQuery(opts.criteria) : undefined
83
+ const values: any[] = []
84
+ let sql = `select * from ?? `
85
+ values.push(opts.table.tableName)
86
+ if (query) {
87
+ sql += ` where ${query.sql} `
88
+ values.push(...query.values)
89
+ }
90
+ // 排序
91
+ if (opts.orderBy && opts.orderBy.length) {
92
+ opts.orderBy.forEach((orderBy, idx) => {
93
+ const [field, sort] = orderBy
94
+ if (idx == 0) {
95
+ sql += ` order by ?? ${sort} `
96
+ } else {
97
+ sql += ` , ?? ${sort} `
98
+ }
99
+ values.push(field)
100
+ })
101
+ }
102
+ // 数量限制
103
+ if (opts.limit) {
104
+ sql += ` limit ${opts.limit} `
105
+ if (opts.offset) {
106
+ sql += ` offset ${opts.offset}`
107
+ }
108
+ }
109
+ const res = await promiseQuery(config, conn, sql, values)
110
+ return res as RowDataPacket[] as T[]
111
+ }
112
+
113
+ /**
114
+ * 指定字段条件查询选项
115
+ */
116
+ export interface FindSelectOpts<T, K extends keyof T> extends FindOpts<T> {
117
+ /**
118
+ * 要查询的字段
119
+ */
120
+ select: K[]
121
+ }
122
+
123
+ /**
124
+ * 查询指定的字段,返回值类型与选择的字段有关
125
+ * @param onfig
126
+ * @param conn
127
+ * @param opts
128
+ */
129
+ export async function findSelect<T, K extends keyof T>(
130
+ config: MysqlConfig,
131
+ conn: PoolConnection,
132
+ opts: FindSelectOpts<T, K>
133
+ ): Promise<Array<Pick<T, K>>> {
134
+ let query = opts.criteria ? buildQuery(opts.criteria) : undefined
135
+ const values: any[] = []
136
+ let sql = `select ${opts.select.map(() => '??').join(',')} from ?? `
137
+ values.push(...opts.select, opts.table.tableName)
138
+ if (query) {
139
+ sql += ` where ${query.sql} `
140
+ values.push(...query.values)
141
+ }
142
+ // 排序
143
+ if (opts.orderBy && opts.orderBy.length) {
144
+ opts.orderBy.forEach((orderBy, idx) => {
145
+ const [field, sort] = orderBy
146
+ if (idx == 0) {
147
+ sql += ` order by ?? ${sort} `
148
+ } else {
149
+ sql += ` , ?? ${sort} `
150
+ }
151
+ values.push(field)
152
+ })
153
+ }
154
+ // 数量限制
155
+ if (opts.limit) {
156
+ sql += ` limit ${opts.limit} `
157
+ if (opts.offset) {
158
+ sql += ` offset ${opts.offset}`
159
+ }
160
+ }
161
+ const res = await promiseQuery(config, conn, sql, values)
162
+ return res as RowDataPacket[] as Pick<T, K>[]
163
+ }
164
+ /**
165
+ * 根据 id 列表查询记录
166
+ * @param connection
167
+ * @param table
168
+ * @param ids
169
+ * @returns
170
+ */
171
+ export async function findByIdIn<T>(
172
+ config: MysqlConfig,
173
+ connection: PoolConnection,
174
+ table: Table<T>,
175
+ ids: Array<string | number>
176
+ ): Promise<T[]> {
177
+ if (!ids.length) {
178
+ return []
179
+ }
180
+ return find(config, connection, {
181
+ table,
182
+ criteria: c => c.in(table.id, ids)
183
+ })
184
+ }
185
+
186
+ /**
187
+ * 查找符合条件的第一条记录
188
+ * @param conn
189
+ * @param table
190
+ * @param criteria
191
+ * @returns
192
+ */
193
+ export async function findFirst<T>(
194
+ config: MysqlConfig,
195
+ conn: PoolConnection,
196
+ table: Table<T>,
197
+ criteria?: MixCriteria<T>,
198
+ /**
199
+ * 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
200
+ */
201
+ orderBy?: Array<[keyof T, 'asc' | 'desc']>
202
+ ): Promise<T | null> {
203
+ let query = criteria ? buildQuery(criteria) : undefined
204
+ let sql = `select * from ?? `
205
+ const values: any[] = [table.tableName]
206
+ if (query) {
207
+ sql += ` where ${query.sql} `
208
+ values.push(...query.values)
209
+ }
210
+ // 排序
211
+ if (orderBy && orderBy.length) {
212
+ orderBy.forEach((orderBy, idx) => {
213
+ const [field, sort] = orderBy
214
+ if (idx == 0) {
215
+ sql += ` order by ?? ${sort} `
216
+ } else {
217
+ sql += ` , ?? ${sort} `
218
+ }
219
+ values.push(field)
220
+ })
221
+ }
222
+ sql += ' limit 1'
223
+ const res = await promiseQuery(config, conn, sql, values)
224
+ const list = res as RowDataPacket[] as T[]
225
+ return list.length ? list[0] : null
226
+ }
@@ -0,0 +1,11 @@
1
+ // 各类操作封装
2
+ export * from './count'
3
+ export * from './criteria'
4
+ export * from './delete'
5
+ export * from './exist'
6
+ export * from './find'
7
+ export * from './insert'
8
+ export * from './modify'
9
+ export * from './paginate'
10
+ export * from './query'
11
+ export * from './update'
@@ -0,0 +1,120 @@
1
+ import { PoolConnection, ResultSetHeader } from 'mysql2'
2
+ import { MysqlException } from '../../exception'
3
+ import { Table } from '../../table-info'
4
+ import { promiseQuery } from '../utils'
5
+ import { MysqlConfig } from '../../config'
6
+ import { processColumnValue } from './utils'
7
+
8
+ /**
9
+ * 为表插入数据
10
+ * @param connection
11
+ * @param table
12
+ * @param data
13
+ * @returns
14
+ */
15
+ export async function insert<T>(
16
+ config: MysqlConfig,
17
+ connection: PoolConnection,
18
+ table: Table<T>,
19
+ data: T
20
+ ): Promise<T> {
21
+ // 插入后的新数据
22
+ // 列信息,使用 set 防止 columns 中重复配置 id 和更新创建时间列
23
+ let columnsSet: Set<keyof T> = new Set()
24
+ // 判定下 id ,如果有值,才在 insert 语句中出现 id 列,否则不出现
25
+ if (data[table.id]) {
26
+ columnsSet.add(table.id)
27
+ }
28
+ table.columns.forEach(col => columnsSet.add(col))
29
+ if (table.createdDate) {
30
+ const createdData = table.createdDate.type === 'date' ? new Date() : new Date().getTime()
31
+ data[table.createdDate.column] = createdData as any
32
+ columnsSet.add(table.createdDate.column)
33
+ }
34
+ if (table.updatedDate) {
35
+ const updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime()
36
+ data[table.updatedDate.column] = updatedDate as any
37
+ columnsSet.add(table.updatedDate.column)
38
+ }
39
+ const columns = Array.from(columnsSet)
40
+ // 构建 sql
41
+ const sql = `insert into ??(${columns.map(() => '??').join(',')}) values(${columns
42
+ .map(() => '?')
43
+ .join(',')})`
44
+ const values: any[] = [
45
+ table.tableName,
46
+ ...columns,
47
+ ...columns.map(col => processColumnValue(data[col]))
48
+ ]
49
+ const res = await promiseQuery(config, connection, sql, values)
50
+ const packet = res as ResultSetHeader
51
+ if (packet.affectedRows !== 1) {
52
+ throw new MysqlException(
53
+ `Insert failed,table:${table.tableName},primary key: ${data[table.id]}`
54
+ )
55
+ }
56
+ // 自动生成的id处理
57
+ if (packet.insertId && (data[table.id] === undefined || data[table.id] === null)) {
58
+ data[table.id] = packet.insertId as any
59
+ }
60
+ return data
61
+ }
62
+ /**
63
+ * 一次插入多条记录
64
+ * @param connection 连接
65
+ * @param table 表
66
+ * @param list 要插入的记录列表
67
+ */
68
+ export async function insertMany<T>(
69
+ config: MysqlConfig,
70
+ connection: PoolConnection,
71
+ table: Table<T>,
72
+ list: T[]
73
+ ): Promise<void> {
74
+ if (!list.length) {
75
+ return
76
+ }
77
+ // 列信息,使用 set 防止 columns 中重复配置 id 和更新创建时间列
78
+ let columnsSet: Set<keyof T> = new Set()
79
+ // 批量插入必须统一使用 id 或不使用 id,以第一条记录为准
80
+ if (list[0][table.id]) {
81
+ columnsSet.add(table.id)
82
+ }
83
+ table.columns.forEach(col => columnsSet.add(col))
84
+ let createdData: Date | number | undefined = undefined
85
+ if (table.createdDate) {
86
+ createdData = table.createdDate.type === 'date' ? new Date() : new Date().getTime()
87
+ columnsSet.add(table.createdDate.column)
88
+ }
89
+ let updatedDate: Date | number | undefined = undefined
90
+ if (table.updatedDate) {
91
+ updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime()
92
+ columnsSet.add(table.updatedDate.column)
93
+ }
94
+ const columns = Array.from(columnsSet)
95
+ // 构建 sql
96
+ let sql = `insert into ??(${columns.map(() => '??').join(',')}) values`
97
+ const values: any[] = [table.tableName, ...columns]
98
+ list.forEach((data, idx) => {
99
+ if (idx > 0) {
100
+ sql += ','
101
+ }
102
+ sql += `(${columns.map(() => '?').join(',')})`
103
+ if (table.createdDate) {
104
+ data[table.createdDate.column] = createdData as any
105
+ }
106
+ if (table.updatedDate) {
107
+ data[table.updatedDate.column] = updatedDate as any
108
+ }
109
+ values.push(...columns.map(col => processColumnValue(data[col])))
110
+ })
111
+
112
+ const res = await promiseQuery(config, connection, sql, values)
113
+ const rsh = res as ResultSetHeader
114
+ if (rsh.affectedRows !== list.length) {
115
+ throw new MysqlException(
116
+ `Insert many for table ${table.tableName} failed,expected to insert ${list.length} records, actually ${rsh.affectedRows}.`
117
+ )
118
+ }
119
+ // insert 插入多条记录是不会返回生成的 id 的,所以就没有办法自动处理
120
+ }
@@ -0,0 +1,14 @@
1
+ import { PoolConnection, ResultSetHeader } from 'mysql2'
2
+ import { promiseQuery } from '../utils'
3
+ import { MysqlConfig } from '../../config'
4
+
5
+ export async function modify(
6
+ config: MysqlConfig,
7
+ connection: PoolConnection,
8
+ sql: string,
9
+ values?: any[]
10
+ ): Promise<number> {
11
+ const res = await promiseQuery(config, connection, sql, values || [])
12
+ const pck = res as ResultSetHeader
13
+ return pck.affectedRows
14
+ }
@@ -0,0 +1,60 @@
1
+ import { PoolConnection } from 'mysql2'
2
+ import { Table } from '../../table-info'
3
+ import { count } from './count'
4
+ import { MixCriteria } from './criteria'
5
+ import { find } from './find'
6
+ import { MysqlConfig } from '../../config'
7
+
8
+ export interface MysqlPaginateOpts<T> {
9
+ /**
10
+ * 表
11
+ */
12
+ table: Table<T>
13
+ /**
14
+ * 查询条件
15
+ * @param criteria
16
+ * @returns
17
+ */
18
+ criteria?: MixCriteria<T>
19
+ /**
20
+ * 而码,默认1
21
+ */
22
+ pn?: number
23
+ /**
24
+ * 每页的数据量大小,默认 20, 必须在 1-1000 之间
25
+ */
26
+ pz?: number
27
+ /**
28
+ * 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
29
+ */
30
+ orderBy?: Array<[keyof T, 'asc' | 'desc']>
31
+ }
32
+ /**
33
+ * mysql 分页查询结果
34
+ */
35
+ export interface MysqlPage<T> {
36
+ total: number
37
+ list: T[]
38
+ }
39
+
40
+ export async function paginate<T>(
41
+ config: MysqlConfig,
42
+ conn: PoolConnection,
43
+ opts: MysqlPaginateOpts<T>
44
+ ): Promise<MysqlPage<T>> {
45
+ const pn = opts.pn && opts.pn >= 1 ? opts.pn : 1
46
+ const limit = opts.pz && opts.pz >= 1 && opts.pz <= 1000 ? opts.pz : 20
47
+ const offset = (pn - 1) * limit
48
+ const list = await find(config, conn, {
49
+ table: opts.table,
50
+ criteria: opts.criteria,
51
+ offset,
52
+ limit,
53
+ orderBy: opts.orderBy
54
+ })
55
+ const total = await count(config, conn, opts.table, opts.criteria)
56
+ return {
57
+ total,
58
+ list
59
+ }
60
+ }
@@ -0,0 +1,13 @@
1
+ import { PoolConnection, RowDataPacket } from 'mysql2'
2
+ import { promiseQuery } from '../utils'
3
+ import { MysqlConfig } from '../../config'
4
+
5
+ export async function query<T>(
6
+ config: MysqlConfig,
7
+ connection: PoolConnection,
8
+ sql: string,
9
+ values?: any[]
10
+ ): Promise<T[]> {
11
+ const res = await promiseQuery(config, connection, sql, values || [])
12
+ return res as RowDataPacket[] as T[]
13
+ }