Dcat Admin

Dcat Admin是一个基于laravel-admin二次开发而成的后台系统构建工具,只需极少的代码即可快速构建出一个功能完善的高颜值后台系统。支持页面一键生成CURD代码,内置丰富的后台常用组件,开箱即用,让开发者告别冗杂的HTML代码,对后端开发者非常友好。

  • Dcat Admin 文档
  • 考试系统-管理员后台
  • 考试系统-考生后台

    各种问题

    文件上传下载

  • 修改 Config 目录下 admin.php 文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'upload' => [
    // Disk in `config/filesystem.php`.
    'disk' => 'admin',
    // Image and file upload path under the disk above.
    'directory' => [
    'image' => 'images',
    'file' => 'files',
    ],
    ],

  • Filesystems.php 文件
    1
    2
    3
    4
    5
    6
    7
    8
    'disks' => [
    'admin' => [
    'driver' => 'local',
    'root' => public_path('uploads'),
    'visibility' => 'public',
    'url' => env('APP_URL').'/uploads',
    ],
    ],
  • 修改 .env 文件
    1
    2
    3
    4
    5
    APP_NAME=Laravel
    APP_ENV=local
    APP_KEY=base64:ApdWBVhTPxwnoM59rhazb4/XiN4OSL7lkMGQDFxmie0=
    APP_DEBUG=true //正式环境 禁用开发工具 改成false
    APP_URL=http://localhost:8090 //文件不显示 注意端口号

多语言配置

多语言目录文件:D:\GitHub\EUREKA-EMS\resources\lang\zh-CN

安装:composer require "overtrue/laravel-lang:~3.0"
完成上面的操作后,将项目文件 config/app.php 中的下一行
Illuminate\Translation\TranslationServiceProvider::class,
替换为:
Overtrue\LaravelLang\TranslationServiceProvider::class,
如果你想修改扩展包提供的语言文件,可以使用以下命令发布语言文件到项目里:
php artisan lang:publish zh-CN

Pjax刷新页面

1
2
3
4
5
6
7
8
Admin::script(
<<<JS
// 3秒后刷新当前页面
setTimeout(function () {
Dcat.reload();
}, 3000);
JS
);

权限控制

只查询和当前登录用户有关联的数据

1
$grid->model()->where('que_create_byid',Admin::user()->id);

管理员用户数据

文件在 vendor\dcat\laravel-admin\src\Controllers\UserController.php

多后台

  • 生成新应用
1
php artisan admin:app NewAdmin
  • 启用

开配置文件config/admin.php,加入以下代码

1
2
3
4
5
6
7
8
return [
...
'multi_app' => [
// 与新应用的配置文件名称一致
// 设置为true启用,false则是停用
'new-admin' => true,
],
];

浏览器访问这个新应用了http://localhost:8000/new-admin

  • 更改菜单

执行sql脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
Navicat Premium Data Transfer

Source Server : mysql
Source Server Type : MySQL
Source Server Version : 50726
Source Host : localhost:3306
Source Schema : nfdw_ems

Target Server Type : MySQL
Target Server Version : 50726
File Encoding : 65001

Date: 29/07/2020 16:14:00
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for nfdw_ems_i1_permission_menu
-- ----------------------------
DROP TABLE IF EXISTS `nfdw_ems_i1_permission_menu`;
CREATE TABLE `nfdw_ems_i1_permission_menu` (
`permission_id` int(11) NOT NULL,
`menu_id` int(11) NOT NULL,
`created_at` timestamp(0) NULL DEFAULT NULL,
`updated_at` timestamp(0) NULL DEFAULT NULL,
UNIQUE INDEX `admin_permission_menu_permission_id_menu_id_index`(`permission_id`, `menu_id`) USING BTREE
) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Fixed;

