sample laravel set up easy

Laravel 简易项目搭建指南 (Sample Laravel Set Up Easy)

PART 1: Setup

Run the following commands to initialize the project, set up the database, and install the necessary UI and PDF packages.

执行以下命令以初始化项目、配置数据库并安装必要的 UI 和 PDF 扩展包。

composer create-project laravel/laravel fruit-system
cd fruit-system
# Create database in phpMyAdmin: fruit_db
# 在 phpMyAdmin 中创建数据库: fruit_db

# Edit .env:
# 编辑 .env 文件:
DB_DATABASE=fruit_db
DB_USERNAME=root
DB_PASSWORD=

# Install Breeze:
# 安装 Breeze:
composer require laravel/breeze --dev
php artisan breeze:install blade
php artisan migrate
npm install
npm run build

# Install Bootstrap UI and PDF only:
# 仅安装 Bootstrap UI 和 PDF 支持:
npm uninstall tailwindcss postcss autoprefixer
composer require aldhix/breeze-bootstrap-ui
php artisan breeze-bootstrap-ui:install --force
composer require barryvdh/laravel-dompdf
npm install
npm run build

# Create files:
# 创建文件:
php artisan make:model Fruit -mcr
php artisan make:controller ReportController

PART 2: Migration

Define the database schema for the fruits table.

定义 fruits 数据表的数据库结构。

// Open database/migrations/xxxx_create_fruits_table.php:
// 打开 database/migrations/xxxx_create_fruits_table.php:

public function up(): void {
    Schema::create('fruits', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('category');
        $table->decimal('price', 8, 2);
        $table->integer('stock');
        $table->text('description')->nullable();
        $table->boolean('is_available')->default(true);
        $table->timestamps();
    });
}

// Run:
// 执行:
php artisan migrate

PART 3: Model

Configure the Fruit model to allow mass assignment and cast the boolean field.

配置 Fruit 模型以允许批量赋值,并对布尔字段进行类型转换。

// Open app/Models/Fruit.php:
// 打开 app/Models/Fruit.php:

class Fruit extends Model {
    protected $fillable = [
        'name', 'category', 'price', 'stock', 'description', 'is_available',
    ];
    protected $casts = [
        'is_available' => 'boolean',
    ];
}

PART 4: Routes

Define the application routes. Note: Use reports.csv instead of reports.excel.

定义应用程序路由。注意:请使用 reports.csv 而非 reports.excel

// Open routes/web.php:
// 打开 routes/web.php:

Route::middleware('auth')->group(function () {
    Route::get('/', function () { return redirect()->route('fruits.index'); });
    Route::resource('fruits', FruitController::class);
    Route::get('/reports', [ReportController::class, 'index'])->name('reports.index');
    Route::get('/reports/pdf', [ReportController::class, 'exportPdf'])->name('reports.pdf');
    Route::get('/reports/csv', [ReportController::class, 'exportCsv'])->name('reports.csv');
    // ... (other profile routes)
});

PART 5: Fruit Controller

Handle CRUD operations for the fruit inventory.

处理水果库存的增删改查(CRUD)操作。

// Open app/Http/Controllers/FruitController.php:
// 打开 app/Http/Controllers/FruitController.php:

public function store(Request $request) {
    $request->validate([ /* validation rules */ ]);
    $data = $request->all();
    $data['is_available'] = $request->has('is_available') ? 1 : 0;
    Fruit::create($data);
    return redirect()->route('fruits.index')->with('success', 'Fruit added successfully!');
}

PART 6: Report Controller

Implement logic for filtering data and exporting reports to PDF or CSV.

实现数据筛选逻辑,并将报表导出为 PDF 或 CSV 格式。

// Open app/Http/Controllers/ReportController.php:
// 打开 app/Http/Controllers/ReportController.php:

public function exportCsv(Request $request) {
    // Logic to fetch filtered fruits and generate CSV output
    // 获取筛选后的水果数据并生成 CSV 输出的逻辑
    $callback = function () use ($fruits) {
        $file = fopen('php://output', 'w');
        fputcsv($file, ['Name', 'Category', 'Price/kg', 'Stock', 'Available', 'Description']);
        foreach ($fruits as $fruit) {
            fputcsv($file, [$fruit->name, $fruit->category, $fruit->price, $fruit->stock, $fruit->is_available, $fruit->description]);
        }
        fclose($file);
    };
    return response()->stream($callback, 200, $headers);
}