create-nextdevtpl 2.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 (425) hide show
  1. package/README.md +29 -0
  2. package/catalog.json +385 -0
  3. package/dist/catalog.d.ts +3 -0
  4. package/dist/catalog.js +112 -0
  5. package/dist/catalog.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.js +115 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/filesystem.d.ts +10 -0
  10. package/dist/filesystem.js +86 -0
  11. package/dist/filesystem.js.map +1 -0
  12. package/dist/generate.d.ts +5 -0
  13. package/dist/generate.js +758 -0
  14. package/dist/generate.js.map +1 -0
  15. package/dist/index.d.ts +4 -0
  16. package/dist/index.js +4 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/selection.d.ts +2 -0
  19. package/dist/selection.js +111 -0
  20. package/dist/selection.js.map +1 -0
  21. package/dist/service-templates.d.ts +4 -0
  22. package/dist/service-templates.js +180 -0
  23. package/dist/service-templates.js.map +1 -0
  24. package/dist/types.d.ts +65 -0
  25. package/dist/types.js +2 -0
  26. package/dist/types.js.map +1 -0
  27. package/package.json +54 -0
  28. package/template/.dockerignore +14 -0
  29. package/template/.env.example +282 -0
  30. package/template/.gitattributes +17 -0
  31. package/template/.node-version +1 -0
  32. package/template/Dockerfile +45 -0
  33. package/template/LICENSE +21 -0
  34. package/template/README.md +267 -0
  35. package/template/biome.json +68 -0
  36. package/template/cloudflare/templates/logger.ts +162 -0
  37. package/template/cloudflare/templates/mail/server.ts +6 -0
  38. package/template/cloudflare/templates/mail/templates.ts +87 -0
  39. package/template/cloudflare/templates/mail/utils.ts +69 -0
  40. package/template/cloudflare/worker.mjs +25 -0
  41. package/template/components.json +22 -0
  42. package/template/compose.yaml +74 -0
  43. package/template/deploy/check-health.mjs +25 -0
  44. package/template/deploy/docker/README.md +14 -0
  45. package/template/deploy/server/README.md +24 -0
  46. package/template/deploy/server/build.sh +24 -0
  47. package/template/deploy/server/nextdevtpl.service +19 -0
  48. package/template/deploy/server/start.sh +19 -0
  49. package/template/deploy/vercel/README.md +16 -0
  50. package/template/deploy/verify-production-health.mjs +86 -0
  51. package/template/drizzle.config.ts +47 -0
  52. package/template/gitignore +62 -0
  53. package/template/manifest.json +35 -0
  54. package/template/messages/en.json +766 -0
  55. package/template/messages/zh.json +762 -0
  56. package/template/next.config.mjs +28 -0
  57. package/template/open-next.config.ts +3 -0
  58. package/template/package.json +125 -0
  59. package/template/pnpm-lock.yaml +15901 -0
  60. package/template/postcss.config.mjs +7 -0
  61. package/template/public/file.svg +1 -0
  62. package/template/public/globe.svg +1 -0
  63. package/template/public/logo.svg +6 -0
  64. package/template/public/next.svg +1 -0
  65. package/template/public/vercel.svg +1 -0
  66. package/template/public/window.svg +1 -0
  67. package/template/sentry.client.config.ts +10 -0
  68. package/template/sentry.edge.config.ts +10 -0
  69. package/template/sentry.server.config.ts +10 -0
  70. package/template/source.config.ts +59 -0
  71. package/template/src/adapters/ai/anthropic.ts +113 -0
  72. package/template/src/adapters/ai/index.ts +6 -0
  73. package/template/src/adapters/ai/openai-compatible.ts +88 -0
  74. package/template/src/adapters/ai/workers-ai.ts +63 -0
  75. package/template/src/adapters/index.ts +10 -0
  76. package/template/src/adapters/jobs/cloudflare-workflows.ts +46 -0
  77. package/template/src/adapters/jobs/index.ts +5 -0
  78. package/template/src/adapters/jobs/inngest/adapter.ts +29 -0
  79. package/template/src/adapters/jobs/inngest/client.ts +8 -0
  80. package/template/src/adapters/jobs/inngest/functions.ts +17 -0
  81. package/template/src/adapters/jobs/inngest/handler.ts +6 -0
  82. package/template/src/adapters/jobs/inngest/index.ts +4 -0
  83. package/template/src/adapters/mail/cloudflare-email.ts +50 -0
  84. package/template/src/adapters/mail/disabled.ts +17 -0
  85. package/template/src/adapters/mail/index.ts +7 -0
  86. package/template/src/adapters/mail/resend.ts +76 -0
  87. package/template/src/adapters/mail/smtp.ts +82 -0
  88. package/template/src/adapters/payment/creem.ts +269 -0
  89. package/template/src/adapters/payment/index.ts +2 -0
  90. package/template/src/adapters/payment/stripe.ts +302 -0
  91. package/template/src/adapters/rate-limit/cloudflare.ts +42 -0
  92. package/template/src/adapters/rate-limit/index.ts +6 -0
  93. package/template/src/adapters/rate-limit/noop.ts +27 -0
  94. package/template/src/adapters/rate-limit/upstash.ts +113 -0
  95. package/template/src/adapters/registry.ts +228 -0
  96. package/template/src/adapters/storage/index.ts +3 -0
  97. package/template/src/adapters/storage/r2-binding.ts +105 -0
  98. package/template/src/adapters/storage/s3-compatible.ts +149 -0
  99. package/template/src/app/[locale]/(admin)/admin/layout.tsx +36 -0
  100. package/template/src/app/[locale]/(admin)/admin/page.tsx +345 -0
  101. package/template/src/app/[locale]/(admin)/admin/tickets/[id]/page.tsx +261 -0
  102. package/template/src/app/[locale]/(admin)/admin/tickets/page.tsx +236 -0
  103. package/template/src/app/[locale]/(admin)/admin/users/page.tsx +557 -0
  104. package/template/src/app/[locale]/(auth)/forgot-password/page.tsx +9 -0
  105. package/template/src/app/[locale]/(auth)/layout.tsx +28 -0
  106. package/template/src/app/[locale]/(auth)/sign-in/page.tsx +9 -0
  107. package/template/src/app/[locale]/(auth)/sign-up/page.tsx +9 -0
  108. package/template/src/app/[locale]/(dashboard)/dashboard/credits/buy/buy-credits-view.tsx +170 -0
  109. package/template/src/app/[locale]/(dashboard)/dashboard/credits/buy/page.tsx +12 -0
  110. package/template/src/app/[locale]/(dashboard)/dashboard/credits/page.tsx +5 -0
  111. package/template/src/app/[locale]/(dashboard)/dashboard/loading.tsx +41 -0
  112. package/template/src/app/[locale]/(dashboard)/dashboard/page.tsx +299 -0
  113. package/template/src/app/[locale]/(dashboard)/dashboard/settings/page.tsx +38 -0
  114. package/template/src/app/[locale]/(dashboard)/dashboard/support/[id]/page.tsx +220 -0
  115. package/template/src/app/[locale]/(dashboard)/dashboard/support/new/page.tsx +183 -0
  116. package/template/src/app/[locale]/(dashboard)/dashboard/support/page.tsx +145 -0
  117. package/template/src/app/[locale]/(dashboard)/layout.tsx +35 -0
  118. package/template/src/app/[locale]/(marketing)/blog/[slug]/page.tsx +178 -0
  119. package/template/src/app/[locale]/(marketing)/blog/blog-post-card.tsx +95 -0
  120. package/template/src/app/[locale]/(marketing)/blog/page.tsx +127 -0
  121. package/template/src/app/[locale]/(marketing)/demo/plan-badges/page.tsx +36 -0
  122. package/template/src/app/[locale]/(marketing)/layout.tsx +15 -0
  123. package/template/src/app/[locale]/(marketing)/legal/[slug]/page.tsx +130 -0
  124. package/template/src/app/[locale]/(marketing)/page.tsx +94 -0
  125. package/template/src/app/[locale]/(marketing)/pseo/[slug]/page.tsx +68 -0
  126. package/template/src/app/[locale]/(marketing)/pseo/page.tsx +137 -0
  127. package/template/src/app/[locale]/docs/[[...slug]]/page.tsx +63 -0
  128. package/template/src/app/[locale]/docs/layout.tsx +39 -0
  129. package/template/src/app/[locale]/layout.tsx +80 -0
  130. package/template/src/app/[locale]/opengraph-image.tsx +20 -0
  131. package/template/src/app/[locale]/twitter-image.tsx +20 -0
  132. package/template/src/app/api/auth/[...all]/route.ts +20 -0
  133. package/template/src/app/api/health/route.ts +45 -0
  134. package/template/src/app/api/inngest/route.ts +12 -0
  135. package/template/src/app/api/jobs/credits/expire/route.ts +102 -0
  136. package/template/src/app/api/search/route.ts +17 -0
  137. package/template/src/app/api/upload/presigned/route.ts +98 -0
  138. package/template/src/app/api/webhooks/payment/route.ts +363 -0
  139. package/template/src/app/globals.css +406 -0
  140. package/template/src/app/icon.svg +6 -0
  141. package/template/src/app/image-proxy/[...path]/route.ts +137 -0
  142. package/template/src/app/layout.tsx +73 -0
  143. package/template/src/app/robots.ts +29 -0
  144. package/template/src/app/sitemap.ts +68 -0
  145. package/template/src/components/motion/reveal.tsx +49 -0
  146. package/template/src/components/seo/json-ld.tsx +87 -0
  147. package/template/src/components/seo/og-image-template.tsx +118 -0
  148. package/template/src/components/ui/accordion.tsx +66 -0
  149. package/template/src/components/ui/alert-dialog.tsx +195 -0
  150. package/template/src/components/ui/avatar.tsx +53 -0
  151. package/template/src/components/ui/badge.tsx +46 -0
  152. package/template/src/components/ui/button.tsx +65 -0
  153. package/template/src/components/ui/card.tsx +92 -0
  154. package/template/src/components/ui/checkbox.tsx +32 -0
  155. package/template/src/components/ui/collapsible.tsx +33 -0
  156. package/template/src/components/ui/dialog.tsx +124 -0
  157. package/template/src/components/ui/dropdown-menu.tsx +257 -0
  158. package/template/src/components/ui/form.tsx +233 -0
  159. package/template/src/components/ui/index.ts +2 -0
  160. package/template/src/components/ui/input.tsx +21 -0
  161. package/template/src/components/ui/label.tsx +24 -0
  162. package/template/src/components/ui/navigation-menu.tsx +167 -0
  163. package/template/src/components/ui/pagination.tsx +125 -0
  164. package/template/src/components/ui/popover.tsx +48 -0
  165. package/template/src/components/ui/progress.tsx +27 -0
  166. package/template/src/components/ui/radio-group.tsx +45 -0
  167. package/template/src/components/ui/select.tsx +190 -0
  168. package/template/src/components/ui/separator.tsx +28 -0
  169. package/template/src/components/ui/sheet.tsx +140 -0
  170. package/template/src/components/ui/switch.tsx +31 -0
  171. package/template/src/components/ui/tabs.tsx +75 -0
  172. package/template/src/components/ui/textarea.tsx +18 -0
  173. package/template/src/config/index.ts +31 -0
  174. package/template/src/config/nav.ts +238 -0
  175. package/template/src/config/payment.ts +282 -0
  176. package/template/src/config/site.ts +53 -0
  177. package/template/src/config/subscription-plan.ts +164 -0
  178. package/template/src/content/blog/en/hello-world.mdx +48 -0
  179. package/template/src/content/blog/zh/hello-world.mdx +48 -0
  180. package/template/src/content/blog/zh/nextdevtpl-linuxdo-intro.mdx +98 -0
  181. package/template/src/content/docs/en/admin-and-support.mdx +65 -0
  182. package/template/src/content/docs/en/authentication.mdx +71 -0
  183. package/template/src/content/docs/en/background-jobs.mdx +53 -0
  184. package/template/src/content/docs/en/configuration.mdx +71 -0
  185. package/template/src/content/docs/en/credits.mdx +69 -0
  186. package/template/src/content/docs/en/customization.mdx +95 -0
  187. package/template/src/content/docs/en/database.mdx +66 -0
  188. package/template/src/content/docs/en/deployment.mdx +62 -0
  189. package/template/src/content/docs/en/email.mdx +48 -0
  190. package/template/src/content/docs/en/index.mdx +48 -0
  191. package/template/src/content/docs/en/internationalization.mdx +78 -0
  192. package/template/src/content/docs/en/meta.json +22 -0
  193. package/template/src/content/docs/en/observability.mdx +69 -0
  194. package/template/src/content/docs/en/payments.mdx +64 -0
  195. package/template/src/content/docs/en/project-structure.mdx +82 -0
  196. package/template/src/content/docs/en/quick-start.mdx +113 -0
  197. package/template/src/content/docs/en/storage.mdx +51 -0
  198. package/template/src/content/docs/zh/admin-and-support.mdx +65 -0
  199. package/template/src/content/docs/zh/authentication.mdx +71 -0
  200. package/template/src/content/docs/zh/background-jobs.mdx +53 -0
  201. package/template/src/content/docs/zh/configuration.mdx +70 -0
  202. package/template/src/content/docs/zh/credits.mdx +69 -0
  203. package/template/src/content/docs/zh/customization.mdx +95 -0
  204. package/template/src/content/docs/zh/database.mdx +66 -0
  205. package/template/src/content/docs/zh/deployment.mdx +61 -0
  206. package/template/src/content/docs/zh/email.mdx +47 -0
  207. package/template/src/content/docs/zh/index.mdx +48 -0
  208. package/template/src/content/docs/zh/internationalization.mdx +78 -0
  209. package/template/src/content/docs/zh/meta.json +22 -0
  210. package/template/src/content/docs/zh/observability.mdx +68 -0
  211. package/template/src/content/docs/zh/payments.mdx +64 -0
  212. package/template/src/content/docs/zh/project-structure.mdx +82 -0
  213. package/template/src/content/docs/zh/quick-start.mdx +110 -0
  214. package/template/src/content/docs/zh/storage.mdx +51 -0
  215. package/template/src/content/legal/en/cookie-policy.mdx +78 -0
  216. package/template/src/content/legal/en/privacy.mdx +131 -0
  217. package/template/src/content/legal/en/terms.mdx +93 -0
  218. package/template/src/content/legal/zh/cookie-policy.mdx +78 -0
  219. package/template/src/content/legal/zh/privacy.mdx +131 -0
  220. package/template/src/content/legal/zh/terms.mdx +92 -0
  221. package/template/src/core/modules/contract.ts +225 -0
  222. package/template/src/core/modules/index.ts +1 -0
  223. package/template/src/core/services/ai.ts +31 -0
  224. package/template/src/core/services/common.ts +112 -0
  225. package/template/src/core/services/index.ts +8 -0
  226. package/template/src/core/services/jobs.ts +24 -0
  227. package/template/src/core/services/mail.ts +35 -0
  228. package/template/src/core/services/manifest.ts +51 -0
  229. package/template/src/core/services/payment.ts +92 -0
  230. package/template/src/core/services/rate-limit.ts +47 -0
  231. package/template/src/core/services/storage.ts +42 -0
  232. package/template/src/db/index.ts +71 -0
  233. package/template/src/db/schema/auth.ts +67 -0
  234. package/template/src/db/schema/credits.ts +94 -0
  235. package/template/src/db/schema/index.ts +5 -0
  236. package/template/src/db/schema/mail.ts +14 -0
  237. package/template/src/db/schema/subscription.ts +21 -0
  238. package/template/src/db/schema/support.ts +56 -0
  239. package/template/src/db/schema.ts +2 -0
  240. package/template/src/features/admin/components/admin-sidebar.tsx +213 -0
  241. package/template/src/features/admin/components/index.ts +2 -0
  242. package/template/src/features/admin/index.ts +3 -0
  243. package/template/src/features/admin/manifest.ts +41 -0
  244. package/template/src/features/analytics/components/analytics.tsx +62 -0
  245. package/template/src/features/analytics/components/index.ts +2 -0
  246. package/template/src/features/analytics/index.ts +3 -0
  247. package/template/src/features/analytics/manifest.ts +13 -0
  248. package/template/src/features/auth/components/auth-brand-panel.tsx +82 -0
  249. package/template/src/features/auth/components/auth-error-alert.tsx +28 -0
  250. package/template/src/features/auth/components/auth-footer.tsx +52 -0
  251. package/template/src/features/auth/components/auth-logo.tsx +30 -0
  252. package/template/src/features/auth/components/forgot-password-form.tsx +146 -0
  253. package/template/src/features/auth/components/index.ts +9 -0
  254. package/template/src/features/auth/components/sign-in-form.tsx +241 -0
  255. package/template/src/features/auth/components/sign-up-form.tsx +307 -0
  256. package/template/src/features/auth/index.ts +3 -0
  257. package/template/src/features/auth/manifest.ts +30 -0
  258. package/template/src/features/blog/components/blog-post-item.tsx +72 -0
  259. package/template/src/features/blog/components/index.ts +1 -0
  260. package/template/src/features/blog/data/mock-posts.ts +62 -0
  261. package/template/src/features/blog/index.ts +3 -0
  262. package/template/src/features/blog/manifest.ts +22 -0
  263. package/template/src/features/credits/account.ts +76 -0
  264. package/template/src/features/credits/actions.ts +427 -0
  265. package/template/src/features/credits/components/credit-balance-badge.tsx +54 -0
  266. package/template/src/features/credits/components/credit-usage-section.tsx +160 -0
  267. package/template/src/features/credits/components/index.ts +7 -0
  268. package/template/src/features/credits/components/transaction-history.tsx +346 -0
  269. package/template/src/features/credits/config.ts +70 -0
  270. package/template/src/features/credits/consume.ts +140 -0
  271. package/template/src/features/credits/core.ts +23 -0
  272. package/template/src/features/credits/errors.ts +26 -0
  273. package/template/src/features/credits/expire.ts +112 -0
  274. package/template/src/features/credits/grant.ts +168 -0
  275. package/template/src/features/credits/index.ts +6 -0
  276. package/template/src/features/credits/manifest.ts +36 -0
  277. package/template/src/features/credits/query.ts +65 -0
  278. package/template/src/features/credits/types.ts +48 -0
  279. package/template/src/features/dashboard/components/index.ts +3 -0
  280. package/template/src/features/dashboard/components/main-wrapper.tsx +100 -0
  281. package/template/src/features/dashboard/components/sidebar.tsx +341 -0
  282. package/template/src/features/dashboard/context/index.ts +2 -0
  283. package/template/src/features/dashboard/context/sidebar-context.tsx +72 -0
  284. package/template/src/features/dashboard/index.ts +4 -0
  285. package/template/src/features/dashboard/manifest.ts +28 -0
  286. package/template/src/features/mail/actions.ts +175 -0
  287. package/template/src/features/mail/index.ts +5 -0
  288. package/template/src/features/mail/manifest.ts +13 -0
  289. package/template/src/features/mail/server.ts +8 -0
  290. package/template/src/features/mail/templates/index.ts +11 -0
  291. package/template/src/features/mail/templates/primary-action-email.tsx +224 -0
  292. package/template/src/features/mail/templates/welcome-email.tsx +121 -0
  293. package/template/src/features/mail/utils.ts +190 -0
  294. package/template/src/features/marketing/components/animated-price.tsx +51 -0
  295. package/template/src/features/marketing/components/cookie-consent.tsx +255 -0
  296. package/template/src/features/marketing/components/cta-section.tsx +50 -0
  297. package/template/src/features/marketing/components/faq-section.tsx +59 -0
  298. package/template/src/features/marketing/components/feature-grid.tsx +80 -0
  299. package/template/src/features/marketing/components/footer.tsx +128 -0
  300. package/template/src/features/marketing/components/header.tsx +255 -0
  301. package/template/src/features/marketing/components/hero-section.tsx +323 -0
  302. package/template/src/features/marketing/components/how-it-works.tsx +115 -0
  303. package/template/src/features/marketing/components/index.ts +14 -0
  304. package/template/src/features/marketing/components/nav-menu.tsx +236 -0
  305. package/template/src/features/marketing/components/pricing-section.tsx +446 -0
  306. package/template/src/features/marketing/components/testimonials.tsx +59 -0
  307. package/template/src/features/marketing/components/use-cases-section.tsx +78 -0
  308. package/template/src/features/marketing/index.ts +3 -0
  309. package/template/src/features/marketing/manifest.ts +35 -0
  310. package/template/src/features/payment/actions.ts +182 -0
  311. package/template/src/features/payment/index.ts +4 -0
  312. package/template/src/features/payment/manifest.ts +18 -0
  313. package/template/src/features/payment/server.ts +7 -0
  314. package/template/src/features/payment/types.ts +202 -0
  315. package/template/src/features/pseo/components/index.ts +6 -0
  316. package/template/src/features/pseo/components/pseo-cta.tsx +51 -0
  317. package/template/src/features/pseo/components/pseo-faq.tsx +40 -0
  318. package/template/src/features/pseo/components/pseo-feature-grid.tsx +74 -0
  319. package/template/src/features/pseo/components/pseo-hero.tsx +106 -0
  320. package/template/src/features/pseo/components/pseo-related.tsx +62 -0
  321. package/template/src/features/pseo/components/pseo-use-cases.tsx +50 -0
  322. package/template/src/features/pseo/data/pseo-pages.json +534 -0
  323. package/template/src/features/pseo/index.ts +4 -0
  324. package/template/src/features/pseo/lib/pseo-data.ts +140 -0
  325. package/template/src/features/pseo/manifest.ts +22 -0
  326. package/template/src/features/settings/actions/delete-account.ts +50 -0
  327. package/template/src/features/settings/actions/index.ts +3 -0
  328. package/template/src/features/settings/actions/update-profile.ts +49 -0
  329. package/template/src/features/settings/components/billing-section.tsx +283 -0
  330. package/template/src/features/settings/components/index.ts +3 -0
  331. package/template/src/features/settings/components/profile-form.tsx +154 -0
  332. package/template/src/features/settings/components/security-section.tsx +158 -0
  333. package/template/src/features/settings/components/settings-profile-view.tsx +506 -0
  334. package/template/src/features/settings/index.ts +5 -0
  335. package/template/src/features/settings/manifest.ts +28 -0
  336. package/template/src/features/settings/schemas/index.ts +2 -0
  337. package/template/src/features/settings/schemas/update-profile.ts +21 -0
  338. package/template/src/features/shared/components/cookie-settings-dialog.tsx +282 -0
  339. package/template/src/features/shared/components/index.ts +5 -0
  340. package/template/src/features/shared/components/language-switcher.tsx +82 -0
  341. package/template/src/features/shared/components/max-width-wrapper.tsx +49 -0
  342. package/template/src/features/shared/components/mode-toggle.tsx +119 -0
  343. package/template/src/features/shared/icons/google-icon.tsx +39 -0
  344. package/template/src/features/shared/icons/index.ts +7 -0
  345. package/template/src/features/shared/index.ts +5 -0
  346. package/template/src/features/shared/manifest.ts +13 -0
  347. package/template/src/features/shared/providers.tsx +59 -0
  348. package/template/src/features/storage/actions.ts +107 -0
  349. package/template/src/features/storage/index.ts +6 -0
  350. package/template/src/features/storage/manifest.ts +22 -0
  351. package/template/src/features/storage/types.ts +143 -0
  352. package/template/src/features/storage/utils.ts +85 -0
  353. package/template/src/features/storage/validation.ts +151 -0
  354. package/template/src/features/subscription/actions/get-user-plan.ts +26 -0
  355. package/template/src/features/subscription/actions/index.ts +5 -0
  356. package/template/src/features/subscription/components/current-plan-badge.tsx +18 -0
  357. package/template/src/features/subscription/components/index.ts +6 -0
  358. package/template/src/features/subscription/components/plan-badge.tsx +98 -0
  359. package/template/src/features/subscription/index.ts +25 -0
  360. package/template/src/features/subscription/manifest.ts +13 -0
  361. package/template/src/features/subscription/services/user-plan.ts +181 -0
  362. package/template/src/features/support/actions/admin-ticket.ts +172 -0
  363. package/template/src/features/support/actions/admin-users.ts +295 -0
  364. package/template/src/features/support/actions/index.ts +22 -0
  365. package/template/src/features/support/actions/ticket.ts +12 -0
  366. package/template/src/features/support/actions/user-ticket.ts +153 -0
  367. package/template/src/features/support/components/admin-ticket-reply-form.tsx +109 -0
  368. package/template/src/features/support/components/admin-ticket-status-select.tsx +119 -0
  369. package/template/src/features/support/components/index.ts +6 -0
  370. package/template/src/features/support/components/ticket-message-form.tsx +99 -0
  371. package/template/src/features/support/components/user-role-select.tsx +107 -0
  372. package/template/src/features/support/index.ts +5 -0
  373. package/template/src/features/support/manifest.ts +53 -0
  374. package/template/src/features/support/schemas/index.ts +15 -0
  375. package/template/src/features/support/schemas/ticket.ts +81 -0
  376. package/template/src/hooks/index.ts +2 -0
  377. package/template/src/i18n/index.ts +12 -0
  378. package/template/src/i18n/request.ts +24 -0
  379. package/template/src/i18n/routing.ts +23 -0
  380. package/template/src/instrumentation.ts +19 -0
  381. package/template/src/lib/ai/index.ts +16 -0
  382. package/template/src/lib/api-logger.ts +24 -0
  383. package/template/src/lib/auth/admin.ts +54 -0
  384. package/template/src/lib/auth/api.ts +17 -0
  385. package/template/src/lib/auth/client.ts +227 -0
  386. package/template/src/lib/auth/edge.ts +84 -0
  387. package/template/src/lib/auth/errors.ts +99 -0
  388. package/template/src/lib/auth/index.ts +159 -0
  389. package/template/src/lib/auth/server.ts +46 -0
  390. package/template/src/lib/auth/session-context.tsx +96 -0
  391. package/template/src/lib/cloudflare/bindings.ts +31 -0
  392. package/template/src/lib/cookie-consent.ts +33 -0
  393. package/template/src/lib/file-utils.ts +45 -0
  394. package/template/src/lib/fingerprint/index.ts +73 -0
  395. package/template/src/lib/health/checks.ts +6 -0
  396. package/template/src/lib/health/core.ts +86 -0
  397. package/template/src/lib/health/index.ts +11 -0
  398. package/template/src/lib/health/types.ts +13 -0
  399. package/template/src/lib/index.ts +2 -0
  400. package/template/src/lib/logger/index.ts +258 -0
  401. package/template/src/lib/monitoring/index.ts +384 -0
  402. package/template/src/lib/rate-limit/anonymous.ts +85 -0
  403. package/template/src/lib/rate-limit/index.ts +111 -0
  404. package/template/src/lib/safe-action.ts +127 -0
  405. package/template/src/lib/seo/json-ld.ts +188 -0
  406. package/template/src/lib/source.ts +122 -0
  407. package/template/src/lib/utils.ts +6 -0
  408. package/template/src/middleware.ts +162 -0
  409. package/template/src/modules/index.ts +10 -0
  410. package/template/src/modules/presets.ts +8 -0
  411. package/template/src/modules/registry.ts +34 -0
  412. package/template/src/modules/selection.ts +45 -0
  413. package/template/src/services/ai.ts +49 -0
  414. package/template/src/services/index.ts +6 -0
  415. package/template/src/services/jobs.ts +3 -0
  416. package/template/src/services/mail.ts +7 -0
  417. package/template/src/services/payment.ts +3 -0
  418. package/template/src/services/rate-limit.ts +12 -0
  419. package/template/src/services/storage.ts +3 -0
  420. package/template/src/types/fumadocs-source.d.ts +14 -0
  421. package/template/src/types/index.ts +2 -0
  422. package/template/tsconfig.json +53 -0
  423. package/template/vercel.json +11 -0
  424. package/template/vitest.config.ts +51 -0
  425. package/template/wrangler.jsonc +30 -0
