Browse Source

支持子路由设置,通过meta isTab属性, 设定是否通过tab标签页展示内容

daxiongYang 7 years ago
parent
commit
577af5ef5d

+ 12 - 7
src/assets/scss/_base.scss

214
.site-content {
214
.site-content {
215
  position: relative;
215
  position: relative;
216
  padding: 15px;
216
  padding: 15px;
217
}
218
.site-content--tabs {
219
  padding: 55px 0 0;
217
  > *[class^="mod-"] {
218
    padding: 15px;
219
    background-color: #fff;
220
  }
220
  > .el-tabs {
221
  > .el-tabs {
221
    .el-tabs__header {
222
    .el-tabs__header {
222
      position: fixed;
223
      position: fixed;
237
    .el-tabs__content {
238
    .el-tabs__content {
238
      padding: 0 15px 15px;
239
      padding: 0 15px 15px;
239
    }
240
    }
240
    .el-pagination {
241
      margin-top: 15px;
242
      text-align: right;
243
    }
244
    .el-breadcrumb {
241
    .el-breadcrumb {
245
      padding: 0 0 15px;
242
      padding: 0 0 15px;
246
      margin-bottom: 22px;
243
      margin-bottom: 22px;
247
      border-bottom: 1px solid #ebeef5;
244
      border-bottom: 1px solid #ebeef5;
248
    }
245
    }
249
  }
246
  }
247
  .el-pagination {
248
    margin-top: 15px;
249
    text-align: right;
250
  }
251
252
  &--tabs {
253
    padding: 55px 0 0;
254
  }
250
}
255
}

+ 9 - 18
src/router/index.js

21
      redirect: { name: 'home' },
21
      redirect: { name: 'home' },
22
      desc: '上左右整体布局',
22
      desc: '上左右整体布局',
23
      children: [
23
      children: [
24
        // 通过isTab属性, 设定是否通过tab标签页展示内容
24
        { path: '/home', component: _import('home/index'), name: 'home', desc: '首页' },
25
        { path: '/home', component: _import('home/index'), name: 'home', desc: '首页' },
25
        {
26
          path: '/content-tabs',
27
          component: _import('layout/content-tabs'),
28
          name: 'content-tabs',
29
          redirect: { name: '404' },
30
          desc: '内容需通过tabs展示',
31
          children: [
32
            // 以'/n'开头统一拦截, 标记为左侧菜单导航tab展示内容方式路由
33
            { path: '/n/user', component: _import('user/index'), name: 'user', desc: '管理员管理' },
34
            { path: '/n/role', component: _import('role/index'), name: 'role', desc: '角色管理' },
35
            { path: '/n/menu', component: _import('menu/index'), name: 'menu', desc: '菜单管理' },
36
            { path: '/n/sql', component: _import('sql/index'), name: 'sql', desc: 'SQL监控' },
37
            { path: '/n/schedule', component: _import('schedule/index'), name: 'schedule', desc: '定时任务' },
38
            { path: '/n/config', component: _import('config/index'), name: 'config', desc: '参数管理' },
39
            { path: '/n/oss', component: _import('oss/index'), name: 'oss', desc: '文件上传' },
40
            { path: '/n/log', component: _import('log/index'), name: 'log', desc: '系统日志' }
41
          ]
42
        }
26
        { path: '/user', component: _import('user/index'), name: 'user', desc: '管理员管理', meta: { isTab: true } },
27
        { path: '/role', component: _import('role/index'), name: 'role', desc: '角色管理', meta: { isTab: true } },
28
        { path: '/menu', component: _import('menu/index'), name: 'menu', desc: '菜单管理', meta: { isTab: true } },
29
        { path: '/sql', component: _import('sql/index'), name: 'sql', desc: 'SQL监控', meta: { isTab: true } },
30
        { path: '/schedule', component: _import('schedule/index'), name: 'schedule', desc: '定时任务', meta: { isTab: true } },
31
        { path: '/config', component: _import('config/index'), name: 'config', desc: '参数管理', meta: { isTab: true } },
32
        { path: '/oss', component: _import('oss/index'), name: 'oss', desc: '文件上传', meta: { isTab: true } },
33
        { path: '/log', component: _import('log/index'), name: 'log', desc: '系统日志', meta: { isTab: true } }
43
      ],
34
      ],
44
      beforeEnter (to, from, next) {
35
      beforeEnter (to, from, next) {
45
        let token = Vue.cookie.get('token')
36
        let token = Vue.cookie.get('token')

+ 23 - 25
src/views/home/index.vue

1
<template>
1
<template>
2
  <div class="site-content site-content--home">
3
    <el-card :style="contentViewStyles">
4
      <h3>项目介绍</h3>
5
      <ul>
6
        <li>一个轻量级的Java快速开发平台,能快速开发项目并交付【接私活利器】</li>
7
        <li>友好的代码结构及注释,便于阅读及二次开发</li>
8
        <li>完善的XSS防范及脚本过滤,彻底杜绝XSS攻击</li>
9
        <li>实现前后端分离,通过token进行数据交互</li>
10
        <li>推荐使用阿里云服务器部署项目,免费领取阿里云优惠券,请点击【<a href="//promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=y93lfwbg&productCode=dmspre&utm_source=y93lfwbg" target="_blank">免费领取</a>】</li>
11
      </ul>
12
      <h3>获取帮助</h3>
13
      <ul>
14
        <li>官方社区:<a href="//renren.io" target="_blank">renren.io</a></li>
15
        <li>前端Git地址:<a href="//github.com/daxiongYang/renren-fast-vue" target="_blank">github.com/daxiongYang/renren-fast-vue</a></li>
16
        <li>后台Git地址:<a href="//git.oschina.net/renrenio/renren-fast" target="_blank">git.oschina.net/renrenio/renren-fast</a></li>
17
        <li>代码生成器:<a href="//git.oschina.net/renrenio/renren-generator" target="_blank">git.oschina.net/renrenio/renren-generator</a></li>
18
        <li>如需关注项目最新动态,请Watch、Star项目,同时也是对项目最好的支持</li>
19
      </ul>
20
      <h3>官方QQ群</h3>
21
      <ul>
22
        <li>高级群:324780204(大牛云集,跟大牛学习新技能)</li>
23
        <li>普通群:145799952(学习交流,互相解答各种疑问)</li>
24
      </ul>
25
    </el-card>
2
  <div class="mod-home">
3
    <h3>项目介绍</h3>
4
    <ul>
5
      <li>一个轻量级的Java快速开发平台,能快速开发项目并交付【接私活利器】</li>
6
      <li>友好的代码结构及注释,便于阅读及二次开发</li>
7
      <li>完善的XSS防范及脚本过滤,彻底杜绝XSS攻击</li>
8
      <li>实现前后端分离,通过token进行数据交互</li>
9
      <li>推荐使用阿里云服务器部署项目,免费领取阿里云优惠券,请点击【<a href="//promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=y93lfwbg&productCode=dmspre&utm_source=y93lfwbg" target="_blank">免费领取</a>】</li>
10
    </ul>
11
    <h3>获取帮助</h3>
12
    <ul>
13
      <li>官方社区:<a href="//renren.io" target="_blank">renren.io</a></li>
14
      <li>前端Git地址:<a href="//github.com/daxiongYang/renren-fast-vue" target="_blank">github.com/daxiongYang/renren-fast-vue</a></li>
15
      <li>后台Git地址:<a href="//git.oschina.net/renrenio/renren-fast" target="_blank">git.oschina.net/renrenio/renren-fast</a></li>
16
      <li>代码生成器:<a href="//git.oschina.net/renrenio/renren-generator" target="_blank">git.oschina.net/renrenio/renren-generator</a></li>
17
      <li>如需关注项目最新动态,请Watch、Star项目,同时也是对项目最好的支持</li>
18
    </ul>
19
    <h3>官方QQ群</h3>
20
    <ul>
21
      <li>高级群:324780204(大牛云集,跟大牛学习新技能)</li>
22
      <li>普通群:145799952(学习交流,互相解答各种疑问)</li>
23
    </ul>
26
  </div>
24
  </div>
27
</template>
25
</template>
28
26
48
</script>
46
</script>
49
47
50
<style>
48
<style>
51
  .site-content--home {
49
  .mod-home {
52
    line-height: 1.5;
50
    line-height: 1.5;
53
  }
51
  }
54
</style>
52
</style>

+ 22 - 24
src/views/layout/content-tabs.vue

1
<template>
1
<template>
2
  <div class="site-content site-content--tabs">
3
    <el-tabs
4
      v-model="tabActiveName"
5
      :closable="$store.state.contentTabs.length > 1"
6
      @tab-click="selectedTabHandle"
7
      @tab-remove="removeTabHandle">
8
        <el-tab-pane
9
          v-for="item in $store.state.contentTabs"
10
          :key="item.name"
11
          :label="item.title"
12
          :name="item.name">
13
          <el-card :body-style="contentViewHeight(item)">
14
            <iframe
15
              v-if="item.type === 'iframe'"
16
              :src="getNestIframeUrl(item.url)"
17
              width="100%" height="100%" frameborder="0" scrolling="yes">
18
            </iframe>
19
            <keep-alive v-else>
20
              <router-view v-if="item.name === tabActiveName"></router-view>
21
            </keep-alive>
22
          </el-card>
23
        </el-tab-pane>
24
    </el-tabs>
25
  </div>
2
  <el-tabs
3
    v-model="tabActiveName"
4
    :closable="$store.state.contentTabs.length > 1"
5
    @tab-click="selectedTabHandle"
6
    @tab-remove="removeTabHandle">
7
    <el-tab-pane
8
      v-for="item in $store.state.contentTabs"
9
      :key="item.name"
10
      :label="item.title"
11
      :name="item.name">
12
      <el-card :body-style="contentViewHeight(item)">
13
        <iframe
14
          v-if="item.type === 'iframe'"
15
          :src="getNestIframeUrl(item.url)"
16
          width="100%" height="100%" frameborder="0" scrolling="yes">
17
        </iframe>
18
        <keep-alive v-else>
19
          <router-view v-if="item.name === tabActiveName"></router-view>
20
        </keep-alive>
21
      </el-card>
22
    </el-tab-pane>
23
  </el-tabs>
26
</template>
24
</template>
27
25
28
<script>
26
<script>

+ 10 - 1
src/views/layout/index.vue

7
      <topbar></topbar>
7
      <topbar></topbar>
8
      <sidebar></sidebar>
8
      <sidebar></sidebar>
9
      <div class="site-content__wrapper" :style="siteContentWarpperStyles">
9
      <div class="site-content__wrapper" :style="siteContentWarpperStyles">
10
        <router-view></router-view>
10
        <div class="site-content" :class="{ 'site-content--tabs': routeIsTab }">
11
          <keep-alive v-if="!routeIsTab">
12
            <router-view></router-view>
13
          </keep-alive>
14
          <!-- tab标签页, 内容展示方式 -->
15
          <content-tabs v-else></content-tabs>
16
        </div>
11
      </div>
17
      </div>
12
    </template>
18
    </template>
13
  </div>
19
  </div>
40
        return [
46
        return [
41
          { 'minHeight': this.$store.state.documentClientHeight + 'px' }
47
          { 'minHeight': this.$store.state.documentClientHeight + 'px' }
42
        ]
48
        ]
49
      },
50
      routeIsTab () {
51
        return this.$route.meta && this.$route.meta.isTab
43
      }
52
      }
44
    },
53
    },
