Win10环境使用Laravel8+Laravel-Admin2.0搭建管理后台

本文详细介绍了如何在Win10环境下,利用WAMP、Composer、Node.js等工具,一步步安装和配置Laravel8和Laravel-Admin2.0,包括环境配置、数据库连接、数据迁移、模型创建、控制器生成、路由配置等内容,最终实现后台管理系统的搭建。

Win10环境使用Laravel8+Laravel-Admin2.0搭建管理后台

1. 安装

1.1 Laravel8

1.1.1 WAMP

WAMP是指在Windows服务器上使用Apache、MySQL和PHP的集成安装环境,可以快速安装配置Web服务器。
本篇内容使用的phpStudy8.1.1.3

  • 支持Php 8.0.2
  • 支持Mysql 8.0.12
  • 支持Redis 3.0.5
  • 支持Nginx 1.16.1

1.1.2 Composer

Composer 是 PHP 的一个依赖管理工具。
官方下载地址
https://getcomposer.org/download/

1.1.3 Node.js

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具!Laravel8 的扩展需要Node.js环境支持。
官方下载地址
http://nodejs.cn/download/

1.1.4 Laravel 8

在D盘home目录创建项目myweb,安装程序自动创建home和myweb目录
composer create-project laravel/laravel=8.* --prefer-dist d:\home\myweb

1.2 Laravel-Admin

Laravel-Admin 2.0 功能齐全的后台管理扩展包
laravel-admin 2.0 是基于laravel 7.*的版本和AdminLTE前端样式框架开发的一套通用后台管理系统laravel-admin:

  • 内置基于RBAC的权限系统
  • 菜单管理,和权限系统结合
  • 模型数据表格,能快速构建数据表格,并支持多种模型关系
  • 模型表单以及30+种form元素组件,自动实现增、删、改功能
  • 支持本地和云存储,支持图片的剪裁、压缩、加水印等操作
  • 大量常用后台开发组件

1.2.1 安装admin扩展包

composer require encore/laravel-admin:2.*

1.2.2 发布资源到项目里

php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

1.2.3 数据库连接配置

  • .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=admin
DB_USERNAME=admin
DB_PASSWORD=abcdddd
  • config\database.php
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

1.2.4 初始化数据

php artisan admin:install

1.2.5 启动本地服务器验证

php artisan serve
启动服务后,在浏览器打开 http://localhost/admin/ ,使用用户名 admin 和密码 admin登录

2. 深入配置

2.1 Laravel App 环境

编辑config/app.php

2.1.1 中文语言

  • 设置Laravel中文语言支持
'locale' => 'zh-CN',
  • 备用语言,如果locale指定语言找不到相应内容使用备用语言
'fallback_locale' => 'en',
  • 让Faker数据生成器能生成中文假数据
'faker_locale' => 'zh-CN',

2.1.2 增加自定义中文翻译

resources/lang目录下新建resources/lang/zh-CN.json

{
    "Id": "ID",
    "ID": "ID",
    "Created at":"创建时间",
    "Updated at":"更新时间",
    "name":"名字",
    "email":"邮箱",
    "Item name":"项目名称",
    "Item id":"项目ID",
    "Publish":"发布状态",
    "Expiry date":"有效期",
    "Access level":"访问级别",
    "Order":"排序",
    "Content":"内容",
    "Type":"类型",
    "Plan name":"方案名称",
    "Plan id":"方案ID",
    "User level":"用户访问级别"
}

控制器里相应的显示Label标签就会自动按上表规则翻译成中文显示

		$table->column('item_id', __('Item id'));

“Item id"在页面里显示为"项目ID”

2.1.3 设置时区

//'timezone' => 'UTC',
'timezone' => 'Asia/Shanghai',

2.1.4 设置HTTPS访问

布署到CentOS站点时,如果站点使用SSL证书,Nginx会配置把所有http访问重定向到https链接访问,这时登录页面可能会重定向自己的https链接,造成没有任何提示且无法正常登录的情况,这时需要修改larave的.env环境文件,在任何行加入允许HTTPS访问

ADMIN_HTTPS=true

2.2 Admin环境

config/admin.php

