open-saas 完整实战教程:用订阅支付与文件上传三模块搭好生产级 SaaS
【免费下载链接】open-saasA 100% free modern JS SaaS boilerplate (React, NodeJS, Prisma). Full-featured: Auth (email, google, github, slack, MS), Email sending, Background jobs, Landing page, Payments (Stripe, Polar.sh), Shadcn UI, S3 file upload. AI-ready with tailored AGENTS.md, skills, and Claude Code plugin. One cmd deploy. Powered by Wasp full-stack framework.项目地址: https://gitcode.com/GitHub_Trending/op/open-saas
open-saas 是一个 100% 免费开源的 SaaS 启动模板,基于 React、Node.js 和 Prisma,内置了多认证方式登录、订阅支付、S3 文件上传和后台管理面板这一整套 RESTful API。如果你打算从零做一个能收钱的 SaaS 产品,又不想从零手写这些基础接口,这套模板基本可以直接跑起来。
🧩 做一个 SaaS,最先要写的是哪些代码?
如果你要做一个订阅制产品,脑子里第一个冒出来的往往不是"功能设计",而是"这些基础接口谁来写":怎么校验用户身份和角色?用户点了"购买"之后去哪创建支付会话?文件传完了怎么记录元数据?这些东西跟你的业务无关,但每个项目都得重写一遍,还容易写错。
open-saas 的思路是把这些"公共接口"做成现成的 RESTful API,按业务领域切成 user、payment、file-upload 等模块,每个模块一个独立目录,看一个目录就是一条完整业务链路。
⚡ 五分钟在本地跑起来
模板放在template/目录下,应用本体用 Wasp 框架构建,一条命令启动。
git clone https://gitcode.com/GitHub_Trending/op/open-saas克隆后进入template/app,执行npm install和npm run dev,登录页、定价页、文件上传演示页就都好了。后台管理面板自带用户列表和收入统计,很适合先跑一遍找找手感。
项目跑通后,这些接口是怎么写权限的?
🔒 普通用户和管理员是怎么区分的?
打开用户模块 template/app/src/user/operations.ts,能看到一个非常统一的套路:每个操作先用 Zod schema 校验入参,再检查context.user。
if (!context.user.isAdmin) { throw new HttpError( 403, "Only admins are allowed to perform this operation" ); }getPaginatedUsers按每页 10 条返回用户,支持按邮箱、管理员、订阅状态筛选;updateIsUserAdminById负责切换管理员身份。两个操作都统一用 401/403 拒绝越权请求,前端拿到错误码提示用户即可,不用各自发明错误格式。
用户管起来了,那他们怎么付钱?
💳 支付:从计划定义到结账会话
想加一个"10 次点数"的购买包要改什么?答案在 template/app/src/payment/plans.ts:
export enum PaymentPlanId { Hobby = "hobby", Pro = "pro", Credits10 = "credits10", }订阅和点数包通过计划的effect字段区分(subscription 或 credits)。定价页 PricingPage.tsx 直接遍历这个枚举渲染卡片,所以新增计划几乎不用改页面。
用户点"Buy plan"后,前端调用 payment/operations.ts 里的generateCheckoutSession:先校验登录态和邮箱,再让支付处理器创建会话并返回结账 URL。已订阅用户则走getCustomerPortalUrl,跳转到订阅管理页。
支付打通了,用户生成的内容又放在哪?
📁 文件上传的完整链路
上传走"两步走":先从服务端拿预签名 URL,把文件直传 S3,再把元数据落库。整条链路在 file-upload/operations.ts 里:
createFileUploadUrl:校验文件类型和文件名,签发预签名上传 URLaddFileToDb:先确认文件确实存在于 S3,再写入数据库deleteFile:先删数据库记录,再清理 S3,失败只记日志,避免留孤儿记录
允许的文件类型和 5MB 大小上限集中在 file-upload/validation.ts,放宽限制只改这一个文件。
🛠️ 想换支付商,动哪里?
模板默认接的是 Stripe,但想换 Lemon Squeezy 或 Polar 只改一行。payment/paymentProcessor.ts 里的PaymentProcessor接口定义了结账会话、客户门户、webhook、收入汇总的统一契约,三家处理器各自独立成目录,切换时只换掉导出那一行。
理解了这个"接口 + 可插拔实现"的写法,你自己加新的支付渠道、新的业务模块时也就有模板可循了。
不管你做的是 AI 套壳、视频工具还是订阅服务,open-saas 已经把认证、支付、上传、管理面板这些重复劳动搬进了模板,你的精力可以全放在自己的业务逻辑上。想继续深入,可以从这几处开始:
- 模板说明:template/README.md
- 端到端测试用例:template/e2e-tests/
- 文档与博客站点:opensaas-sh/blog/
【免费下载链接】open-saasA 100% free modern JS SaaS boilerplate (React, NodeJS, Prisma). Full-featured: Auth (email, google, github, slack, MS), Email sending, Background jobs, Landing page, Payments (Stripe, Polar.sh), Shadcn UI, S3 file upload. AI-ready with tailored AGENTS.md, skills, and Claude Code plugin. One cmd deploy. Powered by Wasp full-stack framework.项目地址: https://gitcode.com/GitHub_Trending/op/open-saas
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考