云乐坊
云乐坊是面向独立开发者的工具与资源平台。本仓库包含 www.yunle.fun 的 Nuxt 应用、CloudBase 云函数,以及跨应用统一登录使用的授权核心。
功能
- 平台首页与由 SSO Client Registry 驱动的应用导航
- 手机号 / GitHub 自动注册登录、已绑定邮箱验证码与密码登录,以及跨站 SSO(详见 账号注册与用户名规范)
- 开发者平台、应用管理、文档和博客
- 会员、微信支付、App Store 内购与奖励领取
- 测试身份、事务邮件和后台运维能力
- 中文、英文与日文界面
公开展示页面优先使用可缓存和预渲染能力;登录、账户、支付等功能使用 Nuxt 服务端运行时和 CloudBase 私有服务。
技术架构
- Nuxt 4、Vue 3、Nuxt UI 4 和 Tailwind CSS
- pnpm workspace,内部授权包位于
packages/authorization-core - 腾讯云 CloudBase:认证、数据库和云函数
- EdgeOne Pages:正式网站;Cloudflare Pages:兼容性构建与预览
- Vitest、ESLint 和 Nuxt TypeScript 检查
业务数据库已选定未来采用 PostgreSQL,当前仍运行在 CloudBase NoSQL,尚未启动迁移。腾讯云配置、费用基线和跨仓库分阶段迁移约束见 PostgreSQL 选型与迁移规划。
主站通过 YunLeFun Design 统一外观:@yunlefun/ui@0.0.6 提供共享明暗主题,design-tokens.css 将其映射到 Nuxt UI 与本地控件,@yunlefun/vue@0.4.2 提供徽标和分隔线。App* 封装保留路由、表单与业务接口;可选的 tone 使用 blue | sun | cyan | coral | pink | green,成功、提醒、错误等状态色不受 tone 覆盖。接入范围和业务样式例外见 设计系统迁移说明。
本地开发
环境要求
- Node.js 22 或更高版本
- pnpm 11(仓库通过
packageManager固定版本)
启动
corepack enable
pnpm install
cp .env.example .env.local
pnpm dev
应用默认运行在 http://localhost:3000。只修改公开页面时,可保留大多数可选服务变量为空;账号、支付、邮件或云函数开发必须使用自己的 development 环境和密钥。不要把真实凭据写入仓库。
常用命令:
| 命令 | 用途 |
|---|---|
pnpm dev |
启动本地 Nuxt 开发服务器 |
pnpm build |
构建生产应用并校验客户端路由壳 |
pnpm preview |
本地预览生产构建 |
pnpm lint |
运行 ESLint |
pnpm typecheck |
运行 Nuxt TypeScript 检查 |
pnpm test |
运行完整 Vitest 测试 |
pnpm build:authorization-core |
构建共享授权核心 |
所有可配置项及用途见 .env.example。只有 NUXT_PUBLIC_* 变量可以进入浏览器;其他变量必须只保存在本地忽略文件或部署平台的 Secret 中。
目录结构
| 目录 | 内容 |
|---|---|
app/ |
Nuxt 页面、组件、状态和客户端逻辑 |
server/ |
Nitro 服务端 API 与中间件 |
cloudfunctions/ |
CloudBase 云函数源码 |
packages/authorization-core/ |
Registry、签名和授权共享实现 |
content/ |
文档与博客内容 |
docs/ |
架构、集成、迁移和运维说明 |
tests/ |
单元、集成和工作流回归测试 |
SSO Client Registry
应用展示、允许的 Origin、回调地址和接入类型统一由 Client Registry 管理。开发环境可以自动生成、校验、合并并部署 Registry;production 发布必须经过人工 owner 审批,或经过受管 YunLeFun 客户端的独立机器策略审批,并继续通过显式环境门禁。机器策略仅允许纯新增、低权限、精确 HTTPS 回调且有实时官方应用/EdgeOne 项目归属证明的客户端;不会注册 *.yunle.fun 通配回调。
不要手工修改 packages/authorization-core/src/generated/*-registry.json 或 *-release.json。接入方式、静态页面适配器和发布模型见 SSO 集成指南。
部署
网站
main 分支由 EdgeOne Pages 的 Git 集成部署到正式站点。Cloudflare Pages 连接同一分支,用作 cloudflare-pages preset 的构建检查和预览;正式域名与生产流量仍以 EdgeOne Pages 为准。
仓库使用 nuxt build 和 Nitro node-server hybrid 运行时。上线前必须在平台配置服务端变量,特别是 NUXT_SESSION_PASSWORD。会话迁移与共享领取密钥要求见 Cookie Session 迁移说明。
CloudBase 云函数
普通云函数不会随网站自动发布。部署脚本会先检查目标环境和 {{env.*}} 占位符,缺少任何变量都会在构建前失败:
node scripts/deploy-function.mjs <function-name>
sso-registry-admin、sso-ticket 和 desktop-auth 依赖 vendored @yunlefun/authorization-core,必须同步构建和发布:
node scripts/build-cloud-function.mjs sso-registry-admin sso-ticket desktop-auth
完整的环境变量、数据库索引、密钥轮换和函数部署说明见 cloudfunctions/README.md。任何 production 变更都应先在 development 完成 smoke,并保留显式审批。
包发布
根项目和两个 workspace 包当前均为 private: true。开源源码不依赖 npm 发布;只有未来需要让其他仓库独立安装稳定 SDK 时,才应单独设计公开包、版本兼容策略和 npm provenance 发布链路。
参与贡献
提交问题或代码前请阅读 贡献指南 与 行为准则。安全漏洞请按 安全策略 私下报告,不要创建公开 Issue。
许可证
MIT © YunLeFun contributors
