admin1 1

image.png

api index

import request from '../utils/request'

export const Login = (params) => {
  return request({
    method: 'post',
    url: '/login',
    data: params
  })
}

components breadcrumb

<template>
  <el-breadcrumb separator-class="el-icon-arrow-right">
    <el-breadcrumb-item
      v-for="(item,index) in breadList"
      :key="item.path"
    >
      <router-link
        to="/welcome"
        v-if="index===  0"
      >首页</router-link>
      <span v-else>
        {{item.meta.title}}
      </span>
    </el-breadcrumb-item>
  </el-breadcrumb>
</template>
<script>
export default {
  data() {
    return {

    }
  },
  created() {
    // console.log(this.$route.matched)
  },
  computed: {
    breadList() {
      return this.$route.matched
    }
  }
}
</script>
<style lang="scss" scoped>
</style>

layout components appmain

<template>
  <div class="app-main">
    <router-view></router-view>
  </div>
</template>
<script>
export default {
  data() {
    return {

    }
  }
}
</script>
<style lang="scss" scoped>
.app-main {
  background-color: #eee;
  height: calc(100vh - 50px);
  padding: 10px;
  box-sizing: border-box;
}
</style>

navbar

<template>
  <div class="navbar">
    <i
      :class="getIcon"
      @click="hanldeToggleSideBar"
    ></i>

    <Breadcrumb class="bread"></Breadcrumb>
  </div>
</template>
<script>
import Breadcrumb from '@/components/Breadcrumb'
import { mapGetters } from 'vuex'
export default {
  computed: {
    ...mapGetters(['sidebar']),
    getIcon() {
      return this.sidebar.opened ? 'el-icon-s-fold' : 'el-icon-s-unfold'
    }
  },
  components: {
    Breadcrumb
  },
  data() {
    return {

    }
  },
  methods: {
    hanldeToggleSideBar() {
      this.$store.dispatch('app/toggleSidebar')
    }
  }
}
</script>
<style lang="scss" scoped>
.navbar {
  height: 100%;
  display: flex;
  align-items: center;
  .bread {
    margin-left: 12px;
  }
}
</style>
image.png

slidebar index

<template>
  <div class="sidebar">
    <logo :isCollapse="isCollapse"></logo>
    <el-menu
      :collapse="isCollapse"
      :collapse-transition="false"
      class="sidebar-menu"
    >
      <sidebar-item></sidebar-item>
    </el-menu>
  </div>
</template>
<script>
import Logo from './Logo'
import SidebarItem from './SidebarItem'
export default {
  props: ['isCollapse'],
  // data() {
  //   return {
  //     isCollapse: false
  //   }
  // },
  components: {
    Logo,
    SidebarItem
  }
}
</script>
<style lang="scss" scoped>
.sidebar {
  .sidebar-menu {
    border-right: none;
  }
}
</style>

logo

<template>
  <div class="logo">
    <img
      src="@/assets/images/logo.png"
      alt=""
    >
    <span
      class="title"
      v-show="!isCollapse"
    >fly-admin</span>
  </div>
</template>
<script>
export default {
  props: ['isCollapse'],
  data() {
    return {

    }
  }
}
</script>
<style lang="scss" scoped>
.logo {
  height: 50px;
  background-color: #000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 10px;
  box-sizing: border-box;
  img {
    width: 32px;
    height: 32px;
  }
  .title {
    margin-left: 20px;
  }
}
</style>

slidebaritem

<template>
  <!-- <div class="side-item"> -->
  <el-submenu index="1">
    <template slot="title">
      <i class="el-icon-location"></i>
      <span slot="title">导航一</span>
    </template>
    <el-menu-item-group>
      <span slot="title">分组一</span>
      <el-menu-item index="1-1">选项1</el-menu-item>
      <el-menu-item index="1-2">选项2</el-menu-item>
    </el-menu-item-group>
  </el-submenu>
  <!-- </div> -->
</template>
<script>
export default {
  data() {
    return {

    }
  }
}
</script>
<style lang="scss" scoped>
</style>

index.js

