Skip to content

runphp/lasaas

Repository files navigation

Lasaas - Laravel 多租户 SaaS 平台

Laravel Livewire Filament PHP License Tests

📖 项目简介

Lasaas 是一个基于 Laravel 生态构建的现代化多租户 SaaS 平台,采用独立数据库隔离方案,为每个租户提供完全独立的数据存储空间。项目整合了 Livewire、Filament、Spatie Permission 和 Stancl/Tenancy 等优秀组件,提供了完整的用户管理、团队协作、权限控制和多租户解决方案。

🎯 适用场景

  • SaaS 应用开发:快速构建多租户 SaaS 产品
  • 企业级应用:需要数据隔离的多客户系统
  • 团队协作平台:支持多团队、多角色的协作工具
  • 白标解决方案:可为不同客户提供独立域名和品牌

✨ 核心特性

🏢 多租户架构

  • 独立数据库隔离:每个租户拥有独立的数据库,确保数据安全和隐私
  • 独立域名支持:每个租户可配置专属域名访问(如 tenant.example.com)
  • 自动租户初始化:创建租户时自动完成数据库创建、迁移等流程
  • 资源隔离:缓存、文件系统、队列等资源按租户隔离
  • 租户状态管理:支持租户激活、过期、禁用等状态管理
  • 灵活的数据库驱动:支持 MySQL、PostgreSQL、SQLite 等多种数据库

👤 中央管理平台(Central App)

个人中心(Livewire + Flux UI)

  • 用户注册/登录(支持双因素认证、Passkeys 无密码登录)
  • 个人资料管理(头像、姓名、邮箱等)
  • 安全设置(密码修改、两步验证、会话管理)
  • 团队管理
    • 创建和管理多个团队
    • 邀请成员加入团队
    • 角色权限分配(Admin/Member)
    • 团队成员管理(移除、角色变更)
    • 团队切换功能
  • 外观偏好设置(主题、语言等)
  • 团队邀请链接接受

管理后台(Filament Admin Panel)

  • 用户管理

    • 查看所有注册用户列表
    • 用户状态管理(激活/禁用)
    • 用户详情查看与编辑
    • 用户角色分配
  • 租户管理

    • 创建新租户(自动生成数据库)
    • 租户列表查看与筛选
    • 租户域名配置与管理
    • 租户状态管理(激活/过期/禁用)
    • 租户数据统计
    • 租户信息维护(名称、联系方式等)
  • 团队管理

    • 全局团队视图
    • 团队数据统计
    • 团队成员查询
  • 权限管理(Filament Shield)

    • 角色定义与管理
    • 权限分配与控制
    • 访问控制策略
    • 细粒度权限管理

🏠 租户管理平台(Tenant App)

每个租户拥有独立的 Filament 管理后台,通过专属域名访问:

  • 用户管理

    • 租户内部用户 CRUD(创建、读取、更新、删除)
    • 用户角色分配与管理
    • 用户激活/禁用控制
    • 用户数据隔离
  • 团队管理

    • 团队信息维护
    • 团队成员管理
    • 团队权限配置
    • 团队邀请管理
  • 权限管理

    • 基于 Spatie Permission 的 RBAC(角色基于访问控制)
    • 细粒度权限控制
    • 角色继承与组合
    • 权限中间件保护
  • 可扩展性

    • 支持自定义业务模块
    • 租户级别的配置定制
    • 独立的数据库迁移

🛠️ 技术栈

后端框架

  • Laravel 13.x - PHP Web 应用框架
  • PHP 8.3+ - 编程语言

前端技术

  • Livewire 4.x - 全栈 Reactivity 框架,无需编写 JavaScript
  • Flux UI 2.x - 专业的 Livewire 组件库
  • Alpine.js - 轻量级 JavaScript 框架
  • Tailwind CSS 4.x - 实用优先的 CSS 框架
  • Vite 8.x - 现代前端构建工具

