savannabits / jetstream-inertia-generator

使用 Laravel Jetstream, Inertiajs, Vue.js, Pagetables 和 Tailwindcss 开发的 CRUD 生成器

v3.4.0 2023-04-17 06:29 UTC

README

Latest Version on Packagist GitHub code size in bytes Travis (.com) Build Scrutinizer build Total Downloads

⚠️ 我们将维护此存储库直到 Laravel 9,因为我们继续改进其继任者,Savannabits/Acacia,它更易于管理,模块化,并且完全独立于您的主应用程序。请查看它,如果您喜欢它,请给它一个星标。感谢您的支持!

Jetstream Inertia Generatorjig 允许您生成与 Laravel 项目完全兼容的简单 Admin CRUD(创建、读取、更新、删除)代码,该项目由 Jetstream - Inertia - Vue.js 栈提供支持。 预览

场景

您正在开发一个下一代项目。数据模型复杂。它需要管理员管理大量的 CRUD 以支持主要最终用户功能。您不希望花费 几天甚至几个月 为所有 CRUD 编写样板代码。如果您是这样,这个包就是您的救星。只需按照以下简单步骤操作

  • 为您的 CRUD 表生成迁移,例如 articles,并运行 php artisan migrate(大约 2 分钟
  • 使用此包,只需运行 php artisan jig:generate articles(大约 3 秒!!!
  • 构建您的 css 和 javascript(大约 27 秒) 完成!在约 2 分钟半 内,您将获得一个完全工作的模块,包括 -
  • 模型
  • 管理员控制器 - 列表、创建、显示、编辑、存储、更新、删除
  • API 控制器 - 列表、存储、显示、更新、删除
  • 授权策略 - viewAny、view、create、update、delete、restore、forceDelete
  • spatie/laravel-permissions 生成的权限 - articles、articles.index、articles.create、articles.show、articles.edit、articles.delete
  • 前端菜单项
  • 使用 Yajra Datatables 和 datatables.net 的前端数据表,具有操作功能
  • Tailwindcss 驱动的 CREATE 和 EDIT 表单
  • Tailwindcss 驱动的 SHOW 视图
  • Web 和 API 路由
  • 验证和授权请求类

您还能要求什么?将一天的工作缩短到不到 3 分钟。

我不喜欢配置,给我一个可以工作的代码!

不用担心。如果以下步骤太多,我们有一个几乎无需设置的启动模板,您可以使用它来开始项目而无需以下初始配置。请查看 JIG 模板 以开始。只需点击 使用此模板

依赖关系

如果您已按照 Jetstream - Inertia - Vue.js 安装说明 操作,则项目将具有最少的配置即可工作。其他重要依赖项,您必须配置包括

  1. Spatie Laravel Permissions - 这用于管理角色和权限。其迁移将在资产发布期间发布,之后您可以继续配置用户特征。
  2. Laravel Sanctum - 用于管理API和状态认证。由于整个应用将是一个单页应用,请确保您已在app/Http/Kernel.php中配置了sanctum中间件,如下所示
'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    ...
],

如果您使用的是v2.x版本

注意:本文档适用于JIG的v3.x版本。如果您使用的是v2.x,请在此处访问v2.x文档

安装前

  • 确保您已安装带有inertialaravel/jetstream

安装

  1. 您可以通过Composer安装此包
composer require savannabits/jetstream-inertia-generator

⚠️ 1. 在继续之前,请确保您已安装带有inertialaravel/jetstream

⚠️ 2. 第一步将安装spatie/laravel-permission。在继续之前,请确保您已发布了此包的迁移,以便创建角色和权限表。

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

💡 注意:当第一次生成CRUD时,将自动将title字段添加到rolespermissions表中。 ::

  1. 通过运行以下命令安装必要的npm开发依赖项:如果您使用的是npm
npm install --include=dev --legacy-peer-deps @headlessui/vue @inertiajs/inertia @inertiajs/inertia-vue3 @vitejs/plugin-vue popper.js @babel/plugin-syntax-dynamic-import dayjs dotenv numeral postcss postcss-import pusher-js laravel-echo laravel-vite sass sass-loader vite vue@^3.1 vue3-vt-notifications vue-flatpickr-component  vue-numerals mitt vue-select@^4 dynamic-import-polyfill

或者如果您使用的是yarn

yarn add -D @headlessui/vue @vitejs/plugin-vue @inertiajs/inertia @inertiajs/inertia-vue3 popper.js @babel/plugin-syntax-dynamic-import dayjs dotenv numeral postcss postcss-import pusher-js laravel-echo laravel-vite sass sass-loader vite vue@^3.1 vue3-vt-notifications vue-flatpickr-component  vue-numerals mitt vue-select@^4 dynamic-import-polyfill

您可以根据自己的喜好配置颜色调色板,但为了统一,请确保包括primarysecondarysuccessdanger变体,因为它们在jig模板中使用。

  1. 发布包的资产、配置、模板、组件和布局。这对于您获取管理员布局和在生成代码中使用的所有vue组件是必要的

选项1(适用于全新安装)

php artisan vendor:publish --force --provider="Savannabits\JetstreamInertiaGenerator\JetstreamInertiaGeneratorServiceProvider"

选项2(如果您正在升级包或已对本地更改不希望覆盖的情况很有用。)NB:如果您只想更新一些已发布的文件,请仅删除您想要更新的已发布文件,然后运行以下适当的命令

php artisan vendor:publish --tag=jig-blade-templates #Publishes resources/views/app.blade.php. If it already exists, use --force to replace it
php artisan vendor:publish --tag=jig-config #Publishes the config file. If it exists use --force to replace it.
php artisan vendor:publish --tag=jig-routes #Publishes routes/jig.php to hold routes for generated modules.If you have already generated some routes, be sure to back them up as this file will be reset if you --force it.
php artisan vendor:publish --tag=jig-views #publishes Vue Components, app.js, bootstrap.js and Layout files. Use --force to force replace
php artisan vendor:publish --tag=jig-scripts #publishes main.ts and Layout files. Use --force to force replace
php artisan vendor:publish --tag=jig-css #publishes app.css. Use --force to force replace
php artisan vendor:publish --tag=jig-assets #publishes logos and other assets
php artisan vendor:publish --tag=jig-compiler-configs #publishes postcss.config.js,vite.config.js, tsconfig.json and tailwind.config.js
php artisan vendor:publish --tag=jig-seeders #Publish database Seeders
  1. JigMiddleware添加到app/Http/Kernel.php中的web中间件组
protected $middlewareGroups = [
    'web' => [
        ...,
        \Savannabits\JetstreamInertiaGenerator\Middleware\JigMiddleware::class,
    ],
];
  1. 通过在app/Http/Kernel.php中的api中间件组中添加以下内容,允许对Sanctum API的第一方访问
protected $middlewareGroups = [
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        ...
    ],
];
  1. 修改.env以包含以下键
