İlk temizlik tamamlandı bir önceki projeden

This commit is contained in:
Ümit Tunç
2026-04-28 21:14:25 +03:00
commit f80443aec0
10000 changed files with 959965 additions and 0 deletions
+475
View File
@@ -0,0 +1,475 @@
# Citrus CMS - Geliştirici Dokümantasyonu
## İçindekiler
1. [Proje Genel Bakış](#proje-genel-bakış)
2. [Klasör Yapısı](#klasör-yapısı)
3. [Modül Sistemi](#modül-sistemi)
4. [Kimlik Doğrulama (Auth) Sistemi](#kimlik-doğrulama-auth-sistemi)
5. [Types Tablosu ve Kullanımı](#types-tablosu-ve-kullanımı)
6. [Controller Yapısı](#controller-yapısı)
7. [Helper Fonksiyonlar](#helper-fonksiyonlar)
8. [DevExtreme Entegrasyonu](#devextreme-entegrasyonu)
9. [Admin-AJAX Sistemi](#admin-ajax-sistemi)
10. [Şablonlar ve Bileşenler](#şablonlar-ve-bileşenler)
11. [Yeni Modül Geliştirme](#yeni-modül-geliştirme)
12. [Middleware ve İzin Sistemi](#middleware-ve-izin-sistemi)
## Proje Genel Bakış
Bu proje, Laravel framework'ü üzerine inşa edilmiş, Trunçgil Teknoloji tarafından geliştirilen Citrus CMS yönetim paneli uygulamasıdır. Temel olarak aşağıdaki özellikleri içermektedir:
- Modüler yapı
- Kullanıcı yetkilendirme ve rol bazlı izin sistemi
- DevExtreme ile gelişmiş kullanıcı arayüzü
- Excel import/export işlemleri
- Dinamik form ve alan yönetimi
- Çoklu dil desteği
- Çeşitli helper fonksiyonlar
## Klasör Yapısı
Projenin ana klasör yapısı Laravel'in standart yapısına uygundur, ancak bazı özel klasör ve dosyalar eklenmiştir:
- **app/** - Uygulamanın ana kaynak kodu
- **Functions/** - Özel fonksiyonlar
- **Helpers/** - Yardımcı fonksiyonlar
- **Models/** - Veritabanı modelleri
- **DevExtreme/** - DevExtreme entegrasyonu için gerekli sınıflar
- **Http/Controllers/** - Controller sınıfları
- **resources/** - Görünüm şablonları ve ön yüz varlıkları
- **routes/** - Uygulama rotaları
- **config/** - Yapılandırma dosyaları
- **public/** - Genel erişilebilir dosyalar
- **storage/** - Uygulama tarafından oluşturulan dosyalar için depolama alanı
## Modül Sistemi
Proje modüler bir yapıda geliştirilmiştir. Her bir modül (örneğin WeldLog, TestPackage, vb.) kendi Model, Controller ve View dosyalarına sahiptir. Modüller, `Types` tablosu üzerinden yönetilmektedir.
### Modül Yapısı
Tipik bir modül şu bileşenlerden oluşur:
1. **Model** - `app/Models/` altında
2. **Controller** - `app/Http/Controllers/` altında
3. **Views** - `resources/views/admin/` altında
4. **Routes** - `routes/web.php` içinde tanımlı
## Kimlik Doğrulama (Auth) Sistemi
Laravel'in varsayılan kimlik doğrulama sistemi kullanılmaktadır, ancak genişletilmiş yetkilendirme ve rol yönetimi uygulanmıştır.
### Kullanıcı Seviyeleri
Kullanıcılar farklı seviyelere (level) sahip olabilir:
- Admin
- Manager
- User
- vb.
Her seviye için farklı izin ayarları tanımlanabilir.
### Middleware
Uygulamada `PermissionControl` adlı özel bir middleware kullanılmakta, bu middleware kullanıcının erişim isteklerini kontrol etmektedir.
```php
// Middleware örneği
if(in_array($thisPath, $onlyAdminPath)) {
if(!isAdmin()) {
echo "Only admin can access this area.";
exit();
}
}
```
## Types Tablosu ve Kullanımı
`types` tablosu, sistemdeki modülleri tanımlamak için kullanılır. Bu tablo aşağıdaki alanları içerir:
- `id` - Benzersiz tanımlayıcı
- `title` - Modül başlığı
- `slug` - URL-dostu benzersiz string
- `fields` - Modülün içerdiği alanlar (virgülle ayrılmış liste)
Her modül için gerekli alanlar `Fields` tablosunda saklanır ve bu tablo aracılığıyla formlar ve tablolar dinamik olarak oluşturulur.
## Controller Yapısı
Projede controller'lar genellikle şu yapıda düzenlenmiştir:
### AdminController
`AdminController` temel CRUD işlemleri ve admin paneli yönetimi için kullanılır. Örnek metotlar:
- `index()` - Admin panel ana sayfası
- `action()` - İçerik ekleme, silme, güncelleme
- `importExcel()` - Excel'den veri içe aktarma
- `exportExcel()` - Veriyi Excel olarak dışa aktarma
- `delete()` - Kayıt silme
### Modül Controllerleri
Her modül genellikle kendi controller'ına sahiptir. Örneğin `WeldLogController`, `TestPackageController` vb.
## Helper Fonksiyonlar
Projede çeşitli yardımcı fonksiyonlar bulunmaktadır. Bunlar `app/Functions/` ve `app/Helpers/` dizinlerinde saklanır.
Sık kullanılan helper fonksiyonlardan bazıları:
- `u()` - Mevcut kullanıcıyı döndürür
- `db($table)` - Belirtilen tabloya erişim sağlar
- `setting($key)` - Sistem ayarlarına erişim
- `isAdmin()` - Kullanıcının admin olup olmadığını kontrol eder
- `userPermissions()` - Kullanıcı izinlerini döndürür
## DevExtreme Entegrasyonu
Proje, kullanıcı arayüzü için DevExtreme bileşenlerini kullanmaktadır. DevExtreme, veri tablolarını ve formları hızlı bir şekilde oluşturmak için kullanılan JavaScript tabanlı UI komponent kütüphanesidir.
### DevExtreme Bileşenleri ve Yapısı
DevExtreme entegrasyonu için özel sınıflar `app/DevExtreme/` klasöründe bulunur:
- `Utils` - Genel yardımcı fonksiyonlar
- `FilterHelper` - Filtreleme için yardımcı fonksiyonlar
- `DbSet` - Veritabanı sorguları için yardımcı sınıf
### CRUD İşlemleri
**Önemli Not**: Sistemdeki tüm modüllerin CRUD (Create, Read, Update, Delete) işlemleri `AdminController.php` üzerinden yürütülmektedir. Bu merkezi yaklaşım, kod tekrarını önler ve tutarlı bir API sağlar.
`AdminController` içindeki temel CRUD metotları:
- `tableToJson` - Veritabanı tablosunu JSON formatına dönüştürür (Read)
- `insertJson` - Yeni kayıt ekler (Create)
- `saveJson` - Mevcut kaydı günceller (Update)
- `removeJson` - Kaydı siler (Delete)
Tüm modüller, işlemlerini bu metotlar üzerinden gerçekleştirir ve özel bir controller geliştirmeye gerek kalmaz.
### DevExtreme DataGrid
DataGrid, veri tablosunu görüntülemek için kullanılan ana bileşendir. JavaScript tarafında aşağıdaki özellikleri destekler:
- Filtreleme ve sıralama
- Sayfalama
- Satır düzenleme
- Grup oluşturma
- Özet bilgileri
- Özel düğmeler ve işlemler
## Admin-AJAX Sistemi
Projede AJAX tabanlı istekler için özel bir sistem kullanılmaktadır. Bu sistem, `AdminAjaxController` tarafından yönetilir ve admin paneli içerisinde yapılan asenkron istekleri işler.
### URL Yapısı
Admin-AJAX istekleri için URL yapısı şu şekildedir:
```
/admin-ajax/{işlem_adı}
```
Burada `{işlem_adı}`, gerçekleştirilecek AJAX işlemini belirtir. Örneğin:
```
/admin-ajax/get-users
/admin-ajax/update-status
/admin-ajax/save-form
```
### Controller Yapısı
Admin-AJAX Controller'ı şu şekilde çalışır:
```php
// app/Http/Controllers/AdminAjaxController.php
public function index(Request $request, string $var) {
$u = Auth::user();
if(!isset($u->level)) {
echo("permission error");
exit();
}
$url = "admin-ajax.$var";
return view($url, array(
"request" => $request
));
}
```
Bu yapı, AJAX isteğini uygun view dosyasına yönlendirir. View adı `admin-ajax.{işlem_adı}` formatında olmalıdır.
### View Dosyaları
AJAX view dosyaları `resources/views/admin-ajax/` dizininde bulunur. Her bir AJAX işlemi için ayrı bir blade dosyası oluşturulmalıdır:
```
resources/views/admin-ajax/get-users.blade.php
resources/views/admin-ajax/update-status.blade.php
resources/views/admin-ajax/save-form.blade.php
```
### Yeni AJAX İşlemi Ekleme
Yeni bir AJAX işlemi eklemek için:
1. İlgili view dosyasını oluşturun:
```php
// resources/views/admin-ajax/yeni-islem.blade.php
@php
// İsteği işleyin
$data = db('tablo_adi')->get();
// JSON formatında yanıt döndürün
echo json_encode([
'status' => 'success',
'data' => $data
]);
@endphp
```
2. View dosyasını çağıran JavaScript kodu:
```javascript
$.ajax({
url: '/admin-ajax/yeni-islem',
type: 'POST',
data: {
parametre1: deger1,
parametre2: deger2,
_token: csrf_token // CSRF koruması için gerekli
},
success: function(response) {
// Başarılı yanıtı işleyin
},
error: function(error) {
// Hatayı işleyin
}
});
```
### Güvenlik Önlemleri
Admin-AJAX isteklerinde şu güvenlik önlemleri uygulanmaktadır:
- Tüm istekler için kimlik doğrulama kontrolü
- CSRF koruma tokeni
- Kullanıcı seviyesine göre yetkilendirme
## Şablonlar ve Bileşenler
Proje, birçok tekrar kullanılabilir şablon ve bileşen içerir. Bu bileşenler, modül geliştirme sürecini kolaylaştırır ve tutarlı bir kullanıcı arayüzü sağlar.
### Şablon Sistemi
Sistem içinde kullanılan ana şablonlar:
#### `sablon4.blade.php`
`resources/views/admin/type/sablon4.blade.php` dosyası, modül sayfalarını oluşturmak için kullanılan temel şablondur. Yeni bir modül geliştirirken, model ve migration oluşturduktan sonra bu şablonu kullanmak genellikle yeterlidir. Şablonun başında tanımlanan değişkenler ile özelleştirilebilir.
Temel özelleştirme değişkenleri:
```php
// Modül başlığı
$title = "Radiographic Test";
// Tabloyu oluşturmak için kullanılan model
$listDatas = RadiographicTest::orderBy("id","DESC")->paginate(setting('row_count'));
// Veritabanı tablo adı
$tableName = "radiographic_tests";
// Blok grupları - alanları kategorilere bölmek için
$blockGroup = [
'Info' => [
'report_file',
'contractor',
],
// Diğer gruplar...
];
// Dosya yükleme klasörü
$firstUploadFolder = '004_QA/0001_RT/';
// Dosya yükleme başlığı
$firstUploadTitle = 'Upload PDF';
```
#### `module-block.blade.php`
`resources/views/components/blocks/module-block.blade.php` dosyası, modülün ana içeriğini oluşturan ve DataGrid'i görüntüleyen bileşendir. Bu bileşen, `sablon4.blade.php` içinde çağrılır ve aşağıdaki özellikleri içerir:
- Alan listesi oluşturma
- Alan tiplerini belirleme
- Sütun seçimini yönetme
- Excel içe/dışa aktarma işlemleri
- DataGrid entegrasyonu
```php
// Dışa aktarma, sütun seçimi ve diğer işlemler için temel ayarlar
$options = [
'export' => $tableName,
];
// DataGrid dahil etme
@include("components.table.$tableType")
```
#### `datagrid.blade.php`
`resources/views/components/table/datagrid.blade.php` dosyası, DevExtreme DataGrid'i entegre eder ve aşağıdaki özellikleri sağlar:
- Sütun tiplendirme ve düzenleme
- Filtreleme ve sıralama
- Veri işleme (CRUD)
- Klavye kısayolları
- Özel stil ve davranışlar
- Validation işlemleri
Bu dosya, JavaScript kodunu da içerir ve DataGrid'in tüm davranışlarını yapılandırır:
```javascript
var dataGrid = $("#dataGrid").dxDataGrid({
// DataGrid ayarları
dataSource: dataSource,
keyExpr: "{{$tableName}}",
allowColumnResizing: true,
// Diğer yapılandırmalar...
});
```
#### `upload.blade.php`
`resources/views/admin/type/document/upload.blade.php` dosyası, dosya yükleme işlemlerini yönetir. Özellikle PDF dosyalarını yüklemek için kullanılır. Aşağıdaki özellikleri içerir:
- Dropzone.js entegrasyonu
- Modal pencere ile yükleme arayüzü
- Birden fazla yükleme bölümü
- Özel klasörlere dosya yükleme
Bu bileşen, sablon4.blade.php içinde `@include("admin.type.document.upload")` ile dahil edilir.
### Form Elemanları ve Alan Tipleri
DataGrid içinde kullanılabilen farklı alan tipleri vardır:
- `text` - Standart metin girişi
- `date` - Tarih seçici
- `number` - Sayısal değer girişi
- `select` - Dropdown liste
- `auto-complete` - Otomatik tamamlama
- `link-search` - Bağlantı ve arama
- `decimal` - Ondalık sayı girişi
- `checkbox` - Onay kutusu
Her alan tipi için `components/table/datagrid/{tip}.blade.php` altında bir şablon vardır.
Örnek olarak select tipi için kullanım:
```php
$relationDatas = [
'field_name' => [
'type' => 'select',
'datas' => [
'option1' => 'Option 1',
'option2' => 'Option 2'
]
]
];
```
## Yeni Modül Geliştirme
Yeni bir modül geliştirmek için aşağıdaki adımları takip etmeniz gerekir:
1. **Model ve Migration Oluşturun**:
```php
// app/Models/YeniModul.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class YeniModul extends Model
{
protected $table = 'yeni_modul';
protected $primaryKey = 'id';
public $timestamps = true;
}
```
```php
// database/migrations/xxxx_create_yeni_modul_table.php
public function up()
{
Schema::create('yeni_modul', function (Blueprint $table) {
$table->id();
$table->string('ad')->nullable();
$table->text('aciklama')->nullable();
$table->timestamps();
});
}
```
2. **Şablonu Kopyalayın ve Özelleştirin**:
- `resources/views/admin/type/` dizini altında yeni bir blade dosyası oluşturun
- `sablon4.blade.php` temel alınarak özelleştirme yapabilirsiniz
```php
<?php
use App\Models\YeniModul;
$title = "Yeni Modül";
$tableWidth="100%";
$listDatas = YeniModul::orderBy("id","DESC")->paginate(setting('row_count'));
$tableName = "yeni_modul";
$blockGroup = [
'Genel Bilgiler' => [
'ad',
'aciklama',
],
// Diğer gruplar...
];
$firstUploadFolder = 'YeniModul/';
$firstUploadTitle = 'Dosya Yükle';
?>
<div class="content">
<div class="row">
@include("admin.type.document.upload")
@include("components.blocks.module-block")
</div>
</div>
```
3. **Type Tablosuna Kayıt Ekleyin**:
- Admin panelinden yeni bir tip ekleyin
- Modül için gerekli alanları belirtin
- URL adresi olarak oluşturduğunuz şablonu belirtin
**Önemli Not**: Citrus CMS'de yeni bir modül oluşturmak için genellikle model ve migration oluşturmak, ardından `sablon4.blade.php` şablonunu özelleştirmek yeterlidir. Tüm CRUD işlemleri otomatik olarak `AdminController.php` üzerinden yönetilir ve özel bir controller kodlamanıza gerek yoktur.
## Middleware ve İzin Sistemi
Uygulamada izin kontrolü şu şekilde yapılmaktadır:
1. **Kullanıcı Seviyeleri**: Her kullanıcı bir seviyeye sahiptir (level alanı)
2. **İzin Tanımları**: Her modül için okuma, yazma, tam kontrol izinleri tanımlanır
3. **Middleware Kontrolü**: Kullanıcının sahip olduğu seviyeye göre izin kontrolleri yapılır
```php
// İzin kontrolü örneği
if(isAuth($modulAdi, "read")) {
// Okuma izni var, işleme devam et
} else {
// İzin yok, erişim engellendi
}
```
### Kullanıcı İzin Kontrolü
`userPermissions()` fonksiyonu kullanıcının izinlerini döndürür ve `isAuth()` fonksiyonu belirli bir işlem için izin kontrolü yapar.
---
Bu dokümantasyon, projenin temel yapısını ve özelliklerini kapsamaktadır. Daha detaylı bilgi için ilgili kaynak kodları inceleyebilir veya ekip ile iletişime geçebilirsiniz.