How can I make login open on its own layout instead of the main layout?
If I put login on its own layout(auth.html below) am unable to navigate to index.html
The router code is as follows:
import { createWebHistory, createRouter } from "vue-router";
import Dashboard from "@/components/Dashboard.vue";
import SampleComponent from "@/components/SampleComponent.vue";
import Login from '@/components/auth/Login.vue';
const routes = [
{
path: "/",
name: "Dashboard",
component: Dashboard,
meta: { authOnly: true }
},
{
path: "/sample-component",
name: "Sample",
component: SampleComponent,
meta: { authOnly: true }
},
{
path: "/login",
name: "Login",
component: Login,
meta: { guestOnly: true }
}
];
const router = createRouter({
history: createWebHistory(),
routes,
});
function isLoggedIn() {
return localStorage.getItem("auth");
}
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.authOnly)) {
// this route requires auth, check if logged in
// if not, redirect to login page.
if (!isLoggedIn()) {
next({
path: "/login",
query: { redirect: to.fullPath }
});
} else {
next();
}
} else if (to.matched.some(record => record.meta.guestOnly)) {
// this route requires auth, check if logged in
// if not, redirect to login page.
if (isLoggedIn()) {
next({
path: "/dashboard",
query: { redirect: to.fullPath }
});
} else {
next();
}
} else {
next(); // make sure to always call next()!
}
});
export default router;
App.vue
<script setup>
import TopBar from './components/TopBar.vue'
import SideBar from './components/SideBar.vue'
import Footer from './components/Footer.vue'
</script>
<template>
<!-- Page Wrapper -->
<div id="wrapper">
<SideBar/>
<!-- Content Wrapper -->
<div id="content-wrapper" class="d-flex flex-column">
<!-- Main Content -->
<div id="content">
<TopBar/>
<!-- Begin Page Content -->
<div class="container-fluid">
<!--Load components as user navigates through the application-->
<router-view />
</div>
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
<Footer/>
</div>
<!-- End of Content Wrapper -->
</div>
<!-- End of Page Wrapper -->
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-angle-up"></i>
</a>
<!-- Logout Modal-->
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">Select "Logout" below if you are ready to end your current session.</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
<a class="btn btn-primary" href="#">Logout</a>
</div>
</div>
</div>
</div>
</template>
<style>
</style>
main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router' //Import Router
createApp(App).use(router).mount('#app')
index.html (Can be viewed by authenticated users)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>SB Admin 2 - Dashboard</title>
<!-- Custom fonts for this template-->
<link href="/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
<!-- Custom styles for this template-->
<link href="/css/sb-admin-2.min.css" rel="stylesheet">
</head>
<body id="page-top">
<div id="app">
</div>
<script type="module" src="/src/main.js"></script>
<!-- Bootstrap core JavaScript-->
<script src="/vendor/jquery/jquery.min.js"></script>
<script src="/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="/vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="/js/sb-admin-2.min.js"></script>
<!-- Page level plugins -->
<script src="/vendor/chart.js/Chart.min.js"></script>
<!-- Page level custom scripts -->
<script src="/js/demo/chart-area-demo.js"></script>
<script src="/js/demo/chart-pie-demo.js"></script>
</body>
</html>
auth.html (Login layout)
<!DOCTYPE html>
<html lang="en">
<head>
<title>Vue SPA template with Auth</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container pt-3">
<div id="app">
</div>
<script type="module" src="/src/main.js"></script>
</div>
</body>
</html>