IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue3 element-plus-demo 登录认证多页面路由demo -> 正文阅读

[JavaScript知识库]vue3 element-plus-demo 登录认证多页面路由demo

vue3 element-plus-demo 登录认证多页面路由demo

一:效果演示

动画演示

二:设计

a. 目录结构

src
├── App.vue
├── assets
│   ├── element-plus-logo.svg
│   └── logo.png
├── components
├── main.js
├── router
│   └── index.js
├── store
│   └── index.js
└── views
    ├── About.vue
    ├── Home.vue
    ├── Layout.vue			# 模板基本布局,分Header,main 和 footer
    ├── Login.vue			# 登录界面,
    ├── Page1.vue
    └── Page2.vue

b. 页面

页面都继承自Layout.vue

主页页面

Layout.vue

<template>
    <el-container style="height: 100%;">
        <el-header>
            <el-menu :default-active="activeIndex" mode="horizontal" router>
                <el-menu-item>
                    <img src="../assets/element-plus-logo.svg" style="width: 120px; height: 60px;" />
                </el-menu-item>
                <template v-if="username !== ''">
                    <template v-for="route in routes" :key="route.name" :route="route">
                        <el-menu-item :index="route.path">{{ route.meta.displayName }}</el-menu-item>
                    </template>
                    <el-sub-menu style="margin-left: auto;">
                        <template #title>
                            <i class="el-icon-setting"></i>
                            {{ username }}
                        </template>
                        <el-menu-item @click="logoff">
                            <i class="el-icon-right"></i>
                            注销登陆
                        </el-menu-item>
                    </el-sub-menu>
                </template>
                <template v-else>
                    <el-menu-item class="is-active">请登陆后访问!</el-menu-item>
                </template>
            </el-menu>
        </el-header>
        <el-main>
            <slot name="main"></slot>
        </el-main>
        <el-footer height="40px" style="color: #909399; text-align: center;">?2021 Leo xxxxxx.com</el-footer>
    </el-container>
</template>

<script>

import { useRoute, useRouter } from "vue-router";
import { ElMessage } from 'element-plus'

export default {
    name: 'Layout',
    setup() {
        const router = useRouter();
        const route = useRoute();
        return {
            routes: router.getRoutes().filter(value => value.name != 'Login' && value.name != 'Logout'),
            activeIndex: route.path,
        }
    },
    computed: {
        username() {
            return this.$store.state.username || ''
        }
    },
    methods: {
        logoff() {
            this.$store.commit('logoff')
            ElMessage({
                showClose: true,
                message: `用户 ${this.$store.state.username} 注销成功!`,
                type: 'success',
            })
            this.$router.replace({ name: 'Login' })
        }
    }
}
</script>

Home.vue

<template>
<Layout>
  <template v-slot:main>
    <h1>Main Content</h1>
  </template>

</Layout>
</template>

<script>
// @ is an alias to /src

import Layout from "../views/Layout.vue";

export default {
  name: 'Home',
  components: {
    Layout
  }
}
</script>

c. 路由

登录处理, Login.vue

<template>
    <Layout>
        <template v-slot:main>
            <div style="display: flex; justify-content: center; align-items: center; height: 100%;">
                <el-form
                    ref="loginForm"
                    :model="loginForm"
                    status-icon
                    :rules="rules"
                    label-width="120px"
                    style="width: 400px;"
                >
                    <el-form-item label="用户" prop="username" required>
                        <el-input v-model="loginForm.username" autocomplete="off"></el-input>
                    </el-form-item>
                    <el-form-item label="密码" prop="userpwd" required>
                        <el-input
                            v-model="loginForm.userpwd"
                            type="password"
                            autocomplete="off"
                            show-password
                        ></el-input>
                    </el-form-item>
                    <el-form-item>
                        <el-button
                            type="primary"
                            @click="submitForm('loginForm')"
                            style="width: 100%;"
                        >登陆</el-button>
                    </el-form-item>
                </el-form>
            </div>
        </template>
    </Layout>
</template>
<script>

import { ElMessage } from 'element-plus'
import Layout from '../views/Layout.vue';


export default {
    data() {
        return {
            loginForm: {
                username: '',
                userpwd: ''
            },
            rules: {
                username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
                userpwd: [{ required: true, message: '请输入密码', trigger: 'blur' }]
            },
        }
    },
    methods: {
        submitForm(formName) {
            this.$refs[formName].validate((valid) => {
                if (valid) {
                    this.$store.commit('login', this.loginForm.username)
                    ElMessage({
                        showClose: true,
                        message: `用户 ${this.loginForm.username} 登陆成功!`,
                        type: 'success',
                    })
                    this.$router.replace({ name: 'Home' })
                } else {
                    return false
                }
            })
        }
    },
    components: {
        Layout
    }
}
</script>


三: 完整代码

https://github.com/LeoBest2/LearnLib/tree/main/element-plus/src

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:10:41  更:2021-09-29 10:11:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 21:37:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码