ZenStack เป็นชุดเครื่องมือ Node.js/typescript ที่ทำให้การพัฒนาแบ็กเอนด์ของเว็บแอปง่ายขึ้น มันช่วยเพิ่ม PRISMA ORM ด้วยเลเยอร์การอนุญาตที่ยืดหยุ่นและ APIs/Hook ที่สร้างขึ้นตามแบบอัตโนมัติซึ่งเป็นการปลดล็อกศักยภาพอย่างเต็มที่สำหรับการพัฒนาเต็มรูปแบบ
เป้าหมายของเราคือให้คุณประหยัดเวลาในการเขียนรหัสหม้อต้มและมุ่งเน้นไปที่การสร้างคุณสมบัติจริง!
อ่านเอกสารฉบับเต็มได้ที่? Zenstack.dev เข้าร่วม Discord สำหรับข้อเสนอแนะและคำถาม
Zenstack ขยายพลังของ Prisma เพิ่มขึ้นด้วยสี่ชั้นต่อไปนี้:
Zenstack แนะนำภาษาการสร้างแบบจำลองข้อมูลที่เรียกว่า "ZModel" - Superset of Prisma Schema Language มันขยาย Schema Prisma ด้วยคุณลักษณะและฟังก์ชั่นที่กำหนดเองและขึ้นอยู่กับว่าใช้เลเยอร์ควบคุมการเข้าถึงที่ยืดหยุ่นรอบ PRISMA
// base.zmodel
abstract model Base {
id String @ id
author User @ relation ( fields : [ authorId ] , references : [ id ] )
authorId String
// ? allow full CRUD by author
@@ allow ( 'all' , author == auth ( ) )
} // schema.zmodel
import "base"
model Post extends Base {
title String
published Boolean @ default ( false )
// ? allow logged-in users to read published posts
@@ allow ( 'read' , auth ( ) != null && published )
} zenstack CLI เปลี่ยน Zmodel เป็นสคีมา Prisma มาตรฐานซึ่งคุณสามารถใช้กับเวิร์กโฟลว์ Prisma ปกติ
ที่รันไทม์พร็อกซีโปร่งใสถูกสร้างขึ้นรอบ ๆ ลูกค้า PRISMA สำหรับการสกัดกั้นและการกลายพันธุ์เพื่อบังคับใช้นโยบายการเข้าถึง
import { enhance } from '@zenstackhq/runtime' ;
// a regular Prisma client
const prisma = new PrismaClient ( ) ;
async function getPosts ( userId : string ) {
// create an enhanced Prisma client that has access control enabled
const enhanced = enhance ( prisma , { user : userId } ) ;
// only posts that're visible to the user will be returned
return enhanced . post . findMany ( ) ;
}แพ็คเกจอะแดปเตอร์เซิร์ฟเวอร์ช่วยให้คุณห่อไคลเอนต์ PRISMA ที่รองรับการควบคุมการเข้าถึงลงใน API CRUD Backend ที่สามารถเรียกได้อย่างปลอดภัยจากส่วนหน้า นี่คือตัวอย่างสำหรับ next.js:
// pages/api/model/[...path].ts
import { requestHandler } from '@zenstackhq/next' ;
import { enhance } from '@zenstackhq/runtime' ;
import { getSessionUser } from '@lib/auth' ;
import { prisma } from '@lib/db' ;
// Mount Prisma-style APIs: "/api/model/post/findMany", "/api/model/post/create", etc.
// Can be configured to provide standard RESTful APIs (using JSON:API) instead.
export default requestHandler ( {
getPrisma : ( req , res ) => enhance ( prisma , { user : getSessionUser ( req , res ) } ) ,
} ) ;ปลั๊กอินสามารถสร้างไลบรารีไคลเอ็นต์ที่พิมพ์ได้อย่างแข็งแกร่งซึ่งพูดคุยกับ API ดังกล่าว นี่คือตัวอย่างสำหรับการตอบสนอง:
// components/MyPosts.tsx
import { useFindManyPost } from '@lib/hooks' ;
const MyPosts = ( ) => {
// list all posts that're visible to the current user, together with their authors
const { data : posts } = useFindManyPost ( {
include : { author : true } ,
orderBy : { createdAt : 'desc' } ,
} ) ;
return (
< ul >
{ posts ?. map ( ( post ) => (
< li key = { post . id } >
{ post . title } by { post . author . name }
</ li >
) ) }
</ ul >
) ;
} ; แผนภาพต่อไปนี้ให้ภาพรวมสถาปัตยกรรมระดับสูงของ Zenstack
repo ตัวอย่างมีรูปแบบต่อไปนี้:
คุณสามารถใช้โพสต์บล็อกนี้เป็นบทนำ
ตรวจสอบแอป ToDo ผู้เช่าหลายคนสำหรับตัวอย่างที่กำลังทำงานอยู่ คุณสามารถค้นหาการใช้งานที่แตกต่างด้านล่าง:
เข้าร่วมเซิร์ฟเวอร์ Discord ของเราสำหรับการแชทและอัปเดต!
ถ้าคุณชอบ Zenstack เข้าร่วมกับเราเพื่อให้เป็นเครื่องมือที่ดีกว่า! โปรดใช้คู่มือการสนับสนุนสำหรับรายละเอียดเกี่ยวกับวิธีเริ่มต้นและอย่าลังเลที่จะเข้าร่วม Discord เพื่อแบ่งปันความคิดของคุณ เอกสารอยู่ใน repo แยกต่างหาก: Zenstack-Docs
โปรดพิจารณาสนับสนุนงานของเราเพื่อเร่งการพัฒนา การบริจาคของคุณจะถูกใช้ 100% เป็นรางวัลเงินรางวัลเพื่อส่งเสริมให้สมาชิกชุมชนช่วยแก้ไขข้อบกพร่องเพิ่มคุณสมบัติและปรับปรุงเอกสาร
ขอบคุณสำหรับการสนับสนุนที่ใจดี!
การทำเครื่องหมาย | แผนภูมินางเงือก | coderabbit | โยฮันน์โรห์น |
เบนจามินเซซิโรวิค | ulric | เฟเบียนจ๊อคส์ |
ขอบคุณผู้สนับสนุนทุกคนที่ช่วยให้ Zenstack ดีขึ้น!
มิกซ์