APP_BASE_DOMAIN=mydomain.test
# or https
APP_SCHEME=http
#optional mix_app_uri (The path under which the app will be served. It is recommended to run the app from the root of the domain.
MIX_APP_URI= 
#If MIX_APP_URI is empty.
APP_URL=${APP_SCHEME}://${APP_BASE_DOMAIN} 
#If MIX_APP_URI is not empty.
#APP_URL=${APP_SCHEME}://${APP_BASE_DOMAIN}/${MIX_APP_URI}

# Append the following key to your .env to allow 1st party consumption of your api:
#You can add other comma separated domains
SANCTUM_STATEFUL_DOMAINS="${APP_BASE_DOMAIN}"
  1. 创建storage:link(参见Laravel文档),以便通过Web访问公共磁盘资产(例如徽标)
php artisan storage:link
  1. 对于v3仅,将您的package.json中的scripts设置如下
"scripts": {
        "dev": "vite",
        "build": "vite build",
        "serve": "vite preview"
    },
  1. 通过在config/jetstream.php中的'features'下取消注释以下行来启用个人照片
Features::profilePhotos(),
  1. 运行迁移和种子
php artisan migrate
php artisan db:seed --class SeedAdminRoleAndUser
  1. 现在使用vitejs构建npm依赖项
yarn dev #Start the vitejs development server
yarn build #build assets for production

🚀 您现在可以生成CRUD了!🎉

用法

初始种子管理员用户和角色

当您运行php artisan vendor:publish --tag=jig-migrations时,会发布一个迁移,创建一个名为Administrator的默认用户和一个名为administrator的角色,以便您能够以管理员权限访问系统。用户账户的凭据如下:

在迁移后使用这些凭据登录并探索应用程序的所有部分

首先按顺序创建权限、角色和用户模块

在生成管理员之前,运行以下命令以生成用户访问控制模块

php artisan jig:generate:permission -f
php artisan jig:generate:role -f
php artisan jig:generate:user -f

您现在可以按照以下部分中的步骤继续生成您想要的任何其他CRUD。

生成CRUD的一般步骤

  1. 使用php artisan make:migration命令生成您的表的迁移并编写迁移。
  2. 使用php artisan migrate命令将迁移运行到数据库中
  3. 使用php artisan jig:generate命令为模块生成整个管理员界面
  4. 如有必要,请修改和自定义生成的代码以满足您的特定需求。__注意:如果crud已经存在,并且您想要生成,可以使用-f--force选项强制替换文件。