2.2.1 定制页面

  • 登录页面的大标题,显示在登录页面
	'name' => 'Laravel-admin',
  • 登录内页Logo角标
	'logo' => [
        'image' => '/vendor/laravel-admin/AdminLTE/img/AdminLTELogo.png',
        'text' => '<span class="font-weight-bolder">我的CMS</span>'
    ],
  • 所有页面的标签内容
	'title' => '我的CMS | 管理',
  • 登录页面的背景图设置
'login_background_image' => '',

2.2.2 文件上传设置

  • Form表单中的image和file类型的默认上传磁盘和目录设置
	'upload' => [

        // `config/filesystem.php`中设置的disk路径
        'disk' => 'admin',

        // image和file类型表单元素的上传目录
        'directory' => [
            'image' => 'images',
            'file'  => 'files',
        ],
    ],
  • config/filesystem.php
		//本地端public的uploads空间,用于远程存储与浏览器访问,完全对外开放
        'admin' => [
            'driver' => 'local',
            'root' => public_path('upload'),
            'url' => env('APP_URL').'/upload',
            'visibility' => 'public',
        ],

3. 使用Migration创建数据库

3.1 数据迁移

Laravel数据迁移创建数据表结构

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateQuestionnairesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('questionnaires', function (Blueprint $table) {
            $table->increments('id');
            $table->string('item_name', 190)->unique();
            $table->timestamp('expiry_date');
            $table->timestamp('publish');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('questionnaires');
    }
}

-timestamps() 等价于下面两条命令,同时创建’created_at’和’updated_at’字段
$table->timestamp(‘created_at’)
$table->timestamp(‘updated_at’)
-increments(‘id’) 自增id
-unique() 定义字段数据唯一性
-comment(‘字段注解’) 定义字段注解
-其他常用选项
$table->engine = ‘InnoDB’; // 指定表引擎
$table->charset = ‘utf8mb4’; // 表字符集
$table->collation = ‘utf8mb4_unicode_ci’; // 表排序规则

3.2 数据填充

使用DatabaseSeeder类填充测试数据,或者设置你的APP初始数据

3.2.1 使用Seeder方式填充菜单预设数据

3.2.1.1 生成并编写Seeder

php artisan make:seeder AdminMenuSeeder

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

class AdminMenuSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table(config('admin.database.menu_table'))->insert([
        	[
	            'parent_id' => 0,
	            'order' => 1,
	            'title' => '仪表盘',
	            'icon' => 'fas fa-tachometer-alt',
	            'uri' => '/',
	            'created_at' => Carbon::now(),
	            'updated_at' => NULL,
	        ],     
	        [
	            'parent_id' => 0,
	            'order' => 7,
	            'title' => '客户管理',
	            'icon' => 'fas fa-user-tie',
	            'uri' => NULL,
	            'created_at' => Carbon::now(),
	            'updated_at' => NULL,
	        ],
	        [
	            'parent_id' => 0,
	            'order' => 9,
	            'title' => '系统管理',
	            'icon' => 'far fa-circle',
	            'uri' => NULL,
	            'created_at' => Carbon::now(),
	            'updated_at' => NULL,
	        ],
	        [
	            'parent_id' => 4,
	            'order' => 71,
	            'title' => '客户列表',
	            'icon' => 'fas fa-users',
	            'uri' => '/users',
	            'created_at' => Carbon::now(),
	            'updated_at' => NULL,
	        ],
	        [
	            'parent_id' => 4,
	            'order' => 72,
	            'title' => '客户统计',
	            'icon' => 'fas fa-chart-line',
	            'uri' => '/users_data',
	            'created_at' => Carbon::now(),
	            'updated_at' => NULL,
	        ],
	        
	        [
	            'parent_id' => 5,
	            'order' => 91,
	            'title' => '菜单设置',
	            'icon' => 'fas fa-bars',
	            'uri' => 'auth/menu',
	            'created_at' => Carbon::now(),
	            'updated_at' => NULL,
	        ],
	        [
	            'parent_id' => 5,
	            'order' => 92,
	            'title' => '人员管理',
	            'icon' => 'fas fa-user-shield',
	            'uri' => 'auth/users',
	            'created_at' => Carbon::now(),
	            'updated_at' => NULL,
	        ],
        ]);
    }
}

3.2.1.2 自定义Seeder加入DatabaseSeeder全局类

