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,可选danger、warning、info、primary、default、success
如果需要将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;
}
本文完
本文详细介绍了如何在Win10环境下,利用WAMP、Composer、Node.js等工具,一步步安装和配置Laravel8和Laravel-Admin2.0,包括环境配置、数据库连接、数据迁移、模型创建、控制器生成、路由配置等内容,最终实现后台管理系统的搭建。

被折叠的 条评论
为什么被折叠?