export { default as AppMain } from './AppMain/index.vue'
export { default as Navbar } from './NavBar/index.vue'
export { default as Sidebar } from './Sidebar/index.vue'

layout index

<template>
  <div class="app-wrapper">
    <!-- 左侧  -->
    <sidebar
      :class="['sidebar-container', isCollapse ?'fold': 'unfold' ]"
      :isCollapse="isCollapse"
    ></sidebar>
    <!-- 右侧 -->
    <div :class="['main-container', isCollapse ?'fold': 'unfold']">
      <div class="fixed-header">
        <navbar></navbar>
      </div>
      <app-main></app-main>
    </div>
  </div>
</template>
<script>
import { Navbar, AppMain, Sidebar } from './components'
import { mapGetters } from 'vuex'
export default {
  computed: {
    ...mapGetters(['sidebar']),
    isCollapse() {
      return !this.sidebar.opened
    }
  },
  components: {
    Navbar,
    AppMain,
    Sidebar
  }
}
</script>
<style lang="scss">
.app-wrapper {
  position: relative;
  .sidebar-container {
    position: fixed;
    width: 200px;
    // background-color: #000;
    height: 100vh;
    color: #fff;
    transition: width 0.3s;
    &.fold {
      width: 64px;
    }
    &.unfold {
      width: 200px;
    }
  }
  .main-container {
    margin-left: 200px;
    height: 100vh;
    color: #000;
    background-color: pink;
    transition: margin-left 0.3s;
    &.fold {
      margin-left: 64px;
    }
    &.unfold {
      margin-left: 200px;
    }
    .fixed-header {
      height: 50px;
      background-color: #fff;
      padding: 10px;
      box-sizing: border-box;
    }
  }
}
</style>

router

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)


const routes = [
  {
    path: '/',
    component: () => import('../layout'),
    redirect: '/welcome',
    meta: {
      title: '首页'
    },
    children: [
      {
        path: 'welcome',
        component: () => import('../views/Welcome.vue'),
        meta: {
          title: '欢迎'
        }
      }
    ]
  },
  {
    path: '/login',
    component: () => import('../views/Login.vue')
  },
  {
    path: '*',
    component: () => import('../views/PageNoFound.vue')
  }
]

const router = new VueRouter({
  routes
})

export default router

store
modules

export default {
  namespaced: true,
  state: {
    sidebar: {
      opened: true
    }
  },
  mutations: {
    TOGGLE_SIDEBAR(state) {
      state.sidebar.opened = !state.sidebar.opened
    }
  },
  actions: {
    toggleSidebar({ commit }) {
      commit('TOGGLE_SIDEBAR')
    }
  }
}

getters.js

export default {
  sidebar: state => state.app.sidebar
}

index.js

import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
import getters from './getters'
Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    app
  },
  getters
})

utils
request

import axios from 'axios'
// import { Message } from 'element-ui'
// 配置aixos对象
const service = axios.create({
  // baseURL: '/api'
  baseURL: process.env.VUE_APP_BASE_API
})

// 请求拦截
service.interceptors.request.use(config => {
  return config
}, err => {
  Promise.reject(err)
})

// 响应拦截
service.interceptors.response.use(response => {
  console.log(response)
  return response
}, err => {
  // Message({
  //   type: 'error',
  //   message: '网络请求失败'
  // })
  Promise.reject(err)
})

export default service

storage

const namespace = 'mall-admin'

export default {
  setItem(key, val) {
    const storage = this.getStorage()
    storage[key] = val
    window.localStorage.setItem(namespace, JSON.stringify(storage))
  },
  getItem(key) {
    return this.getStorage()[key]
  },
  getStorage() {
    return JSON.parse(window.localStorage.getItem(namespace) || "{}")
  },
  clearItem(key) {
    const storage = this.getStorage()
    delete storage[key]
    window.localStorage.setItem(namespace, JSON.stringify(storage))
  },
  clearAll() {
    window.localStorage.clear()
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,548评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,069评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,985评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,305评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,324评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,030评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,639评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,552评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,081评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,194评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,327评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,004评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,688评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,188评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,307评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,667评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,337评论 2 358

推荐阅读更多精彩内容