【Laravel】Laravel-admin後臺框架-2創建數據表建立模塊增刪改查CURD(1)

前言

前面我們已經能夠完整創建Laravel-admin的項目了,接下來要在做中學,學習如何實際創建一個符合業務的模塊,完成CURD的操作。

實戰

定義業務

業務:比如我們要做個健身教練錄入上課訓練的記錄,記錄每次教學的情況。

設計數據表

目前只做一張表,後續再迭代。

CREATE TABLE `fit_record` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶名稱',
  `admin_id` int(11) unsigned NOT NULL COMMENT '教練名稱',
  `class_time` time NOT NULL COMMENT '上課時間',
  `star` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '評分',
  `date` date NOT NULL COMMENT '日期',
  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '總結',
  `created_at` datetime NOT NULL COMMENT '創建時間',
  `updated_at` datetime NOT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='課程記錄表';

創建模型

lixiaoyu@localhost fit % composer require reliese/laravel
    1/13:	https://mirrors.aliyun.com/composer/p/provider-archived$52c8dd62b281440663b1f30ca24e96ff31ead2f625af3ee85487abb1ad7929b8.json
    2/13:	https://mirrors.aliyun.com/composer/p/provider-2019-07$a244f7ffcdbae34f7bc0b0429cde5b2e506ee8e3c27ad47792c4e2a934a43647.json
    3/13:	https://mirrors.aliyun.com/composer/p/provider-2015$8560c0f524832933b1e7e2ee13aee2ab7733008eda885fbe1f784eab5652d0f7.json
    4/13:	https://mirrors.aliyun.com/composer/p/provider-2019-10$057ca9a7b38aeef220511ee9dfb8846a0bf677bb3ccce6392e163a8d9d8ac6e2.json
    5/13:	https://mirrors.aliyun.com/composer/p/provider-2013$0332a3aa11cf0cbe03d02cc56124f22c14e38846fcf01674d6732f6db01c1119.json
    6/13:	https://mirrors.aliyun.com/composer/p/provider-2014$270468bbe7b61b879a2a54169b471353c86318e4a9e1b40851d6763989d42e08.json
    7/13:	https://mirrors.aliyun.com/composer/p/provider-2019$cc2fc124e2fdb7f586f597a3e2f49219548f6c489fa91802b5a849c8c4887d75.json
    8/13:	https://mirrors.aliyun.com/composer/p/provider-latest$fd0ad9c5fb4d252916129e185cdf1250f26de2aa36f05395c65c1f0ff4adcce6.json
    9/13:	https://mirrors.aliyun.com/composer/p/provider-2017$a23758a1eeb4bcda969878ebb62f452ce904f319fccc9deec62d6674f6d93806.json
    10/13:	https://mirrors.aliyun.com/composer/p/provider-2020-01$76eb865fc55298c6e7edd8176c30978bcc676e3be254a3fb044cf4c620fdc114.json
    11/13:	https://mirrors.aliyun.com/composer/p/provider-2020-04$05757647de7ff0e2c4d67553023fcc56ce91eced6ae49c6dcda45fd2a710bb08.json
    12/13:	https://mirrors.aliyun.com/composer/p/provider-2016$137b5465b9ee2d71731e79e23efdb0eb613bb3dd94b839c8f7331ef1ecc4995c.json
    13/13:	https://mirrors.aliyun.com/composer/p/provider-2018$6b1f4cd011f8668c7aa58d37879b462b8abcaebe07a55adec2d1fb1eb87490a5.json
    Finished: success: 13, skipped: 0, failure: 0, total: 13
Using version ^0.0.16 for reliese/laravel
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
    1/1:	https://mirrors.aliyun.com/composer/dists/reliese/laravel/f4a95c8a37d1c0b117939d7d8660119474d1704b.zip
    Finished: success: 1, skipped: 0, failure: 0, total: 1
Package operations: 1 install, 0 updates, 0 removals
  - Installing reliese/laravel (v0.0.16): Loading from cache
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: encore/laravel-admin
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: reliese/laravel
Package manifest generated successfully.
46 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

修改config/app.php找到providers添加如下內容

Reliese\Coders\CodersServiceProvider::class,
lixiaoyu@localhost fit % php artisan vendor:publish --tag=reliese-models
Copied File [/vendor/reliese/laravel/config/models.php] To [/config/models.php]
Publishing complete.
lixiaoyu@localhost fit % php artisan config:clea
Configuration cache cleared!
lixiaoyu@localhost fit % php artisan code:models
Check out your models for laravel
lixiaoyu@localhost fit % ls app/Models 
AdminMenu.php		AdminPermission.php	AdminRoleMenu.php	AdminRoleUser.php	AdminUserPermission.php	FitRecord.php
AdminOperationLog.php	AdminRole.php		AdminRolePermission.php	AdminUser.php		FailedJob.php		User.php

你就能看到全部的表都創建了對應的模型。

創建控制器

lixiaoyu@localhost fit % php artisan admin:make RecordController --model=App\\Models\\FitRecord
App\Admin\Controllers\RecordController created successfully.

