|
|
<?php
|
|
|
|
|
|
namespace App\Admin\Controllers;
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
|
|
use App\Models\Category;
|
|
|
use Encore\Admin\Controllers\HasResourceActions;
|
|
|
use Encore\Admin\Form;
|
|
|
use Encore\Admin\Layout\Column;
|
|
|
use Encore\Admin\Layout\Content;
|
|
|
use Encore\Admin\Layout\Row;
|
|
|
use Encore\Admin\Show;
|
|
|
use Encore\Admin\Tree;
|
|
|
use Encore\Admin\Widgets\Box;
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
|
class CategoryController extends Controller
|
|
|
{
|
|
|
use HasResourceActions; // 引入资源操作的特性
|
|
|
|
|
|
/**
|
|
|
* 显示商品分类的首页
|
|
|
*
|
|
|
* @param Content $content
|
|
|
* @return Content 返回构建好的内容
|
|
|
*/
|
|
|
public function index(Content $content)
|
|
|
{
|
|
|
return $content
|
|
|
->header('商品分类') // 设置页面标题
|
|
|
->description('') // 页面描述
|
|
|
->row(function (Row $row) {
|
|
|
|
|
|
// 创建分类树形结构,限制只能在同一级排序
|
|
|
$row->column(6, Category::tree(function (Tree $tree) {
|
|
|
$tree->disableCreate(); // 禁用创建新分类的功能
|
|
|
|
|
|
// 允许拖拽排序,且最大深度为1
|
|
|
$tree->nestable(['maxDepth' => 1])
|
|
|
->branch(function ($branch) {
|
|
|
// 自定义树节点的显示格式
|
|
|
$icon = "<i class='fa {$branch['icon']}'></i>";
|
|
|
return $icon . ' ' . $branch['title'];
|
|
|
});
|
|
|
}));
|
|
|
|
|
|
// 创建新分类的表单
|
|
|
$row->column(6, function (Column $column) {
|
|
|
$form = new \Encore\Admin\Widgets\Form();
|
|
|
$form->action(admin_base_path('categories')); // 设置表单提交路径
|
|
|
|
|
|
// 定义表单字段
|
|
|
$form->text('title', '分类名')->rules('required|unique:categories,title'); // 分类名,必填且唯一
|
|
|
$form->icon('icon', '图标')->default('fa-bars')->rules('required'); // 图标,必填
|
|
|
$form->image('thumb', '缩略图')->uniqueName()->rules('required'); // 缩略图,必填
|
|
|
$form->hidden('_token')->default(csrf_token()); // CSRF 令牌
|
|
|
|
|
|
// 将表单添加到页面
|
|
|
$column->append((new Box('新增', $form))->style('success'));
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 显示分类的详细信息
|
|
|
*
|
|
|
* @param mixed $id 分类ID
|
|
|
* @param Content $content
|
|
|
* @return Content 返回构建好的内容
|
|
|
*/
|
|
|
public function show($id, Content $content)
|
|
|
{
|
|
|
return $content
|
|
|
->header('详情') // 设置页面标题
|
|
|
->description('') // 页面描述
|
|
|
->body($this->detail($id)); // 显示分类详细信息
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 显示编辑分类的界面
|
|
|
*
|
|
|
* @param mixed $id 分类ID
|
|
|
* @param Content $content
|
|
|
* @return Content 返回构建好的内容
|
|
|
*/
|
|
|
public function edit($id, Content $content)
|
|
|
{
|
|
|
return $content
|
|
|
->header('编辑') // 设置页面标题
|
|
|
->description('') // 页面描述
|
|
|
->body($this->form()->edit($id)); // 显示编辑表单
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建分类详细信息的展示构建器
|
|
|
*
|
|
|
* @param mixed $id 分类ID
|
|
|
* @return Show 返回详细信息展示实例
|
|
|
*/
|
|
|
protected function detail($id)
|
|
|
{
|
|
|
$show = new Show(Category::findOrFail($id)); // 根据ID查找分类
|
|
|
|
|
|
// 定义展示的字段
|
|
|
$show->field('id'); // ID
|
|
|
$show->field('title', '分类名'); // 分类名
|
|
|
$show->field('thumb', '缩略图')->unescape()->as(function ($thumb) {
|
|
|
return image($thumb); // 显示缩略图
|
|
|
});
|
|
|
$show->field('description', '描述'); // 描述
|
|
|
$show->field('order', '排序'); // 排序
|
|
|
$show->field('created_at', '创建时间'); // 创建时间
|
|
|
$show->field('updated_at', '修改时间'); // 修改时间
|
|
|
|
|
|
return $show; // 返回详细信息展示
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建分类的表单构建器
|
|
|
*
|
|
|
* @return Form 返回表单实例
|
|
|
*/
|
|
|
protected function form()
|
|
|
{
|
|
|
$form = new Form(new Category); // 创建新的表单实例
|
|
|
|
|
|
// 定义表单字段
|
|
|
$form->text('title', '分类名'); // 分类名
|
|
|
$form->icon('icon', '图标'); // 图标
|
|
|
$form->image('thumb', '缩略图'); // 缩略图
|
|
|
$form->text('description', '描述'); // 描述
|
|
|
|
|
|
// 保存前的逻辑
|
|
|
$form->saving(function (Form $form) {
|
|
|
if (app()->environment('dev')) { // 检查是否在开发环境
|
|
|
admin_toastr('开发环境不允许操作', 'error'); // 提示用户
|
|
|
return back()->withInput(); // 返回到表单
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return $form; // 返回创建的表单
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 删除分类
|
|
|
*
|
|
|
* @param $id 分类ID
|
|
|
* @return \Illuminate\Http\JsonResponse 返回 JSON 响应
|
|
|
*/
|
|
|
public function destroy($id)
|
|
|
{
|
|
|
if (app()->environment('dev')) { // 检查是否在开发环境
|
|
|
return response()->json(['status' => false, 'message' => '开发环境不允许操作']);
|
|
|
}
|
|
|
|
|
|
/** @var $category Category */
|
|
|
$category = Category::query()->findOrFail($id); // 查找分类
|
|
|
|
|
|
// 检查分类下是否有商品
|
|
|
if ($category->products()->exists()) {
|
|
|
return response()->json(['status' => false, 'message' => '分类下有商品存在,不允许删除']);
|
|
|
}
|
|
|
|
|
|
// 尝试删除分类
|
|
|
if ($category->delete()) {
|
|
|
$data = [
|
|
|
'status' => true,
|
|
|
'message' => trans('admin.delete_succeeded'), // 删除成功提示
|
|
|
];
|
|
|
} else {
|
|
|
$data = [
|
|
|
'status' => false,
|
|
|
'message' => trans('admin.delete_failed'), // 删除失败提示
|
|
|
];
|
|
|
}
|
|
|
|
|
|
return response()->json($data); // 返回 JSON 响应
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取分类下的商品下拉列表
|
|
|
*
|
|
|
* @param Request $request
|
|
|
* @return \Illuminate\Support\Collection 返回商品集合
|
|
|
*/
|
|
|
public function getProducts(Request $request)
|
|
|
{
|
|
|
$id = $request->get('q'); // 获取请求参数中的分类ID
|
|
|
|
|
|
$category = Category::query()->findOrFail($id); // 查找分类
|
|
|
|
|
|
// 返回分类下的商品,按销量降序排列
|
|
|
return $category->products()->orderBy('sale_count', 'desc')->get(['id', 'name as text']);
|
|
|
}
|
|
|
}
|