示例

假设您想生成一个books

php artisan make:migration create_books_table

books-crud

  • 打开您的迁移并按需修改,添加您的字段。之后,运行迁移。
php artisan migrate
  • 有趣的部分: 使用以下命令使用jig生成一个完整的书籍管理模块
php artisan jig:generate books #Format: php artisan generate [table_name] [-f]

注意: 要获取地下调用的所有jig命令的完整列表以及jig:generate命令的完整描述,可以运行以下命令

php artisan jig --help
php artisan jig:generate --help

上述命令将生成多个文件,并将路由添加到您的api.phpweb.php路由文件中。它还会将菜单项追加到发布的Menus.json文件中。生成的vue文件放置在js文件夹下的Pages/Books文件夹中。

  • 最后,运行yarn dev 或 yarn build来编译资产。这样您就有了您的CRUD。

角色、权限和侧边栏菜单

  • 默认情况下,生成模块会生成以下权限

    • index
    • create
    • show
    • edit
    • delete
  • 权限的命名规范为${module-name}.${perm},例如payments.index,users.create等。

  • 此包使用策略管理访问控制。每个生成的模块都生成一个策略,包含默认的laravel操作

    • viewAny, view, store, update, delete, restore, forceDelete 上面的权限在这些策略中进行检查。如果您需要修改任何访问权限,请查看策略。
  • 还必须生成特殊权限来控制侧边栏菜单的访问。这些权限不应该包含用点分隔的两个部分,而应该只有一个部分。

  • 菜单在位于./resources/js/Layouts/Jig/Menu.json的json文件中配置。

    • 对于所有菜单项,json键必须与控制该菜单的权限相匹配。生成每个模块时,都会生成一个不包含任何动词的权限,为此目的。例如,生成一个payments模块将生成一个payments权限。然后支付菜单必须将payments作为json键。
    • 对于父菜单和其他可能不匹配任何模块的菜单,您必须创建一个具有相同键名的权限来控制其访问。例如,如果您有一个名为master-data的父菜单,您必须生成一个具有相同名称的权限。

组件文档

Datatables

JIG建立在datatables.net之上,并使用Yajra Datatables完全在服务器端渲染。大部分逻辑位于App\Repositories内,在相应的仓库文件中,有一个名为dtColumns的方法,用于完全控制索引页面显示的列。

例如,为了控制用户数据表的显示列,以下是位于App\Repositories\Users.php下的dtColumns方法

public static function dtColumns(): array
    {
        return [
            Column::make('id')->title('ID')->className('all text-right'),
            Column::make("name")->className('all'),
            Column::make("first_name")->className('none'),
            Column::make("last_name")->className('none'),
            Column::make("middle_name")->className('none'),
            Column::make("username")->className('min-desktop-lg'),
            Column::make("email")->className('min-desktop-lg'),
            Column::make("gender")->className('min-desktop-lg'),
            Column::make("dob")->className('none'),
            //Column::make("email_verified_at")->className('min-desktop-lg'),
            Column::make("activated")->className('min-desktop-lg'),
            Column::make("created_at")->className('min-tv'),
            Column::make("updated_at")->className('min-tv'),
            Column::make('actions')->className('min-desktop text-right')->orderable(false)->searchable(false),
        ];
    }

注意:为了从我的索引列中省略email_verified_at类,我只需要将其注释掉(或者更好一点,直接从列列表中删除它!)

数据表默认是响应式的(有关详细信息,请参阅https://datatables.net.cn/extensions/responsive/)。为此,您可以使用jig提供的以下响应式断点自动折叠给定屏幕大小下的列。有关如何使用类逻辑的信息,请参阅类逻辑文档。我通常只使用min-,例如min-desktop-l

breakpoints: [
        { name: "tv", width: Infinity },
        { name: "desktop-l", width: 1536 },
        { name: "desktop", width: 1280 },
        { name: "tablet-l", width: 1024 },
        { name: "tablet-p", width: 768 },
        { name: "mobile-l", width: 480 },
        { name: "mobile-p", width: 320 },
    ],
}

查看我如何使用响应式类别的第一个片段!

测试

composer test

变更日志

请参阅变更日志获取更多关于最近更改的信息。

贡献

请参阅贡献指南获取详细信息。

安全

如果您发现任何与安全相关的问题,请通过maosa.sam@gmail.com发送电子邮件,而不是使用问题跟踪器。

鸣谢

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。