Add the following route to app/Admin/routes.php:

    $router->resource('fit-records', RecordController::class);

接下來按說明在app/Admin/routes.php添加

	$router->resource('record', RecordController::class);

控制器已經自動創建在了App\Admin\Controllers\RecordController,已經默認使用了模型並創建了對應的表單

內容如下:

namespace App\Admin\Controllers;

use App\Models\FitRecord;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;

class RecordController extends AdminController
{
    /**
     * Title for current resource.
     *
     * @var string
     */
    protected $title = 'FitRecord';

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new FitRecord());

        $grid->column('id', __('Id'));
        $grid->column('user_name', __('User name'));
        $grid->column('admin_id', __('Admin id'));
        $grid->column('class_time', __('Class time'));
        $grid->column('star', __('Star'));
        $grid->column('date', __('Date'));
        $grid->column('remark', __('Remark'));
        $grid->column('created_at', __('Created at'));
        $grid->column('updated_at', __('Updated at'));

        return $grid;
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(FitRecord::findOrFail($id));

        $show->field('id', __('Id'));
        $show->field('user_name', __('User name'));
        $show->field('admin_id', __('Admin id'));
        $show->field('class_time', __('Class time'));
        $show->field('star', __('Star'));
        $show->field('date', __('Date'));
        $show->field('remark', __('Remark'));
        $show->field('created_at', __('Created at'));
        $show->field('updated_at', __('Updated at'));

        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new FitRecord());

        $form->text('user_name', __('User name'));
        $form->number('admin_id', __('Admin id'));
        $form->datetime('class_time', __('Class time'))->default(date('Y-m-d H:i:s'));
        $form->switch('star', __('Star'));
        $form->date('date', __('Date'))->default(date('Y-m-d'));
        $form->text('remark', __('Remark'));

        return $form;
    }
}

可以看到的是,這個控制器繼承了AdminController,他裏面寫了對應的create,show,edit,list方法

一般情況下都是不能滿足業務需求的,所以需要自己寫。

訪問地址

創建之後,對應的地址是http://fit.local/admin/record,其中fit.loca是我自己本地定義的。

在這裏插入圖片描述

完善創建功能

目前的創建是這樣的

在這裏插入圖片描述
需要完善的部分

  • 描述相關改成中文
  • 修改表單順序
  • 隱藏admin_id默認爲當前登錄用戶的id
  • star改成0到5的range
  • 表單字段改成中文
  • 去掉不需要的按鈕比如重置

model

namespace App\Models;

use Carbon\Carbon;
use Encore\Admin\Admin;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

/**
 * Class FitRecord
 *
 * @property int $id
 * @property string $user_name
 * @property int $admin_id
 * @property Carbon $class_time
 * @property bool $star
 * @property Carbon $date 日期
 * @property string $remark 備註
 * @property int $created_at
 * @property int $updated_at
 *
 * @package App\Models
 */
class FitRecord extends Model
{
	protected $table = 'fit_record';

	protected $casts = [
		'admin_id' => 'int',
		'star' => 'bool',
		'created_at' => 'datetime',
		'updated_at' => 'datetime'
	];

	protected $dates = [
		'class_time',
		'date'
	];

	protected $fillable = [
		'user_name',
		'admin_id',
		'class_time',
		'star',
		'date',
		'remark'
	];

	public static $label = [
	    'user_name'=>'用戶名',
        'star'=>'評分',
        'date'=>'日期',
        'class_time'=>'開始時間',
        'remark'=>'備註',
        'created_at' => '創建時間',
        'updated_at' => '修改時間'
    ];


	public function __construct(array $attributes = [])
    {
        if($this->id == null){
            $this->admin_id = \Encore\Admin\Facades\Admin::user()->id; //初始化管理員id
        }
        parent::__construct($attributes);
    }
}

controller

    protected function form()
    {
        $form = new Form(new FitRecord());

        $form->tools(function (Form\Tools $tools) {
            $tools->disableList();
            $tools->disableDelete();
            $tools->disableView();

        });

        $form->footer(function ($footer) {
            $footer->disableReset();;
            $footer->disableViewCheck();
            $footer->disableEditingCheck();
        });

        $form->text('user_name', FitRecord::$label['user_name']);
        $form->time('class_time',   FitRecord::$label['class_time'])->default(date('H:i:s'));
        $form->number('star', FitRecord::$label['star'])->min(0)->max(5)->default(5);
        $form->date('date',FitRecord::$label['date'])->default(date('Y-m-d'));
        $form->textarea('remark', FitRecord::$label['remark']);

        $form->display('created_at', '創建時間');
        $form->display('updated_at', '修改時間');
        return $form;
    }

修改完成對應的模型和視圖之後,頁面展示如下

在這裏插入圖片描述

到此完成了數據新增的修改。

總結

  • 自動創建模型
  • 修改模型規則
  • 顯示字段註釋
  • 構造函數寫入登錄用戶id

參考資料

  • https://github.com/reliese/laravel
  • https://learnku.com/docs/laravel/7.x/authentication/7474
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章