美文网首页
laravel adminlte3 使用iframe 实现左侧菜

laravel adminlte3 使用iframe 实现左侧菜

作者: 码农工号9527 | 来源:发表于2020-06-06 14:53 被阅读0次
  1. 修改菜单代码,给菜单的 >li>a 中添加target属性为mainiframe,菜单视图代码 left.blade.php 如下:
<!-- Left side column. contains the logo and sidebar -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
    <!-- Brand Logo -->
    <a href="/home" class="brand-link">
      <img src="/adminlte/dist/img/AdminLTELogo.png" alt="AdminLTE Logo" class="brand-image img-circle elevation-3"
           style="opacity: .8">
      <span class="brand-text font-weight-light">SDK</span>
    </a>

    <!-- Sidebar -->
    <div class="sidebar">
      <!-- Sidebar Menu -->
      <nav class="mt-2">
        <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
          <!-- Add icons to the links using the .nav-icon class
               with font-awesome or any other icon font library -->
          @foreach( Cache::get('cartes'.\Auth::user()->id) as $carte)
          @if($carte['child'])
          <li class="nav-item has-treeview">
            <span href="#" class="nav-link">
              <i class="nav-icon fas fa-tachometer-alt"></i>
              <p>
                {{$carte['name']}}
                <i class="right fas fa-angle-left"></i>
              </p>
            </span>
            <ul class="nav nav-treeview">
              @foreach($carte['child'] as $child)
              <li class="nav-item">
                <!-- 这里添加 mainiframe 的 target 属性,为了在点击菜单的时候改变 content 内容 -->
                <a href="/{{$child['module']}}/index" class="nav-link" target="mainiframe">
                  <i class="far fa-circle nav-icon"></i>
                  <p>{{ $child['name'] }}</p>
                </a>
              </li>
              @endforeach
            </ul>
          </li>
          @endif
          @endforeach
        </ul>
      </nav>
      <!-- /.sidebar-menu -->
    </div>
    <!-- /.sidebar -->
</aside>
  1. 登陆成功后跳转到 /home 路由,/home路由执行控制器方法,渲染基础视图,这个视图实现基础的html渲染,视图代码如下
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title> adminlte | iframe </title>
    <!-- Font Awesome Icons -->
    <link rel="stylesheet" href="/adminlte/plugins/fontawesome-free/css/all.min.css">
    <!-- IonIcons -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <!-- Theme style -->
    <link rel="stylesheet" href="/adminlte/dist/css/adminlte.min.css">
    <!-- Google Font: Source Sans Pro -->
    <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
    <link rel="stylesheet" type="text/css" media="all" href="/adminlte/plugins/daterangepicker/daterangepicker.css" />
    <link rel="stylesheet" href="/adminlte/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
</head>
<body class="hold-transition skin-blue sidebar-mini">
<div class="wrapper">
    <!-- 页头视图 -->
    @include('layouts.header')
    <!-- 左侧菜单视图 -->
    @include('layouts.left') 
    <div class="content-wrapper">
        <iframe name="mainiframe" id="mainiframe" width="100%"  src="/index"
                frameborder="0" marginwidth="0" marginheight="0" scrolling="auto"
                onload="changeFrameHeight()"
        ></iframe>
    </div>
    <!-- 页脚视图 -->
    @include('layouts.footer')
    <div class="control-sidebar-bg"></div>
</div>
<!-- ./wrapper -->
<script src="{{asset('js/app.js')}}"></script>
<script>
    function changeFrameHeight(){
        var ifm= document.getElementById("mainiframe");
        ifm.height=document.documentElement.clientHeight - 50 - 60;
    }
    window.onresize=function(){
        var ua = navigator.userAgent.toLowerCase();

        var screenwidth = window.screen.width;
        // console.log("屏幕宽度为", screenwidth);
        if (!/iphone|ipad|ipod/.test(ua)) {
        } else {
            document.getElementById("mainiframe").width = screenwidth;
        }
        changeFrameHeight();
    }
</script>
</body>
</html>