DatabaseSeeder.php里设置需要执行哪些Seeder规则或Factory规则进行填充

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(AdminMenuSeeder::class);
    }
}

3.2.2 使用Factory方式填充用户测试数据

3.2.2.1 生成并编写Factory

php artisan make:factory UserFactory

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }

    /**
     * Indicate that the model's email address should be unverified.
     *
     * @return \Illuminate\Database\Eloquent\Factories\Factory
     */
    public function unverified()
    {
        return $this->state(function (array $attributes) {
            return [
                'email_verified_at' => null,
            ];
        });
    }
}
3.2.2.2 自定义Factory加入DatabaseSeeder全局类

DatabaseSeeder.php里设置需要执行哪些Seeder规则或Factory规则进行填充

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(AdminMenuSeeder::class);
		\App\Models\User::factory(10)->create();
    }
}

3.2.3 执行数据填充

php artisan make:refresh

重置数据库

php artisan db:seed

使用DatabaseSeeder.php定义的Seeder和factory填充数据

未在DatabaseSeeder.php的Seeder可以也直接调用执行
php artisan db:seed ---class=调用的Seeder名称

4. 创建数据模型

4.1 Eloquent 模型

Laravel Eloquent模型是一个对象关系映射器(ORM),使用的简洁的 ActiveRecord 实现来和数据库进行交互。

关系映射为对象
映射为模型类
记录映射为模型对象
字段映射为模型对象属性
关联映射为模型关联

4.2 使用数据模型定义连接数据表

php artisan make:model /App/Admin/Models/User

<?php

namespace App\Admin\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Encore\Admin\Traits\DefaultDatetimeFormat;

class User extends Model
{
    use HasFactory;
    use DefaultDatetimeFormat; 
    //protected $table = 'user';
}
  • namespace 空间名
  • class 类名
    模型文件采用单数形式命名,而数据表采用复数形式命名。
    比如User模型默认对应Users 数据表,可以用protected $table指定表
  • protected $table
    访问指定的数据表
  • use HasFactory
  • use DefaultDatetimeFormat 时区格式
    使用config/app设置’timezone’的时区显示数据库返回的时间
    记得在头部引入类’use Encore\Admin\Traits\DefaultDatetimeFormat;’
  • 指定主键
    protected $primaryKey = ‘article_id’;
  • 是否开启时间戳
    protected $timestamps = false;
  • 设置时间戳格式为Unix
    protected $dateFormat = ‘U’;

4.3 过滤字段

只有包含的字段才能被更新

    protected $fillable = [
        'name',
        'email',
        'password',
    ];

4.4 隐藏字段

模型转换为数组时应当隐藏的字段

    protected $hidden = [
        'password',
        'remember_token',
    ];

4.5 属性转换类型

数据库取出的字段属性转换成需要的数据类型

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

5. 创建控制器

5.1 生成控制器并关联模型

使用模型获取及处理数据,定义数据页面的显示形式

php artisan admin:make UsersController --model=App\Admin\Models\User
or Laravel-Admin 1.8+版本
php artisan admin:controller App\Admin\Models\User

namespace App\Admin\Controllers;

use App\Admin\Models\Users;
use Encore\Admin\Form;
use Encore\Admin\Http\Controllers\AdminController;
use Encore\Admin\Show;
use Encore\Admin\Table;

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

    /**
     * Make a table builder.
     *
     * @return Table
     */
    protected function table()
    {
        $table = new Table(new Users());

        $table->column('id', __('Id'));
        $table->column('name', __('Name'));
        $table->column('email', __('Email'));
        $table->column('email_verified_at', __('Email verified at'));
        $table->column('password', __('Password'));
        $table->column('remember_token', __('Remember token'));
        $table->column('created_at', __('Created at'));
        $table->column('updated_at', __('Updated at'));

        return $table;
    }

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

        $show->field('id', __('Id'));
        $show->field('name', __('Name'));
        $show->field('email', __('Email'));
        $show->field('email_verified_at', __('Email verified at'));
        $show->field('password', __('Password'));
        $show->field('remember_token', __('Remember token'));
        $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 Users());

        $form->text('name', __('Name'));
        $form->email('email', __('Email'));
        $form->datetime('email_verified_at', __('Email verified at'))->default(date('Y-m-d H:i:s'));
        $form->password('password', __('Password'));
        $form->text('remember_token', __('Remember token'));

        return $form;
    }
}

