ai-engineering-init 1.1.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 (313) hide show
  1. package/.claude/agents/code-reviewer.md +139 -0
  2. package/.claude/agents/project-manager.md +159 -0
  3. package/.claude/audio/completed.wav +0 -0
  4. package/.claude/commands/add-todo.md +255 -0
  5. package/.claude/commands/check.md +210 -0
  6. package/.claude/commands/crud.md +454 -0
  7. package/.claude/commands/dev.md +503 -0
  8. package/.claude/commands/init-docs.md +681 -0
  9. package/.claude/commands/next.md +251 -0
  10. package/.claude/commands/progress.md +242 -0
  11. package/.claude/commands/start.md +199 -0
  12. package/.claude/commands/sync.md +307 -0
  13. package/.claude/commands/update-status.md +428 -0
  14. package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
  15. package/.claude/docs/README.md +167 -0
  16. package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
  17. package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
  18. package/.claude/docs//345/267/245/344/275/234/346/265/201/345/274/200/345/217/221/346/214/207/345/215/227.md +714 -0
  19. package/.claude/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +463 -0
  20. package/.claude/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +390 -0
  21. package/.claude/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213/350/247/204/350/214/203.md +688 -0
  22. package/.claude/docs//346/226/260/351/241/271/347/233/256/345/274/200/345/217/221/346/265/201/347/250/213.md +365 -0
  23. package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
  24. package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
  25. package/.claude/framework-config.json +73 -0
  26. package/.claude/hooks/pre-tool-use.js +117 -0
  27. package/.claude/hooks/skill-forced-eval.js +167 -0
  28. package/.claude/hooks/stop.js +58 -0
  29. package/.claude/settings.json +41 -0
  30. package/.claude/skills/add-skill/SKILL.md +352 -0
  31. package/.claude/skills/api-development/SKILL.md +560 -0
  32. package/.claude/skills/architecture-design/SKILL.md +756 -0
  33. package/.claude/skills/backend-annotations/SKILL.md +674 -0
  34. package/.claude/skills/banana-image/CHANGELOG.md +37 -0
  35. package/.claude/skills/banana-image/README.md +146 -0
  36. package/.claude/skills/banana-image/SKILL.md +164 -0
  37. package/.claude/skills/banana-image/assets/logo.png +0 -0
  38. package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
  39. package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
  40. package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  41. package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
  42. package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
  43. package/.claude/skills/banana-image/scripts/package.json +18 -0
  44. package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
  45. package/.claude/skills/banana-image/templates/poster.json +22 -0
  46. package/.claude/skills/banana-image/templates/product.json +17 -0
  47. package/.claude/skills/banana-image/templates/social.json +22 -0
  48. package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
  49. package/.claude/skills/brainstorm/SKILL.md +648 -0
  50. package/.claude/skills/bug-detective/SKILL.md +1206 -0
  51. package/.claude/skills/code-patterns/SKILL.md +590 -0
  52. package/.claude/skills/collaborating-with-codex/SKILL.md +174 -0
  53. package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  54. package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
  55. package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  56. package/.claude/skills/crud-development/SKILL.md +649 -0
  57. package/.claude/skills/data-permission/SKILL.md +599 -0
  58. package/.claude/skills/database-ops/SKILL.md +407 -0
  59. package/.claude/skills/error-handler/SKILL.md +371 -0
  60. package/.claude/skills/file-oss-management/SKILL.md +863 -0
  61. package/.claude/skills/git-workflow/SKILL.md +375 -0
  62. package/.claude/skills/json-serialization/SKILL.md +357 -0
  63. package/.claude/skills/leniu-api-development/SKILL.md +803 -0
  64. package/.claude/skills/leniu-architecture-design/SKILL.md +598 -0
  65. package/.claude/skills/leniu-backend-annotations/SKILL.md +664 -0
  66. package/.claude/skills/leniu-code-patterns/SKILL.md +365 -0
  67. package/.claude/skills/leniu-crud-development/SKILL.md +1110 -0
  68. package/.claude/skills/leniu-data-permission/SKILL.md +256 -0
  69. package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
  70. package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
  71. package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
  72. package/.claude/skills/leniu-java-code-style/SKILL.md +510 -0
  73. package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
  74. package/.claude/skills/leniu-java-entity/SKILL.md +751 -0
  75. package/.claude/skills/leniu-java-export/SKILL.md +560 -0
  76. package/.claude/skills/leniu-java-logging/SKILL.md +832 -0
  77. package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
  78. package/.claude/skills/leniu-java-mybatis/SKILL.md +640 -0
  79. package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
  80. package/.claude/skills/leniu-java-task/SKILL.md +367 -0
  81. package/.claude/skills/leniu-java-total-line/SKILL.md +195 -0
  82. package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  83. package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  84. package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
  85. package/.claude/skills/leniu-redis-cache/SKILL.md +316 -0
  86. package/.claude/skills/leniu-security-guard/SKILL.md +520 -0
  87. package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
  88. package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
  89. package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
  90. package/.claude/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  91. package/.claude/skills/openspec-continue-change/SKILL.md +118 -0
  92. package/.claude/skills/openspec-explore/SKILL.md +290 -0
  93. package/.claude/skills/openspec-ff-change/SKILL.md +101 -0
  94. package/.claude/skills/openspec-new-change/SKILL.md +74 -0
  95. package/.claude/skills/openspec-onboard/SKILL.md +529 -0
  96. package/.claude/skills/openspec-sync-specs/SKILL.md +138 -0
  97. package/.claude/skills/openspec-verify-change/SKILL.md +168 -0
  98. package/.claude/skills/performance-doctor/SKILL.md +627 -0
  99. package/.claude/skills/project-navigator/SKILL.md +305 -0
  100. package/.claude/skills/redis-cache/SKILL.md +839 -0
  101. package/.claude/skills/scheduled-jobs/SKILL.md +633 -0
  102. package/.claude/skills/security-guard/SKILL.md +748 -0
  103. package/.claude/skills/sms-mail/SKILL.md +766 -0
  104. package/.claude/skills/social-login/SKILL.md +668 -0
  105. package/.claude/skills/store-pc/SKILL.md +366 -0
  106. package/.claude/skills/task-tracker/SKILL.md +307 -0
  107. package/.claude/skills/tech-decision/SKILL.md +393 -0
  108. package/.claude/skills/tenant-management/SKILL.md +603 -0
  109. package/.claude/skills/test-development/SKILL.md +755 -0
  110. package/.claude/skills/ui-pc/SKILL.md +438 -0
  111. package/.claude/skills/utils-toolkit/SKILL.md +615 -0
  112. package/.claude/skills/websocket-sse/SKILL.md +716 -0
  113. package/.claude/skills/workflow-engine/SKILL.md +676 -0
  114. package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
  115. package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
  116. package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
  117. package/.codex/skills/add-skill/SKILL.md +352 -0
  118. package/.codex/skills/add-todo/SKILL.md +269 -0
  119. package/.codex/skills/api-development/SKILL.md +693 -0
  120. package/.codex/skills/architecture-design/SKILL.md +628 -0
  121. package/.codex/skills/backend-annotations/SKILL.md +664 -0
  122. package/.codex/skills/banana-image/CHANGELOG.md +37 -0
  123. package/.codex/skills/banana-image/README.md +146 -0
  124. package/.codex/skills/banana-image/SKILL.md +164 -0
  125. package/.codex/skills/banana-image/assets/logo.png +0 -0
  126. package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
  127. package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
  128. package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  129. package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
  130. package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
  131. package/.codex/skills/banana-image/scripts/package.json +18 -0
  132. package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
  133. package/.codex/skills/banana-image/templates/poster.json +22 -0
  134. package/.codex/skills/banana-image/templates/product.json +17 -0
  135. package/.codex/skills/banana-image/templates/social.json +22 -0
  136. package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
  137. package/.codex/skills/brainstorm/SKILL.md +648 -0
  138. package/.codex/skills/bug-detective/SKILL.md +1206 -0
  139. package/.codex/skills/check/SKILL.md +367 -0
  140. package/.codex/skills/code-patterns/SKILL.md +442 -0
  141. package/.codex/skills/collaborating-with-codex/SKILL.md +174 -0
  142. package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  143. package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
  144. package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  145. package/.codex/skills/crud/SKILL.md +265 -0
  146. package/.codex/skills/crud-development/SKILL.md +637 -0
  147. package/.codex/skills/data-permission/SKILL.md +591 -0
  148. package/.codex/skills/database-ops/SKILL.md +553 -0
  149. package/.codex/skills/dev/SKILL.md +187 -0
  150. package/.codex/skills/error-handler/SKILL.md +361 -0
  151. package/.codex/skills/file-oss-management/SKILL.md +863 -0
  152. package/.codex/skills/git-workflow/SKILL.md +375 -0
  153. package/.codex/skills/init-docs/SKILL.md +194 -0
  154. package/.codex/skills/json-serialization/SKILL.md +357 -0
  155. package/.codex/skills/leniu-api-development/SKILL.md +803 -0
  156. package/.codex/skills/leniu-architecture-design/SKILL.md +594 -0
  157. package/.codex/skills/leniu-backend-annotations/SKILL.md +662 -0
  158. package/.codex/skills/leniu-code-patterns/SKILL.md +365 -0
  159. package/.codex/skills/leniu-crud-development/SKILL.md +1110 -0
  160. package/.codex/skills/leniu-data-permission/SKILL.md +256 -0
  161. package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
  162. package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
  163. package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
  164. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  165. package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
  166. package/.codex/skills/leniu-java-entity/SKILL.md +751 -0
  167. package/.codex/skills/leniu-java-export/SKILL.md +560 -0
  168. package/.codex/skills/leniu-java-logging/SKILL.md +832 -0
  169. package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
  170. package/.codex/skills/leniu-java-mybatis/SKILL.md +640 -0
  171. package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
  172. package/.codex/skills/leniu-java-task/SKILL.md +367 -0
  173. package/.codex/skills/leniu-java-total-line/SKILL.md +195 -0
  174. package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  175. package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  176. package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
  177. package/.codex/skills/leniu-redis-cache/SKILL.md +316 -0
  178. package/.codex/skills/leniu-security-guard/SKILL.md +520 -0
  179. package/.codex/skills/leniu-utils-toolkit/SKILL.md +378 -0
  180. package/.codex/skills/next/SKILL.md +137 -0
  181. package/.codex/skills/openspec-apply-change/SKILL.md +156 -0
  182. package/.codex/skills/openspec-archive-change/SKILL.md +114 -0
  183. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  184. package/.codex/skills/openspec-continue-change/SKILL.md +118 -0
  185. package/.codex/skills/openspec-explore/SKILL.md +290 -0
  186. package/.codex/skills/openspec-ff-change/SKILL.md +101 -0
  187. package/.codex/skills/openspec-new-change/SKILL.md +74 -0
  188. package/.codex/skills/openspec-onboard/SKILL.md +529 -0
  189. package/.codex/skills/openspec-sync-specs/SKILL.md +138 -0
  190. package/.codex/skills/openspec-verify-change/SKILL.md +168 -0
  191. package/.codex/skills/performance-doctor/SKILL.md +627 -0
  192. package/.codex/skills/progress/SKILL.md +193 -0
  193. package/.codex/skills/project-navigator/SKILL.md +286 -0
  194. package/.codex/skills/redis-cache/SKILL.md +829 -0
  195. package/.codex/skills/scheduled-jobs/SKILL.md +633 -0
  196. package/.codex/skills/security-guard/SKILL.md +739 -0
  197. package/.codex/skills/sms-mail/SKILL.md +766 -0
  198. package/.codex/skills/social-login/SKILL.md +668 -0
  199. package/.codex/skills/start/SKILL.md +154 -0
  200. package/.codex/skills/store-pc/SKILL.md +491 -0
  201. package/.codex/skills/sync/SKILL.md +149 -0
  202. package/.codex/skills/task-tracker/SKILL.md +307 -0
  203. package/.codex/skills/tech-decision/SKILL.md +393 -0
  204. package/.codex/skills/tenant-management/SKILL.md +603 -0
  205. package/.codex/skills/test-development/SKILL.md +755 -0
  206. package/.codex/skills/ui-pc/SKILL.md +475 -0
  207. package/.codex/skills/update-status/SKILL.md +159 -0
  208. package/.codex/skills/utils-toolkit/SKILL.md +593 -0
  209. package/.codex/skills/websocket-sse/SKILL.md +716 -0
  210. package/.codex/skills/workflow-engine/SKILL.md +676 -0
  211. package/.cursor/agents/code-reviewer.md +139 -0
  212. package/.cursor/agents/project-manager.md +159 -0
  213. package/.cursor/commands/opsx-apply.md +152 -0
  214. package/.cursor/commands/opsx-archive.md +157 -0
  215. package/.cursor/commands/opsx-bulk-archive.md +242 -0
  216. package/.cursor/commands/opsx-continue.md +114 -0
  217. package/.cursor/commands/opsx-explore.md +174 -0
  218. package/.cursor/commands/opsx-ff.md +94 -0
  219. package/.cursor/commands/opsx-new.md +69 -0
  220. package/.cursor/commands/opsx-onboard.md +525 -0
  221. package/.cursor/commands/opsx-sync.md +134 -0
  222. package/.cursor/commands/opsx-verify.md +164 -0
  223. package/.cursor/mcp.json +22 -0
  224. package/.cursor/skills/add-skill/SKILL.md +352 -0
  225. package/.cursor/skills/api-development/SKILL.md +560 -0
  226. package/.cursor/skills/architecture-design/SKILL.md +756 -0
  227. package/.cursor/skills/backend-annotations/SKILL.md +674 -0
  228. package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
  229. package/.cursor/skills/banana-image/README.md +146 -0
  230. package/.cursor/skills/banana-image/SKILL.md +164 -0
  231. package/.cursor/skills/banana-image/assets/logo.png +0 -0
  232. package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
  233. package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
  234. package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  235. package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
  236. package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
  237. package/.cursor/skills/banana-image/scripts/package.json +18 -0
  238. package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
  239. package/.cursor/skills/banana-image/templates/poster.json +22 -0
  240. package/.cursor/skills/banana-image/templates/product.json +17 -0
  241. package/.cursor/skills/banana-image/templates/social.json +22 -0
  242. package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
  243. package/.cursor/skills/brainstorm/SKILL.md +648 -0
  244. package/.cursor/skills/bug-detective/SKILL.md +1206 -0
  245. package/.cursor/skills/code-patterns/SKILL.md +590 -0
  246. package/.cursor/skills/collaborating-with-codex/SKILL.md +174 -0
  247. package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  248. package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
  249. package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  250. package/.cursor/skills/crud-development/SKILL.md +649 -0
  251. package/.cursor/skills/data-permission/SKILL.md +599 -0
  252. package/.cursor/skills/database-ops/SKILL.md +407 -0
  253. package/.cursor/skills/error-handler/SKILL.md +371 -0
  254. package/.cursor/skills/file-oss-management/SKILL.md +863 -0
  255. package/.cursor/skills/git-workflow/SKILL.md +375 -0
  256. package/.cursor/skills/json-serialization/SKILL.md +357 -0
  257. package/.cursor/skills/leniu-api-development/SKILL.md +803 -0
  258. package/.cursor/skills/leniu-architecture-design/SKILL.md +598 -0
  259. package/.cursor/skills/leniu-backend-annotations/SKILL.md +664 -0
  260. package/.cursor/skills/leniu-code-patterns/SKILL.md +365 -0
  261. package/.cursor/skills/leniu-crud-development/SKILL.md +1110 -0
  262. package/.cursor/skills/leniu-data-permission/SKILL.md +256 -0
  263. package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
  264. package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
  265. package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
  266. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  267. package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
  268. package/.cursor/skills/leniu-java-entity/SKILL.md +751 -0
  269. package/.cursor/skills/leniu-java-export/SKILL.md +560 -0
  270. package/.cursor/skills/leniu-java-logging/SKILL.md +832 -0
  271. package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
  272. package/.cursor/skills/leniu-java-mybatis/SKILL.md +640 -0
  273. package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
  274. package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
  275. package/.cursor/skills/leniu-java-total-line/SKILL.md +195 -0
  276. package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  277. package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  278. package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
  279. package/.cursor/skills/leniu-redis-cache/SKILL.md +316 -0
  280. package/.cursor/skills/leniu-security-guard/SKILL.md +520 -0
  281. package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
  282. package/.cursor/skills/openspec-apply-change/SKILL.md +156 -0
  283. package/.cursor/skills/openspec-archive-change/SKILL.md +114 -0
  284. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  285. package/.cursor/skills/openspec-continue-change/SKILL.md +118 -0
  286. package/.cursor/skills/openspec-explore/SKILL.md +290 -0
  287. package/.cursor/skills/openspec-ff-change/SKILL.md +101 -0
  288. package/.cursor/skills/openspec-new-change/SKILL.md +74 -0
  289. package/.cursor/skills/openspec-onboard/SKILL.md +529 -0
  290. package/.cursor/skills/openspec-sync-specs/SKILL.md +138 -0
  291. package/.cursor/skills/openspec-verify-change/SKILL.md +168 -0
  292. package/.cursor/skills/performance-doctor/SKILL.md +627 -0
  293. package/.cursor/skills/project-navigator/SKILL.md +305 -0
  294. package/.cursor/skills/redis-cache/SKILL.md +839 -0
  295. package/.cursor/skills/scheduled-jobs/SKILL.md +633 -0
  296. package/.cursor/skills/security-guard/SKILL.md +748 -0
  297. package/.cursor/skills/sms-mail/SKILL.md +766 -0
  298. package/.cursor/skills/social-login/SKILL.md +668 -0
  299. package/.cursor/skills/store-pc/SKILL.md +366 -0
  300. package/.cursor/skills/task-tracker/SKILL.md +307 -0
  301. package/.cursor/skills/tech-decision/SKILL.md +393 -0
  302. package/.cursor/skills/tenant-management/SKILL.md +603 -0
  303. package/.cursor/skills/test-development/SKILL.md +755 -0
  304. package/.cursor/skills/ui-pc/SKILL.md +438 -0
  305. package/.cursor/skills/utils-toolkit/SKILL.md +615 -0
  306. package/.cursor/skills/websocket-sse/SKILL.md +716 -0
  307. package/.cursor/skills/workflow-engine/SKILL.md +676 -0
  308. package/AGENTS.md +669 -0
  309. package/CLAUDE.md +205 -0
  310. package/README.md +205 -0
  311. package/bin/index.js +179 -0
  312. package/init.sh +178 -0
  313. package/package.json +27 -0