管理面板

  • Filament 5.x - Laravel 管理面板构建器
    • Forms - 强大的表单构建器
    • Tables - 数据表格展示与筛选
    • Notifications - 实时通知系统
    • Widgets - 数据可视化组件
    • Filament Shield - 权限管理集成

多租户

  • Stancl/Tenancy 3.x - Laravel 多租户解决方案
    • 数据库自动隔离
    • 域名路由识别
    • 资源自动隔离(缓存、文件系统、队列)
    • 租户生命周期管理

权限管理

  • Spatie Laravel Permission 7.x - 角色和权限管理
    • RBAC(角色基于访问控制)
    • 多模型权限支持
    • 权限缓存优化

认证授权

  • Laravel Fortify - 无头认证后端
    • 双因素认证(2FA)
    • Passkeys 无密码登录支持
    • 邮箱验证
    • 密码重置

国际化

  • Laravel Lang - 多语言支持
    • 中文(简体)
    • 英文
    • 易于扩展其他语言

开发工具

  • Pest 4.x - 优雅的 PHP 测试框架
  • Laravel Pint - 代码风格修复工具(PHP-CS-Fixer)
  • DDEV - 本地开发环境管理
  • Laravel Pail - 日志查看工具
  • Concurrently - 并行任务执行

📁 项目结构

lasaas/
├── app/
│   ├── Actions/           # 业务逻辑动作类(Fortify、Teams)
│   ├── Concerns/          # Traits(可复用特性)
│   ├── Enums/             # 枚举类(TeamRole、TeamPermission、TenantStatus)
│   ├── Filament/          # Filament 管理面板资源
│   │   ├── Resources/     # 资源管理(Users、Tenants、Teams、Roles)
│   │   ├── Pages/         # 自定义页面
│   │   └── Widgets/       # 数据小组件
│   ├── Http/              # HTTP 相关(Controllers、Middleware、Responses)
│   ├── Livewire/          # Livewire 组件
│   ├── Models/            # Eloquent 数据模型(User、Team、Tenant、Membership等)
│   ├── Notifications/     # 通知类
│   ├── Policies/          # 授权策略类
│   ├── Providers/         # 服务提供者
│   ├── Rules/             # 自定义验证规则
│   └── Support/           # 辅助类
├── config/                # 配置文件(tenancy、fortify、filament、permission等)
├── database/
│   ├── migrations/        # 中央数据库迁移
│   │   └── tenant/        # 租户数据库迁移模板
│   ├── seeders/           # 数据填充器
│   └── factories/         # 模型工厂(测试用)
├── resources/
│   ├── views/             # Blade 视图模板
│   │   ├── components/    # Blade 组件
│   │   ├── layouts/       # 布局模板
│   │   ├── pages/         # 页面视图(auth、teams、profile)
│   │   └── flux/          # Flux UI 组件覆盖
│   ├── js/                # JavaScript 文件
│   └── css/               # CSS 样式文件
├── routes/                # 路由定义
│   ├── web.php            # 中央应用路由
│   ├── tenant.php         # 租户应用路由
│   ├── settings.php       # 设置相关路由
│   └── console.php        # Artisan 命令路由
├── tests/                 # 测试文件
│   ├── Feature/           # 功能测试
│   └── Unit/              # 单元测试
├── public/                # 公共资源目录(入口文件、构建产物)
├── storage/               # 存储目录(app、framework、logs)
├── lang/                  # 多语言文件(en、zh_CN)
├── .ddev/                 # DDEV 开发环境配置
├── .env.example           # 环境变量示例
├── composer.json          # Composer 依赖配置
├── package.json           # NPM 依赖配置
├── vite.config.js         # Vite 构建配置
└── artisan                # Laravel Artisan 命令行工具

🚀 快速开始

环境要求

  • PHP 8.3+
  • Composer
  • Node.js & NPM
  • MySQL/MariaDB 或 PostgreSQL
  • DDEV(可选,推荐用于本地开发)

