NavController.php 6.3 KB
<?php

namespace App\Http\Controllers\Bside\Nav;


use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Nav\NavLogic;
use App\Http\Requests\Bside\Nav\NavRequest;
use App\Models\Nav\BNav;
use App\Models\Nav\BNavGroup;

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


    /**
     * @remark :获取列表数据
     * @name   :index
     * @author :lyh
     * @method :post
     * @time   :2023/12/4 15:00
     */
    public function index(BNav $nav,BNavGroup $navGroup){
        $this->map['project_id'] = $this->user['project_id'];
        $lists = $nav->list($this->map,$this->order = ['sort','id']);
        //获取菜单组排序字段
        $groupInfo = $navGroup->read(['id'=>$this->param['group_id']]);
        if(!empty($groupInfo['sort_list'])){
            $sort_list = json_decode($groupInfo['sort_list']);
            $result = $this->findDetailsList($sort_list,$lists);
            $detailsList = $result['detailsList'];
            if(!empty($detailsList)){
                //写入

            }
            $data = $result['result'];
        }else{
            $data = array();
            foreach ($lists as $v){
                $v = (array)$v;
                if ($v['pid'] == 0) {
                    $v['sub'] = _get_child($v['id'], $lists);
                    $data[]   = $v;
                }
            }
        }
        $this->response('success',Code::SUCCESS,$data);
    }

    /**
     * @remark :根据固定的数组排序
     * @name   :findDetailsInList
     * @author :lyh
     * @method :post
     * @time   :2023/12/18 14:54
     */
    public function findDetailsList($data, &$detailsList) {
        $result = [];
        foreach ($data as $item) {
            $item = (array)$item;
            $items = $item;
            $id = $items['id'];
            $matchingDetail = null;
            foreach ($detailsList as $k => $v) {
                if ($id == $v['id']) {
                    $matchingDetail = $v;
                    unset($detailsList[$k]);
                    break; // Break once a match is found
                }
            }
            if (!empty($matchingDetail)) {
                $items = $matchingDetail;
            }
            if (!empty($item['sub']) && is_array($item['sub'])) {
                $items['sub'] = $this->findDetailsList($item['sub'], $detailsList)['result'];
            }
            $result[] = $items;
        }
        return ['result'=>$result,'detailsList'=>$detailsList];
    }

    /**
     * @remark :
     * @name   : setDetails
     * @author : lyh
     * @method : post
     * @time   : 2023/12/21 9:09
     */
    public function setDetails($details, &$result)
    {
        foreach ($details as $k => $v) {
            if ($v['pid'] == 0) {// 一级菜单
                $result[] = $v;
            } else {
                $parentIndex = $this->findParentIndex($result, $v['pid']);
                if ($parentIndex !== null) {
                    // Add the current element under its parent
                    $result[$parentIndex]['sub'][] = $v;
                }
            }
        }
    }

    /**
     * Find the index of the parent element in $result based on 'id'.
     *
     * @param array $result
     * @param int   $parentId
     * @return int|null
     */
    private function findParentIndex($result, $parentId)
    {
        foreach ($result as $index => $item) {
            if ($item['id'] == $parentId) {
                return $index;
            }
        }
        return null;
    }



    /**
     * @remark :获取当前id下的所有子集
     * @name   :getSubList
     * @author :lyh
     * @method :post
     * @time   :2023/12/4 15:04
     */
    public function getSubList(NavLogic $logic){
        $data = $logic->getSubList();
        $this->response('success',Code::SUCCESS,$data);
    }

    /**
     * @remark :保存数据
     * @name   :save
     * @author :lyh
     * @method :post
     * @time   :2023/8/21 11:32
     */
    public function save(NavRequest $request,NavLogic $logic){
        $request->validated();
        $logic->navSave();
        $this->response('success');
    }


    /**
     * @remark :删除菜单
     * @name   :delete
     * @author :lyh
     * @method :post
     * @time   :2023/8/23 11:09
     */
    public function delete(NavLogic $logic){
        $this->request->validate([
            'id'=>'required',
        ],[
            'id.required' => '产品ID不能为空',
        ]);
        $logic->navDelete();
        $this->response('success');

    }


    /**
     * @author:dc
     * @time 2023/5/9 16:14
     */
    public function urls(){
        // todo::需要配合 c端来
        $data = [
            ['url'=>'index', 'name'=>'首页'],
            ['url'=>'news', 'name'=>'新闻'],
            ['url'=>'products', 'name'=>'产品'],
            ['url'=>'search', 'name'=>'搜索页'],
            ['url'=>'blog', 'name'=>'博客']
        ];
        $this->response('success',Code::SUCCESS,$data);
    }

    /**
     * @remark :排序
     * @name   :sort
     * @author :lyh
     * @method :post
     * @time   :2023/8/22 9:49
     */
    public function sort(NavLogic $navLogic){
        $this->request->validate([
            'id'=>'required',
            'sort'=>'required'
        ],[
            'id.required' => '产品ID不能为空',
            'sort.required'=>'排序字段不能为空'
        ]);
        $navLogic->navSort();
        $this->response('success');
    }

    /**
     * 一键导入子菜单
     * @author zbj
     * @date 2023/11/21
     */
    public function import(NavLogic $navLogic){
        $this->request->validate([
            'id'=>'required',
        ],[
            'id.required' => 'ID不能为空',
        ]);
        $navLogic->importNav();
        $this->response('success');
    }

    /**
     * @remark :菜单列表排序
     * @name   :setSortList
     * @author :lyh
     * @method :post
     * @time   :2023/12/18 13:44
     */
    public function setSortList(NavLogic $navLogic){
        $this->request->validate([
            'id'=>'required'
        ],[
            'id.required' => 'ID不能为空',
        ]);
        $navLogic->setSortList();
        $this->response('success');
    }
}