• laravel5.4 后台RBAC功能完成中遇到的问题及解决方法


    1.在后台模块中有些公共的地方 比如头部 尾部 左侧菜单栏; 在laravel中通过继承模板来实现,但是在做RBAC的时候

    需求是:不同的登陆用户显示不同的菜单;去数据库获取这些数据 但是每个界面都要载入layout.blade.php这个页面 需要的数据也是每个页面都需要

    so第一思路是:共享数据  文档 http://laravelacademy.org/post/6758.html   有同样问题的超链接 http://laravelacademy.org/post/697.html

    view->share('key','value')

    视图composer

    但是由于数据是动态的 需要从数据库取 而且用到了session,而AppServiceProvider这个类是在中间件之前运行,那么就出现了session无法使用的问题,网上搜遍也没有找到问题;

    最后使用简单粗暴的问题解决了 直接在类里写个方法 在layout页面中 直接调用这个方法 就输出结果了 然后再对结果进行处理

    2.由于laravel从数据库中取出的数据全是obj,而有时候要用数组形式的

      在取出的时候加->toArray()  但是也只能是外层对象变为数组 内层还是对象

      那么就可以$menus = json_decode(json_encode($menus), true);来   来把数据完全转换为数组了  这是学习源头 https://blog.csdn.net/itbsl/article/details/76472807

    3.在弄菜单的时候遇到无限级分类的问题

       刚开始的方法是对数据进行遍历 然后再每个元素上加个level的标识 然后把子级跟着父级后面

    public function getTreeMenu($menu_list, $p_id = 0, $level = 0)
        {
            static $arr = [];
    //        dd($menu_list);
            foreach ($menu_list as $v) {
    //            dd($v);
                if ($v->parent_id == $p_id) {
                    $v->level = $level;
                    $arr[] = $v;
                    $this->getTreeMenu($menu_list, $v->id, $level+1);
                }
            }
    
            return $arr;
        }

    这里我在后面用的时候不是很方便;由于static的问题 出现使用两次循环的时候数据缓存的问题

    后来用了另一种形式的数组 很方便 就是这种形式 可以用到很多地方 比如全国地方省份 市 县城的显示   多级菜单的显示

    学习源头 http://www.jb51.net/article/123363.htm

    附代码:

    // 形成父级子级形式的数组 子级在父级里
        public function getTree($arr)
        {
            $refer = array();
            $tree = array();
            foreach($arr as $k => $v){
                $refer[$v['id']] = & $arr[$k]; //创建主键的数组引用
            }
            foreach($arr as $k => $v){
                $pid = $v['parent_id'];  //获取当前分类的父级id
                if($pid == 0){
                    $tree[] = & $arr[$k];  //顶级栏目
                }else{
                    if(isset($refer[$pid])){
                        $refer[$pid]['subcat'][] = & $arr[$k]; //如果存在父级栏目,则添加进父级栏目的子栏目数组中
                    }
                }
            }
            return $tree;
        }

    这样在取出的时候只用遍历一遍

    <ul class=" nav-tabs nav-stacked">
                @foreach(iqiyiHttpControllersIndex::menuTree() as $k => $menu)
                        @if(!isset($menu['subcat']))
                            <li role="presentation" class=" normal" id="{{$menu['id']}}"><a  href="{{$menu['href']}}">{{$menu['name']}}</a></li>
                        @elseif(isset($menu['subcat']))
                            <li role="presentation" class="dropdown normal " id="{{$menu['id']}}">
                                <a class="dropdown-toggle" data-toggle="dropdown"  href="{{$menu['href']}}" role="button" aria-haspopup="true" aria-expanded="false">
                                    {{$menu['name']}}<span class="caret"></span>
                                </a>
                                <ul class="dropdown-menu dropdown-menu-small ">
                                    @foreach($menu['subcat'] as $son)
                                        <li role="presentation"><a class="bg-warning" href="{{$son['href']}}">{{$son['name']}}</a></li>
                                    @endforeach
                                </ul>
                            </li>
                        @endif
                @endforeach
            </ul>

    4.在curd的时候需要多个where条件 ->where()->where() 多个连接即可

    5. 在一对多 多对多的关系表 要更新的时候 如何解决呢?

      1.把原来的数据按条件删除 再插入新的数据

      2.把现有的数据从数据库中取出来 和更新的数据做对比 a array_diff b (取出的是a独有的数据) b array_diff a (取出的是b独有的数据) 删除那些a独有的数据 再插入 b独有的数据    个人 感觉数据量特别大 而且交集比较多的时候 方法2更快

    6.在生成独一无二的订单号或者id号的时候

    $input['id'] = date('YmdHis') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

    这样可简单的生成一个定长的单号

    7.laravel中要查看sql语句的执行情况时候 可以用

    DB::connection->enableQueryLog() 开启查询日志

    print_r(DB::getQueryLog()) // 获取查询语句 参数 和执行时间

    如果在一个类中 有多个方法 需要多次查看查询语句的时候 把DB::connection()->getQueryLog() 写到 __construct()构造方法中 在查看的时候 DB::getQueryLog()

    public function __construct() {
            DB::connection()->enableQueryLog(); // 开启查询日志
        }

    8.在左侧的菜单时候用到bootstrap 需要父级菜单可以点击 但是悬浮的时候要显示它的子级菜单

    学习源头: http://www.jb51.net/article/98215.htm 

    $(document).ready(function(){
                dropdownOpen();//调用
            });
            /**
             * 鼠标划过就展开子菜单,免得需要点击才能展开
             */
            function dropdownOpen() {
    
                var $dropdownLi = $('li.dropdown');
    
                $dropdownLi.mouseover(function() {
                    $(this).addClass('open');
                }).mouseout(function() {
                    $(this).removeClass('open');
                });
            }

    9.虚拟机的ip地址是会改变的:

      你在公司和家里 网络不同的时候会变 

      网络卡  有人顶你的时候 ip也会变

    测试一个ip通不通的方法 ping 域名/ip地址

    查看ip的方法:ifconfig

      所以有时候连接不到的时候 有可能是ip地址改变了

    10.在进行crud的时候 要考虑 用户不填的情况  做处理

  • 相关阅读:
    python读写操作excel数据
    python读写操作excel数据小应用
    操作系统相关知识
    网络编程课堂笔记
    UDP简单初识+socketserver 模块实现服务端并发
    链接循环+模拟远程执行命令+实现大文件上传
    循环通信
    luogu P2761 软件补丁问题
    luogu P4016 负载平衡问题
    P3381 【模板】最小费用最大流(spfa板子)
  • 原文地址:https://www.cnblogs.com/djwhome/p/8892779.html
Copyright © 2020-2023  润新知