qdt-admin-layout 1.1.4 → 1.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,4 +18,7 @@
18
18
 
19
19
  ```
20
20
  npm i qdt-admin-layout -S
21
+
22
+ npm用户名:hexiaojun
23
+ 密码:hxj1433808390
21
24
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qdt-admin-layout",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "description": "基于element-ui的后台管理layout的管家婆改版",
5
5
  "main": "src/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -3,16 +3,16 @@
3
3
  * 默认的侧边栏实现,支持以抽屉形式渲染
4
4
  */
5
5
 
6
- import menuMixin from '../../../mixin/menu'
7
- import { appGetters, asideGetters, asideMutations } from '../../../store'
8
- import Logo from '../../../component/Logo'
9
- import NavMenu from '../../../component/NavMenu'
10
- import Hamburger from '../../../component/Hamburger'
11
- import LoadingSpinner from '../../../component/LoadingSpinner'
12
- import { getRouterActiveMenu, isRedirectRouter } from '../../../config/logic'
6
+ import menuMixin from "../../../mixin/menu";
7
+ import { appGetters, asideGetters, asideMutations } from "../../../store";
8
+ import Logo from "../../../component/Logo";
9
+ import NavMenu from "../../../component/NavMenu";
10
+ import Hamburger from "../../../component/Hamburger";
11
+ import LoadingSpinner from "../../../component/LoadingSpinner";
12
+ import { getRouterActiveMenu, isRedirectRouter } from "../../../config/logic";
13
13
 
14
14
  export default {
15
- name: 'DefaultSidebar',
15
+ name: "DefaultSidebar",
16
16
 
17
17
  mixins: [menuMixin],
18
18
 
@@ -21,85 +21,92 @@ export default {
21
21
  // 开启了自动隐藏时,判断鼠标是否在侧边栏外
22
22
  mouseOutside: true,
23
23
  // 开启了自动隐藏时,用于判断鼠标是否在弹出菜单内
24
- openedMenuNum: 0
25
- }
24
+ openedMenuNum: 0,
25
+ };
26
26
  },
27
27
 
28
28
  computed: {
29
29
  // 侧边栏菜单
30
30
  sidebarMenus() {
31
- const menus = appGetters.menus
32
- let finalData
31
+ const menus = appGetters.menus;
32
+ let finalData;
33
33
 
34
34
  // 移动端时,侧边栏只会按侧边栏导航模式渲染
35
- if (appGetters.isMobile) finalData = menus
35
+ if (appGetters.isMobile) finalData = menus;
36
36
  else {
37
37
  // 只有导航模式为aside或mix时才会渲染侧边栏
38
38
  switch (appGetters.navMode) {
39
- case 'aside':
40
- finalData = menus
41
- break
42
- case 'mix':
43
- const root = menus.find(i => i.fullPath === appGetters.activeRootMenu)
44
- finalData = root ? root.children || [] : []
45
- break
39
+ case "aside":
40
+ finalData = menus;
41
+ break;
42
+ case "mix":
43
+ const root = menus.find(
44
+ (i) => i.fullPath === appGetters.activeRootMenu
45
+ );
46
+ finalData = root ? root.children || [] : [];
47
+ break;
46
48
  default:
47
- finalData = []
49
+ finalData = [];
48
50
  }
49
51
  }
50
52
 
51
- const f = asideGetters.postMenus
52
- return f ? f(this.copyMenus(finalData)) : finalData
53
+ const f = asideGetters.postMenus;
54
+ return f ? f(this.copyMenus(finalData)) : finalData;
53
55
  },
54
56
 
55
57
  // 当是移动端或设置了侧边栏自动隐藏时将侧边栏用抽屉包裹
56
58
  renderInDrawer() {
57
- return appGetters.isMobile || asideGetters.autoHide
59
+ return appGetters.isMobile || asideGetters.autoHide;
58
60
  },
59
61
  // el-drawer的自定义类名
60
62
  drawerClass() {
61
- const behindHeader = !appGetters.isMobile && appGetters.struct === 'top-bottom'
62
- return `sidebar-drawer${behindHeader ? ' behind-header' : ''}`
63
+ const behindHeader =
64
+ !appGetters.isMobile && appGetters.struct === "top-bottom";
65
+ return `sidebar-drawer${behindHeader ? " behind-header" : ""}`;
63
66
  },
64
67
 
65
68
  // 侧边栏的显隐状态,true显示、false隐藏
66
69
  show() {
67
70
  // store中要显示那就显示
68
- if (asideGetters.show) return true
71
+ if (asideGetters.show) return true;
69
72
 
70
73
  // 移动端,false
71
- if (appGetters.isMobile) return false
74
+ if (appGetters.isMobile) return false;
72
75
 
73
76
  // 未设置侧边栏自动隐藏,false
74
- if (!asideGetters.autoHide) return false
77
+ if (!asideGetters.autoHide) return false;
75
78
 
76
79
  // 鼠标在侧边栏内,true
77
- if (!this.mouseOutside) return true
80
+ if (!this.mouseOutside) return true;
78
81
 
79
82
  // 侧边栏处于折叠状态 且 存在弹出的子菜单,true
80
- return this.collapse && this.openedMenuNum > 0
83
+ return this.collapse && this.openedMenuNum > 0;
81
84
  },
82
85
 
83
86
  // 侧边栏的折叠状态,true折叠、false展开,仅在pc端可折叠
84
87
  collapse() {
85
- return asideGetters.collapse && !appGetters.isMobile
88
+ return asideGetters.collapse && !appGetters.isMobile;
86
89
  },
87
90
 
88
91
  // 是否需要显示logo
89
92
  showLogo() {
90
- return appGetters.showLogo && (appGetters.isMobile || appGetters.struct === 'left-right')
93
+ // return (
94
+ // appGetters.showLogo &&
95
+ // (appGetters.isMobile || appGetters.struct === "left-right")
96
+ // );
97
+ return true;
91
98
  },
92
99
 
93
100
  sidebarClass() {
94
- return { 'sidebar': true, 'collapse': this.collapse }
101
+ return { sidebar: true, collapse: this.collapse };
95
102
  },
96
103
 
97
104
  // 只有设置了自动隐藏时才需要绑定鼠标的移入移出事件
98
105
  sidebarEvent() {
99
106
  return !appGetters.isMobile && asideGetters.autoHide
100
107
  ? { mouseleave: this.onMouseLeave, mouseenter: this.onMouseEnter }
101
- : undefined
102
- }
108
+ : undefined;
109
+ },
103
110
  },
104
111
 
105
112
  watch: {
@@ -107,209 +114,207 @@ export default {
107
114
  $route: {
108
115
  immediate: true,
109
116
  handler(to) {
110
- if (isRedirectRouter(to)) return
117
+ if (isRedirectRouter(to)) return;
111
118
 
112
- this.activeMenu = getRouterActiveMenu(this.$route)
119
+ this.activeMenu = getRouterActiveMenu(this.$route);
113
120
 
114
- const elMenu = this.$_getElMenuInstance()
115
- if (!elMenu) return
121
+ const elMenu = this.$_getElMenuInstance();
122
+ if (!elMenu) return;
116
123
 
117
- this.resetActiveMenu()
124
+ this.resetActiveMenu();
118
125
 
119
- const item = elMenu.items[this.activeMenu]
120
- if (!item) return
126
+ const item = elMenu.items[this.activeMenu];
127
+ if (!item) return;
121
128
 
122
129
  // 由于elMenu的initOpenedMenu()不会触发select事件,所以选择手动触发
123
- this.onSelect(item.index, item.indexPath, item, false)
130
+ this.onSelect(item.index, item.indexPath, item, false);
124
131
 
125
132
  // 滚动至激活的菜单
126
- this.$nextTick(this.moveToActiveMenuVertically)
127
- }
128
- }
133
+ this.$nextTick(this.moveToActiveMenuVertically);
134
+ },
135
+ },
129
136
  },
130
137
 
131
138
  methods: {
132
139
  // 返回传入的菜单数据的拷贝副本
133
140
  copyMenus(menus) {
134
- return menus.map(menu => {
135
- const result = { ...menu }
141
+ return menus.map((menu) => {
142
+ const result = { ...menu };
136
143
  if (result.children) {
137
- result.children = this.copyMenus(result.children)
144
+ result.children = this.copyMenus(result.children);
138
145
  }
139
- return result
140
- })
146
+ return result;
147
+ });
141
148
  },
142
149
 
143
150
  // 模拟选中菜单
144
151
  onSelect(index, indexPath, item, jump = true) {
145
152
  // 非折叠且开启手风琴模式时,收起其它展开项
146
153
  if (!asideGetters.collapse && asideGetters.uniqueOpen) {
147
- const elMenu = this.$_getElMenuInstance()
148
- elMenu.openedMenus = indexPath.slice(0, -1)
154
+ const elMenu = this.$_getElMenuInstance();
155
+ elMenu.openedMenus = indexPath.slice(0, -1);
149
156
  }
150
157
 
151
- jump && this.actionOnSelectMenu(index)
158
+ jump && this.actionOnSelectMenu(index);
152
159
 
153
160
  // 抽屉模式下需要关闭抽屉
154
161
  if (this.renderInDrawer && this.show) {
155
- asideMutations.close()
156
- this.mouseOutside = true
162
+ asideMutations.close();
163
+ this.mouseOutside = true;
157
164
  }
158
165
  },
159
166
 
160
167
  // 将当前激活的菜单移动到视窗中
161
168
  moveToActiveMenuVertically() {
162
- const elMenu = this.$_getElMenuInstance()
163
- if (!elMenu) return
169
+ const elMenu = this.$_getElMenuInstance();
170
+ if (!elMenu) return;
164
171
 
165
- const cur = elMenu.activeIndex
166
- if (!cur) return
172
+ const cur = elMenu.activeIndex;
173
+ if (!cur) return;
167
174
 
168
- const curInstance = elMenu.items[cur]
169
- if (!curInstance) return
175
+ const curInstance = elMenu.items[cur];
176
+ if (!curInstance) return;
170
177
 
171
- let el = curInstance.$el
178
+ let el = curInstance.$el;
172
179
 
173
180
  // 当侧边栏折叠时,需要滚动至可视区域的元素是激活菜单的最顶层父节点
174
181
  if (elMenu.collapse) {
175
- let rootParent = curInstance
176
- while (rootParent.$parent.$options.componentName !== 'ElMenu') {
177
- rootParent = rootParent.$parent
182
+ let rootParent = curInstance;
183
+ while (rootParent.$parent.$options.componentName !== "ElMenu") {
184
+ rootParent = rootParent.$parent;
178
185
  }
179
- el = rootParent.$el
186
+ el = rootParent.$el;
180
187
  }
181
188
 
182
189
  /*
183
- * 这里考虑了菜单展开时的200ms动画时间
184
- * 为什么不分情况讨论?比如当subMenu已经是展开状态时,无需延时滚动
185
- * 但这种情况无法判断,因为这时menu.openedMenus已经包含了subMenu,无论subMenu之前是否展开
186
- * 所以统一延时300ms
187
- * */
188
- window.setTimeout(() => el.scrollIntoView({ behavior: 'smooth', block: 'nearest' }), 300)
190
+ * 这里考虑了菜单展开时的200ms动画时间
191
+ * 为什么不分情况讨论?比如当subMenu已经是展开状态时,无需延时滚动
192
+ * 但这种情况无法判断,因为这时menu.openedMenus已经包含了subMenu,无论subMenu之前是否展开
193
+ * 所以统一延时300ms
194
+ * */
195
+ window.setTimeout(
196
+ () => el.scrollIntoView({ behavior: "smooth", block: "nearest" }),
197
+ 300
198
+ );
189
199
  },
190
200
 
191
201
  // 开启侧边栏自动隐藏后的鼠标移动事件
192
202
  onMouseMove(e) {
193
203
  // 鼠标移动至屏幕左侧边缘时,标识鼠标在侧边栏内部
194
- if (e.clientX <= 1) this.mouseOutside = false
204
+ if (e.clientX <= 1) this.mouseOutside = false;
195
205
  },
196
206
  onMouseLeave() {
197
- this.mouseOutside = true
207
+ this.mouseOutside = true;
198
208
  },
199
209
  onMouseEnter() {
200
- this.mouseOutside = false
210
+ this.mouseOutside = false;
201
211
  },
202
212
 
203
213
  // 渲染el-menu时监听其展开菜单
204
214
  watchOpenedMenus() {
205
215
  // 尝试取消之前设置的监听
206
216
  if (this.watchOpenedMenusCallback) {
207
- this.watchOpenedMenusCallback()
208
- this.watchOpenedMenusCallback = null
217
+ this.watchOpenedMenusCallback();
218
+ this.watchOpenedMenusCallback = null;
209
219
  }
210
220
 
211
- const elMenu = this.$_getElMenuInstance()
212
- if (!elMenu) return
221
+ const elMenu = this.$_getElMenuInstance();
222
+ if (!elMenu) return;
213
223
 
214
- this.watchOpenedMenusCallback = elMenu.$watch('openedMenus', v => {
215
- this.openedMenuNum = v.length
216
- })
224
+ this.watchOpenedMenusCallback = elMenu.$watch("openedMenus", (v) => {
225
+ this.openedMenuNum = v.length;
226
+ });
217
227
  },
218
228
 
219
229
  // 抽屉打开的过渡动画结束时,滚动至高亮菜单
220
230
  onDrawerOpened() {
221
- this.$nextTick(this.moveToActiveMenuVertically)
231
+ this.$nextTick(this.moveToActiveMenuVertically);
222
232
  },
223
233
 
224
234
  renderHeader(h) {
225
- const defaultContent = this.showLogo && <Logo show-title={!this.collapse}/>
226
- const { headerSlot } = asideGetters
235
+ const defaultContent = this.showLogo && (
236
+ <Logo show-title={!this.collapse} />
237
+ );
238
+ const { headerSlot } = asideGetters;
227
239
 
228
- return headerSlot ? headerSlot(h, defaultContent) : defaultContent
240
+ return headerSlot ? headerSlot(h, defaultContent) : defaultContent;
229
241
  },
230
242
  renderFooter(h) {
231
- const defaultContent = asideGetters.showHamburger && !this.renderInDrawer && <Hamburger/>
232
- const { footerSlot } = asideGetters
243
+ const defaultContent = asideGetters.showHamburger &&
244
+ !this.renderInDrawer && <Hamburger />;
245
+ const { footerSlot } = asideGetters;
233
246
 
234
- let children
247
+ let children;
235
248
 
236
249
  if (footerSlot) {
237
- let renderResult = footerSlot(h, defaultContent)
250
+ let renderResult = footerSlot(h, defaultContent);
238
251
  if (Array.isArray(renderResult)) {
239
- renderResult = renderResult.filter(Boolean)
252
+ renderResult = renderResult.filter(Boolean);
240
253
  if (renderResult.length > 0) {
241
- children = renderResult
254
+ children = renderResult;
242
255
  }
243
- }
244
- else children = renderResult
245
- }
246
- else children = defaultContent
256
+ } else children = renderResult;
257
+ } else children = defaultContent;
247
258
 
248
- return children && (
249
- <div class="sidebar-footer">
250
- {children}
251
- </div>
252
- )
253
- }
259
+ return children && <div class="sidebar-footer">{children}</div>;
260
+ },
254
261
  },
255
262
 
256
263
  created() {
257
264
  // 侧边栏菜单变化时设置当前的高亮菜单
258
265
  // 在此前,activeMenu会在watch:$route中发生第一次变化(不会真有人把menu.meta.activeMenu设成''吧?)
259
- this.$watch('sidebarMenus', this.setDefaultActiveMenu, { immediate: true })
266
+ this.$watch("sidebarMenus", this.setDefaultActiveMenu, { immediate: true });
260
267
 
261
268
  // 添加或移除鼠标移动事件
262
269
  this.$watch(
263
270
  () => {
264
271
  // 如果是移动端,false
265
- if (appGetters.isMobile) return false
272
+ if (appGetters.isMobile) return false;
266
273
 
267
274
  // 如果未启用侧边栏自动隐藏,false
268
- if (!asideGetters.autoHide) return false
275
+ if (!asideGetters.autoHide) return false;
269
276
 
270
277
  // 侧边栏为打开状态,false
271
- if (this.show) return false
278
+ if (this.show) return false;
272
279
 
273
280
  // 鼠标在侧边栏外部,true
274
- return this.mouseOutside
281
+ return this.mouseOutside;
275
282
  },
276
- v => {
283
+ (v) => {
277
284
  // 尝试移除之前可能添加的事件
278
- window.removeEventListener('mousemove', this.onMouseMove)
285
+ window.removeEventListener("mousemove", this.onMouseMove);
279
286
 
280
- v && window.addEventListener('mousemove', this.onMouseMove)
287
+ v && window.addEventListener("mousemove", this.onMouseMove);
281
288
  },
282
289
  { immediate: true }
283
- )
290
+ );
284
291
 
285
292
  // 切换至移动端 或 切换至桌面端且设置了自动隐藏时,收起侧边栏
286
293
  this.$watch(
287
294
  () => appGetters.isMobile,
288
- v => (v || asideGetters.autoHide) && asideMutations.close()
289
- )
295
+ (v) => (v || asideGetters.autoHide) && asideMutations.close()
296
+ );
290
297
  },
291
298
 
292
299
  beforeDestroy() {
293
- window.removeEventListener('mousemove', this.onMouseMove)
300
+ window.removeEventListener("mousemove", this.onMouseMove);
294
301
  },
295
302
 
296
303
  render(h) {
297
304
  // 没有菜单时,仅当设置了alwaysRender才退出后续渲染
298
305
  if (this.sidebarMenus.length === 0 && !asideGetters.alwaysRender) {
299
- return
306
+ return;
300
307
  }
301
-
302
308
  const sidebar = (
303
309
  <div {...{ class: this.sidebarClass, on: this.sidebarEvent }}>
304
310
  {this.renderHeader(h)}
305
311
 
306
- {appGetters.loadingMenu
307
- ? (
308
- <div style="position: relative;flex: 1">
309
- <LoadingSpinner/>
310
- </div>
311
- )
312
- : <NavMenu
312
+ {appGetters.loadingMenu ? (
313
+ <div style="position: relative;flex: 1">
314
+ <LoadingSpinner />
315
+ </div>
316
+ ) : (
317
+ <NavMenu
313
318
  ref="nav-menu"
314
319
  menus={this.sidebarMenus}
315
320
  collapse={this.collapse}
@@ -324,16 +329,19 @@ export default {
324
329
  menu-content-slot={asideGetters.menuContentSlot}
325
330
  {...{
326
331
  // 只能在nav-menu的mounted里,自身mounted时nav-menu可能还未渲染
327
- on: { select: this.onSelect, 'hook:mounted': this.watchOpenedMenus }
332
+ on: {
333
+ select: this.onSelect,
334
+ "hook:mounted": this.watchOpenedMenus,
335
+ },
328
336
  }}
329
337
  />
330
- }
338
+ )}
331
339
 
332
340
  {this.renderFooter(h)}
333
341
  </div>
334
- )
342
+ );
335
343
 
336
- if (!this.renderInDrawer) return sidebar
344
+ if (!this.renderInDrawer) return sidebar;
337
345
 
338
346
  return (
339
347
  <el-drawer
@@ -348,7 +356,7 @@ export default {
348
356
  >
349
357
  {sidebar}
350
358
  </el-drawer>
351
- )
352
- }
353
- }
359
+ );
360
+ },
361
+ };
354
362
  </script>
@@ -4,17 +4,15 @@
4
4
  height: 100%;
5
5
  width: $aside-width;
6
6
  transition: width 0.2s;
7
-
8
7
  > .el-menu {
9
8
  flex: 1;
10
9
  }
11
10
 
12
11
  &.collapse {
13
- width: 90px;
14
-
15
- .logo-container {
16
- padding-left: ($aside-collapse-width - $logo-size) / 2;
17
- }
12
+ width: 160px;
13
+ // .logo-container {
14
+ // padding-left: ($aside-collapse-width - $logo-size) / 2;
15
+ // }
18
16
  }
19
17
  }
20
18
 
@@ -4,27 +4,30 @@
4
4
  * 拆成Aside和DefaultSidebar是为了能让用户自定义侧边栏内容
5
5
  */
6
6
 
7
- import { appGetters, asideGetters } from '../../store'
8
- import DefaultSidebar from './DefaultSidebar'
7
+ import { appGetters, asideGetters } from "../../store";
8
+ import DefaultSidebar from "./DefaultSidebar";
9
9
 
10
10
  export default {
11
- name: 'Aside',
11
+ name: "Aside",
12
12
 
13
13
  computed: {
14
14
  // 移动端下不能设置z-index,否则会被el-drawer的遮罩遮住
15
15
  style() {
16
- return appGetters.isMobile ? 'z-index: auto !important' : undefined
17
- }
16
+ return appGetters.isMobile ? "z-index: auto !important" : undefined;
17
+ },
18
18
  },
19
19
 
20
20
  render(h) {
21
- const { defaultSlot } = asideGetters
22
-
21
+ const { defaultSlot } = asideGetters;
23
22
  return (
24
- <aside class={`aside ${asideGetters.theme}`} style={this.style}>
25
- {defaultSlot ? defaultSlot(h) : <DefaultSidebar ref="default-sidebar"/>}
23
+ <aside class="aside dark" style={this.style}>
24
+ {defaultSlot ? (
25
+ defaultSlot(h)
26
+ ) : (
27
+ <DefaultSidebar ref="default-sidebar" />
28
+ )}
26
29
  </aside>
27
- )
28
- }
29
- }
30
+ );
31
+ },
32
+ };
30
33
  </script>
@@ -1,7 +1,7 @@
1
- @import './DefaultSidebar/style';
1
+ @import "./DefaultSidebar/style";
2
2
 
3
3
  .aside {
4
- z-index: $header-z-index - 1;
4
+ z-index: $header-z-index + 1;
5
5
 
6
6
  // 侧边栏底部区域
7
7
  .sidebar-footer {
@@ -19,5 +19,5 @@
19
19
  }
20
20
  }
21
21
 
22
- @import './theme-light';
23
- @import './theme-dark';
22
+ @import "./theme-light";
23
+ @import "./theme-dark";
@@ -8,7 +8,7 @@
8
8
  max-height: 50vh;
9
9
  color: rgb(96, 98, 102);
10
10
  background-color: rgb(255, 255, 255);
11
- box-shadow: 0 2px 4px rgb(0 0 0 / 12%), 0 0 6px rgb(0 0 0 / 4%);
11
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.4);
12
12
  overflow-y: auto;
13
13
  overflow-x: hidden;
14
14
 
@@ -25,7 +25,8 @@ export default {
25
25
  !appGetters.isMobile &&
26
26
  appGetters.showLogo &&
27
27
  (appGetters.navMode === "head" || appGetters.struct === "top-bottom");
28
- return renderLogo && <Logo />;
28
+ // return renderLogo && <Logo />;
29
+ return null;
29
30
  },
30
31
  // 左侧汉堡包
31
32
  defaultHamburger() {
@@ -72,12 +73,14 @@ export default {
72
73
  />
73
74
  </span>
74
75
  {!isEmpty(username) && (
75
- <span on-click={userinfo} class="username hide-on-mobile">{username}</span>
76
+ <span on-click={userinfo} class="username hide-on-mobile">
77
+ {username}
78
+ </span>
76
79
  )}
77
80
 
78
81
  <span class="username shu">|</span>
79
82
  <i
80
- style="color:#fff"
83
+ style="color:#333"
81
84
  class="el-icon-bell header-icon"
82
85
  on-click={message}
83
86
  />
@@ -56,7 +56,7 @@
56
56
 
57
57
  .username {
58
58
  font-size: 14px;
59
- color: #fff;
59
+ color: #333;
60
60
  padding: 0 7px;
61
61
  }
62
62
  .shu {
@@ -1,8 +1,8 @@
1
1
  .header.light {
2
- background: linear-gradient(90deg, #f58852, #f56c45);
2
+ background: #ffffff;
3
3
 
4
4
  .logo-container {
5
- color: #fff;
5
+ color: #333;
6
6
  }
7
7
 
8
8
  .header-item {