feat: 實作 Multi-tenancy 多租戶架構 (stancl/tenancy)
All checks were successful
Koori-ERP-Deploy-System / deploy-demo (push) Successful in 1m3s
Koori-ERP-Deploy-System / deploy-production (push) Has been skipped

- 安裝並設定 stancl/tenancy 套件
- 分離 Central / Tenant migrations
- 建立 Tenant Model 與資料遷移指令
- 建立房東後台 CRUD (Landlord Dashboard)
- 新增租戶管理頁面 (列表、新增、編輯、詳情)
- 新增域名管理功能
- 更新部署手冊
This commit is contained in:
2026-01-15 13:15:18 +08:00
parent 3e3d8ffb6c
commit 4f745c1021
51 changed files with 1954 additions and 1 deletions

228
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "edfbf8e1cc43c925ea8b04fc1f93da65",
"content-hash": "931b01f076d9ee28568cd36f178a0c04",
"packages": [
{
"name": "brick/math",
@@ -508,6 +508,59 @@
],
"time": "2025-03-06T22:45:56+00:00"
},
{
"name": "facade/ignition-contracts",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/facade/ignition-contracts.git",
"reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
"reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
"shasum": ""
},
"require": {
"php": "^7.3|^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^v2.15.8",
"phpunit/phpunit": "^9.3.11",
"vimeo/psalm": "^3.17.1"
},
"type": "library",
"autoload": {
"psr-4": {
"Facade\\IgnitionContracts\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "https://flareapp.io",
"role": "Developer"
}
],
"description": "Solution contracts for Ignition",
"homepage": "https://github.com/facade/ignition-contracts",
"keywords": [
"contracts",
"flare",
"ignition"
],
"support": {
"issues": "https://github.com/facade/ignition-contracts/issues",
"source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
},
"time": "2020-10-16T08:27:54+00:00"
},
{
"name": "fruitcake/php-cors",
"version": "v1.4.0",
@@ -3443,6 +3496,179 @@
],
"time": "2025-12-13T21:45:21+00:00"
},
{
"name": "stancl/jobpipeline",
"version": "v1.8.1",
"source": {
"type": "git",
"url": "https://github.com/archtechx/jobpipeline.git",
"reference": "c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/archtechx/jobpipeline/zipball/c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c",
"reference": "c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c",
"shasum": ""
},
"require": {
"illuminate/support": "^10.0|^11.0|^12.0",
"php": "^8.0"
},
"require-dev": {
"ext-redis": "*",
"orchestra/testbench": "^8.0|^9.0|^10.0",
"spatie/valuestore": "^1.2"
},
"type": "library",
"autoload": {
"psr-4": {
"Stancl\\JobPipeline\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Samuel Štancl",
"email": "samuel.stancl@gmail.com"
}
],
"description": "Turn any series of jobs into Laravel listeners.",
"support": {
"issues": "https://github.com/archtechx/jobpipeline/issues",
"source": "https://github.com/archtechx/jobpipeline/tree/v1.8.1"
},
"time": "2025-07-29T20:21:17+00:00"
},
{
"name": "stancl/tenancy",
"version": "v3.9.1",
"source": {
"type": "git",
"url": "https://github.com/archtechx/tenancy.git",
"reference": "d98a170fbd2e114604bfec3bc6267a3d6e02dec1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/archtechx/tenancy/zipball/d98a170fbd2e114604bfec3bc6267a3d6e02dec1",
"reference": "d98a170fbd2e114604bfec3bc6267a3d6e02dec1",
"shasum": ""
},
"require": {
"ext-json": "*",
"facade/ignition-contracts": "^1.0.2",
"illuminate/support": "^10.0|^11.0|^12.0",
"php": "^8.0",
"ramsey/uuid": "^4.7.3",
"stancl/jobpipeline": "^1.8.0",
"stancl/virtualcolumn": "^1.5.0"
},
"require-dev": {
"doctrine/dbal": "^3.6.0",
"laravel/framework": "^10.0|^11.0|^12.0",
"league/flysystem-aws-s3-v3": "^3.12.2",
"orchestra/testbench": "^8.0|^9.0|^10.0",
"spatie/valuestore": "^1.3.2"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Tenancy": "Stancl\\Tenancy\\Facades\\Tenancy",
"GlobalCache": "Stancl\\Tenancy\\Facades\\GlobalCache"
},
"providers": [
"Stancl\\Tenancy\\TenancyServiceProvider"
]
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Stancl\\Tenancy\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Samuel Štancl",
"email": "samuel.stancl@gmail.com"
}
],
"description": "Automatic multi-tenancy for your Laravel application.",
"keywords": [
"laravel",
"multi-database",
"multi-tenancy",
"tenancy"
],
"support": {
"issues": "https://github.com/archtechx/tenancy/issues",
"source": "https://github.com/archtechx/tenancy/tree/v3.9.1"
},
"funding": [
{
"url": "https://tenancyforlaravel.com/donate",
"type": "custom"
},
{
"url": "https://github.com/stancl",
"type": "github"
}
],
"time": "2025-03-13T16:02:11+00:00"
},
{
"name": "stancl/virtualcolumn",
"version": "v1.5.0",
"source": {
"type": "git",
"url": "https://github.com/archtechx/virtualcolumn.git",
"reference": "75718edcfeeb19abc1970f5395043f7d43cce5bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/archtechx/virtualcolumn/zipball/75718edcfeeb19abc1970f5395043f7d43cce5bc",
"reference": "75718edcfeeb19abc1970f5395043f7d43cce5bc",
"shasum": ""
},
"require": {
"illuminate/database": ">=10.0",
"illuminate/support": ">=10.0"
},
"require-dev": {
"orchestra/testbench": ">=8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Stancl\\VirtualColumn\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Samuel Štancl",
"email": "samuel.stancl@gmail.com"
}
],
"description": "Eloquent virtual column.",
"support": {
"issues": "https://github.com/archtechx/virtualcolumn/issues",
"source": "https://github.com/archtechx/virtualcolumn/tree/v1.5.0"
},
"time": "2025-02-25T13:12:44+00:00"
},
{
"name": "symfony/clock",
"version": "v8.0.0",