NavController.php 5.0 KB
<?php

namespace App\Http\Controllers\Bside;


use App\Enums\Common\Code;
use App\Models\BNav;

/**
 * 导航栏目 b端编辑 c端显示
 * @author:dc
 * @time 2023/5/8 16:31
 * Class NavController
 * @package App\Http\Controllers\Bside
 */
class NavController extends BaseController
{

    /**
     * 验证规则
     * @var array[]
     */
    private $verify = [
        'role'  =>  [
            'pid'   =>  ['required','integer','gte:0'],
            'name'   =>  ['required','max:100'],
            'location'   =>  ['required','in:header,footer'],
            'url'   =>  ['required','max:200'],
            'status'   =>  ['required','in:0,1'],
            'target'   =>  ['required','in:0,1'],
            'sort'   =>  ['required','integer','gte:0']
        ],
        'message'   =>  [
            'pid.required'  =>  '上级选择错误',
            'pid.gte'  =>  '上级选择错误',
            'pid.integer'  =>  '上级选择错误',
            'name.required'  =>  '名称必须',
            'name.max'  =>  '名称不能超过100个字符',
            'location.required'  =>  '位置选择错误',
            'location.in'  =>  '位置选择错误',
            'url.required'  =>  '链接必须',
            'url.max'  =>  '链接不能超过200个字符',
            'status.required'  =>  '状态选择错误',
            'status.in'  =>  '状态必须是显示/隐藏',
            'target.required'  =>  '打开方式必须',
            'target.in'  =>  '打开方式选择错误',
            'sort.required'  =>  '排序必须',
            'sort.integer'  =>  '排序必须是一个数字',
            'sort.gte'  =>  '排序必须大于等于0',
        ],
        'attr'  =>  [

        ]
    ];

    /**
     * 列表数据
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     * @author:dc
     * @time 2023/5/8 16:37
     */
    public function index(){

        $isTree = $this->param['tree']??false;
        // 显示位置
        $location = $this->param['location']??'';

        $lists = BNav::_all($this->user['project_id'],$location)->toArray();

        if($isTree){
            $lists = list_to_tree($lists);
        }

        return $this->success($lists);

    }



    /**
     * 创建导航栏
     * @author:dc
     * @time 2023/5/8 16:39
     */
    public function create(){
        return $this->save();
    }


    /**
     * 修改
     * @return \Illuminate\Http\JsonResponse
     * @throws \Illuminate\Validation\ValidationException
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     * @author:dc
     * @time 2023/5/8 17:06
     */
    public function update(){
        $this->verify['role']['id'] = ['required','integer','gt:0'];
        $this->verify['message']['id.gt'] = $this->verify['message']['id.integer'] = $this->verify['message']['id.required'] = '编辑导航数据不存在';
        return $this->save();
    }

    /**
     * 新增修改
     * @return \Illuminate\Http\JsonResponse
     * @throws \Illuminate\Validation\ValidationException
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     * @author:dc
     * @time 2023/5/8 17:06
     */
    private function save(){
        $data  = $this->validate(request() ,$this->verify['role'],$this->verify['message']);

        if($data['pid']){
            // 验证是否存在上级
            $all = BNav::_all($this->user['project_id'],$data['location']);
            if(!$all->where('id',$data['pid'])->count()){
                return $this->response('上级栏目不存在','B_NAV_PID_NOTFOUND');
            }
            // 上级不允许是自己的下级
            if(!empty($data['id'])){
                $all = list_to_tree($all->toArray(),$data['id']);
                $all = tree_to_list($all);
                if(in_array($data['pid'],array_column($all,'id'))){
                    return $this->response('上级栏目不允许为本身的下级','B_NAV_PID_IS_CHILD');
                }
            }
        }

        // 保存
        $id = BNav::_save($this->user['project_id'],$data,$data['id']??0);

        if($id===-1){
            return $this->response('导航菜单不存在','B_NAV_NOTFOUND');
        }

        return $this->success(BNav::_find($this->user['project_id'],$id,true));
    }


    /**
     * 删除数据
     * @return \Illuminate\Http\JsonResponse
     * @author:dc
     * @time 2023/5/9 9:20
     */
    public function delete(){
        $id = $this->param['id']??0;
        $data   =   BNav::_find($this->user['project_id'],$id);

        if(empty($data)){
            return $this->response('导航菜单不存在','B_NAV_NOTFOUND');
        }


        if(BNav::isChild($data['id'],$this->user['project_id'])){
            return $this->response('存在下级无法删除','B_NAV_DELETE_CHILD');
        }


        if($data->delete()){
            return $this->response('删除成功',Code::SUCCESS);
        }

    }








}