Browse Source

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

daxiongYang 7 years ago
parent
commit
577af5ef5d

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

@ -214,9 +214,10 @@ i.site-sidebar__menu-icon {
214 214
.site-content {
215 215
  position: relative;
216 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 221
  > .el-tabs {
221 222
    .el-tabs__header {
222 223
      position: fixed;
@ -237,14 +238,18 @@ i.site-sidebar__menu-icon {
237 238
    .el-tabs__content {
238 239
      padding: 0 15px 15px;
239 240
    }
240
    .el-pagination {
241
      margin-top: 15px;
242
      text-align: right;
243
    }
244 241
    .el-breadcrumb {
245 242
      padding: 0 0 15px;
246 243
      margin-bottom: 22px;
247 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,25 +21,16 @@ export default new Router({
21 21
      redirect: { name: 'home' },
22 22
      desc: '上左右整体布局',
23 23
      children: [
24
        // 通过isTab属性, 设定是否通过tab标签页展示内容
24 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 35
      beforeEnter (to, from, next) {
45 36
        let token = Vue.cookie.get('token')

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

@ -1,28 +1,26 @@
1 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 24
  </div>
27 25
</template>
28 26
@ -48,7 +46,7 @@
48 46
</script>
49 47
50 48
<style>
51
  .site-content--home {
49
  .mod-home {
52 50
    line-height: 1.5;
53 51
  }
54 52
</style>

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

@ -1,28 +1,26 @@
1 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 24
</template>
27 25
28 26
<script>

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

@ -7,7 +7,13 @@
7 7
      <topbar></topbar>
8 8
      <sidebar></sidebar>
9 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 17
      </div>
12 18
    </template>
13 19
  </div>
@ -40,6 +46,9 @@
40 46
        return [
41 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 54
    created () {

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

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

+ 1 - 1
static/config/index.js

@ -4,7 +4,7 @@
4 4
;(function () {
5 5
  window.SITE_CONFIG = {}
6 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 9
  // 嵌套iframe地址
10 10
  window.SITE_CONFIG.nestIframeUrl = '//demo.renren.io/renren-fast/'