@@ -0,0 +1,316 @@
1
+ # leniu-redis-cache
2
+
3
+ 适用于 leniu-tengyun-core 项目的 Redis 缓存和分布式锁操作。
4
+
5
+ ## RedisUtil 工具类
6
+
7
+ 位置:`net.xnzn.core.common.redis.RedisUtil`
8
+
9
+ ### String 操作
10
+
11
+ ```java
12
+ import net.xnzn.core.common.redis.RedisUtil;
13
+
14
+ // 设置 String(无过期时间)
15
+ RedisUtil.setString("key", "value");
16
+
17
+ // 设置 String(带过期时间,单位秒)
18
+ RedisUtil.setString("key", "value", 3600L);
19
+
20
+ // 获取 String
21
+ String value = RedisUtil.getString("key");
22
+
23
+ // 存在则更新,不存在则设置
24
+ Boolean updated = RedisUtil.setIfPresentString("key", "new-value", 3600L);
25
+ ```
26
+
27
+ ### Object 操作
28
+
29
+ ```java
30
+ // 设置对象(无过期时间)
31
+ RedisUtil.setObj("user:123", user);
32
+
33
+ // 设置对象(带过期时间)
34
+ RedisUtil.setObj("user:123", user, 1800L);
35
+
36
+ // 获取对象
37
+ Object user = RedisUtil.getObj("user:123");
38
+ User userObj = (User) RedisUtil.getObj("user:123");
39
+ ```
40
+
41
+ ### 删除操作
42
+
43
+ ```java
44
+ // 删除指定 key
45
+ RedisUtil.delete("user:123");
46
+
47
+ // 批量删除(匹配模式)
48
+ RedisUtil.deleteByPattern("cache:user:*");
49
+ ```
50
+
51
+ ### 自增/自减
52
+
53
+ ```java
54
+ // 自增(返回递增后的值)
55
+ Integer count = RedisUtil.incr("counter", 3600L);
56
+
57
+ // 自减(返回递减后的值)
58
+ Integer count = RedisUtil.decr("counter", 3600L);
59
+
60
+ // 仅获取当前值(不增减)
61
+ Integer current = RedisUtil.getRedisAtomicInteger("counter", null, null);
62
+ ```
63
+
64
+ ### 分布式锁
65
+
66
+ ```java
67
+ import org.redisson.api.RLock;
68
+
69
+ // 获取锁对象
70
+ RLock lock = RedisUtil.getLock("lock:order:123");
71
+
72
+ // 标准用法(推荐):lock() 直接阻塞获取
73
+ RLock lock = RedisUtil.getLock("lock:order:123");
74
+ lock.lock();
75
+ try {
76
+ // 执行业务逻辑
77
+ doBusiness();
78
+ } catch (Exception e) {
79
+ log.error("业务处理异常", e);
80
+ } finally {
81
+ // ✅ 安全释放锁:双重检查,防止重复 unlock
82
+ try {
83
+ if (lock.isHeldByCurrentThread() && lock.isLocked()) {
84
+ lock.unlock();
85
+ }
86
+ } catch (Exception e) {
87
+ log.error("解锁异常", e);
88
+ }
89
+ }
90
+
91
+ // tryLock 用法(不阻塞,失败直接抛异常)
92
+ RLock lock2 = RedisUtil.getLock("lock:order:123");
93
+ if (!lock2.tryLock()) {
94
+ throw new LeException("订单正在处理中,请稍后重试");
95
+ }
96
+ try {
97
+ doBusiness();
98
+ } finally {
99
+ try {
100
+ if (lock2.isHeldByCurrentThread() && lock2.isLocked()) {
101
+ lock2.unlock();
102
+ }
103
+ } catch (Exception e) {
104
+ log.error("解锁异常", e);
105
+ }
106
+ }
107
+
108
+ // 检查锁状态
109
+ boolean locked = RedisUtil.isLock("lock:order:123");
110
+ ```
111
+
112
+ **已弃用的方法**(避免代码扫描问题,请使用 `getLock` + `lock/unlock`):
113
+
114
+ ```java
115
+ // 不推荐使用(已弃用)
116
+ RedisUtil.tryLock("lock:key", 10, 30);
117
+ RedisUtil.lock("lock:key");
118
+ RedisUtil.unLock("lock:key");
119
+ ```
120
+
121
+ ### ZSet 操作
122
+
123
+ ```java
124
+ // 添加到有序集合
125
+ RedisUtil.zAdd("ranking:weekly", "user123", 95.5);
126
+ RedisUtil.zAdd("ranking:weekly", "user456", 88.3);
127
+
128
+ // 获取排名数据(带分数)
129
+ Set<ZSetOperations.TypedTuple<Object>> ranking = RedisUtil.zGetList("ranking:weekly", 0, 9);
130
+
131
+ // 从有序集合中删除
132
+ RedisUtil.zRemove("ranking:weekly", "user123");
133
+ ```
134
+
135
+ ### 批量操作
136
+
137
+ ```java
138
+ // 批量保存
139
+ Map<String, Object> map = new HashMap<>();
140
+ map.put("key1", "value1");
141
+ map.put("key2", "value2");
142
+ RedisUtil.multiSet(map);
143
+
144
+ // 批量获取
145
+ List keys = Arrays.asList("key1", "key2", "key3");
146
+ List values = RedisUtil.multiGet(keys);
147
+ ```
148
+
149
+ ### Key 查询
150
+
151
+ ```java
152
+ // 匹配 key
153
+ List<String> keys = RedisUtil.keysByPattern("cache:*");
154
+
155
+ // 检查锁是否锁定
156
+ boolean isLocked = RedisUtil.isLock("lock:order:123");
157
+ ```
158
+
159
+ ## 缓存配置
160
+
161
+ ### 最大缓存时间
162
+
163
+ 可以通过配置限制缓存的最大过期时间:
164
+
165
+ ```yaml
166
+ spring:
167
+ redis:
168
+ # 自定义最大缓存时间(秒)
169
+ custom-max-expiration-second: 86400 # 24小时
170
+ ```
171
+
172
+ ## 缓存 Key 命名规范
173
+
174
+ | 类型 | 命名格式 | 示例 |
175
+ |------|---------|------|
176
+ | 用户信息 | `user:{id}` | `user:12345` |
177
+ | 用户列表缓存 | `user:list:{params_hash}` | `user:list:abc123` |
178
+ | 权限缓存 | `permissions:subject_id:{id}` | `permissions:subject_id:123` |
179
+ | 角色缓存 | `roles:subject_id:{id}` | `roles:subject_id:123` |
180
+ | 租户配置 | `tenant:config:{id}` | `tenant:config:123` |
181
+ | 字典缓存 | `dict:{type}:{key}` | `dict:sys_yes_no:1` |
182
+ | 分布式锁 | `lock:{module}:{id}` | `lock:order:123` |
183
+ | 限流器 | `rate:{user_id}:{api}` | `rate:123:/api/order/create` |
184
+
185
+ ## 典型场景
186
+
187
+ ### 缓存击穿保护
188
+
189
+ ```java
190
+ public User getUserById(Long userId) {
191
+ String key = "user:" + userId;
192
+
193
+ // 先查缓存
194
+ Object cached = RedisUtil.getObj(key);
195
+ if (cached != null) {
196
+ return (User) cached;
197
+ }
198
+
199
+ // 使用分布式锁防止缓存击穿
200
+ RLock lock = RedisUtil.getLock("lock:user:" + userId);
201
+ try {
202
+ if (lock.tryLock(5, 30, TimeUnit.SECONDS)) {
203
+ try {
204
+ // 双重检查
205
+ cached = RedisUtil.getObj(key);
206
+ if (cached != null) {
207
+ return (User) cached;
208
+ }
209
+
210
+ // 查询数据库
211
+ User user = userMapper.selectById(userId);
212
+ if (user != null) {
213
+ RedisUtil.setObj(key, user, 3600L);
214
+ }
215
+ return user;
216
+ } finally {
217
+ lock.unlock();
218
+ }
219
+ }
220
+ return userMapper.selectById(userId);
221
+ } catch (InterruptedException e) {
222
+ Thread.currentThread().interrupt();
223
+ return userMapper.selectById(userId);
224
+ }
225
+ }
226
+ ```
227
+
228
+ ### 限流器
229
+
230
+ ```java
231
+ public boolean checkRateLimit(Long userId, String api, int limit, int seconds) {
232
+ String key = String.format("rate:%d:%s", userId, api);
233
+ Integer count = RedisUtil.incr(key, (long) seconds);
234
+
235
+ // 首次请求设置过期时间
236
+ if (count == 1) {
237
+ RedisUtil.setString(key, count.toString(), (long) seconds);
238
+ }
239
+
240
+ return count <= limit;
241
+ }
242
+ ```
243
+
244
+ ### 分布式任务去重
245
+
246
+ ```java
247
+ public void executeTask(String taskId) {
248
+ String key = "task:executing:" + taskId;
249
+
250
+ // setNx 防止重复执行
251
+ boolean acquired = RedisUtil.setNx(key, "1", 300);
252
+ if (!acquired) {
253
+ log.warn("任务正在执行中: {}", taskId);
254
+ return;
255
+ }
256
+
257
+ try {
258
+ // 执行任务
259
+ doTask(taskId);
260
+ } finally {
261
+ RedisUtil.delete(key);
262
+ }
263
+ }
264
+ ```
265
+
266
+ ### 排行榜
267
+
268
+ ```java
269
+ // 添加分数
270
+ public void addScore(Long userId, Double score) {
271
+ RedisUtil.zAdd("ranking:daily", String.valueOf(userId), score);
272
+ }
273
+
274
+ // 获取 TOP 10
275
+ public List<RankingItem> getTop10() {
276
+ Set<ZSetOperations.TypedTuple<Object>> ranking =
277
+ RedisUtil.zGetList("ranking:daily", 0, 9);
278
+
279
+ return ranking.stream()
280
+ .map(tuple -> new RankingItem(
281
+ Long.parseLong(tuple.getValue().toString()),
282
+ tuple.getScore()
283
+ ))
284
+ .sorted(Comparator.comparing(RankingItem::getScore).reversed())
285
+ .collect(Collectors.toList());
286
+ }
287
+
288
+ // 获取用户排名
289
+ public Long getUserRank(Long userId) {
290
+ // 需要 RedisUtil 扩展,或使用 RedisTemplate
291
+ Long rank = redisTemplate.opsForZSet().rank("ranking:daily", String.valueOf(userId));
292
+ return rank != null ? rank + 1 : null;
293
+ }
294
+ ```
295
+
296
+ ## 与 RuoYi-Plus 的区别
297
+
298
+ | 特性 | RuoYi-Plus | leniu-tengyun-core |
299
+ |------|-----------|-------------------|
300
+ | 工具类 | `RedisUtils` | `RedisUtil` |
301
+ | 分布式锁 | `RedisUtils.lock()` | `RedisUtil.getLock()` |
302
+ | 设置对象 | `RedisUtils.setCacheObject()` | `RedisUtil.setObj()` |
303
+ | 获取对象 | `RedisUtils.getCacheObject()` | `RedisUtil.getObj()` |
304
+ | 删除 | `RedisUtils.deleteObject()` | `RedisUtil.delete()` |
305
+ | ZSet 操作 | `RedisUtils.getCacheZSetRank()` | `RedisUtil.zAdd/zGetList()` |
306
+ | 缓存注解 | `@Cacheable` | 未使用注解方式 |
307
+ | 锁释放 | `RedisUtils.unlock()` | `RLock.unlock()` |
308
+
309
+ ## 注意事项
310
+
311
+ 1. `setNx` 用于防止重复执行,返回 `true` 表示设置成功
312
+ 2. 分布式锁必须使用 `try-finally` 确保 unlock 执行
313
+ 3. 自增/自减操作可指定过期时间,首次自增时设置
314
+ 4. 过期时间单位统一为秒
315
+ 5. 批量删除使用 `deleteByPattern` 会扫描所有匹配 key,生产环境慎用
316
+ 6. `RedisUtil` 底层使用 `RedisTemplate` 和 `RedissonClient`