说明:iframe 的 src="/index" 指当登陆成功后 redirect 到 /home 渲染出这个基础视图,基础视图中 iframe 的内容将从 /index 路由中访问获取, 相当于初始化 iframe 中 content 的内容,js 方法 changeFrameHeight() 实现iframe的高度控制,ifm.height 的高度需要自己调试减去多少合适,减的太少的话html会出现滚动条,这个时候如果 content 中返回的 html 高度也超过浏览器的高度,就会出现两个滚动条,不美观。

  1. content的内容可以自己定义一个blade模板来使用,然后view视图渲染读取这个模板,在写入自己需要的html就好了,例子如下:
    app.blade.php 模板:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title> adminlte | iframe </title>
    <!-- Font Awesome Icons -->
    <link rel="stylesheet" href="/adminlte/plugins/fontawesome-free/css/all.min.css">
    <!-- IonIcons -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <!-- Theme style -->
    <link rel="stylesheet" href="/adminlte/dist/css/adminlte.min.css">
    <!-- Google Font: Source Sans Pro -->
    <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
    <link rel="stylesheet" type="text/css" media="all" href="/adminlte/plugins/daterangepicker/daterangepicker.css" />
    <link rel="stylesheet" href="/adminlte/plugins/datatables-bs4/css/dataTables.bootstrap4.css">

    @yield('links')

</head>
<body class="hold-transition skin-blue sidebar-mini" style="background-color: #ecf0f5;">
    @yield('content')
<div class="control-sidebar-bg"></div>
<!-- ./wrapper -->

<!-- jQuery -->
<script src="/adminlte/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap -->
<script src="/adminlte/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE -->
<script src="/adminlte/dist/js/adminlte.js"></script>
<script src="/adminlte/plugins/moment/moment.min.js"></script>
<!-- OPTIONAL SCRIPTS -->
<script src="/adminlte/plugins/chart.js/Chart.min.js"></script>
<script src="/adminlte/dist/js/demo.js"></script>
<script src="/adminlte/dist/js/pages/dashboard3.js"></script>
<!-- date-range-picker -->
<script src="/adminlte/plugins/daterangepicker/daterangepicker.js"></script>
<!-- Tempusdominus Bootstrap 4 -->
<script src="/adminlte/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script>
<!-- Bootstrap Switch -->
<script src="/adminlte/plugins/bootstrap-switch/js/bootstrap-switch.min.js"></script>
<script src="/adminlte/plugins/datatables/jquery.dataTables.js"></script>
<script src="/adminlte/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script>

@yield('scripts')

</body>

</html>

/index路由 返回的视图(即/home 路由返回视图中的 iframe 内容 ):

@extends('layouts.app')

@section('links')
@stop

@section('content')
    <div class="content-header">
        <div class="container-fluid">
            <div class="row mb-2">
                <div class="col-sm-6">
                </div>
                <div class="col-sm-6">
                    <ol class="breadcrumb float-sm-right">
                    </ol>
                </div>
            </div>
        </div>
    </div>

    <div class="content">
        <div class="container-fluid">

            <div class="card">
                <div class="card-header">
                    <h3 class="card-title">这个是首页的content</h3>

                    <div class="card-tools">
                        <button type="button" class="btn btn-tool" data-card-widget="collapse" data-toggle="tooltip" title="Collapse">
                            <i class="fas fa-minus"></i></button>
                        <button type="button" class="btn btn-tool" data-card-widget="remove" data-toggle="tooltip" title="Remove">
                            <i class="fas fa-times"></i></button>
                    </div>
                </div>
                <div class="card-body">
                    <p>欢迎来到后台管理系统!</p>
                    <p>当前系统时间: {{date('Y-m-d H:i:s',time())}}</p>
                    <p>当前系统时区: {{date_default_timezone_get()}}</p>
                    <p>当前系统版本: Laravel Framework {{app()::VERSION}}</p>
                </div>
                <!-- /.card-body -->
                <div class="card-footer">
                    后台管理
                </div>
                <!-- /.card-footer-->
            </div>

            <!-- div设置为透明 避免因为没有为chart设置id报错 -->
            <div style="opacity: 0">
                <canvas id="visitors-chart" height="0"></canvas>
            </div>
            <div style="opacity: 0">
                <canvas id="sales-chart" height="0"></canvas>
            </div>
            <!-- /.row -->
        </div>
        <!-- /.container-fluid -->
    </div>
@stop

@section('scripts')
@stop

相关文章

  • laravel adminlte3 使用iframe 实现左侧菜

    修改菜单代码,给菜单的 >li>a 中添加target属性为mainiframe,菜单视图代码 left.blad...

  • iframe遇见的问题

    在项目中所实现的是,左侧为导航栏,点击左侧导航栏,右侧为一iframe引用进来的界面,iframe页面上按钮点击,...

  • 使用iframe实现一页展示两个界面,点击左边界面改变右边界面页

    首先使用iframe实现一页展示两个界面,点击左边界面改变右边界面页面这是此次想要的效果,但你会发现点击左侧界面后...

  • 前端预览PDF,Excel,Word,TXT文件

    前端可以使用iframe可以直接预览文件,以下是几种依靠iframe实现在线预览的解决方案。