From be7002e3d63d21141eb3b4e7a1033971c5cff5d6 Mon Sep 17 00:00:00 2001 From: huzhushan Date: Thu, 25 Mar 2021 18:29:58 +0800 Subject: [PATCH] update --- mock/login.js | 14 +++ src/api/app.js | 8 ++ src/layout/components/Sidebar/index.vue | 126 +++++++++++++++++++ src/layout/components/Tabsbar/index.vue | 9 ++ src/layout/components/Topbar/Breadcrumbs.vue | 68 ++++++++++ src/layout/components/Topbar/Hamburger.vue | 38 ++++++ src/layout/components/Topbar/Userinfo.vue | 65 ++++++++++ src/layout/components/Topbar/index.vue | 37 ++++++ src/layout/index.vue | 63 ++++++++++ src/router/index.js | 18 ++- src/router/modules/home.js | 3 + src/router/modules/user.js | 23 ++++ src/store/index.js | 4 +- src/store/modules/{user.js => app.js} | 21 +++- src/utils/request.js | 8 +- src/views/login/index.vue | 2 +- src/views/user/AddUser.vue | 3 + src/views/user/index.vue | 3 + 项目开发手册.md | 27 ++-- 19 files changed, 512 insertions(+), 28 deletions(-) create mode 100644 src/api/app.js create mode 100644 src/layout/components/Sidebar/index.vue create mode 100644 src/layout/components/Tabsbar/index.vue create mode 100644 src/layout/components/Topbar/Breadcrumbs.vue create mode 100644 src/layout/components/Topbar/Hamburger.vue create mode 100644 src/layout/components/Topbar/Userinfo.vue create mode 100644 src/layout/components/Topbar/index.vue create mode 100644 src/layout/index.vue create mode 100644 src/router/modules/user.js rename src/store/modules/{user.js => app.js} (54%) create mode 100644 src/views/user/AddUser.vue create mode 100644 src/views/user/index.vue diff --git a/mock/login.js b/mock/login.js index 1457af7..1d95df0 100644 --- a/mock/login.js +++ b/mock/login.js @@ -12,4 +12,18 @@ export default [ } }, }, + { + url: "/api/userinfo", + method: "get", + timeout: 100, + response: { + code: 200, + message: "获取用户信息成功", + data: { + id: 1, + userName: 'admin', + avatar: "@image('48x48', '#fb0a2a')" + } + }, + }, ] \ No newline at end of file diff --git a/src/api/app.js b/src/api/app.js new file mode 100644 index 0000000..ddf38f6 --- /dev/null +++ b/src/api/app.js @@ -0,0 +1,8 @@ +import request from '@/utils/request' +// 获取用户信息 +export const GetUserinfo = () => { + return request({ + url: "/api/userinfo", + method: "get" + }); +}; \ No newline at end of file diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..4f0f215 --- /dev/null +++ b/src/layout/components/Sidebar/index.vue @@ -0,0 +1,126 @@ + + + + + \ No newline at end of file diff --git a/src/layout/components/Tabsbar/index.vue b/src/layout/components/Tabsbar/index.vue new file mode 100644 index 0000000..1a9514e --- /dev/null +++ b/src/layout/components/Tabsbar/index.vue @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/src/layout/components/Topbar/Breadcrumbs.vue b/src/layout/components/Topbar/Breadcrumbs.vue new file mode 100644 index 0000000..87d1ce7 --- /dev/null +++ b/src/layout/components/Topbar/Breadcrumbs.vue @@ -0,0 +1,68 @@ + + + + \ No newline at end of file diff --git a/src/layout/components/Topbar/Hamburger.vue b/src/layout/components/Topbar/Hamburger.vue new file mode 100644 index 0000000..01eacbe --- /dev/null +++ b/src/layout/components/Topbar/Hamburger.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/src/layout/components/Topbar/Userinfo.vue b/src/layout/components/Topbar/Userinfo.vue new file mode 100644 index 0000000..9af0152 --- /dev/null +++ b/src/layout/components/Topbar/Userinfo.vue @@ -0,0 +1,65 @@ + + + + \ No newline at end of file diff --git a/src/layout/components/Topbar/index.vue b/src/layout/components/Topbar/index.vue new file mode 100644 index 0000000..075e891 --- /dev/null +++ b/src/layout/components/Topbar/index.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..69ffc1c --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,63 @@ + + + + \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index c74a516..4982119 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,18 +1,24 @@ // index.js -import { createRouter, createWebHistory } from "vue-router" -import home from './modules/home' +import { createRouter, createWebHashHistory } from "vue-router" +import layout from '@/layout/index.vue' import login from './modules/login' +import home from './modules/home' +import user from './modules/user' -import { TOKEN } from '@/store/modules/user' +import { TOKEN } from '@/store/modules/app' const router = createRouter({ - history: createWebHistory(), + history: createWebHashHistory(), routes: [ { path: '/', - redirect: '/home' + component: layout, + redirect: '/home', + children: [ + ...home, + ...user + ] }, - ...home, ...login ], }); diff --git a/src/router/modules/home.js b/src/router/modules/home.js index 3530c2d..242912e 100644 --- a/src/router/modules/home.js +++ b/src/router/modules/home.js @@ -6,5 +6,8 @@ export default [ path: "/home", name: "home", component: Home, + meta: { + title: "首页", + } } ] \ No newline at end of file diff --git a/src/router/modules/user.js b/src/router/modules/user.js new file mode 100644 index 0000000..9771daf --- /dev/null +++ b/src/router/modules/user.js @@ -0,0 +1,23 @@ + +const User = () => import("@/views/user/index.vue"); +const AddUser = () => import("@/views/user/AddUser.vue"); + +export default [ + { + path: "/user", + name: "user", + component: User, + meta: { + title: "用户管理", + } + }, + { + path: "/user/add", + name: "addUser", + component: AddUser, + meta: { + title: "添加用户", + parentBreadcrumb: ["user"] + } + } +] \ No newline at end of file diff --git a/src/store/index.js b/src/store/index.js index 8bb5ea0..78a1fd0 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,9 +1,9 @@ //index.js import { createStore } from "vuex"; -import user from "./modules/user"; +import app from "./modules/app"; export default createStore({ modules: { - user, + app }, }); \ No newline at end of file diff --git a/src/store/modules/user.js b/src/store/modules/app.js similarity index 54% rename from src/store/modules/user.js rename to src/store/modules/app.js index 7d449c0..0fee57c 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/app.js @@ -5,6 +5,10 @@ export default { namespaced: true, state: { authorization: getItem(TOKEN), + sidebar: { + collapse: getItem('collapse') + }, + userinfo: null }, mutations: { setToken (state, data) { @@ -17,6 +21,21 @@ export default { // 保存到localStorage removeItem(TOKEN); }, + setCollapse (state, data) { + state.sidebar.collapse = data; + // 保存到localStorage + setItem('collapse', data); + }, + clearCollapse (state) { + state.sidebar.collapse = ''; + // 保存到localStorage + removeItem('collapse'); + }, + setUserinfo (state, data) { + state.userinfo = data; + } + }, + actions: { + }, - actions: {}, }; \ No newline at end of file diff --git a/src/utils/request.js b/src/utils/request.js index 921182f..fb4b8a0 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -12,7 +12,7 @@ const service = axios.create({ // 拦截请求 service.interceptors.request.use( (config) => { - const authorization = store.state.user; + const authorization = store.state.app; if (authorization) { config.headers.Authorization = `Bearer ${authorization.token}`; } @@ -36,7 +36,7 @@ service.interceptors.response.use( // 响应拦截器中的 error 就是那个响应的错误对象 if (error.response && error.response.status === 401) { // 校验是否有 refresh_token - const { authorization } = store.state; + const { authorization } = store.state.app; if (!authorization || !authorization.refresh_token) { router.push("/login"); @@ -54,7 +54,7 @@ service.interceptors.response.use( }); // 如果获取成功,则把新的 token 更新到容器中 // console.log('刷新 token 成功', res) - store.commit("setToken", { + store.commit("app/setToken", { token: res.data.data.token, // 最新获取的可用 token refresh_token: authorization.refresh_token, // 还是原来的 refresh_token }); @@ -67,7 +67,7 @@ service.interceptors.response.use( // console.log('请求刷线 token 失败', err) router.push("/login"); // 清除token - store.commit("clearToken") + store.commit("app/clearToken") } } diff --git a/src/views/login/index.vue b/src/views/login/index.vue index be2a8ab..8ddb1f0 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -97,7 +97,7 @@ export default defineComponent({ router.push(!!targetPath ? targetPath : "/"); }, }); - store.commit("user/setToken", data); + store.commit("app/setToken", data); } else { ctx.$message.error(message); } diff --git a/src/views/user/AddUser.vue b/src/views/user/AddUser.vue new file mode 100644 index 0000000..aab3377 --- /dev/null +++ b/src/views/user/AddUser.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/views/user/index.vue b/src/views/user/index.vue new file mode 100644 index 0000000..ef9402a --- /dev/null +++ b/src/views/user/index.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/项目开发手册.md b/项目开发手册.md index 8b6a8cf..e4a51f7 100644 --- a/项目开发手册.md +++ b/项目开发手册.md @@ -32,7 +32,6 @@ Vue3 + Element-plus + Vite > 我们将使用vite和vue3手动进行前端项目架构。为方便大家从vue2过渡到vue3,本项目我们先不使用ts。 > -> ts项目我们后面再讲,并且我们将会使用更加集成化的框架,就不需要手动搭建项目了。 使用vite的命令创建项目: @@ -159,12 +158,12 @@ npm run dev ```js // index.js - import { createRouter, createWebHistory } from "vue-router" + import { createRouter, createWebHashHistory } from "vue-router" import home from './modules/home' import login from './modules/login' const router = createRouter({ - history: createWebHistory(), + history: createWebHashHistory(), routes: [ { path: '/', @@ -242,10 +241,10 @@ npm run dev > 状态管理也使用模块化的方式 - 在store目录中创建modules目录,modules中创建一个模块,比如叫user.js + 在store目录中创建modules目录,modules中创建一个模块app.js ```js - // user.js + // app.js export default { namespaced: true, state: {}, @@ -259,11 +258,11 @@ npm run dev ```js //index.js import { createStore } from "vuex"; - import user from "./modules/user"; + import app from "./modules/app"; export default createStore({ modules: { - user, + app, }, }); @@ -525,12 +524,12 @@ server: { password: '123456' }) if (+code === 200) { - store.commit("user/setToken", data); + store.commit("app/setToken", data); } } ``` - store/modules/user.js + store/modules/app.js ```js import { getItem, setItem, removeItem } from "@/utils/storage"; //getItem和setItem是封装的操作localStorage的方法 @@ -604,7 +603,7 @@ server: { // 拦截请求 service.interceptors.request.use( (config) => { - const authorization = store.state.user; + const authorization = store.state.app; if (authorization) { config.headers.Authorization = `Bearer ${authorization.token}`; } @@ -628,7 +627,7 @@ server: { // 响应拦截器中的 error 就是那个响应的错误对象 if (error.response && error.response.status === 401) { // 校验是否有 refresh_token - const { authorization } = store.state; + const { authorization } = store.state.app; if (!authorization || !authorization.refresh_token) { router.push("/login"); @@ -646,7 +645,7 @@ server: { }); // 如果获取成功,则把新的 token 更新到容器中 // console.log('刷新 token 成功', res) - store.commit("setToken", { + store.commit("app/setToken", { token: res.data.data.token, // 最新获取的可用 token refresh_token: authorization.refresh_token, // 还是原来的 refresh_token }); @@ -659,7 +658,7 @@ server: { // console.log('请求刷线 token 失败', err) router.push("/login"); // 清除token - store.commit("clearToken") + store.commit("app/clearToken") } } @@ -700,7 +699,7 @@ server: { ```js // 引入TOKEN变量 - import { TOKEN } from '@/store/modules/user' + import { TOKEN } from '@/store/modules/app' // 全局路由守卫,注意vue-router4的路由守卫不需要next跳转,而是通过return返回false或者一个路由地址 router.beforeEach((to, from) => {