此处可以直接跳到 6. 配置访问路由,完成基本步骤,并登录Admin系统直观了解,模型、控制器、路由三者构建一个完整的数据访问、显示、修改的内容页。
5.2收下内容为表格、表单的更多自定义操作、显示、查询等功能,掌握基本构建过程后,再深入学习这些内容。

5.2 控制器定义数据表显示样式与内容

5.2.1 数据表格显示 model-table

5.2.1.1 创建数据表格实例

Encore\Admin\Table类 用于生成基于数据模型的表格

	$table = new Table(new Users());

从用户的数据模型获取数据,使用new Table()创建一个表格实例,定义这些数据的显示方式。

  • 禁用创建按钮,关闭数据表的“新增”按钮
    disableCreateButton()
	$table->disableCreateButton();
  • 禁用导出数据按钮
    disableExport()
  • 禁用行选择的选择框checkbox组件
    disableRowSelector()
  • 模态框(弹出式窗口)打开创建和编辑表单
    modalForm()
5.2.1.2 定义表格列内容
  • 定义列显示内容
    column(‘字段名’, ‘表格列名’)
	$table->column('name', '用户名')
  • 加入方法组件
    sortable() 方法为“用户名”这列添加排序按钮
	$table->column('name', '用户名')->sortable();
  • 列值格式化显示
    display() 方法来通过传入的回调函数来处理当前列的值

例:用户创建时间早于某时间的,创建时间字段标红处理

$table->column('created_at')->display(function ($created_at) {
	if($created_at >  '2022-03-10 00:00:00') {
	    return "<span style='color:black'>$created_at</span>";
	}else{
		return "<span style='color:red'>$created_at</span>";
	}
});

虚拟一个新增列名,用不同字段内容组合新的内容,例:full_name的内容为 id name

尽量避免在回调函数中去查询数据库或者调用外部接口,这样会在每一行渲染的时候运行查询或者外部接口的调用,严重影响性能,一个好的办法是给模型建立关联关系,然就用模型的with方法将关联数据一并查询出来.