@@ -0,0 +1,113 @@
1
+ ---
2
+ title: Quick Start
3
+ description: Run NextDevTpl locally with the minimum required services.
4
+ ---
5
+
6
+ # Quick Start
7
+
8
+ This guide starts the app locally with the smallest useful configuration.
9
+
10
+ ## Requirements
11
+
12
+ | Tool | Version | Notes |
13
+ | --- | --- | --- |
14
+ | Node.js | 20+ | Required by Next.js and Inngest dependencies in this project |
15
+ | pnpm | 10+ recommended | The lockfile is maintained with pnpm |
16
+ | PostgreSQL | 14+ recommended | Local PostgreSQL, Neon, Supabase, or another compatible host |
17
+
18
+ ## Install dependencies
19
+
20
+ ```bash
21
+ git clone git@github.com:evepupil/NextDevTpl.git
22
+ cd NextDevTpl
23
+ pnpm install
24
+ ```
25
+
26
+ ## Create environment file
27
+
28
+ ```bash
29
+ cp .env.example .env.local
30
+ ```
31
+
32
+ On Windows PowerShell:
33
+
34
+ ```powershell
35
+ Copy-Item .env.example .env.local
36
+ ```
37
+
38
+ ## Minimal environment variables
39
+
40
+ Only these variables are required for a basic local boot:
41
+
42
+ ```bash
43
+ DATABASE_URL="postgresql://postgres:password@localhost:5432/nextdevtpl"
44
+ BETTER_AUTH_SECRET="replace-with-a-random-secret"
45
+ BETTER_AUTH_URL="http://localhost:3000"
46
+ ```
47
+
48
+ Generate a strong local secret with:
49
+
50
+ ```bash
51
+ openssl rand -base64 32
52
+ ```
53
+
54
+ OAuth, email, payments, storage, Redis, logging, monitoring, AI, and background jobs can be enabled later.
55
+
56
+ ## Initialize the database
57
+
58
+ For a new local database, push the current Drizzle schema:
59
+
60
+ ```bash
61
+ pnpm db:push
62
+ ```
63
+
64
+ Use migrations for shared or production databases:
65
+
66
+ ```bash
67
+ pnpm db:generate
68
+ pnpm db:migrate
69
+ ```
70
+
71
+ ## Start the dev server
72
+
73
+ ```bash
74
+ pnpm dev
75
+ ```
76
+
77
+ Open:
78
+
79
+ ```txt
80
+ http://localhost:3000
81
+ ```
82
+
83
+ The middleware will route you to the active locale, for example `/en` or `/zh`.
84
+
85
+ ## Verify the app
86
+
87
+ After startup, verify these flows:
88
+
89
+ | Check | Expected result |
90
+ | --- | --- |
91
+ | Home page | Marketing page renders without missing translation errors |
92
+ | Sign up | Email/password account can be created |
93
+ | Sign in | Authenticated user reaches `/dashboard` |
94
+ | Dashboard | Sidebar, settings, credits, and support links render |
95
+ | Admin | User with `role = "admin"` can access `/admin` |
96
+ | Docs | `/en/docs` and `/zh/docs` show language-specific content |
97
+
98
+ ## Common commands
99
+
100
+ ```bash
101
+ pnpm dev # Start Next.js dev server
102
+ pnpm build # Create a production build
103
+ pnpm start # Start production server
104
+ pnpm typecheck # Run TypeScript type checking
105
+ pnpm lint # Run Biome lint
106
+ pnpm check # Run Biome check with fixes
107
+ pnpm db:push # Push Drizzle schema in development
108
+ pnpm db:generate # Generate migration files
109
+ pnpm db:migrate # Run migrations
110
+ pnpm db:studio # Open Drizzle Studio
111
+ pnpm test:run # Run tests once
112
+ ```
113
+
@@ -0,0 +1,51 @@
1
+ ---
2
+ title: Storage
3
+ description: Configure S3 or Cloudflare R2 compatible storage and presigned uploads.
4
+ ---
5
+
6
+ # Storage
7
+
8
+ The storage layer is compatible with S3-style providers such as AWS S3, Cloudflare R2, and MinIO.
9
+
10
+ ## Main files
11
+
12
+ | Path | Purpose |
13
+ | --- | --- |
14
+ | `src/features/storage/providers/s3.ts` | S3-compatible provider |
15
+ | `src/features/storage/actions.ts` | Storage Server Actions |
16
+ | `src/features/storage/utils.ts` | Utility helpers |
17
+ | `src/features/storage/types.ts` | Storage types |
18
+ | `src/app/api/upload/presigned/route.ts` | Presigned upload endpoint |
19
+ | `src/app/image-proxy/[...path]/route.ts` | Image proxy route |
20
+ | `src/test/storage/security.test.ts` | Storage security tests |
21
+
22
+ ## Environment variables
23
+
24
+ | Variable | Purpose |
25
+ | --- | --- |
26
+ | `STORAGE_ENDPOINT` | Provider endpoint, for example R2 endpoint |
27
+ | `STORAGE_REGION` | S3 region or provider-compatible value |
28
+ | `STORAGE_BUCKET` | Bucket name |
29
+ | `STORAGE_ACCESS_KEY_ID` | Access key |
30
+ | `STORAGE_SECRET_ACCESS_KEY` | Secret key |
31
+
32
+ ## Upload model
33
+
34
+ 1. Client requests a presigned upload URL.
35
+ 2. Server validates the request and returns upload metadata.
36
+ 3. Client uploads directly to the storage provider.
37
+ 4. App stores or uses the returned object key.
38
+ 5. Public display can go through the image proxy when needed.
39
+
40
+ ## Security checklist
41
+
42
+ - Validate file type and size before creating presigned URLs.
43
+ - Keep object keys scoped and hard to guess.
44
+ - Do not expose secret keys to the browser.
45
+ - Prefer private buckets plus signed reads or proxy routes.
46
+ - Run storage security tests after changing upload rules.
47
+
48
+ ```bash
49
+ pnpm test:run src/test/storage
50
+ ```
51
+
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: 管理后台和工单
3
+ description: 管理用户、角色、工单和客户支持流程。
4
+ ---
5
+
6
+ # 管理后台和工单
7
+
8
+ 模板内置了一个简单但可用的管理后台和工单系统。
9
+
10
+ ## 管理后台
11
+
12
+ Admin 路由在:
13
+
14
+ ```txt
15
+ src/app/[locale]/(admin)/admin
16
+ ```
17
+
18
+ 主要组件:
19
+
20
+ | 路径 | 作用 |
21
+ | --- | --- |
22
+ | `src/features/admin/components/admin-sidebar.tsx` | Admin 导航 |
23
+ | `src/app/[locale]/(admin)/admin/page.tsx` | Admin 概览 |
24
+ | `src/app/[locale]/(admin)/admin/users/page.tsx` | 用户管理 |
25
+ | `src/app/[locale]/(admin)/admin/tickets/page.tsx` | 工单队列 |
26
+ | `src/app/[locale]/(admin)/admin/tickets/[id]/page.tsx` | 工单详情 |
27
+
28
+ ## 工单系统
29
+
30
+ 用户工单路由在:
31
+
32
+ ```txt
33
+ src/app/[locale]/(dashboard)/dashboard/support
34
+ ```
35
+
36
+ 功能文件:
37
+
38
+ | 路径 | 作用 |
39
+ | --- | --- |
40
+ | `src/features/support/actions/ticket.ts` | 工单 actions |
41
+ | `src/features/support/actions/admin-users.ts` | Admin 用户 helpers |
42
+ | `src/features/support/components` | 工单表单、回复、状态控件 |
43
+ | `src/features/support/schemas` | 校验 schemas |
44
+ | `src/test/support` | 工单和 admin user 测试 |
45
+
46
+ ## 工单状态流
47
+
48
+ 推荐状态流:
49
+
50
+ ```txt
51
+ open -> in_progress -> resolved
52
+ ```
53
+
54
+ 回复用户时不要暴露内部日志、密钥或供应商错误详情。
55
+
56
+ ## 管理员权限
57
+
58
+ Admin 权限依赖当前用户的 role。本地测试时,创建用户后在数据库里设置 `role = 'admin'`。
59
+
60
+ ## 测试
61
+
62
+ ```bash
63
+ pnpm test:run src/test/support
64
+ ```
65
+
@@ -0,0 +1,71 @@
1
+ ---
2
+ title: 认证
3
+ description: 了解 Better Auth 集成、认证路由、角色和受保护页面。
4
+ ---
5
+
6
+ # 认证
7
+
8
+ 认证基于 Better Auth,并接入了 App Router、middleware、Dashboard 和 Admin 权限控制。
9
+
10
+ ## 主要文件
11
+
12
+ | 路径 | 作用 |
13
+ | --- | --- |
14
+ | `src/lib/auth/api.ts` | Better Auth API 配置 |
15
+ | `src/lib/auth/client.ts` | 客户端认证 helpers |
16
+ | `src/lib/auth/server.ts` | 服务端 session helpers |
17
+ | `src/lib/auth/edge.ts` | middleware 可用的认证检查和公开路由配置 |
18
+ | `src/lib/auth/admin.ts` | 管理员相关 helpers |
19
+ | `src/app/api/auth/[...all]/route.ts` | Better Auth route handler |
20
+ | `src/features/auth/components` | 登录、注册、找回密码 UI |
21
+
22
+ ## 支持的流程
23
+
24
+ | 流程 | 说明 |
25
+ | --- | --- |
26
+ | 邮箱密码 | 最基础的本地认证流程 |
27
+ | GitHub OAuth | 需要 GitHub OAuth app 凭证 |
28
+ | Google OAuth | 需要 Google Cloud OAuth 凭证 |
29
+ | 重置密码 | 需要邮件服务发送重置邮件 |
30
+ | 角色权限 | 使用 `user` 和 `admin` 区分普通用户和管理员 |
31
+
32
+ ## 公开和受保护路由
33
+
34
+ middleware 和 edge auth helpers 会判断哪些路由公开,哪些路由需要 session。公开路由包括营销页、认证页、博客、法律页面、文档和部分 API。
35
+
36
+ 用户登录后的页面在:
37
+
38
+ ```txt
39
+ src/app/[locale]/(dashboard)/dashboard
40
+ ```
41
+
42
+ 管理员页面在:
43
+
44
+ ```txt
45
+ src/app/[locale]/(admin)/admin
46
+ ```
47
+
48
+ ## 给自己设置管理员
49
+
50
+ 本地创建用户后,在数据库里把用户角色改成 `admin`:
51
+
52
+ ```sql
53
+ update "user"
54
+ set role = 'admin'
55
+ where email = 'you@example.com';
56
+ ```
57
+
58
+ 然后访问:
59
+
60
+ ```txt
61
+ /zh/admin
62
+ ```
63
+
64
+ ## 新增 OAuth Provider
65
+
66
+ 1. 在供应商控制台创建 OAuth 凭证。
67
+ 2. 把 client id 和 secret 写入 `.env.local`。
68
+ 3. 配置和 `BETTER_AUTH_URL` 匹配的 callback URL。
69
+ 4. 如果要展示按钮,更新认证 UI。
70
+ 5. 本地测试通过后再上生产。
71
+
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: 后台任务
3
+ description: 使用 Inngest 运行异步产品流程。
4
+ ---
5
+
6
+ # 后台任务
7
+
8
+ 后台任务使用 Inngest。适合处理不应该阻塞请求的流程,例如积分过期、投递重试、邮件批处理、异步产品任务等。
9
+
10
+ ## 主要文件
11
+
12
+ | 路径 | 作用 |
13
+ | --- | --- |
14
+ | `src/inngest/client.ts` | Inngest client |
15
+ | `src/inngest/functions.ts` | function 定义 |
16
+ | `src/inngest/index.ts` | exports |
17
+ | `src/app/api/inngest/route.ts` | Inngest route handler |
18
+ | `src/app/api/jobs/credits/expire/route.ts` | 积分过期 job endpoint |
19
+ | `src/test/jobs/cron-expire.test.ts` | job 测试 |
20
+
21
+ ## 本地开发
22
+
23
+ 先启动应用:
24
+
25
+ ```bash
26
+ pnpm dev
27
+ ```
28
+
29
+ 如果需要本地检查或触发 function,再使用 Inngest dev server。
30
+
31
+ ## 生产环境变量
32
+
33
+ | 变量 | 作用 |
34
+ | --- | --- |
35
+ | `INNGEST_EVENT_KEY` | 向 Inngest 发送事件 |
36
+ | `INNGEST_SIGNING_KEY` | 校验 Inngest 请求 |
37
+
38
+ ## Job 设计规则
39
+
40
+ - job 必须尽量幂等。
41
+ - 保存足够状态,方便 retry 后恢复。
42
+ - 不要因为重复 webhook 或重复事件重复发积分。
43
+ - 优先拆成小的可组合函数。
44
+ - 日志里记录 job id 和外部事件 id。
45
+
46
+ ## 测试
47
+
48
+ 修改过期逻辑后运行:
49
+
50
+ ```bash
51
+ pnpm test:run src/test/jobs
52
+ ```
53
+
@@ -0,0 +1,70 @@
1
+ ---
2
+ title: 配置说明
3
+ description: 配置 NextDevTpl 需要的必填和可选服务。
4
+ ---
5
+
6
+ # 配置说明
7
+
8
+ 项目通过环境变量配置。建议先填必填项,让项目跑起来,再按业务需要逐步打开外部服务。
9
+
10
+ ## 最小必填项
11
+
12
+ | 变量 | 作用 |
13
+ | --- | --- |
14
+ | `DATABASE_URL` | Drizzle 和 Better Auth 使用的 PostgreSQL 连接串 |
15
+ | `BETTER_AUTH_SECRET` | 用于签名认证/session 数据 |
16
+ | `BETTER_AUTH_URL` | Better Auth callback 和 cookie 使用的站点地址 |
17
+
18
+ 示例:
19
+
20
+ ```bash
21
+ DATABASE_URL="postgresql://postgres:password@localhost:5432/nextdevtpl"
22
+ BETTER_AUTH_SECRET="replace-with-a-random-secret"
23
+ BETTER_AUTH_URL="http://localhost:3000"
24
+ ```
25
+
26
+ ## 开发阶段推荐配置
27
+
28
+ | 服务 | 变量 | 说明 |
29
+ | --- | --- | --- |
30
+ | GitHub OAuth | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | 回调地址:`/api/auth/callback/github` |
31
+ | Google OAuth | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | 回调地址:`/api/auth/callback/google` |
32
+ | Resend | `RESEND_API_KEY`, `EMAIL_FROM` | 开启真实邮件验证和重置密码邮件 |
33
+
34
+ 如果没有配置邮件,先测试不依赖邮件投递的认证流程。
35
+
36
+ ## 可选产品服务
37
+
38
+ | 服务 | 变量 | 用途 |
39
+ | --- | --- | --- |
40
+ | Creem | `CREEM_API_KEY`, `CREEM_WEBHOOK_SECRET` | 订阅 checkout、积分购买、webhook |
41
+ | S3/R2 | `STORAGE_ENDPOINT`, `STORAGE_REGION`, `STORAGE_BUCKET`, `STORAGE_ACCESS_KEY_ID`, `STORAGE_SECRET_ACCESS_KEY` | 文件上传和代理访问 |
42
+ | Upstash Redis | `UPSTASH_REDIS_REST_URL`, `UPSTASH_REDIS_REST_TOKEN` | API 和匿名访问限流 |
43
+ | Axiom | `AXIOM_TOKEN`, `AXIOM_DATASET` | 云端结构化日志 |
44
+ | Sentry | `NEXT_PUBLIC_SENTRY_DSN`, `SENTRY_AUTH_TOKEN` | 错误监控和 release 上传 |
45
+ | AI Provider | `OPENAI_API_KEY` 以及供应商相关配置 | `src/lib/ai` 抽象层 |
46
+ | Inngest | `INNGEST_EVENT_KEY`, `INNGEST_SIGNING_KEY` | 生产后台任务 |
47
+
48
+ ## 降级策略
49
+
50
+ 可选服务不应该阻断基础启动。预期行为如下:
51
+
52
+ | 缺少服务 | 预期行为 |
53
+ | --- | --- |
54
+ | Redis | 限流降级,不让应用启动失败 |
55
+ | Axiom | 日志输出到本地 |
56
+ | Sentry | 监控 no-op 或 console-only |
57
+ | Storage | 上传功能不可用,但应用外壳可运行 |
58
+ | Creem | 支付流程不可用,非支付页面可运行 |
59
+ | Inngest keys | 本地开发不强依赖生产签名密钥 |
60
+
61
+ ## 常改配置入口
62
+
63
+ | 路径 | 修改内容 |
64
+ | --- | --- |
65
+ | `src/config/site.ts` | 站点名、URL、metadata、社交链接 |
66
+ | `src/config/nav.ts` | Header、Footer、Dashboard、Admin 导航 |
67
+ | `src/config/payment.ts` | 支付产品和 checkout 配置 |
68
+ | `src/config/subscription-plan.ts` | 套餐限制和价格展示 |
69
+ | `messages/*.json` | UI 文案 |
70
+ | `.env.local` | 本地密钥和服务凭证 |
@@ -0,0 +1,69 @@
1
+ ---
2
+ title: 积分系统
3
+ description: 了解内置积分系统、账本记录和过期模型。
4
+ ---
5
+
6
+ # 积分系统
7
+
8
+ 积分模块是 NextDevTpl 的核心产品能力之一,适合 AI 工具、按量计费 SaaS、付费导出等场景。
9
+
10
+ ## 主要文件
11
+
12
+ | 路径 | 作用 |
13
+ | --- | --- |
14
+ | `src/features/credits/core.ts` | 余额和交易核心逻辑 |
15
+ | `src/features/credits/actions.ts` | 积分相关 Server Actions |
16
+ | `src/features/credits/config.ts` | 积分套餐和展示配置 |
17
+ | `src/features/credits/components` | 余额、用量、购买、历史记录 UI |
18
+ | `src/app/[locale]/(dashboard)/dashboard/credits/buy` | 积分购买页 |
19
+ | `src/test/credits` | 积分完整性和购买测试 |
20
+
21
+ ## 核心概念
22
+
23
+ | 概念 | 说明 |
24
+ | --- | --- |
25
+ | Balance | 用户当前可用积分 |
26
+ | Transaction | 一次积分变动记录 |
27
+ | Batch | 一批同来源、同过期规则的积分 |
28
+ | FIFO 过期 | 老批次积分优先消耗 |
29
+ | Purchase package | 一次性购买的积分套餐 |
30
+
31
+ ## 典型流程
32
+
33
+ ### 购买积分
34
+
35
+ 1. 用户进入 `/dashboard/credits/buy`。
36
+ 2. 选择积分套餐。
37
+ 3. 支付层创建 checkout。
38
+ 4. webhook 确认付款成功。
39
+ 5. 给用户发放积分。
40
+ 6. 交易历史记录这次购买。
41
+
42
+ ### 消耗积分
43
+
44
+ 业务功能不要直接改一个余额数字,应该调用 credits core。这样才能保留审计记录和过期规则。
45
+
46
+ ### 过期积分
47
+
48
+ 过期依赖批次 metadata 和后台任务。后台任务说明见 [后台任务](/zh/docs/background-jobs)。
49
+
50
+ ## 修改积分套餐
51
+
52
+ 编辑:
53
+
54
+ ```txt
55
+ src/features/credits/config.ts
56
+ ```
57
+
58
+ 套餐 ID 一旦进入支付或审计记录,就不要随意改名。
59
+
60
+ ## 测试
61
+
62
+ 修改积分逻辑后运行:
63
+
64
+ ```bash
65
+ pnpm test:run src/test/credits
66
+ ```
67
+
68
+ 积分 bug 本质上是财务/账务 bug,不只是 UI bug。
69
+
@@ -0,0 +1,95 @@
1
+ ---
2
+ title: 二开指南
3
+ description: 常见品牌、导航、定价、页面和模块定制入口。
4
+ ---
5
+
6
+ # 二开指南
7
+
8
+ 这页列出把 NextDevTpl 改成自己 SaaS 时最常见的修改入口。
9
+
10
+ ## 品牌
11
+
12
+ | 修改项 | 路径 |
13
+ | --- | --- |
14
+ | 站点名、URL、metadata | `src/config/site.ts` |
15
+ | Logo | `public/logo.svg` 和 Header 组件 |
16
+ | 全局样式 | `src/app/globals.css` |
17
+ | Open Graph 图片模板 | `src/features/shared/components/og-image-template.tsx` |
18
+
19
+ ## 导航
20
+
21
+ | 区域 | 路径 |
22
+ | --- | --- |
23
+ | Header 和 Footer | `src/config/nav.ts` |
24
+ | Dashboard 侧边栏 | `src/config/nav.ts` 和 `src/features/dashboard/components/sidebar.tsx` |
25
+ | Admin 侧边栏 | `src/config/nav.ts` 和 `src/features/admin/components/admin-sidebar.tsx` |
26
+
27
+ ## 首页
28
+
29
+ 营销页组件在:
30
+
31
+ ```txt
32
+ src/features/marketing/components
33
+ ```
34
+
35
+ 首页路由在:
36
+
37
+ ```txt
38
+ src/app/[locale]/(marketing)/page.tsx
39
+ ```
40
+
41
+ 大部分文案在:
42
+
43
+ ```txt
44
+ messages/en.json
45
+ messages/zh.json
46
+ ```
47
+
48
+ ## 定价和套餐
49
+
50
+ | 修改项 | 路径 |
51
+ | --- | --- |
52
+ | 套餐名和限制 | `src/config/subscription-plan.ts` |
53
+ | 支付产品映射 | `src/config/payment.ts` |
54
+ | 定价区 UI | `src/features/marketing/components/pricing-section.tsx` |
55
+ | 订阅 UI | `src/features/subscription` |
56
+
57
+ ## 新增产品模块
58
+
59
+ 新功能建议放在:
60
+
61
+ ```txt
62
+ src/features/<your-feature>
63
+ ```
64
+
65
+ 推荐结构:
66
+
67
+ ```txt
68
+ src/features/example/
69
+ ├── actions.ts
70
+ ├── components/
71
+ ├── schemas/
72
+ ├── types.ts
73
+ └── index.ts
74
+ ```
75
+
76
+ 路由组合放在 `src/app`,可复用业务逻辑放在 feature module。
77
+
78
+ ## 内容
79
+
80
+ | 内容 | 路径 |
81
+ | --- | --- |
82
+ | 文档 | `src/content/docs/<locale>` |
83
+ | 博客 | `src/content/blog/<locale>` |
84
+ | 法律页面 | `src/content/legal/<locale>` |
85
+ | PSEO 数据 | `src/features/pseo/data/pseo-pages.json` |
86
+
87
+ ## 提交前检查
88
+
89
+ ```bash
90
+ pnpm typecheck
91
+ pnpm lint
92
+ ```
93
+
94
+ 如果改了认证、积分、支付、存储、工单或后台任务,要跑对应测试。
95
+
@@ -0,0 +1,66 @@
1
+ ---
2
+ title: 数据库
3
+ description: 在 NextDevTpl 中使用 PostgreSQL 和 Drizzle ORM。
4
+ ---
5
+
6
+ # 数据库
7
+
8
+ NextDevTpl 使用 PostgreSQL 和 Drizzle ORM。schema 是认证、积分、支付、工单和用户数据的事实来源。
9
+
10
+ ## 主要文件
11
+
12
+ | 路径 | 作用 |
13
+ | --- | --- |
14
+ | `src/db/schema.ts` | 表结构定义 |
15
+ | `src/db/index.ts` | 数据库 client |
16
+ | `drizzle.config.ts` | Drizzle 配置 |
17
+ | `drizzle/` | 生成的迁移和 snapshot |
18
+ | `src/test/utils/db.ts` | 测试数据库 helpers |
19
+
20
+ ## 开发流程
21
+
22
+ 新本地数据库:
23
+
24
+ ```bash
25
+ pnpm db:push
26
+ ```
27
+
28
+ 需要评审和部署的 schema 变更:
29
+
30
+ ```bash
31
+ pnpm db:generate
32
+ pnpm db:migrate
33
+ ```
34
+
35
+ 查看本地数据:
36
+
37
+ ```bash
38
+ pnpm db:studio
39
+ ```
40
+
41
+ ## push 和 migration 的区别
42
+
43
+ | 命令 | 使用场景 |
44
+ | --- | --- |
45
+ | `pnpm db:push` | 本地初始化或快速迭代 |
46
+ | `pnpm db:generate` | 修改了 `src/db/schema.ts`,需要生成迁移文件 |
47
+ | `pnpm db:migrate` | 执行已提交的迁移 |
48
+
49
+ ## schema 修改 checklist
50
+
51
+ 1. 修改 `src/db/schema.ts`。
52
+ 2. 更新读写该表的 feature service/action。
53
+ 3. 根据环境选择 push 或 migration。
54
+ 4. 在 `src/test` 补测试。
55
+ 5. 运行 `pnpm typecheck` 和相关测试。
56
+
57
+ ## 常见表区域
58
+
59
+ | 区域 | 使用方 |
60
+ | --- | --- |
61
+ | 用户和 session | Better Auth |
62
+ | 积分和交易 | Credits ledger 和购买流程 |
63
+ | 订阅 | 支付和套餐查询 |
64
+ | 工单 | 用户工单和后台处理 |
65
+ | 存储记录 | 上传和安全测试 |
66
+