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 @@
+
+
+
+

+
ERP管理系统
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+ {{item.meta.title}}
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+ admin
+
+
+
{{userinfo.userName}}
+
+
+
+
+ 个人中心
+ 修改密码
+ 锁定屏幕
+ 退出登录
+
+
+
+
+
+
+
\ 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 @@
+
+ addUser
+
\ 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 @@
+
+ user
+
\ 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) => {