-- ----------------------------
-- Records of nfdw_ems_i1_permission_menu
-- ----------------------------
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (8, 9, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (9, 9, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (10, 9, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (8, 10, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (9, 10, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (10, 10, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (8, 12, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (9, 12, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (10, 12, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (8, 11, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (9, 11, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (10, 11, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (8, 13, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (9, 13, NULL, NULL);
INSERT INTO `nfdw_ems_i1_permission_menu` VALUES (10, 13, NULL, NULL);

SET FOREIGN_KEY_CHECKS = 1;


/*
Navicat Premium Data Transfer

Source Server : mysql
Source Server Type : MySQL
Source Server Version : 50726
Source Host : localhost:3306
Source Schema : nfdw_ems

Target Server Type : MySQL
Target Server Version : 50726
File Encoding : 65001

Date: 29/07/2020 16:13:49
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for nfdw_ems_i1_menu
-- ----------------------------
DROP TABLE IF EXISTS `nfdw_ems_i1_menu`;
CREATE TABLE `nfdw_ems_i1_menu` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT 0,
`order` int(11) NOT NULL DEFAULT 0,
`title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`uri` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`created_at` timestamp(0) NULL DEFAULT NULL,
`updated_at` timestamp(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of nfdw_ems_i1_menu
-- ----------------------------
INSERT INTO `nfdw_ems_i1_menu` VALUES (5, 2, 5, 'Permission', '', 'auth/permissions', '2020-07-23 02:30:26', NULL);
INSERT INTO `nfdw_ems_i1_menu` VALUES (4, 2, 4, 'Roles', '', 'auth/roles', '2020-07-23 02:30:26', NULL);
INSERT INTO `nfdw_ems_i1_menu` VALUES (3, 2, 3, 'Users', '', 'auth/users', '2020-07-23 02:30:26', NULL);
INSERT INTO `nfdw_ems_i1_menu` VALUES (2, 0, 2, 'Admin', 'feather icon-settings', '', '2020-07-23 02:30:26', NULL);
INSERT INTO `nfdw_ems_i1_menu` VALUES (1, 0, 1, 'Index', 'feather icon-bar-chart-2', '/', '2020-07-23 02:30:26', NULL);
INSERT INTO `nfdw_ems_i1_menu` VALUES (6, 2, 6, 'Menu', '', 'auth/menu', '2020-07-23 02:30:26', NULL);
INSERT INTO `nfdw_ems_i1_menu` VALUES (7, 2, 7, 'Operation log', '', 'auth/logs', '2020-07-23 02:30:26', NULL);

SET FOREIGN_KEY_CHECKS = 1;


/*
Navicat Premium Data Transfer

Source Server : mysql
Source Server Type : MySQL
Source Server Version : 50726
Source Host : localhost:3306
Source Schema : nfdw_ems

Target Server Type : MySQL
Target Server Version : 50726
File Encoding : 65001

Date: 29/07/2020 16:13:43
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for nfdw_ems_i1_role_menu
-- ----------------------------
DROP TABLE IF EXISTS `nfdw_ems_i1_role_menu`;
CREATE TABLE `nfdw_ems_i1_role_menu` (
`role_id` bigint(20) NOT NULL,
`menu_id` bigint(20) NOT NULL,
`created_at` timestamp(0) NULL DEFAULT NULL,
`updated_at` timestamp(0) NULL DEFAULT NULL,
UNIQUE INDEX `admin_role_menu_role_id_menu_id_unique`(`role_id`, `menu_id`) USING BTREE
) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Fixed;

-- ----------------------------
-- Records of nfdw_ems_i1_role_menu
-- ----------------------------
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (1, 9, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (1, 10, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (1, 11, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (1, 12, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (2, 9, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (2, 10, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (2, 12, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (2, 11, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (1, 13, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_menu` VALUES (2, 13, NULL, NULL);

SET FOREIGN_KEY_CHECKS = 1;


/*
Navicat Premium Data Transfer

Source Server : mysql
Source Server Type : MySQL
Source Server Version : 50726
Source Host : localhost:3306
Source Schema : nfdw_ems

Target Server Type : MySQL
Target Server Version : 50726
File Encoding : 65001

Date: 29/07/2020 16:14:06
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for nfdw_ems_i1_role_permissions
-- ----------------------------
DROP TABLE IF EXISTS `nfdw_ems_i1_role_permissions`;
CREATE TABLE `nfdw_ems_i1_role_permissions` (
`role_id` int(11) NOT NULL,
`permission_id` int(11) NOT NULL,
`created_at` timestamp(0) NULL DEFAULT NULL,
`updated_at` timestamp(0) NULL DEFAULT NULL,
UNIQUE INDEX `admin_role_permissions_role_id_permission_id_index`(`role_id`, `permission_id`) USING BTREE
) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Fixed;

-- ----------------------------
-- Records of nfdw_ems_i1_role_permissions
-- ----------------------------
INSERT INTO `nfdw_ems_i1_role_permissions` VALUES (2, 8, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_permissions` VALUES (2, 9, NULL, NULL);
INSERT INTO `nfdw_ems_i1_role_permissions` VALUES (2, 10, NULL, NULL);

SET FOREIGN_KEY_CHECKS = 1;

Excel导入

前期准备

  • 安装
    1
    composer require maatwebsite/excel
  • Maatwebsite\Excel\ExcelServiceProviderconfig/app.php以下位置添加ServiceProvider
1
2
3
4
5
6
'providers' => [
/*
* Package Service Providers...
*/
Maatwebsite\Excel\ExcelServiceProvider::class,
]
  • 手动添加,config/app.php
    1
    2
    3
    4
    'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
    ]
  • 发布配置
    1
    php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
    将创建一个新配置文件 config/excel.php

导入

  • 创建一个导入类 app/Imports
    1
    2
    3
    4
    5
    6
    7
    php artisan make:import QuestionImport --model= Question

    ├── app
    │ ├── Imports
    │ │ ├── QuestionImport.php

    └── composer.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

namespace App\Imports;

use App\Models\TiKu\Question;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class QuestionImport implements ToModel, WithHeadingRow
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Question([
'id' => $row['id'],
'questype_id' => $row['questype_id'],
'que_index' => $row['que_index'],
'que_create_byid' => $row['que_create_byid'],
'que_create_byname' => $row['que_create_byname'],
'que_last_byid' => $row['que_last_byid'],
'que_last_byname' => $row['que_last_byname'],
'que_select' => $row['que_select'],
'que_selectnum' => $row['que_selectnum'],
'que_answer' => $row['que_answer'],
'que_describe' => $row['que_describe'],
'que_status' => $row['que_status'],
'que_level' => $row['que_level'],
'que_sequence' => $row['que_sequence'],
'declaration_id' => $row['declaration_id'],
'major_id' => $row['major_id'],
'created_at' => $row['created_at'],
'updated_at' => $row['updated_at'],
]);
}
}

注意:模型需要与QuestionImport 字段名一致

模型 Model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

namespace App\Models\TiKu;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;

class Question extends Model
{
use HasDateTimeFormatter;
//字段名
protected $fillable = ['id', 'questype_id', 'que_index', 'que_create_byid', 'que_create_byname', 'que_last_byid', 'que_last_byname', 'que_select', 'que_selectnum', 'que_answer', 'que_describe', 'que_status', 'que_level', 'que_sequence', 'declaration_id', 'major_id', 'created_at', 'updated_at'];

public function major()
{
return $this->belongsTo(Major::class);
}

public function declaration()
{
return $this->belongsTo(Declaration::class);
}

public function questype()
{
return $this->belongsTo(Questype::class);
}
}

  • 生成工具表单

    1
    php artisan admin:form QuestionData

    修改:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    <?php

    namespace App\Admin\Forms;

    use App\Imports\QuestionImport;
    use Dcat\Admin\Widgets\Form;
    use Symfony\Component\HttpFoundation\Response;
    use Maatwebsite\Excel\Facades\Excel;

    class QuestionData extends Form
    {
    // 增加一个自定义属性保存用户ID
    protected $id = 'DATA_IMPORT';

    // 构造方法的参数必须设置默认值
    public function __construct($id = null)
    {
    $this->id = $id;
    parent::__construct();
    }
    /**
    * Handle the form request.
    *
    * @param array $input
    *
    * @return Response
    */
    public function handle(array $input)
    {
    // 下面的代码获取到上传的文件,然后使用`maatwebsite/excel`等包来处理上传你的文件,保存到数据库
    $file = $input['file'];
    if(!$file){
    return $this->error('请先上传文件');
    }
    // 导入
    Excel::import(new QuestionImport(), $file, 'admin');
    return $this->success('导入完成!');
    }

    /**
    * Build a form here.
    */
    public function form()
    {
    $this->file('file', '请选择文件')
    ->disk('admin')
    ->autoUpload()
    ->accept('xlsx,xls,csv');
    }
    }

  • 弹窗显示
    运行 php artisan admin:action 命令,选择选项 3

    1
    2
    3
    4
    5
    6
    7
    8
    9
    php artisan admin:action
    Which type of action would you like to make?:
    [0] default
    [1] grid-batch
    [2] grid-row
    [3] grid-tool
    [4] form-tool
    [5] show-tool
    [6] tree-tool

    修改:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?php

    namespace App\Admin\Actions\Grid;

    use App\Admin\Forms\QuestionData;
    use Dcat\Admin\Admin;
    use Dcat\Admin\Grid\Tools\AbstractTool;

    class GridQuestionData extends AbstractTool
    {
    /**
    * @return string
    */
    protected $title = '导入';

    protected function script()
    {
    $url = request()->fullUrlWithQuery(['gender' => '_gender_']);

    return <<<JS
    $('input:radio.user-gender').change(function () {
    var url = "$url".replace('_gender_', $(this).val());
    Dcat.reload(url);
    });
    JS;
    }

    public function render()
    {
    Admin::script($this->script());
    $id = "DATA_IMPORT";
    $this->modal($id);
    return <<<HTML
    <span data-toggle="modal" data-target="#{$id}" style="float: right">
    <a class="btn btn-primary btn-outline" style="color: #4199de"><i class="feather icon-share"></i> 导入</a>
    </span>
    HTML;
    }

    protected function modal($id)
    {
    // 表单
    $form = new QuestionData();
    Admin::html(
    <<<HTML
    <div class="modal fade" id="{$id}">
    <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
    <div class="modal-header">
    <h4 class="modal-title">导入数据</h4>
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
    </div>
    <div class="modal-body">
    {$form->render()}
    </div>
    </div>
    </div>
    </div>
    HTML
    );
    }
    }

  • 在grid 工具栏 使用

    1
    2
    //导入
    $grid->tools(new GridQuestionData());

表格

模型树

表结构和模型

使用model-tree,要遵守约定的表结构。表格结构里面有三个必要的字段parent_id、order、title,表结构中的三个字段parent_id、order、title的字段名也是可以修改的(修改为:sort_p_id、sort_name),parent_id字段一定要默认为0

1
2
3
4
5
6
7
8
9
CREATE TABLE `shiyu_sort`  (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`sort_name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`sort_desc` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL,
`sort_p_id` int(11) NULL DEFAULT 0,
`created_at` timestamp(0) NULL DEFAULT NULL,
`updated_at` timestamp(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;

对应的模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace App\Models\Blog;

use Dcat\Admin\Traits\HasDateTimeFormatter;

use Dcat\Admin\Traits\ModelTree;
use Illuminate\Database\Eloquent\Model;

class ShiyuSort extends Model
{
use HasDateTimeFormatter;
use ModelTree;
protected $table = 'shiyu_sort';
// 父级ID字段名称,默认值为 parent_id
protected $parentColumn = 'sort_p_id';

// 排序字段名称,默认值为 order
protected $orderColumn = 'id';

// 标题字段名称,默认值为 title
protected $titleColumn = 'sort_name';
}

页面使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
namespace App\Admin\Controllers\Blog;

use App\Models\Blog\ShiyuSort;
use Dcat\Admin\Form;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Tree;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Controllers\AdminController;

class ShiyuSortController extends AdminController
{
public function index(Content $content)
{
return $content->header('分类')
->body(function (Row $row) {
$tree = new Tree(new ShiyuSort);
$row->column(12, $tree);
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new ShiyuSort(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->column('sort_name');
$grid->column('sort_desc');
$grid->column('sort_p_id');
$grid->column('created_at');
$grid->column('updated_at')->sortable();

$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');

});
});
}

/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new ShiyuSort(), function (Show $show) {
$show->field('id');
$show->field('sort_name');
$show->field('sort_desc');
$show->field('sort_p_id');
$show->field('created_at');
$show->field('updated_at');
});
}

/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new ShiyuSort(), function (Form $form) {
$menuModel = "App\Models\Blog\ShiyuSort";
$form->display('id');
$form->text('sort_name');
$form->text('sort_desc');
$form->select('sort_p_id')->options(function () use ($menuModel) {
return $menuModel::selectOptions();
})->saving(function ($v) {
return (int)$v;
});
$form->display('created_at');
$form->display('updated_at');
});
}
}

表单

下拉框

  • 单选

    1
    2
    3
    4
    $form->select('subject_set')->options(function () {
    $roleModel = Major::class;
    return $roleModel::all()->pluck('major_name', 'id');
    })->required();
  • 多选

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $form->multipleSelect('subject_set')
    ->options(function () {
    $roleModel = Major::class;
    return $roleModel::all()->pluck('major_name', 'id');
    })
    //从数据库中查出的二维数组中转化成ID
    ->customFormat(function ($v) {
    return array_column($v, 'id');
    });

    弹窗选择

  • 单选(2.0版本弃用)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 方法1
    $form->selectResource('questype_id', '题型')->path('/TiKu/Questype')
    ->multiple(1) // 设置为单选
    ->options(function ($v) {
    if (!$v) return $v;
    return Questype::find($v)->pluck('type_name', 'id');
    });

    // 方法2
    $menuModel = "App\Models\Blog\ShiyuSort";
    $form->select('sort_p_id')->options(function () use ($menuModel) {
    return $menuModel::selectOptions();
    })->saving(function ($v) {
    return (int)$v;
    });
  • 多选(2.0版本弃用)

    1
    2
    3
    4
    5
    6
    $form->selectResource('major_id', '申报专业')->path('/TiKu/Major')
    ->multiple() // 设置为多选
    ->options(function ($v) {
    if (!$v) return $v;
    return Major::find($v)->pluck('major_name', 'id');
    });
  • 弹窗选择新方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //单选 (selectTable )
    $this->multipleSelectTable('recent_news')->title('弹窗标题')
    ->dialogWidth('50%') // 弹窗宽度,默认 800px
    ->from(ShiyuArticleTable::make(['id' => $this->getKey()])) // 设置渲染类实例,并传递自定义参数
    ->model(ShiyuArticle::class, 'id', 'artcles_title'); // 设置编辑数据显示
    //多选 (multipleSelectTable)
    $this->multipleSelectTable('recent_news')->title('弹窗标题')
    ->dialogWidth('50%') // 弹窗宽度,默认 800px
    ->from(ShiyuArticleTable::make(['id' => $this->getKey()])) // 设置渲染类实例,并传递自定义参数
    ->model(ShiyuArticle::class, 'id', 'artcles_title') // 设置编辑数据显示
    ->saving(function ($v) {
    // $v 是表单提交的字段值,默认是数组类型,这里需要手动转换一下
    // 保存为以 "," 隔开的字符串,如果是多对多关联关系,则不需要转换。
    return implode(',', $v);
    });

    定义渲染类如下,需要继承Dcat\Admin\Grid\LazyRenderable

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    namespace App\Admin\Renderable;

    use App\Models\Blog\ShiyuArticle;
    use Dcat\Admin\Grid;
    use Dcat\Admin\Grid\LazyRenderable;

    class ShiyuArticleTable extends LazyRenderable
    {
    public function grid(): Grid
    {
    // 获取外部传递的参数
    $id = $this->id;
    return Grid::make(new ShiyuArticle(), function (Grid $grid) {
    $grid->column('id')->sortable();
    $grid->column('artcles_title','文章标题');
    $grid->column('artcles_views','浏览量');
    $grid->column('artcles_likes','点赞数');
    $grid->column('created_at');
    $grid->column('updated_at')->sortable();

    // 如果表格数据中带有 “name”、“title”或“username”字段,则可以不用设置
    $grid->rowSelector()->titleColumn('artcles_title');

    $grid->quickSearch(['id', 'artcles_title']);

    $grid->paginate(10);
    $grid->disableActions();

    // $grid->filter(function (Grid\Filter $filter) {
    // $filter->like('artcles_title')->width(4);
    // });
    });
    }
    }

json字段

1
2
3
4
5
6
7
8
9
10
$form->table('exam_set', function ($table) {
$table->select('subject_set', '题型')->options(function () {
$roleModel = Questype::class;
return $roleModel::all()->pluck('type_name', 'id');
});
$table->number('count', '数量');
$table->number('score', '每题分值');
})->saving(function ($v) {
return json_encode($v);//转为json格式
});

标签 (tags)

插入逗号(,)隔开的字符串tags,注意:处理ManyToMany关系时必须调用pluck方法,指定显示的字段名和主键。 此外 options 方法传入一个Collection对象时,options会自动调用该对象的pluck方法转为[‘主键名’ => ‘显示字段名’] 数组,作为下拉框选项。或者可以直接使用[‘主键名’ => ‘显示字段名’]这样的数组作为参数。
格式化待渲染的数据 (customFormat),通过customFormat方法把从数据库查出的字段值转化为array格式。

1
2
3
4
5
6
7
8
9
10
11
$form->tags('artcles_label')
->pluck('tag_name', 'id')
->options(ShiyuTag::all())
->customFormat(function ($v){
if (!$v) return $v;
$tag = ShiyuTag::find($v)->pluck('tag_name', 'id');
return $tag;
})
->saving(function ($value) {
return $value;
});

自定义页面

首先控制器代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace App\Admin\Controllers\Shiyu;

use App\Admin\Forms\ShiyuIndex;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Controllers\AdminController;
use Dcat\Admin\Widgets\Card;

class ShiyuInddexController extends AdminController
{
public function index(Content $content)
{
return $content->title('主页配置')
->body(new Card(new ShiyuIndex()));
}
}

Form表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
namespace App\Admin\Forms;

use App\Models\Shiyu\ShiyuInddex;
use Dcat\Admin\Widgets\Form;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;

class ShiyuIndex extends Form
{
// 处理表单提交请求
public function handle(array $input)
{
$data = $input;
$ShiyuInddex = new ShiyuInddex();

if ($res = $ShiyuInddex->where('id', 1)->update($data)) {
DB::commit();
} else {
DB::rollBack();
return $this->error('Your error message.');
}
return $this->success('更新成功', 'Shiyu/ShiyuInddex');
}

// 构建表单
public function form()
{
$this->confirm('您确定要提交表单吗', 'content');
$this->text('id')->display(false);
$this->text('title');
$this->image('logo')->autoUpload();
$this->url('yuming');
$this->multipleImage('lbt_images')->limit(3)->autoUpload();
$this->table('lbt_text_1', function ($table) {
$table->textarea('lbt1_1');
$table->textarea('lbt1_2');
$table->textarea('lbt1_3');
})->saving(function ($v) {
return json_encode($v);
});
$this->table('lbt_text_2', function ($table) {
$table->textarea('lbt2_1');
$table->textarea('lbt2_2');
$table->textarea('lbt2_3');
})->saving(function ($v) {
return json_encode($v);
});
$this->text('recent_photography');
$this->multipleImage('teams_images')->limit(5)->autoUpload();
$this->table('teams_text', function ($table) {
$table->text('people_name');
$table->textarea('people_msg');
})->saving(function ($v) {
return json_encode($v);
});
$this->text('contact_text');
$this->text('feedback_text');
$this->text('recent_news');
$this->text('footer_text');
$this->display('created_at');
$this->display('updated_at');
}

/**
* 返回表单数据
*
* @return array
*/
public function default()
{
$data = ShiyuInddex::find(1)->get()->toArray();
return $data[0];
}
}

根据前台json数组,动态建表

做的时候,$data总是传不到Schema::create('stmt_plan_list', function ($table){...}里,自己错误写法是这样的:

1
2
3
Schema::create('stmt_plan_list', function ($table,$data) {
....
}

正确写法应该是用 use ($data)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
->saved(function (Form $form, $result) {
if(!Schema::hasTable('stmt_plan_list')){
$data = $form->updates();
$data = json_decode($data['plan_create_table']);//字段数组
Schema::create('stmt_plan_list', function ($table) use ($data) {
$table->increments('id')->comment('主键');
for ($i = 0;$i<count($data);$i++){
if($data[$i]->table_type == 'varchar'){
$table->string($data[$i]->table_name)->comment($data[$i]->table_desc);
}
if($data[$i]->table_type == 'int'){
$table->integer($data[$i]->table_name)->comment($data[$i]->table_desc);
}
if($data[$i]->table_type == 'decimal'){
$table->decimal($data[$i]->table_name, 10, 2)->comment($data[$i]->table_desc);
}
}
$table->timestamps();
});
}
});