安装步骤

方式一:使用 DDEV(推荐)

  1. 克隆项目
git clone <repository-url> lasaas
cd lasaas
  1. 启动 DDEV 环境
ddev start
  1. 安装依赖并初始化
ddev composer install
ddev npm install
ddev artisan key:generate
ddev artisan migrate
ddev npm run build
  1. 访问应用
  • 中央应用:https://lasaas.ddev.site
  • 租户应用:https://{tenant-id}.lasaas.ddev.site

方式二:手动安装

  1. 克隆项目并安装依赖
git clone <repository-url> lasaas
cd lasaas
composer install
npm install
  1. 配置环境变量
cp .env.example .env
php artisan key:generate

编辑 .env 文件,配置数据库连接:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lasaas_central
DB_USERNAME=root
DB_PASSWORD=
  1. 运行数据库迁移
php artisan migrate
  1. 编译前端资源
npm run build
  1. 启动开发服务器
# 方式一:使用 Laravel 内置命令
php artisan serve

# 方式二:使用完整开发环境(推荐)
composer run dev

初始配置

  1. 创建第一个用户 访问注册页面创建管理员账户

  2. 创建第一个租户 在管理后台或通过 Artisan 命令:

php artisan tinker
>>> \App\Models\Tenant::create(['id' => 'demo']);
>>> \App\Models\Domain::create(['domain' => 'demo.lasaas.test', 'tenant_id' => 'demo']);
  1. 运行租户迁移
php artisan tenants:migrate

📝 使用说明

中央应用功能

用户注册与登录

  • 访问首页进行用户注册
  • 支持邮箱验证
  • 支持双因素认证(2FA)
  • 支持 Passkeys 无密码登录

团队管理

  1. 创建团队

    • 点击团队切换器中的"创建团队"
    • 输入团队名称和 Slug
    • 系统自动生成唯一团队标识
  2. 邀请成员

    • 进入团队设置页面
    • 点击"邀请成员"
    • 输入邮箱地址选择角色
    • 发送邀请邮件
  3. 管理成员

    • 查看团队成员列表
    • 修改成员角色(Admin/Member)
    • 移除团队成员

管理后台

访问 /admin 进入 Filament 管理面板:

  • 管理所有用户
  • 创建和管理租户
  • 配置租户域名
  • 查看系统统计

租户应用功能

访问租户后台

通过配置的域名访问租户应用:

https://your-tenant-domain.com/admin

租户内部管理

  • 管理租户内部用户
  • 配置团队权限
  • 自定义业务逻辑

🔧 开发指南

添加新的租户资源

  1. 创建迁移文件
php artisan make:migration create_posts_table --path=database/migrations/tenant
  1. 创建模型
php artisan make:model Post
  1. 创建 Filament 资源
php artisan make:filament-resource Post --tenant
  1. 运行租户迁移
php artisan tenants:migrate

自定义权限

  1. 定义角色和权限
// 在服务提供者中
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'manager']);
$permission = Permission::create(['name' => 'edit-posts']);
$role->givePermissionTo($permission);
  1. 在代码中使用
// 检查权限
$user->can('edit-posts');

// 检查角色
$user->hasRole('manager');

测试

运行所有测试:

composer test

运行特定测试:

php artisan test --filter=TeamTest

📦 可用命令

Artisan 命令

租户管理

# 创建新租户
php artisan tenants:create

# 列出所有租户
php artisan tenants:list

# 为所有租户运行迁移
php artisan tenants:migrate

# 为特定租户运行迁移
php artisan tenants:migrate --tenants=demo,prod

# 填充租户数据
php artisan tenants:seed

# 删除租户及其数据库
php artisan tenants:delete {tenant_id}

权限管理(Filament Shield)

# 生成所有资源的权限
php artisan shield:generate --all

# 生成特定资源的权限
php artisan shield:generate --resource=User