45
    created () {
54
    created () {

+ 1 - 1
src/views/layout/sidebar.vue

61
      },
61
      },
62
      // 路由操作
62
      // 路由操作
63
      routeHandle (route) {
63
      routeHandle (route) {
64
        if (/^\/n\/.*$/.test(route.path)) {
64
        if (route.meta && route.meta.isTab) {
65
          var tab = this.$store.state.contentTabs.filter(item => item.name === route.name)[0]
65
          var tab = this.$store.state.contentTabs.filter(item => item.name === route.name)[0]
66
          // tab不存在, 先添加
66
          // tab不存在, 先添加
67
          if (isEmpty(tab)) {
67
          if (isEmpty(tab)) {

+ 1 - 1
static/config/index.js

4
;(function () {
4
;(function () {
5
  window.SITE_CONFIG = {}
5
  window.SITE_CONFIG = {}
6
  // api接口请求地址
6
  // api接口请求地址
7
  window.SITE_CONFIG.baseUrl = '//demo.renren.io/renren-fast'
7
  window.SITE_CONFIG.baseUrl = '//dev.demo.renren.io/renren-fast'
8
8
9
  // 嵌套iframe地址
9
  // 嵌套iframe地址
10
  window.SITE_CONFIG.nestIframeUrl = '//demo.renren.io/renren-fast/'
10
  window.SITE_CONFIG.nestIframeUrl = '//demo.renren.io/renren-fast/'