管理后台模板

安装element-plus

npm install element-plus —save

main.js导入element-plus

import { createApp } from 'vue'
import App from './App.vue'
import router from './router';
import Header from '@/components/t4/Header.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
 
const app = createApp(App);
 
// 注入全局组件
app.component('Header',Header);
 
app.use(router);
 
app.use(ElementPlus)
 
app.mount('#app')

Index.vue

<template>
    <el-container>
        <Aside :isCollapse="isCollapse"></Aside>
        <el-container direction="vertical" style="height: 100vh;">
            <Header @isCollapse="getIsCollapse"></Header>
            <el-main>
                <h1>首页</h1>
            </el-main>
        </el-container>
    </el-container>
</template>
 
<script setup>
    import Aside from '@/components/Aside.vue';
    import Header from '@/components/Header.vue';
    import {ref} from 'vue';
 
    let isCollapse = ref();
 
    const getIsCollapse = (data) => {
        isCollapse.value = data;
    }
 
 
</script>
 
<style scoped>
    .el-main {
        background-color: rgb(242, 242, 242);
    }
</style>

Header.vue

<template>
    <el-header fixed>
        <el-row>
            <el-col :span="4" class="menu-icon">
                <el-icon @click="changeMenu" v-if="isCollapse"><Fold /></el-icon>
                <el-icon  @click="changeMenu" v-else><Expand /></el-icon>
            </el-col>
            <el-col :span="14"></el-col>
            <el-col :span="6" class="login-system">
                <el-dropdown>
                    <div>
                        <el-avatar src="https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png"/>
                        <span>张三</span>
                    </div>
                    <template #dropdown>
                        <el-dropdown-menu>
                            <el-dropdown-item>Action 1</el-dropdown-item>
                            <el-dropdown-item>Action 2</el-dropdown-item>
                            <el-dropdown-item>Action 3</el-dropdown-item>
                            <el-dropdown-item>Action 4</el-dropdown-item>
                            <el-dropdown-item>Action 5</el-dropdown-item>
                        </el-dropdown-menu>
                    </template>
                </el-dropdown>
            </el-col>
        </el-row>
    </el-header>
</template>
 
<script setup>
 
    import {Expand,Fold} from '@element-plus/icons-vue'
    import {ref} from 'vue';
 
    const emit = defineEmits(['isCollapse']);
 
    let isCollapse = ref(true);
 
    const changeMenu = ()=> {
        if(isCollapse.value){
            isCollapse.value = false;
            emit('isCollapse',true);
        }else {
            isCollapse.value = true;
            emit('isCollapse',false);
        }
    }
 
</script>
 
<style scoped>
    .el-header {
        background-color: blueviolet;
        height: 60px;
        padding: 10px;
    }
    .menu-icon {
        height: 40px;
        line-height: 45px;
        color: white;
        font-size: 28px;
    }
    .menu-icon i {
        cursor: pointer;
    }
    .login-system {
        text-align: right;
        padding-right: 20px;
    }
    .login-system span{
        vertical-align: middle;
        margin-left: 10px;
        color: white;
    }
</style>

Aside.vue

<template>
    <el-aside width="200">
        <el-menu default-active="2" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen"
            @close="handleClose">
            <div id="logo">
                LOGO
            </div>
            <el-sub-menu index="1">
                <template #title>
                    <el-icon>
                        <location />
                    </el-icon>
                    <span>Navigator One</span>
                </template>
                <el-menu-item-group>
                    <template #title><span>Group One</span></template>
                    <el-menu-item index="1-1">item one</el-menu-item>
                    <el-menu-item index="1-2">item two</el-menu-item>
                </el-menu-item-group>
                <el-menu-item-group title="Group Two">
                    <el-menu-item index="1-3">item three</el-menu-item>
                </el-menu-item-group>
                <el-sub-menu index="1-4">
                    <template #title><span>item four</span></template>
                    <el-menu-item index="1-4-1">item one</el-menu-item>
                </el-sub-menu>
            </el-sub-menu>
            <el-menu-item index="2">
                <el-icon><icon-menu /></el-icon>
                <template #title>Navigator Two</template>
            </el-menu-item>
            <el-menu-item index="3" disabled>
                <el-icon>
                    <document />
                </el-icon>
                <template #title>Navigator Three</template>
            </el-menu-item>
            <el-menu-item index="4">
                <el-icon>
                    <setting />
                </el-icon>
                <template #title>Navigator Four</template>
            </el-menu-item>
        </el-menu>
    </el-aside>
</template>
 
<script setup>
    import { ref } from 'vue'
    import {
        Document,
        Menu as IconMenu,
        Location,
        Setting,
    } from '@element-plus/icons-vue';
 
    //获取父组件发送过来的值
    const props = defineProps(['isCollapse']);
 
    const handleOpen = (key, keyPath) => {
        console.log(key, keyPath)
    }
    const handleClose = (key, keyPath) => {
        console.log(key, keyPath)
    }
</script>
 
<style scoped>
.el-aside {
    background-color: antiquewhite;
    height: 100vh;
}
.el-menu {
    height: 100vh;
}
#logo {
    height: 60px;
    text-align: center;
    line-height: 60px;
}
</style>

Axios封装

request.js

import axios from 'axios'
 
// 创建新的axios实例
const service = axios.create({
    // 环境变量
    baseURL: 'http://116.62.118.175/api',
    //跨域时携带cookie
    //withCredentials: true,
    // 超时时间暂定5s
    timeout: 5000,
})
 
//请求拦截
service.interceptors.request.use(
    config => {
        // 此处添加Loading
        
        return config;
    },
    error => {
        return Promise.reject(error);
    }
)
 
//响应拦截
service.interceptors.response.use(
    response => {
 
        return response;
    },
    error => {
 
        return Promise.resolve(error.response);
    }
)
 
const get = (url,params) => {
    return new Promise((resolve, reject) => {
        service.get(url,{
            params: params
        }).then(response => {
            if(response && response.data){
                resolve(response.data);
            }
        }).catch(error =>{
            reject(error);
        })
    });
}
 
const postJson = (url,data) => {
    return new Promise((resolve, reject) => {
        service.post(url,data).then(response => {
            if(response && response.data){
                resolve(response.data);
            }
        }).catch(error =>{
            reject(error);
        })
    });
}
 
const postForm = (url,params) => {
    return new Promise((resolve, reject) => {
        service.post(url,params,{
            headers:{
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        }).then(response => {
            if(response && response.data){
                resolve(response.data);
            }
        }).catch(error =>{
            reject(error);
        })
    });
}
 
 
export default {get,postForm,postJson};

index.js

 
import http from './request';
 
export function getJobList(params) {
    return http.get('/job/list',params);
}
 
export function delJob(params){
    return http.postForm('/job/del',params);
}
 
export function modJob(params){
    return http.postForm('/job/update',params);
}