# 安装 Shield
php artisan shield:install

常规命令

# 清除缓存
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

# 缓存优化
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize

# 查看路由列表
php artisan route:list

# 数据库相关
php artisan migrate
php artisan migrate:rollback
php artisan db:seed
php artisan db:wipe

# 队列管理
php artisan queue:work
php artisan queue:restart
php artisan queue:flush

NPM 脚本

# 开发模式(带热重载)
npm run dev

# 生产构建
npm run build

# 预览生产构建
npm run preview

Composer 脚本

# 完整初始化项目
composer run setup

# 启动开发环境(服务器+队列+日志+Vite)
composer run dev

# 格式化代码
composer run lint

# 检查代码风格
composer run lint:check

# 运行测试
composer run test

# CI 检查
composer run ci:check

DDEV 命令

# 启动环境
ddev start

# 停止环境
ddev stop

# 重启环境
ddev restart

# 删除环境(保留数据)
ddev delete

# 进入 Web 容器
ddev ssh

# 查看日志
ddev logs

# 访问数据库
ddev mysql

# 邮件预览
ddev mailhog

# 执行 Composer 命令
ddev composer install

# 执行 NPM 命令
ddev npm run dev

# 执行 Artisan 命令
ddev artisan migrate

🔐 安全考虑

Lasaas 采用了多层次的安全措施:

  • 数据隔离:每个租户独立数据库,数据完全隔离
  • 密码加密:使用 bcrypt 算法加密存储密码
  • 双因素认证:支持 TOTP 和 Passkeys
  • CSRF 保护:所有表单请求自动验证 CSRF token
  • XSS 防护:Blade 模板自动转义输出
  • SQL 注入防护:Eloquent ORM 使用参数化查询
  • RBAC 权限控制:基于角色的访问控制
  • 中间件保护:租户隔离验证、身份认证中间件
  • 邮箱验证:新用户必须验证邮箱
  • 会话管理:支持查看和管理活跃会话
  • 速率限制:防止暴力破解和 DDoS 攻击

安全最佳实践

  1. 生产环境配置

    APP_DEBUG=false
    APP_ENV=production
  2. 定期更新依赖

    composer update
    npm update
  3. 备份策略

    • 定期备份中央数据库
    • 定期备份所有租户数据库
    • 备份文件系统和用户上传内容
  4. 监控和日志

    • 启用错误监控(如 Sentry)
    • 定期审查日志文件
    • 设置异常报警

🤝 贡献指南

欢迎提交 Issue 和 Pull Request!

贡献流程

  1. Fork 本仓库 点击 GitHub 页面右上角的 Fork 按钮

  2. 创建特性分支

    git checkout -b feature/AmazingFeature
  3. 提交更改

    git commit -m 'Add some AmazingFeature'
  4. 推送到分支

    git push origin feature/AmazingFeature
  5. 开启 Pull Request 在 GitHub 上创建 Pull Request,描述您的更改

代码规范

  • 遵循 PSR-12 编码规范
  • 使用 Laravel Pint 格式化代码:composer run lint
  • 编写测试用例覆盖新功能
  • 更新相关文档

报告问题

如果您发现了 bug 或有功能建议:

  1. 搜索现有 Issues,避免重复报告
  2. 创建新的 Issue,详细描述问题
  3. 提供重现步骤(如适用)
  4. 包含环境信息(PHP 版本、数据库等)

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。

🙏 致谢

❓ 常见问题(FAQ)

一般问题

Q: 如何创建第一个管理员账户?

A: 访问注册页面创建账户,然后使用 Tinker 分配角色:

php artisan tinker
>>> $user = \App\Models\User::find(1);
>>> $user->assignRole('super_admin');

Q: 如何重置密码?

A: 在登录页面点击“忘记密码”,输入邮箱地址接收重置链接。

Q: 支持哪些数据库?

A: 支持 MySQL 8.0+、MariaDB 10.5+、PostgreSQL 14+ 和 SQLite(开发环境)。

