BU DÖKÜMAN HAKKINDA
Bu döküman, BaseApp platformu için hazırlanan en kapsamlı ve nihai kaynaktır. Hiçbir detay atlanmamış, operasyonel ve teknik tüm bilgiler tek çatı altında toplanmıştır.
- BÖLÜM A (OPERASYON): Stajyerler, destek ekibi ve operasyon yöneticileri için adım adım, ekran görüntüleri tadında "Arayüz Kullanım Rehberi".
- BÖLÜM B (GELİŞTİRME): Yazılımcılar ve mimarlar için kod örnekleri ve detaylı "API Referans Kılavuzu".
Bu bölüm, kod yazmadan platformu yönetmek isteyenler, stajyerler ve destek personeli içindir.
https://admin.sizin-domain.com (Sistem Ayarları, Sadece
Yöneticiler).https://app.sizin-domain.com (Günlük Kullanım, Personel ve
Müşteriler).Firmanızın iş yaptığı kurumları veya kişileri buradan yönetirsiniz.
Müşteriler ağaç yapısında birbirine bağlanabilir (Genel Merkez -> Bölge -> Şube). Bu sayede
üst birim, alt birimin verilerini görebilir.
Sisteme giriş yapacak kişileri buradan eklersiniz.
TENANT_USER.CUSTOMER.CUSTOMER seçtiyseniz, Bağlı
Müşteri kutusu açılır. Buradan hangi firmaya (Örn: "Yıldız Market") ait olduğunu mutlaka
seçin.Bir kullanıcıya sadece belirli bir tabloyu veya dashboard'u göstermek için:
Personelleriniz (TENANT_USER) neler yapabilir?
| Yetki Anahtarı | Açıklama |
|---|---|
ENTITY_VIEW |
Tüm tabloları (Varlıkları) görüntüleyebilir. |
ENTITY_CREATE |
Yeni kayıt ekleyebilir. |
ENTITY_EDIT |
Mevcut kayıtları düzenleyebilir. |
ENTITY_DELETE |
Kayıt silebilir. (Dikkatli Verin!) |
DASHBOARD_VIEW |
Rapor ekranlarını (Dashboard) görebilir. |
DASHBOARD_MANAGE |
Yeni dashboard oluşturabilir ve tasarım yapabilir. |
USERS_MANAGE |
Alt kullanıcı ekleyip çıkartabilir. |
ROLES_MANAGE |
Yeni rol oluşturabilir. |
COMPONENTS_MANAGE |
Widget kodlarını değiştirebilir. (Sadece Teknik Ekip) |
TENANT_USER kalsın.Excel tablosu açar gibi veritabanı tablosu oluşturun.
servis-araclari (Otomatik dolar, değiştirmeyin).Plaka -> Tipi: TEXT, Zorunlu: Evet.Kapasite -> Tipi: NUMBER.Aktif -> Tipi: BOOLEAN.Sürücü -> Tipi: RELATION -> Hedef: Personeller.Tabloyu oluştururken Kapsam kutusuna dikkat edin:
Rapor ekranlarını buradan tasarlarsınız.
/api/app/entities/records/satislar.Widget'ları canlıya almadan önce test etmek için:
itemConfig ve dashboardConfig verilerini girerek bileşenin
farklı durumlarda nasıl göründüğünü anlık olarak test edebilirsiniz.Sistemi İngilizce, Almanca vb. dillerde kullanmak için.
menu.servis_araclari (Küçük harf, boşluksuz).Markanızın renklerini ve logosunu buradan değiştirin.
Varsayılan: Standart üst ve yan menülü yapı.Modern Sidebar: Sadece ikonlardan oluşan dar yan menü.Top Menu Only: Sadece üst menü (Yatay kullanım).Sistemin arka planında çalışan kuralları buradan izlersiniz.
Bir şeyler ters giderse (Örn: Kayıt eklenemiyor):
Bir müşteri "Sisteme giremiyorum" dediğinde, onun gözünden görmek için:
| Hata Mesajı / Durum | Olası Sebep | Çözüm |
|---|---|---|
403 Forbidden |
Yetki eksik veya Scope (Kapsam) yanlış. | Kullanıcının rolünü ve Tablonun Scope ayarını kontrol edin. |
Script execution timed out |
Kod 5 saniyeden uzun sürdü. | Yazılımcınıza iletin; döngü veya sorgu hatası olabilir. |
Relation does not exist |
Bağlı bir tablo silinmiş. | Varlık tanımlarını (Entity Definitions) kontrol edin. |
Permission denied |
Kod içinde yasaklı bir işlem var. | Sandbox içinde fs, process gibi sisteme erişen kodlar engellenir. |
Invalid tenant context |
Firma bulunamadı. | Girdiğiniz URL (subdomain) veya x-tenant-id başlığı hatalı. |
| Widget Boş Görünüyor | Veri yok veya Adres yanlış. | Widget ayarlarındaki API URL'ini (slug) kontrol edin. |
| Kullanıcı Giremiyor | Yanlış adres. | Firmanıza özel adresten (firma.app.com) girdiğinden emin olun. |
Müşteriler menüsünden "ABC Lojistik" firmasını ekle.Kullanıcılar menüsünden "ahmet@abc.com" kullanıcısını ekle.
CUSTOMER seç.Varlıklar menüsünden "Duyurular" tablosu oluştur.Baslik (TEXT), Icerik (TEXT), Tarih (DATE).TENANT_SHARED (Tüm personel görsün).Varlık Kayıtları menüsüne gidip ilk duyuruyu ekle.Bu bölüm, sisteme kod yazarak (Middleware, Hook, Widget Script) müdahale edecek geliştiriciler içindir.
Platform, Multi-Tenant mimariye sahiptir. Her veri tenantId ile ayrılır. Güvenlik, veritabanı
sürücüsü (Prisma Extension) seviyesinde sağlanır.
db.users.findMany() dediğinizde, sistem bunu arka
planda where: { tenantId: 'current' } olarak çalıştırır.SYSADMIN rolüyle yapılan işlemlerde filtreleme devre dışı
kalır.Middleware ve Hook kodlarınızda ctx nesnesi üzerinden erişebileceğiniz araçlar:
| Araç | Metotlar | Açıklama |
|---|---|---|
ctx.prisma |
findFirst, findMany, create, update,
delete, count |
Veritabanı istemcisi. (İzole) |
ctx.redis |
set(key, val), get(key), del(key) |
Ön bellek (Cache). Tenant'a özel prefix kullanır. |
ctx.fetch(url) |
fetch(url, options) |
HTTP İstemcisi. (SSRF Korumalı, Localhost'a erişemez). |
ctx.eventBus |
emit(event, data) |
Sistem içi olay yayınlama. |
ctx.bcrypt |
hash(str, salt), compare(str, hash) |
Şifre hashleme. Cost factor 10 sabittir. |
ctx.console |
log(), error(), warn() |
Admin paneline log basar. |
ctx.createError |
({ statusCode, message }) |
İşlemi durdurup hata fırlatır. |
ctx.getQuery |
() |
URL parametrelerini döner. |
ctx.readBody |
async () |
POST isteğinin gövdesini (JSON) döner. |
ctx.setHeader |
(key, value) |
Yanıt başlığı ekler. |
ctx.payload |
data |
DİKKAT: Hook içinde sadece güncel veri (data) vardır. |
ctx.payload Hakkında Uyarı (UPDATE Hook) UPDATE işlemi sonrası çalışan hook'larda ctx.payload sadece güncel kaydı içerir. Eski
kayda (oldData) erişim yoktur.
// ✅ DOĞRU: Güncel veriyi al
const yeniKayit = ctx.payload.data;
// ❌ YANLIŞ: Eski veriye erişmeye çalışma
// const eskiKayit = ctx.payload.oldData; // Böyle bir alan YOKTUR!
const saat = new Date().getHours();
if (saat < 9 || saat > 18) {
throw ctx.createError({
statusCode: 403,
statusMessage: 'Sisteme sadece mesai saatlerinde girebilirsiniz.'
});
}
Siparis tablosuna kayıt eklendiğinde (CREATE) çalışır:
const siparis = ctx.payload.data;
const urun = await ctx.prisma.entityRecord.findFirst({
where: {
entityDefinition: { slug: 'urunler' },
data: { path: ['id'], equals: siparis.urun_id }
}
});
if (urun) {
await ctx.prisma.entityRecord.update({
where: { id: urun.id },
data: { data: { ...urun.data, stok: urun.data.stok - siparis.adet } }
});
ctx.console.log('Stok güncellendi.');
}
Widget Script'lerinde (setup()) kullanabileceğiniz araçlar:
| Servis Adı | Açıklama |
|---|---|
$fetch veya useNuxtApp().$fetch |
Sunucudan veri çekme. Doğrudan $fetch('/api...') kullanılabilir. |
inject('ui') |
ui.toast('Mesaj'), ui.alert('Hata'), ui.confirm('Emin mi?') |
inject('user') |
user.value.name, user.value.role |
inject('auth') |
auth.login(), auth.logout() |
useRouter() |
Sayfa yönlendirme. router.push('/...') |
inject('navigateTo') |
Alternatif yönlendirme. |
{
props: ['itemConfig', 'dashboardConfig'],
setup(props) {
// $fetch globaldir, doğrudan kullanılabilir.
const ui = inject('ui');
const products = ref([]);
onMounted(async () => {
try {
const res = await $fetch('/api/app/entities/records/urunler');
products.value = res.data;
} catch (e) {
ui.alert({ title: 'Hata', message: 'Veri çekilemedi!' });
}
});
return { products };
}
}
Widget'lara gelen props objesi şunları içerir:
props.itemConfig: Bileşen ayarları.
.title: Başlık..icon: İkon..apiUrl: Veri kaynağı.props.dashboardConfig: Genel dashboard ayarları.
.themeColor: Seçilen tema rengi (Örn: 'dark', 'blue')..refreshRate: Otomatik yenileme süresi.Hangi rolün neleri yapabileceğinin teknik özeti.
| Özellik / Eylem | SysAdmin | Tenant Admin | Tenant User | Customer |
|---|---|---|---|---|
| Firma Oluşturma | ✅ | ❌ | ❌ | ❌ |
| Kullanıcı Ekleme | ✅ | ✅ (Kendi) | 🔒 (Yetkiyle) | ❌ |
| Rol Tanımlama | ✅ | ✅ (Kendi) | ❌ | ❌ |
| Tablo Tanımlama | ✅ | ✅ (Kendi) | 🔒 (Yetkiyle) | ❌ |
| Veri Girişi | ✅ | ✅ | ✅ | ✅ (Kendi) |
| Dashboard Tasarımı | ✅ | ✅ (Kendi) | ❌ | ❌ |
| Kod Yazma (Middleware) | ✅ | ✅ (Kendi) | ❌ | ❌ |
| Taklit (Impersonate) | ✅ | ❌ | ❌ | ❌ |
Platformun sağlığını korumak için, yazdığınız kodlarda bazı sınırlar vardır.
eval, process, fs,
window.EntityRecord tablosunda JSONB verileri için GIN indeksleri
mevcuttur.include) çekerken dikkatli olun. Döngü içinde
veritabanı sorgusu (findUnique) atmayın; hepsini tek seferde (findMany +
in) çekin.limit ve
skip kullanın. Tüm veriyi (findAll) belleğe çekmek performansı düşürür.ctx.redis kullanın.BaseApp Pro - V1.0 - 2026