# 建表 ## 文章分类表 ### 建表语句 ~~~SQL DROP TABLE IF EXISTS `article_category`; CREATE TABLE `article_category` ( `id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT, `parent_id` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级ID', `title` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '分类名称', `order` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序', `seo_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'seo标题', `seo_keywords` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'seo关键词', `seo_description` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'seo摘要', `created_at` timestamp NULL DEFAULT NULL COMMENT '添加时间', `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间', PRIMARY KEY (`id`) USING BTREE, INDEX `menu_join`(`parent_id`) USING BTREE, INDEX `index_list`(`title`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文章分类表' ROW_FORMAT = Dynamic; ~~~ >这里设置的很多字段不为空 所以表单提交的时候 非必填的字段需要给默认值 ### 代码生成 找到后台:`开发工具` -> `代码生成器` 选择 `article_category` 表生成代码 系统会自动生成该表对应的增删改查 添加路由: `app\Admin\routes.php` ~~~php ... Route::group([ ... ], function (Router $router) { ... $router->resource('/article_category', 'ArticleCategoryController'); }); ~~~ >dcat-admin的大多数路由 都是这样设置 `$router->resource('/{表名}', '{控制器}');` ### 创建菜单 创建网站菜单 `文章` 路径不填写 创建`文章`菜单的二级菜单`分类` 路径填写 `/article_category` ### 修改表单代码 `app\Admin\Controllers\ArticleCategoryController.php` ~~~php protected function form() { return Form::make(new ArticleCategory(), function (Form $form) { $articleCategoryModel = new \App\Models\ArticleCategory(); $form->display('id'); $form->select('parent_id', '上级') ->options($articleCategoryModel->selectOptions(null, '顶级')) ->saving(function ($v) { return (int) $v; }) ->default(0) ->required(); $form->text('title', '名称')->required(); $form->text('order', '排序')->required(); $form->text('seo_title', 'SEO标题') ->saving(function ($v) { return (string) $v; }); $form->text('seo_keywords', 'SEO关键词') ->saving(function ($v) { return (string) $v; }); $form->textarea('seo_description', 'SEO描述') ->saving(function ($v) { return (string) $v; }); $form->display('created_at'); $form->display('updated_at'); }); } ~~~ 模型添加方法 `selectOptions` ~~~php use Dcat\Admin\Traits\ModelTree; class ArticleCategory extends Model { use ModelTree; public function selectOptions(\Closure$closure = null, $rootText = null) { $options = (new static())->withQuery($closure) ->buildSelectOptions(); return collect($options) ->prepend($rootText, 0) ->all(); } } ~~~ >这里是参考了 dacat-admin 的写法 树形结构数据 一般分类都会用到 这里可以先把所有的分类都加上 `关于我们` `跨境电商` `国际快递` `FBA派送` `帮助中心` 帮助中心二级: `行业新闻` `物流知识` >加上二级分类是为了在重做列表时可以看到分类结构 ### 修改列表代码 `app\Admin\Controllers\ArticleCategoryController.php` ~~~php use Dcat\Admin\Layout\Content; use Dcat\Admin\Layout\Row; use Dcat\Admin\Tree; public function index(Content $content) { return $content->header('文章分类') ->body(function (Row $row) { $tree = new Tree(new ArticleCategory); $tree->branch(function ($branch) { return "{$branch['id']} - {$branch['title']}"; }); $row->column(5, $tree); }); } ~~~ > dcat-admin 默认列表的方法是 `index` 这里用到了系统的树形结构