// 虚拟一个不存在的`full_name`字段
$table->column('full_name')->display(function () {
    return $this->id . ' ' . $this->name;
});
  • 列常用方法
  • 内容映射
    using([‘0’ => ‘女’, ‘1’ => ‘男’])
  • 内容替换
    replace([0 => ‘-’])
  • 显示为图片
    image(‘http://xxx.com’, 100, 100)
  • 显示为标签
    label(‘danger’)
    设置颜色,默认success,可选dangerwarninginfoprimarydefaultsuccess
    如果需要将status字段的不同的值显示为不同颜色的label:
    $table->column(‘status’)->label([
    1 => ‘default’,
    2 => ‘warning’,
    3 => ‘success’,
    4 => ‘info’,
    ]);
  • 换算为文件尺寸MB,显示更有可读性
    filesize()
  • 显示布尔值为✓和✗
    bool()
    bool([‘Y’ => true, ‘N’ => false])
  • 列数值统计
    totalRow()
    自定义统计显示格式:
    t a b l e − > c o l u m n ( ′ i d ′ , ′ 金 额 ′ ) − > t o t a l R o w ( f u n c t i o n ( table->column('id', '金额')->totalRow(function ( table>column(id,)>totalRow(function(amount) {
    return " {$amount} 元";
    });
5.2.1.3 定义表格行显示
  • 行操作
    数据表格每行数据,默认有编辑、查看、删除的按钮,它们可以被禁用
$table->actions(function ($actions) {
    $actions->disableDelete(); // 去掉删除按钮
    $actions->disableEdit(); // 去掉编辑按钮
    $actions->disableView(); // 去掉详情按钮
});
$table->disableActions(); // 全部禁用
// 禁用批量删除按钮
$table->batchActions(function ($batch) {
    $batch->disableDelete();
});
  • 列表页双击功能

双击列表页的某一行,进行相应的操作
编辑记录edit
查看详情view
删除记录delete

$table->actions(function ($actions) {
    $actions->dblclick('edit'); // 双击数据行,进入编辑页面
});
5.2.1.4 表格查询过滤

model-table 提供系列方法实现表格数据的查询过滤

5.2.1.4.1 自定义表格头部默认的查询过滤器
$table->filter(function($filter){
    $filter->disableIdFilter();  // 去掉默认的id过滤器
    $filter->like('name', 'name'); // 添加name字段过滤器
});
5.2.1.4.2 常用查询类型
  • 模糊包含查询 like
	$filter->like('column', $label);
	$filter->like('name', '张'); //查询所有张姓用户
  • 模糊排除查询 ilike
	$filter->ilike('column', $label);
  • 过滤器组 group
	$filter->group('id', 'ID', function ($group) {
	    $group->gt('大于');
	    $group->lt('小于');
	    $group->nlt('不小于');
	    $group->ngt('不大于');
	    $group->equal('等于');
	});
  • 数值区间 between
	$filter->between('column', $label);
	$filter->between('created_at', '创建日期')->date(); //查询在某天与某天之间创建的数据
  • 复杂条件 where
	$filter->where(function ($query) {
	    $query->where('title', 'like', "%{$this->input}%")
	        ->orWhere('content', 'like', "%{$this->input}%");
	}, 'Text');
5.2.1.4.3 限制用户输入的查询条件格式
	$filter->group('id', 'ID', function ($group) {
	    $group->gt('大于');
	    $group->lt('小于');
	    $group->nlt('不小于');
	    $group->ngt('不大于');
	    $group->equal('等于');
	})->integer();
  • integer()
    整数格式
  • mobile()
    手机号码格式
  • email()
    电邮格式
  • url()
    URL格式
  • ip()
    IP地址格式
  • mac()
    网卡地址格式
  • date()
    日期格式 ‘YYYY-MM-DD’
  • time()
    时间格式 ‘HH:mm:ss’
  • day()
    日期格式 ‘DD’
  • month()
    日期格式 ‘MM’
  • year()
    日期格式 ‘YYYY’])`

5.2.2 详情表单显示 model-show

5.2.2.1 创建详情表单实例

Encore\Admin\Show 类用于生成基于数据模型Models的详情表单

	$table = new Show(Post::findOrFail($id));
5.2.2.2 定义字段显示内容
  • 定义字段显示内容
    field(‘字段名’, ‘标签名’)
	$show->field('id', 'ID');
5.2.2.3 格式化显示
  • 自定义标题字段的显示风格
	$show->title()->as(function ($title) {
	    return "<{$title}>";
	});
  • 显示为图片格式
    image()
	$show->avatar()->image(); // avatar字段的内容使用图片格式显示
  • 显示为路径或url格式
    file()
	$show->avatar()->file(); // avatar字段的内容显示为路径格式
  • 显示为HTML链接
    link()
  • 显示文件尺寸
    filesize()

5.2.3 修改数据表单 model-form

5.2.3.1 创建数据表单实例

Encore\Admin\Form 类用于生成基于Users数据模型的数据表单

	$form = new Form(new Users());
5.2.3.2 定义表单显示
  • 定义表单显示
    表单组件(‘字段名’, ‘标签名’)
	$form->text('name', '姓名');
  • 增加提交确认按钮
	$form->confirm('确定更新吗?', 'edit');
	$form->confirm('确定创建吗?', 'create');
	$form->confirm('确定提交吗?');
5.2.3.3 自定义表单布局
// 左边容器占据1/2的页面宽度
$form->column(1/2, function ($form) {
    // 左边的表单项
});
// 右边容器占据1/2的页面宽度
$form->column(1/2, function ($form) {
    // 右边的表单项
});
5.2.3.4 常用表单组件类型
5.2.3.4.1 表单组件
  • Text 文本组件
	$form->text($column, [$label]);
  • Select 单选
	$form->select($column[, $label])->options([1 => 'foo', 2 => 'bar', 'val' => 'Option name']);

从api中获取选项列表:

	$form->select($column[, $label])->options('/api/users');

api接口的数据格式:

[
    {
        "id": 9,
        "text": "xxx"
    },
    {
        "id": 21,
        "text": "xxx"
    },
    ...
]
  • MultipleSelect多选
	$form->multipleSelect($column[, $label])->options([1 => 'foo', 2 => 'bar', 'val' => 'Option name']);
  • Number 数字输入
	$form->number($column[, $label])->max(100);
  • 设置最大值
    max(100);
  • 设置最小值
    min(10);
  • 设置步数
    step(10);
  • 设置位数
    decimals(2);
  • Mobile 手机号码
	$form->mobile($column[, $label])->options(['mask' => '999 9999 9999']);
  • Radio
	$options = ['value' => 'label', 'value' => 'label'];
	$form->radio($column[, $label])->options($options)
  • Password 密码输入
	$form->password($column[, $label]);
  • Datetime 日期时间
	$form->datetime($column[, $label])->format('YYYY-MM-DD HH:mm:ss');
  • Hidden 隐藏域
	$form->hidden($column);
  • Switch 开关
	$states = [
	    'on'  => ['value' => 1, 'text' => '打开', 'color' => 'success'],
	    'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'],
	];
	$form->switch($column[, $label])->states($states);
  • Image 图片
	$form->image($column[, $label]);
  • 上传图片之后生成缩略图
    thumbnail(‘small’, $width = 300, $height = 300)

安装intervention/image,可以压缩、裁切、添加水印

  • 裁剪图片
    crop(int $width, int $height, [int $x, int $y])
  • 图片加水印
    insert($watermark, ‘center’)
5.2.3.4.2 公共方法
  • 设置默认值
	$form->text('title')->default('text...');
  • 设置必填
	$form->text('title')->required();
  • 设置只读
	$form->text('title')->readonly();
  • 设置提示
	$form->text('title')->placeholder('请输入。。。');
  • 前置附加文字
	$form->text('url')->prependText('https://');
  • 后置附加文字
	$form->text('amount')->appendText('元');
5.2.3.4 设置表单验证规则
5.2.3.4.1 页面规则
  • 创建页面规则creationRules
    只在创建表单提交时生效
	$form->text('title')->creationRules('required|min:3');
  • 更新页面规则updateRules
    只在更新表单提交时生效
	$form->text('title')->updateRules('required|min:3');
  • 数据库检查unique
    提交表单是检查数据是否已经存在
	$form->text('username')
	    ->creationRules(['required', "unique:user_table"])
	    ->updateRules(['required', "unique:user_table,username,{{id}}"]);
5.2.3.4.2 验证规则 rules
	$form->text('name')->rules('required|min:3');
  • 自定义错误提示消息
	$form->text('mobile')->rules('required|regex:/^\d+$/|min:11', [
	    'regex' => '手机号码必须全部为数字',
	    'min'   => '手机号码不能少于11个字符',
	]);

6. 配置访问路由

编辑路由文件app\Admin\routes.php
添加users路由关联到UserController控制器

$router->resource(‘users’, UserController::class);

use Illuminate\Routing\Router;

Admin::routes();

Route::group([
    'prefix'        => config('admin.route.prefix'),
    'namespace'     => config('admin.route.namespace'),
    'middleware'    => config('admin.route.middleware'),
    'as'            => config('admin.route.as'),
], function (Router $router) {

    $router->get('/', 'HomeController@index')->name('home');
    $router->resource('users', UserController::class);
});

7. 数据表-模型名-控制器-路由 命名对应关系

本节针对下划线后缀的数据表命名,了解模型名-控制器-路由-数据表之间的命名关系。

7.1 数据表名 plan_contents

数据表复数命名

plan_contents
1、所有字母小写
2、两单词用下划线分隔
3、结尾加s复数

7.2 模型名 PlanContent

模型名命名

PlanContent
1、前后两个单词首字母改为大写
2、单数命名,去掉结尾的s
3、数据表中的前缀连接符去掉(下划线)

php artisan make:model /App/Admin/Models/PlanContent

namespace App\Admin\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class PlanContent extends Model
{
    use HasFactory;
}

7.3 控制器名 PlanContentController

控制器命名

PlanContentController
1、主体同模型保持一致
2、结尾由生成命令自动加Controller

php artisan admin:controller App\Admin\Models\PlanContent

PS D:\web_www\wuyouplanning.com\admin> php artisan admin:controller App\Admin\Models\PlanContent
App\Admin\Controllers\PlanContentController created successfully.

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

    $router->resource('plan-contents', PlanContentController::class);

模型创建完成,提示添加路由
查看PlanContentController文件内容

	protected $title = 'PlanContent';

$title指定的’PlanContent’就是数据表
实际的数据表名为小写复数,两单词由下划线分隔 plan_contents

7.4 路由

模型创建完成时分配的路由

	$router->resource('plan-contents', PlanContentController::class);

8. 运行本地服务测试Admin

  • 自动加载类
    composer dump-autoload
PS D:\web_www\cms> composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: encore/laravel-admin
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 5690 classes
  • 清理并生成新的缓存
    php artisan optimize
PS D:\web_www\cms> php artisan optimize
Configuration cache cleared!
Configuration cached successfully!
Route cache cleared!
Routes cached successfully!
Files cached successfully!
  • 运行本地服务
    php artisan serve
PS D:\web_www\cms> php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
[Wed Mar 16 03:23:08 2022] PHP 7.4.3 Development Server (http://127.0.0.1:8000) started
  • 浏览器访问Laravel-Admin主页
    http://127.0.0.1:8000/admin

9. 模型关联的数据处理

案例实现目标:
在用户评论数据中显示用户名字

9.1 数据结构

注意数据表复数命名

9.1.1 定义父数据

数据表全是独立数据字段,没有专门设置某字段与其他表中指定字段存在关系,这个表定义为父表。

users 用户表结构

  • id //用户id
  • name //用户名
  • age //用户年龄

9.1.2 定义关联数据

关联数据表,用户评论数据中,专门设置了user_id字段注明是某位用户评论记录,对应User表的id。

comments 评论表结构

  • id 评论记录id
  • user_id 用户id
  • content 评论内容

9.2 关联模型

注意模型单数命名

9.2.1 数据模型

  • 用户表模型
namespace App\Admin\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Encore\Admin\Traits\DefaultDatetimeFormat;
class User extends Model
{
    use HasFactory;
    use DefaultDatetimeFormat;
}
  • 评论表模型
namespace App\Admin\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Encore\Admin\Traits\DefaultDatetimeFormat;
class Comment extends Model
{
    use HasFactory;
    use DefaultDatetimeFormat;
}

9.2.2 正向关联

正向关联使用场景,在用户数据中获取评论表中用户评论的次数。
这里不具体展开测试了。
在User模型中构造自定义函数user_comment

    // 正向关联comment数据模型
    public function user_comment() {
        return $this->hasOne(Comment::class,'user_id','id');
    }

9.2.3 反向关联

在Comment模型中构造自定义函数user_info

namespace App\Admin\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Encore\Admin\Traits\DefaultDatetimeFormat;
class Comment extends Model
{
    use HasFactory;
    use DefaultDatetimeFormat;
    
    // 反向关联user数据模型
    public function user_info() {
        return $this->belongsTo(User::class,'user_id','id');
    }
}

9.3 获取关联数据

9.3.1 模型表格中使用关联数据

	protected function table()
    {
        $table = new Table(new Comment());

        $table->column('id', __('评论ID'));
        // 禁用显示原始user_id
        //$table->column('user_id', __('用户ID'));
        
        // 从关联数据获取的用户名字
        $table->column('user_info.name', __('用户名'))->display(function ($user_name) {
            if($user_name == NULL){
                return "<span style='color:red'>未找到用户信息</span>";
            }else{
            	// 为每个用户名加上超链接 $this->user_id当前用户id
                return "<a href='users?id=$this->user_id'>$user_name</a>";
            }
        });
        
		// 显示评论
        $table->column('content', __('评论内容'));

        return $table;
    }

9.3.2 模型详情中使用关联数据

	protected function detail($id)
    {
        $show = new Show(Comment::findOrFail($id));

        $show->field('id', __('评论ID'));
        // 禁用显示用户ID
        //$show->field('item_id', __('Item id'));

        // 从关联数据获取的用户名字
        $show->field('user_info', '用户名')->as(function ($user_info){
            return $user_info->name;
        });

        // 在详情面板下方生成独立面板显示用户名
        /*$show->user_info('所属问卷2', function ($user_info) {
            $user_info->name();
        });*/

		// 显示评论
        $show->field('content', __('评论内容'));

        return $show;
    }

本文完

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值