You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aquaculture/app/Admin/Controllers/CategoryController.php

196 lines
6.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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']);
}
}