多租户相关

Q: 如何为新租户配置域名?

A: 在 Filament 管理后台的 Tenants 页面,编辑租户并添加域名。或者使用代码:

\App\Models\Domain::create([
    'domain' => 'tenant.yourdomain.com',
    'tenant_id' => $tenantId,
]);

Q: 租户数据库在哪里?

A: 每个租户有独立的数据库,命名格式为 tenant_{tenant_id}。可以在中央数据库中查看 tenants 表获取租户列表。

Q: 如何删除租户及其数据?

A: 使用 Artisan 命令:

php artisan tenants:delete {tenant_id}

这会删除租户记录和其独立数据库。

Q: 如何在中央应用和租户应用之间切换?

A:

  • 中央应用:访问主域名(如 lasaas.ddev.site)
  • 租户应用:访问租户专属域名(如 demo.lasaas.ddev.site)

开发相关

Q: 如何添加新的租户资源?

A: 参考“开发指南”部分的详细步骤:

  1. database/migrations/tenant/ 创建迁移
  2. 创建模型
  3. 创建 Filament 资源
  4. 运行 php artisan tenants:migrate

Q: DDEV 启动失败怎么办?

A: 尝试以下步骤:

# 停止并重新启动
ddev stop
ddev start

# 如果仍有问题,删除并重建
ddev delete
ddev start

Q: 前端资源更新后没有生效?

A: 清除浏览器缓存并重新构建:

npm run build
# 或开发模式
npm run dev

Q: 如何查看队列任务?

A: 检查 jobs 表或使用 Horizon(如果安装):

php artisan tinker
>>> \Illuminate\Support\Facades\DB::table('jobs')->count();

权限相关

Q: 如何为用户分配角色?

A: 在 Filament 后台的用户管理页面,编辑用户并分配角色。或使用代码:

$user->assignRole('admin');

Q: Filament Shield 是什么?

A: Filament Shield 是一个为 Filament 资源自动生成权限的包。它会根据资源生成相应的权限(view、create、update、delete 等)。

Q: 如何自定义权限?

A: 在服务提供者或 Seeder 中:

use Spatie\Permission\Models\Permission;
Permission::create(['name' => 'custom-permission']);

性能相关

Q: 如何优化生产环境性能?

A:

  1. 启用缓存:php artisan optimize
  2. 使用 Redis 作为缓存驱动
  3. 配置队列 worker
  4. 启用 OPcache
  5. 使用 CDN 存储静态资源
  6. 数据库索引优化

Q: 如何处理大量租户?

A:

  • 使用连接池管理数据库连接
  • 实施租户分片策略
  • 定期清理不活跃租户
  • 监控服务器资源使用

故障排除

Q: 出现 "Class not found" 错误

A: 尝试重新生成自动加载文件:

composer dump-autoload

Q: 迁移失败怎么办?

A:

# 回滚迁移
php artisan migrate:rollback

# 清除迁移表
php artisan migrate:fresh

# 重新迁移
php artisan migrate

Q: 邮件发送失败

A: 检查 .env 中的邮件配置,查看日志文件:

tail -f storage/logs/laravel.log

Q: 如何调试租户相关问题?

A:

// 在当前请求中获取租户信息
dump(tenant());
dump(tenant('id'));

// 检查是否在租户上下文中
dump(tenancy()->initialized);

📞 联系方式

如有问题或建议,请提交 Issue 或通过以下方式联系:

📚 相关资源

学习资源

社区


Made with ❤️ using Laravel

About

Lasaas 是一个基于 Laravel 生态构建的现代化多租户 SaaS 平台,采用独立数据库隔离方案,为每个租户提供完全独立的数据存储空间。项目整合了 Livewire、Filament、Spatie Permission 和 Stancl/Tenancy 等优秀组件,提供了完整的用户管理、团队协作、权限控制和多租户解决方案。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages