実現したいこと
Vue3で管理者と一般ユーザーのルーティングを分けたい
前提
実務経験なしの個人開発です。
フロント:Vue3
クイックスタートで$ npm init vue@latest
でプロジェクトを立ち上げ。
一般ユーザーのログイン機能を実装した後、管理者にしかできない機能を追加する必要性を感じ、管理者のログイン機能を追加しようとしました。
ログイン画面は切り分けています。
一般ユーザー:ログイン画面→アプリケーションのホーム画面 管理者:(一般ユーザーのログイン画面から「管理者はこちらみたいなリンクを作るかも」)管理者のログイン画面→管理者のホーム画面
上記のようなルートを構想しています。
ここで、一般ユーザーと管理者ではログインの仕様や、ページごとでの認証などに違いがあるのでVue3で言うところのナビゲーションガイドをそれぞれ分ける必要性があると思いました。ページごとにmeta情報を割り振って条件分岐することは不可能ではなさそうですが、運用保守上よくない気がしたので、ルート自体を分けようと言う発想になりました。
発生している問題・エラーメッセージ
色々試して今は下記の状態で止まってしまっていると言う状況です。
ルートをそれぞれ設定して、htmlのタグを2つ用意して、それぞれmountしているといった感じです。
これだとどちらも表示されるようになっており(例えば、一般ユーザーのログイン画面で下にスクロールすると管理者のログイン画面がある)、先に定義しているからか、#user-appにマウントした方はルーティング通り遷移するのですが、管理者画面はアクセスできません。
失礼しました。上記は
JavaScript
1{ 2 path: "/:catchAll(.*)", // 全てのパスに対して 3 redirect: "/" 4 }
というルート設計を入れていたためおかしな挙動をしていたようです。
こちらを消すことで、一応意図通りに動くようにはなったと思うのですが、コンソールを確認すると
console
1vue-router.mjs:35 [Vue Router warn]: No match found for location with path "/"
というワーニングが発生しています。恐らく、常にどちらのルーティングも指定のURLを探しており、例えば"/"のpathの一般ユーザーのログイン画面にいる場合は、管理者のルーティングには"/"のpathがないためワーニングが出るのだと推測しています。
知りたいこと
結局知りたいことですが
一般的にこのようなルーティングを分けたい場合どのように実装するのでしょうか?
私の実装の仕方だと仕様上、回避できないワーニングだと思います。であればそもそも実装の仕方が悪いのだと考えています。
参考になる記事もなかなか見つからないので質問させていただきます。
該当のソースコード
html:index.html
1<body> 2 <div id="user-app"></div> 3 <div id="admin-app"></div> 4 <script type="module" src="/src/main.js"></script> 5</body>
JavaScript:main.js
1import { createApp } from 'vue' 2import App from './App.vue' 3import AdminApp from './adminApp.vue' 4import userRouter from './routes/userRouter' 5import adminRouter from "./routes/adminRouter"; 6 7const app = createApp(App) 8app.use(userRouter) 9app.mount('#user-app') 10 11const adminApp = createApp(AdminApp) 12adminApp.use(adminRouter) 13adminApp.mount('#admin-app')
JavaScript:userRouter.js
1import { createRouter, createWebHistory } from 'vue-router'; 2import Login from '../views/user/Login.vue'; 3import Survey from '../views/user/Survey.vue'; 4import Signup from '../views/user/Signup.vue'; 5import { checkAuth, checkExpiration } from '../controller/user'; 6 7const routes = [ 8 { 9 path: "/survey", 10 name: "Survey", 11 component: Survey, 12 meta: { 13 requiresAuth: true // このルートにはログインが必要 14 } 15 }, 16 { 17 path: "/", 18 name: "Login", 19 component: Login 20 }, 21 { 22 path: "/signup", 23 name: "Signup", 24 component: Signup 25 } 26] 27 28const router = createRouter({ 29 history: createWebHistory(), 30 routes: routes 31})
JavaScript:adminRouter.js
1import { createRouter, createWebHistory } from "vue-router"; 2import AdminLogin from "../views/admin/AdminLogin.vue"; 3import DashBoard from "../views/admin/DashBoard.vue"; 4 5const routes = [ 6 { 7 path: "/admin", 8 name: "/AdminLogin", 9 component: AdminLogin, 10 }, 11 { 12 path: "/admin/dashboard", 13 name: "/Dashboard", 14 component: DashBoard, 15 meta: { 16 requireAdmin: true, // 管理者は認証が必要 17 }, 18 } 19]; 20 21const router = createRouter({ 22 history: createWebHistory(), 23 routes: routes, 24}); 25
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/06/19 01:26
2023/06/19 04:13
2023/07/03 02:45
2023/07/03 03:02 編集
2023/07/03 05:48
2023/07/03 07:35 編集
2023/07/03 07:35 編集
2023/07/05 02:32
2023/07/08 02:31