ใใซใใใใณใๅฏพๅฟ ๅณๆธ่ฒธๅบ็ฎก็ใทในใใ
Finbuckle.MultiTenantใซใใใใใณใๅ้ขใๅฎ็พ
- ๐ ใใซใใใใณใๅ้ข - Finbuckle.MultiTenantใซใใใขใใชใฑใผใทใงใณใฌใใซใฎๅ้ข
- ๐ซ ๆ่ปใชใฆใผใถใผ็ป้ฒ - ใชใผใใณ/ใใฏใคใใชในใ/ๆฟ่ชๅถใฎ3ใขใผใ
- ๐ Open Library้ฃๆบ - ISBNใใ่ชๅใงๆธ็ฑๆ ๅ ฑใๅๅพ
- ๐ฑ ISBNในใญใฃใณ - ใซใกใฉใไฝฟใฃใใใผใณใผใในใญใฃใณ
- ๐ ๆจฉ้็ฎก็ - ใใ็ดฐใใใญใผใซใปๆจฉ้ใทในใใ
- ๐ Aspireๅฏพๅฟ - ้็บ็ฐๅขใใฏใณใณใใณใใง่ตทๅ
![]() |
![]() |
| ๆธ็ฑ็ฎก็ | ่ฒธๅบ็ฎก็ |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SvelteKit SPA โ
โ (Static Site + ZXing) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ASP.NET Core Web API โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Tenant โ โ Book โ โ Rental โ โ
โ โ Controller โ โ Controller โ โ Controller โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Finbuckle.MultiTenant โ โ
โ โ + Permission Filters โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PostgreSQL โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Tenant A โ โ Tenant B โ โ Tenant C โ โ
โ โ (RLS) โ โ (RLS) โ โ (RLS) โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ใใผใซ | ใใผใธใงใณ | ใชใณใฏ |
|---|---|---|
| .NET SDK | 10.0+ | ใใฆใณใญใผใ |
| Node.js | 20+ | ใใฆใณใญใผใ |
| Docker | ๆๆฐ | ใใฆใณใญใผใ |
| PostgreSQL | 17+ | ใใฆใณใญใผใ |
git clone https://github.com/your-org/OpenLibraryRent.git
cd OpenLibraryRentOpenLibraryRent/appsettings.Development.json ใไฝๆ๏ผ
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Database=openlibraryrent;Username=postgres;Password=postgres"
},
"Authentication": {
"Microsoft": {
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret"
}
},
"Encryption": {
"Key": "your-32-character-encryption-key!!"
}
}Aspireใไฝฟ็จ๏ผๆจๅฅจ๏ผ๏ผ
dotnet run --project OpenLibraryRent.AppHost็ดๆฅ่ตทๅ๏ผ
cd OpenLibraryRent
dotnet ef database update
dotnet run- ๐ ใขใใชใฑใผใทใงใณ: http://localhost:5000
- ๐ API ใใญใฅใกใณใ: http://localhost:5000/swagger
- ๐๏ธ pgAdmin (Aspire): http://localhost:5050
| ใขใผใ | ่ชฌๆ | ใใฏใคใใชในใใฆใผใถใผ |
|---|---|---|
| ๐ Public | ่ชฐใงใใญใฐใคใณๅฏ่ฝ | - |
| ๐ Private | ใใฏใคใใชในใใฎใฟ่จฑๅฏ | ๅณๅบงใซใญใฐใคใณๅฏ่ฝ |
| ๐ Approval | ็ณ่ซโๆฟ่ชๅถ | ๆฟ่ชในใญใใใงใญใฐใคใณ |
graph LR
A[ใฆใผใถใผใญใฐใคใณ] --> B{็ป้ฒใขใผใ?}
B -->|Public| C[ใญใฐใคใณๆๅ]
B -->|Private| D{ใใฏใคใใชในใ?}
D -->|Yes| C
D -->|No| E[ๆๅฆ]
B -->|Approval| F{ใใฏใคใใชในใ?}
F -->|Yes| C
F -->|No| G{ๆฟ่ชๆธใฟ?}
G -->|Yes| C
G -->|No| H[็ณ่ซ็ป้ขใธ]
| ๆจฉ้ | ่ชฌๆ |
|---|---|
tenant.user.read |
ใฆใผใถใผไธ่ฆงใป่ฉณ็ดฐ้ฒ่ฆง |
tenant.user.manage |
ใฆใผใถใผไฝๆใป็ทจ้ใปๅ้ค |
tenant.role.read |
ใญใผใซ้ฒ่ฆง |
tenant.role.manage |
ใญใผใซไฝๆใป็ทจ้ใปๅ้ค |
tenant.book.read |
ๆธ็ฑ้ฒ่ฆง |
tenant.book.manage |
ๆธ็ฑ็ป้ฒใป็ทจ้ |
tenant.rental.read |
่ฒธๅบ้ฒ่ฆง |
tenant.rental.manage |
่ฒธๅบใป่ฟๅดๆไฝ |
| ๆจฉ้ | ่ชฌๆ |
|---|---|
system.tenant.create |
ใใใณใไฝๆ |
system.tenant.read |
ใใใณใไธ่ฆง้ฒ่ฆง |
system.tenant.manage |
ใใใณใ่จญๅฎๅคๆด |
system.tenant.delete |
ใใใณใๅ้ค |
OpenLibraryRent/
โโโ ๐ OpenLibraryRent.AppHost/ # Aspireใในใ
โ โโโ AppHost.cs # ใคใณใใฉๅฎ็พฉ
โ
โโโ ๐ OpenLibraryRent.ServiceDefaults/ # ๅ
ฑ้่จญๅฎ
โ
โโโ ๐ OpenLibraryRent/ # ใกใคใณใใญใธใงใฏใ
โ โโโ ๐ Controllers/
โ โ โโโ AuthController.cs # ่ช่จผ
โ โ โโโ TenantsController.cs # ใใใณใ็ฎก็
โ โ โโโ BooksController.cs # ๆธ็ฑAPI
โ โ โโโ RentalsController.cs # ่ฒธๅบAPI
โ โ โโโ UsersController.cs # ใฆใผใถใผ็ฎก็
โ โ โโโ UserApprovalController.cs # ๆฟ่ชใใญใผ
โ โ โโโ SystemAuthController.cs # ใทในใใ ่ช่จผ
โ โ
โ โโโ ๐ Models/
โ โ โโโ ApplicationUser.cs # ใฆใผใถใผ
โ โ โโโ ApplicationTenantInfo.cs # ใใใณใ
โ โ โโโ Book.cs / BookCopy.cs # ๆธ็ฑ
โ โ โโโ Rental.cs # ่ฒธๅบ
โ โ โโโ UserApprovalRequest.cs # ๆฟ่ชใชใฏใจในใ
โ โ
โ โโโ ๐ Services/
โ โ โโโ TenantManagementService.cs
โ โ โโโ RentalService.cs
โ โ โโโ OpenLibraryService.cs # Open Library API
โ โ โโโ EncryptionService.cs
โ โ
โ โโโ ๐ Filters/
โ โ โโโ RequireAnyAttribute.cs # ORๆกไปถๆจฉ้
โ โ โโโ RequireAllAttribute.cs # ANDๆกไปถๆจฉ้
โ โ
โ โโโ ๐ OpenLibraryRent.Client/ # SvelteKitใใญใณใใจใณใ
โ โ โโโ src/routes/
โ โ โ โโโ [tenant]/ # ใใใณใๅฅใใผใธ
โ โ โ โ โโโ books/ # ๆธ็ฑ็ฎก็
โ โ โ โ โโโ rentals/ # ่ฒธๅบ็ฎก็
โ โ โ โ โโโ users/ # ใฆใผใถใผ็ฎก็
โ โ โ โ โโโ apply/ # ็ณ่ซใใฉใผใ
โ โ โ โ โโโ admin/approvals/ # ๆฟ่ช็ฎก็
โ โ โ โโโ create-tenant/ # ใใใณใไฝๆ
โ โ โโโ src/lib/
โ โ โโโ stores/auth.ts # ่ช่จผในใใข
โ โ โโโ components/ # UIใณใณใใผใใณใ
โ โ
โ โโโ ๐ Migrations/ # EF Coreใใคใฐใฌใผใทใงใณ
โ
โโโ ๐ submodules/MaskedUUID/ # UUIDใในใญใณใฐ
GET /{tenant}/auth/login # OIDCใญใฐใคใณ้ๅง
GET /{tenant}/auth/me # ็พๅจใฎใฆใผใถใผๆ
ๅ ฑ
POST /{tenant}/auth/logout # ใญใฐใขใฆใGET /api/systemauth/microsoft-login # Microsoft OAuth้ๅง
GET /api/systemauth/check # ่ช่จผ็ถๆ
็ขบ่ชGET /api/tenants # ไธ่ฆง๏ผใทในใใ ็ฎก็่
๏ผ
GET /api/tenants/by-identifier/{id} # ่ญๅฅๅญใงๅๅพ
POST /api/tenants/create # ไฝๆ๏ผMicrosoft่ช่จผๅฟ
่ฆ๏ผ
PUT /api/tenants/{id}/registration-settings # ็ป้ฒ่จญๅฎๆดๆฐGET /{tenant}/api/books # ไธ่ฆง
POST /{tenant}/api/books # ็ป้ฒ
POST /{tenant}/api/books/fetch-from-openlibrary/{isbn} # Open Libraryๅๅพ
GET /{tenant}/api/books/{id}/copies # ๆธ็ฑใณใใผไธ่ฆงGET /{tenant}/api/rentals # ไธ่ฆง
POST /{tenant}/api/rentals/borrow # ่ฒธๅบ
POST /{tenant}/api/rentals/{id}/return # ่ฟๅด
GET /{tenant}/api/rentals/overdue # ๅปถๆปไธ่ฆงPOST /{tenant}/api/userapproval/apply # ็ณ่ซ้ไฟก
GET /{tenant}/api/userapproval/status # ในใใผใฟใน็ขบ่ช
GET /{tenant}/api/userapproval/requests # ็ณ่ซไธ่ฆง๏ผ็ฎก็่
๏ผ
POST /{tenant}/api/userapproval/requests/{id}/approve # ๆฟ่ช
POST /{tenant}/api/userapproval/requests/{id}/reject # ๅดไธ| ๅคๆฐๅ | ๅฟ ้ | ่ชฌๆ |
|---|---|---|
ConnectionStrings__DefaultConnection |
โ | PostgreSQLๆฅ็ถๆๅญๅ |
Authentication__Microsoft__ClientId |
โ | Microsoft OAuth Client ID |
Authentication__Microsoft__ClientSecret |
โ | Microsoft OAuth Client Secret |
Encryption__Key |
โ | ๆๅทๅใญใผ๏ผ32ๆๅญ๏ผ |
Cors__AllowedOrigins |
CORS่จฑๅฏใชใชใธใณ๏ผๆฌ็ชๅฟ ้ ๏ผ |
- Azure Portal โ ใขใใชใฎ็ป้ฒ
- ๆฐ่ฆ็ป้ฒ
- ๅๅ:
OpenLibraryRent - ใชใใคใฌใฏใURI:
https://your-domain/auth/microsoft-callback
- ๅๅ:
- ClientId ใจ ClientSecret ใๅๅพ
ใใใณใ่จญๅฎใง JSON ใงใใฃใผใซใๅฎ็พฉ๏ผ
[
{"name": "department", "label": "้จ็ฝฒๅ", "type": "text", "required": true},
{"name": "employee_id", "label": "็คพๅก็ชๅท", "type": "text", "required": true},
{"name": "reason", "label": "ๅฉ็จ็ฎ็", "type": "textarea", "required": false}
]# ๅไฝใในใ
dotnet test
# ใใญใณใใจใณใๅใใงใใฏ
cd OpenLibraryRent/OpenLibraryRent.Client
npm run checkversion: '3.8'
services:
app:
image: openlibraryrent:latest
environment:
- ConnectionStrings__DefaultConnection=Host=postgres;Database=openlibraryrent;Username=postgres;Password=postgres
- Authentication__Microsoft__ClientId=${MS_CLIENT_ID}
- Authentication__Microsoft__ClientSecret=${MS_CLIENT_SECRET}
- Encryption__Key=${ENCRYPTION_KEY}
ports:
- "5000:8080"
depends_on:
- postgres
postgres:
image: postgres:17
environment:
POSTGRES_PASSWORD: postgres
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:- ใใฉใผใฏ
- ใใฉใณใไฝๆ (
git checkout -b feature/amazing) - ใณใใใ (
git commit -m 'Add amazing feature') - ใใใทใฅ (
git push origin feature/amazing) - ใใซใชใฏใจในใไฝๆ
ใใฎใใญใธใงใฏใใฏ MIT License ใฎไธใงๅ ฌ้ใใใฆใใพใใ
Made with โค๏ธ by Your Team

