# 建表
## 文章分类表
### 建表语句
~~~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` 这里用到了系统的树形结构