JapanAnimeTime/Template

用于引导Laravel项目开始的代码生成器

dev-main 2023-03-28 19:23 UTC

This package is not auto-updated.

Last update: 2024-09-24 20:12:03 UTC


README

它是用来做什么的?

此包可以从单个配置生成项目基础

生成结果是

  • 每个实体的合约
  • 每个实体的迁移
  • 每个实体的模型
  • 带有验证的GET、CREATE、UPDATE请求
  • 每个实体的控制器
  • 包含所有CRUD方法的基础仓库,由QueryFilters通过Pipeline进行配置
  • 每个实体扩展自基础仓库的仓库
  • 包含所有CRUD方法的基础服务
  • 扩展自基础服务并为每个实体提供服务的服务
  • 种子和工厂
  • 每个实体的CRUD路由
  • CRUD管理页面和Nuxt的基础结构

如何使用?

  • 创建新的Laravel项目
  • 完成所有必要的配置,例如填写.env
  • composer require japananimetime/template
  • 创建config/entities.php
  • 在那里描述您的实体(以下为示例)
  • php artisan make:entity
  • 享受!

配置示例

<?php

return [
    'user'      => [
        'fields'      => [
            'name'              => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'name()'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'email'             => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => true,
                'fillable'   => true,
                'faker'      => [true, 'email()'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'email'    => 'email:rfc,dns',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                        'email'  => 'email:rfc,dns',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'email_verified_at' => [
                'type'       => 'string',
                'nullable'   => true,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'unixTime()'],
                'validation' => [
                    'create' => [

                    ],
                    'update' => [

                    ],
                    'get'    => [

                    ],
                ],
            ],
            'phone'             => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => true,
                'fillable'   => true,
                'faker'      => [true, 'phoneNumber'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'password'          => [
                'type'       => 'string',
                'nullable'   => true,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [false, '\\Illuminate\\Support\\Facades\\Hash::make(\'123456\')'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'password' => ['required', 'confirmed', 'Illuminate\Validation\Rules\Password::min(6)'],
                        'required' => 'true',
                    ],
                    'update' => [
                        'string'   => 'true',
                        'password' => ['required', 'confirmed', 'Illuminate\Validation\Rules\Password::min(6)'],
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'remember_token'    => [
                'type'       => 'string',
                'nullable'   => true,
                'unique'     => false,
                'fillable'   => false,
                'faker'      => [false, 'null'],
                'validation' => [
                    'create' => [

                    ],
                    'update' => [

                    ],
                    'get'    => [

                    ],
                ],
            ],
            'subscription'      => [
                'type'       => 'bool',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, '1'],
                'validation' => [
                    'create' => [
                        'required' => 'true'
                    ],
                    'update' => [
                        'bool' => 'true'
                    ],
                    'get'    => [

                    ]
                ]
            ],
            'city'              => [
                    'type'       => 'string',
                    'nullable'   => false,
                    'unique'     => false,
                    'fillable'   => true,
                    'faker'      => [true, 'city()'],
                    'validation' => [
                        'create' => [
                            'string'   => 'true',
                            'required' => 'true',
                        ],
                        'update' => [
                            'string' => 'true',
                        ],
                        'get'    => [

                        ],
                    ],
                ],
            'language'              => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'language()'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],

        ],
        'requests'    => [
            'create' => [
                'auth' => true,
            ],
            'update' => [
                'auth' => true,
            ],
            'get'    => [
                'auth' => false,
            ],
        ],
        'softDeletes' => true,
        'pageLength'  => 16,
    ],
    'category'  => [
        'fields' => [
            'title' => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'title()'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'image' => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'imageUrl(640, 480)'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
        ],
        'requests'    => [
            'create' => [
                'auth' => true,
            ],
            'update' => [
                'auth' => true,
            ],
            'get'    => [
                'auth' => false,
            ],
        ],
        'softDeletes' => true,
        'pageLength'  => 16,
    ],
    'product'   => [
        'fields' => [
            'category_id' => [
                'type'       => 'unsignedBigInteger',
                'nullable'   => true,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [false, '\\App\\Models\\Category::inRandomOrder()->first() ? \\App\\Models\\Category::inRandomOrder()->first()->id : null'],
                'validation' => [
                    'create' => [
                        'integer'   => 'true',
                    ],
                    'update' => [
                        'integer' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'title' => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'title()'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'image' => [
                'type'       => 'string',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'imageUrl(640, 480)'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'description'  => [
                'type'       => 'text',
                'nullable'   => false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [true, 'text'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ],
            'price' => [
                'type'      =>  'integer',
                'nullable'  =>  false,
                'unique'     => false,
                'fillable'   => true,
                'faker'      => [false, 'integer'],
                'validation' => [
                    'create' => [
                        'string'   => 'true',
                        'required' => 'true',
                    ],
                    'update' => [
                        'string' => 'true',
                    ],
                    'get'    => [

                    ],
                ],
            ]
        ],
        'requests'    => [
            'create' => [
                'auth' => true,
            ],
            'update' => [
                'auth' => true,
            ],
            'get'    => [
                'auth' => false,
            ],
        ],
        'softDeletes' => true,
        'pageLength'  => 16,
    ],
];

使用Pipeline的QueryFilter

QueryFilter

<?php


namespace App\v2\QueryFilters\Product;


use App\v2\Contracts\ProductContract;

class Hidden
{
    /**
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @param                                       $next
     *
     * @return mixed
     */
    public function handle(\Illuminate\Database\Eloquent\Builder $query, $next)
    {
        if(request()->has('hidden')){
            $query->where(ProductContract::HIDDEN, true);
        }

        return $next($query);
    }
}

控制器

<?php

namespace App\Http\Controllers\API\V1;

use App\Http\Controllers\Controller;
use App\QueryFilters\Product\Hidden;
use App\Http\Requests\GetProductRequest;
use App\Services\ProductService;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    private ProductService $productService;

    public function __construct(ProductService $productService)
    {
        $this->productService = $productService;
    }

    public function universal(Request $request)
    {
        $result = $this->productService->paginate(
            [
                Hidden::class,
            ]
        );

        return response($result['message'], $result['status']);
    }

Nuxt上的基础CRUD管理

生成后,您将在public中获得admin文件夹

在某个地方创建新的Nuxt项目,并将admin文件夹中的内容复制到Nuxt项目中

待办事项

  • 修复生成文件的格式
  • 使管理页面更易于使用,至少添加对不同字段的支持,例如图像插件而不是仅文本字段
  • 完成配置创建的图形界面