@arkxos/arkos-theme-classic 0.1.0

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.
Files changed (97) hide show
  1. package/README.md +36 -0
  2. package/ark_dist/ark-meta.json +81 -0
  3. package/ark_dist/ark_userChunk_1.js +5 -0
  4. package/ark_dist/ark_userChunk_2.js +5 -0
  5. package/ark_dist/ark_userChunk_3.js +49 -0
  6. package/ark_dist/config.js +79 -0
  7. package/ark_dist/css/layout.93396d23.css +125 -0
  8. package/ark_dist/favicon.ico +0 -0
  9. package/ark_dist/img/401.1800ba9e.gif +0 -0
  10. package/ark_dist/img/404.458c248a.png +0 -0
  11. package/ark_dist/img/404.png +0 -0
  12. package/ark_dist/img/auth_banner.jpg +0 -0
  13. package/ark_dist/img/avatar.jpg +0 -0
  14. package/ark_dist/img/avatar2.gif +0 -0
  15. package/ark_dist/img/avatar3.gif +0 -0
  16. package/ark_dist/img/login-background.1a699c00.jpg +0 -0
  17. package/ark_dist/img/loginbg.svg +1 -0
  18. package/ark_dist/img/logo-r.png +0 -0
  19. package/ark_dist/img/logo.png +0 -0
  20. package/ark_dist/img/no-widgets.svg +57 -0
  21. package/ark_dist/img/tasks-example.png +0 -0
  22. package/ark_dist/img/ver.svg +236 -0
  23. package/ark_dist/index.html +127 -0
  24. package/ark_dist/js/app.4a68e1f9.js +1 -0
  25. package/ark_dist/js/layout.661faa0e.js +3 -0
  26. package/ark_dist/js/layout.661faa0e.js.LICENSE.txt +6 -0
  27. package/ark_dist/js/layout.661faa0e.js.map +1 -0
  28. package/ark_proxy/entry.js +28 -0
  29. package/ark_proxy_es/entry.js +16 -0
  30. package/package.json +110 -0
  31. package/scripts/check.js +13 -0
  32. package/scripts/meta.js +21 -0
  33. package/scripts/prepublishOnly.js +28 -0
  34. package/src/assets/logo.png +0 -0
  35. package/src/auto-imports.d.ts +307 -0
  36. package/src/configs/subApp.ts +9 -0
  37. package/src/entrance/libProperties.ts +28 -0
  38. package/src/entrance/libTypes.ts +26 -0
  39. package/src/loadApp.ts +16 -0
  40. package/src/main.ts +18 -0
  41. package/src/os-themes/classic/assets/401_images/401.gif +0 -0
  42. package/src/os-themes/classic/assets/404_images/404.png +0 -0
  43. package/src/os-themes/classic/assets/404_images/404_cloud.png +0 -0
  44. package/src/os-themes/classic/assets/images/login-background.jpg +0 -0
  45. package/src/os-themes/classic/i18n/en.ts +39 -0
  46. package/src/os-themes/classic/i18n/zh-cn.ts +39 -0
  47. package/src/os-themes/classic/i18nFileBuilder/index.ts +19 -0
  48. package/src/os-themes/classic/images/tabs_images/ark-tab.png +0 -0
  49. package/src/os-themes/classic/index.js +19 -0
  50. package/src/os-themes/classic/layout/components/NavMenu.vue +56 -0
  51. package/src/os-themes/classic/layout/components/iframeView.vue +69 -0
  52. package/src/os-themes/classic/layout/components/search.vue +139 -0
  53. package/src/os-themes/classic/layout/components/setting.vue +95 -0
  54. package/src/os-themes/classic/layout/components/sideM.vue +137 -0
  55. package/src/os-themes/classic/layout/components/tags.vue +476 -0
  56. package/src/os-themes/classic/layout/components/tasks.vue +83 -0
  57. package/src/os-themes/classic/layout/components/topbar.vue +49 -0
  58. package/src/os-themes/classic/layout/components/userbar.vue +238 -0
  59. package/src/os-themes/classic/layout/index.vue +347 -0
  60. package/src/os-themes/classic/layout/other/404.vue +44 -0
  61. package/src/os-themes/classic/layout/other/autoExit.js +51 -0
  62. package/src/os-themes/classic/layout/other/empty.vue +3 -0
  63. package/src/os-themes/classic/router/routerStatic.js +103 -0
  64. package/src/os-themes/classic/router/scrollBehavior.js +22 -0
  65. package/src/os-themes/classic/router/systemRouter.js +36 -0
  66. package/src/os-themes/classic/store/index.js +6 -0
  67. package/src/os-themes/classic/store/modules/global.js +25 -0
  68. package/src/os-themes/classic/store/modules/iframe.js +40 -0
  69. package/src/os-themes/classic/store/modules/keepAlive.js +25 -0
  70. package/src/os-themes/classic/store/modules/viewTags.js +48 -0
  71. package/src/os-themes/classic/style/app.scss +318 -0
  72. package/src/os-themes/classic/style/dark.scss +42 -0
  73. package/src/os-themes/classic/style/fix.scss +87 -0
  74. package/src/os-themes/classic/style/media.scss +52 -0
  75. package/src/os-themes/classic/style/pages.scss +46 -0
  76. package/src/os-themes/classic/style/style.scss +5 -0
  77. package/src/os-themes/classic/utils/useTabs.js +66 -0
  78. package/src/os-themes/classic/views/bg.png +0 -0
  79. package/src/os-themes/classic/views/error/401.vue +82 -0
  80. package/src/os-themes/classic/views/error/404.vue +230 -0
  81. package/src/os-themes/classic/views/home.vue +13 -0
  82. package/src/os-themes/classic/views/login/components/commonPage.vue +35 -0
  83. package/src/os-themes/classic/views/login/components/passwordForm.vue +174 -0
  84. package/src/os-themes/classic/views/login/components/phoneForm.vue +74 -0
  85. package/src/os-themes/classic/views/login/index.vue +210 -0
  86. package/src/os-themes/classic/views/login/resetPassword.vue +125 -0
  87. package/src/os-themes/classic/views/login/userRegister.vue +174 -0
  88. package/src/os-themes/classic/views/redirect/index.vue +14 -0
  89. package/src/os-themes/classic/views/register.vue +219 -0
  90. package/src/shims-vue.d.ts +6 -0
  91. package/src/types/axios.d.ts +13 -0
  92. package/src/types/func.ts +14 -0
  93. package/src/types/global.d.ts +108 -0
  94. package/src/types/layout.d.ts +59 -0
  95. package/src/types/mitt.d.ts +40 -0
  96. package/src/types/pinia.d.ts +93 -0
  97. package/src/types/views.d.ts +27 -0
@@ -0,0 +1,238 @@
1
+ <template>
2
+ <div class="user-bar">
3
+ <div class="panel-item hidden-sm-and-down" @click="search">
4
+ <el-icon><el-icon-search /></el-icon>
5
+ </div>
6
+ <div class="screen panel-item hidden-sm-and-down" @click="screen">
7
+ <el-icon><el-icon-full-screen /></el-icon>
8
+ </div>
9
+ <div class="tasks panel-item" @click="tasks">
10
+ <el-icon><el-icon-sort /></el-icon>
11
+ </div>
12
+ <div class="tasks panel-item" @click="skins">
13
+ <el-icon><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M700.928 901.632H315.904c-32.256 0-58.368-26.112-58.368-58.368V490.496L251.392 496.64c-8.704 8.704-19.968 14.336-32.256 15.36-13.824 1.024-27.136-4.096-37.376-13.824L76.8 392.704c-18.944-18.944-18.944-49.152 0-68.096l160.256-160.256c9.216-9.216 21.504-14.336 33.792-14.336h57.856c10.752 0 20.48 6.144 25.6 15.872C383.488 225.792 445.44 264.192 512 264.192s128-38.4 157.696-98.304c4.608-9.728 14.848-15.872 25.6-15.872h57.856c12.8 0 25.088 5.12 33.792 14.336L947.2 324.608c18.944 18.944 18.944 49.152 0 68.096l-105.472 105.472c-9.216 9.216-21.504 14.336-34.304 14.336s-25.088-5.12-34.304-14.336l-7.168-7.168v346.624c0 33.28-29.184 64-65.024 64zM271.36 408.064c4.096 0 8.192 1.024 12.288 2.56l15.36 7.168c9.728 4.608 21.504 14.848 21.504 25.6v372.224c0 12.8 10.24 23.552 23.552 23.552H680.96c12.8 0 23.552-10.24 23.552-23.552V444.928c0-9.728 10.24-18.432 17.92-24.064l14.336-9.216c11.264-7.68 26.112-6.144 35.84 3.584l32.768 32.768L896 357.376l-146.432-145.92h-36.864C670.208 281.6 593.408 325.632 512 325.632c-81.92 0-158.72-44.032-200.192-114.176h-36.864L128.512 357.376l90.624 90.624 31.744-31.744c5.632-5.12 12.8-8.192 20.48-8.192z" p-id="2740"></path></svg></el-icon>
14
+ </div>
15
+ <div class="msg panel-item" @click="showMsg">
16
+ <el-badge :hidden="msgList.length==0" :value="msgList.length" class="badge" type="danger">
17
+ <el-icon><el-icon-chat-dot-round /></el-icon>
18
+ </el-badge>
19
+ <el-drawer title="新消息" v-model="msg" :size="400" append-to-body destroy-on-close>
20
+ <el-container>
21
+ <el-main class="nopadding">
22
+ <el-scrollbar>
23
+ <ul class="msg-list">
24
+ <li v-for="item in msgList" v-bind:key="item.id">
25
+ <a :href="item.link" target="_blank">
26
+ <div class="msg-list__icon">
27
+ <el-badge is-dot type="danger">
28
+ <el-avatar :size="40" :src="item.avatar"></el-avatar>
29
+ </el-badge>
30
+ </div>
31
+ <div class="msg-list__main">
32
+ <h2>{{item.title}}</h2>
33
+ <p>{{item.describe}}</p>
34
+ </div>
35
+ <div class="msg-list__time">
36
+ <p>{{item.time}}</p>
37
+ </div>
38
+ </a>
39
+ </li>
40
+ <el-empty v-if="msgList.length==0" description="暂无新消息" :image-size="100"></el-empty>
41
+ </ul>
42
+ </el-scrollbar>
43
+ </el-main>
44
+ <el-footer>
45
+ <el-button type="primary">消息中心</el-button>
46
+ <el-button @click="markRead">全部设为已读</el-button>
47
+ </el-footer>
48
+ </el-container>
49
+ </el-drawer>
50
+ </div>
51
+ <el-dropdown class="user panel-item" trigger="click" @command="handleUser">
52
+ <div class="user-avatar">
53
+ <el-avatar :size="30">{{ userNameF }}</el-avatar>
54
+ <label>{{ userName }}</label>
55
+ <el-icon class="el-icon--right"><el-icon-arrow-down /></el-icon>
56
+ </div>
57
+ <template #dropdown>
58
+ <el-dropdown-menu>
59
+ <el-dropdown-item command="uc">帐号信息</el-dropdown-item>
60
+ <el-dropdown-item command="clearCache">清除缓存</el-dropdown-item>
61
+ <el-dropdown-item divided command="outLogin">退出登录</el-dropdown-item>
62
+ </el-dropdown-menu>
63
+ </template>
64
+ </el-dropdown>
65
+ </div>
66
+
67
+ <el-dialog v-model="searchVisible" :width="700" title="搜索" center destroy-on-close>
68
+ <search @success="searchVisible=false"></search>
69
+ </el-dialog>
70
+
71
+ <el-drawer v-model="tasksVisible" :size="450" title="任务中心" destroy-on-close>
72
+ <tasks></tasks>
73
+ </el-drawer>
74
+
75
+ <el-drawer title="布局实时演示" v-model="settingDialog" :size="400" append-to-body destroy-on-close>
76
+ <setting></setting>
77
+ </el-drawer>
78
+
79
+ </template>
80
+
81
+ <script>
82
+ import search from './search.vue'
83
+ import tasks from './tasks.vue'
84
+ import setting from './setting.vue';
85
+ import { systemStore, setToken } from '@arkxos/arkos-core';
86
+
87
+ export default {
88
+ components: {
89
+ search,
90
+ tasks,
91
+ setting
92
+ },
93
+ computed: {
94
+ ...mapState(systemStore, {
95
+ userInfo: 'userInfo',
96
+ avatar: 'userInfo.user.avatar',
97
+ userName(store) {
98
+ return store.userInfo?.user?.nickname
99
+ }
100
+ }),
101
+ userNameF() {
102
+ return this.userName?.substring(0, 1);
103
+ }
104
+ },
105
+ data() {
106
+ return {
107
+ settingDialog: false,
108
+ searchVisible: false,
109
+ tasksVisible: false,
110
+ msg: false,
111
+ msgList: [
112
+ {
113
+ id: 1,
114
+ type: 'user',
115
+ avatar: 'img/avatar.jpg',
116
+ title: 'Skuya',
117
+ describe: '如果喜欢就点个星星支持一下哦',
118
+ link: 'https://gitee.com/lolicode/scui',
119
+ time: '5分钟前'
120
+ },
121
+ {
122
+ id: 2,
123
+ type: 'user',
124
+ avatar: 'img/avatar2.gif',
125
+ title: 'Lolowan',
126
+ describe: '点进去Gitee获取最新开源版本',
127
+ link: 'https://gitee.com/lolicode/scui',
128
+ time: '14分钟前'
129
+ },
130
+ {
131
+ id: 3,
132
+ type: 'system',
133
+ avatar: 'img/logo.png',
134
+ title: '感谢登录ArkX OS',
135
+ describe: 'Vue 3.0 + Vue-Router 4.0 + ElementPlus + Axios 后台管理系统。',
136
+ link: 'https://gitee.com/lolicode/scui',
137
+ time: '2020年7月24日'
138
+ }
139
+ ]
140
+ }
141
+ },
142
+ created() {
143
+ // const userInfo = this.$TOOL.data.get('USER_INFO');
144
+ // const userDetail = userInfo?.user
145
+ // console.log('userDetail===', userDetail)
146
+ //
147
+ },
148
+ methods: {
149
+ // 个人信息
150
+ handleUser(command) {
151
+ if (command == 'uc') {
152
+ this.$router.push({ path: '/usercenter' });
153
+ }
154
+ if (command == 'cmd') {
155
+ this.$router.push({ path: '/cmd' });
156
+ }
157
+ if (command == 'clearCache') {
158
+ this.$confirm('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?', '提示', {
159
+ type: 'info',
160
+ }).then(() => {
161
+ const loading = this.$loading()
162
+ this.$TOOL.data.clear()
163
+ this.$router.replace({ path: '/login' })
164
+ setTimeout(() => {
165
+ loading.close()
166
+ location.reload()
167
+ }, 1000)
168
+ }).catch(() => {
169
+ // 取消
170
+ })
171
+ }
172
+ if (command === 'outLogin') {
173
+ this.$confirm('确认是否退出当前用户?', '提示', {
174
+ type: 'warning',
175
+ confirmButtonText: '退出',
176
+ confirmButtonClass: 'el-button--danger'
177
+ }).then(() => {
178
+ setToken('')
179
+ this.$router.replace({ path: '/login' });
180
+ }).catch(() => {
181
+ // 取消退出
182
+ })
183
+ }
184
+ },
185
+ // 全屏
186
+ screen() {
187
+ const element = document.documentElement;
188
+ this.$TOOL.screen(element)
189
+ },
190
+ // 显示短消息
191
+ showMsg() {
192
+ this.msg = true
193
+ },
194
+ // 标记已读
195
+ markRead() {
196
+ this.msgList = []
197
+ },
198
+ // 搜索
199
+ search() {
200
+ this.searchVisible = true
201
+ },
202
+ // 任务
203
+ tasks() {
204
+ this.tasksVisible = true
205
+ },
206
+ skins() {
207
+ this.settingDialog = true;
208
+ },
209
+ openSetting() {
210
+ this.settingDialog = true;
211
+ },
212
+ }
213
+ }
214
+ </script>
215
+
216
+ <style scoped>
217
+ .user-bar {display: flex;align-items: center;height: 100%;}
218
+ .user-bar .panel-item {padding: 0 10px;cursor: pointer;height: 100%;display: flex;align-items: center;}
219
+ .user-bar .panel-item i {font-size: 16px;}
220
+ .user-bar .panel-item:hover {background: rgba(0, 0, 0, 0.1);}
221
+ .user-bar .user-avatar {height:49px;display: flex;align-items: center;}
222
+ .user-bar .user-avatar label {display: inline-block;margin-left:5px;font-size: 12px;cursor:pointer;}
223
+ .user-bar .el-icon--right {
224
+ color: #fff;
225
+ }
226
+ .msg-list li {border-top:1px solid #eee;}
227
+ .msg-list li a {display: flex;padding:20px;}
228
+ .msg-list li a:hover {background: #ecf5ff;}
229
+ .msg-list__icon {width: 40px;margin-right: 15px;}
230
+ .msg-list__main {flex: 1;}
231
+ .msg-list__main h2 {font-size: 15px;font-weight: normal;color: #333;}
232
+ .msg-list__main p {font-size: 12px;color: #999;line-height: 1.8;margin-top: 5px;}
233
+ .msg-list__time {width: 100px;text-align: right;color: #999;}
234
+
235
+ .dark .msg-list__main h2 {color: #d0d0d0;}
236
+ .dark .msg-list li {border-top:1px solid #363636;}
237
+ .dark .msg-list li a:hover {background: #383838;}
238
+ </style>
@@ -0,0 +1,347 @@
1
+ <template>
2
+ <!-- 通栏布局 -->
3
+ <template v-if="layout=='header'">
4
+ <header class="adminui-header">
5
+ <div class="adminui-header-left">
6
+ <div class="logo-bar">
7
+ <img class="logo" src="img/logo.png">
8
+ <span>{{ $CONFIG.ArkosTitle }}</span>
9
+ </div>
10
+ <ul v-if="!ismobile" class="nav">
11
+ <li v-for="item in menu" :key="item" :class="pmenu.path == item.path ? 'active' : ''" @click="showMenu(item)">
12
+ <el-icon><component :is="item.meta.icon || 'el-icon-menu'" /></el-icon>
13
+ <span>{{ item.meta.title }}</span>
14
+ </li>
15
+ </ul>
16
+ </div>
17
+ <div class="adminui-header-right">
18
+ <userbar></userbar>
19
+ </div>
20
+ </header>
21
+ <section class="aminui-wrapper">
22
+ <div v-if="!ismobile && nextMenu.length>0 || !pmenu.component" :class="menuIsCollapse?'aminui-side isCollapse':'aminui-side'" >
23
+ <!-- <div v-if="!menuIsCollapse" class="adminui-side-top">
24
+ <h2>{{ pmenu.meta?.title }}</h2>
25
+ </div> -->
26
+ <div class="adminui-side-scroll">
27
+ <div class="adminui-side-tree">
28
+ <el-scrollbar>
29
+ <el-menu :default-active="active" router :collapse="menuIsCollapse" :unique-opened="$CONFIG.MENU_UNIQUE_OPENED">
30
+ <NavMenu :navMenus="nextMenu"></NavMenu>
31
+ </el-menu>
32
+ </el-scrollbar>
33
+ </div>
34
+ <div class="adminui-side-icon" @click="globalStore().toggleMenuIsCollapse()">
35
+ <div class="bottom-icon">
36
+ <el-icon v-if="menuIsCollapse" class="right-line" size="18" color="#ffffff"><el-icon-right /></el-icon>
37
+ <el-icon v-else class="back-line" size="18" color="#ffffff"><el-icon-back /></el-icon>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <Side-m v-if="ismobile"></Side-m>
43
+ <div class="aminui-body el-container">
44
+ <!-- <div><Topbar v-if="!ismobile"></Topbar></div>-->
45
+ <div><Tags v-if="!ismobile && layoutTags" v-show="isSideAndHeadShow" :menuIsCollapse="menuIsCollapse"></Tags></div>
46
+ <div class="adminui-main" id="adminui-main">
47
+ <router-view v-slot="{ Component }">
48
+ <keep-alive :include="keepAliveStore().keepLiveRoute">
49
+ <component :is="Component" :key="$route.path" v-if="keepAliveStore().routeShow"/>
50
+ </keep-alive>
51
+ </router-view>
52
+ <iframe-view></iframe-view>
53
+ </div>
54
+ </div>
55
+ </section>
56
+ </template>
57
+
58
+ <!-- 经典布局 -->
59
+ <template v-else-if="layout=='menu'">
60
+ <header class="adminui-header" v-show="isSideAndHeadShow">
61
+ <div class="adminui-header-left">
62
+ <div class="logo-bar">
63
+ <img class="logo" src="img/logo.png">
64
+ <span>{{ $CONFIG.ArkosTitle }}</span>
65
+ </div>
66
+ </div>
67
+ <div class="adminui-header-right">
68
+ <userbar></userbar>
69
+ </div>
70
+ </header>
71
+ <section class="aminui-wrapper">
72
+ <div v-if="!ismobile" :class="menuIsCollapse?'aminui-side isCollapse':'aminui-side'" v-show="isSideAndHeadShow">
73
+ <div class="adminui-side-scroll">
74
+ <div class="adminui-side-tree">
75
+ <el-scrollbar>
76
+ <el-menu :default-active="active" router :collapse="menuIsCollapse" :unique-opened="$CONFIG.MENU_UNIQUE_OPENED">
77
+ <NavMenu :navMenus="menu"></NavMenu>
78
+ </el-menu>
79
+ </el-scrollbar>
80
+ </div>
81
+
82
+ <div class="adminui-side-icon" @click="globalStore().toggleMenuIsCollapse()">
83
+ <div class="bottom-icon">
84
+ <el-icon v-if="menuIsCollapse" class="right-line" size="18" color="#ffffff"><el-icon-right /></el-icon>
85
+ <el-icon v-else class="back-line" size="18" color="#ffffff"><el-icon-back /></el-icon>
86
+ </div>
87
+ </div>
88
+ </div>
89
+
90
+ </div>
91
+ <Side-m v-if="ismobile"></Side-m>
92
+ <div class="aminui-body el-container">
93
+ <!-- <Topbar v-if="!ismobile"></Topbar>-->
94
+ <div v-show="isSideAndHeadShow"> <Tags v-if="!ismobile && layoutTags"></Tags></div>
95
+ <div class="adminui-main" id="adminui-main">
96
+ <router-view v-slot="{ Component }">
97
+ <keep-alive :include="keepAliveStore().keepLiveRoute">
98
+ <component :is="Component" :key="$route.path" v-if="keepAliveStore().routeShow"/>
99
+ </keep-alive>
100
+ </router-view>
101
+ <iframe-view></iframe-view>
102
+ </div>
103
+ </div>
104
+ </section>
105
+ </template>
106
+
107
+ <!-- 功能坞布局 -->
108
+ <template v-else-if="layout=='dock'">
109
+ <header class="adminui-header">
110
+ <div class="adminui-header-left">
111
+ <div class="logo-bar">
112
+ <img class="logo" src="img/logo.png">
113
+ <span>{{ $CONFIG.ArkosTitle }}</span>
114
+ </div>
115
+ </div>
116
+ <div class="adminui-header-right">
117
+ <div v-if="!ismobile" class="adminui-header-menu">
118
+ <!-- background-color="#222b45" -->
119
+ <el-menu mode="horizontal" :default-active="active" router background-color="#3182f3" text-color="var(--color-primary-lighter)" active-text-color="#fff">
120
+ <NavMenu :navMenus="menu"></NavMenu>
121
+ </el-menu>
122
+ </div>
123
+ <Side-m v-if="ismobile"></Side-m>
124
+ <userbar></userbar>
125
+ </div>
126
+ </header>
127
+ <section class="aminui-wrapper">
128
+ <div class="aminui-body el-container">
129
+ <div ><Tags v-if="!ismobile && layoutTags" ></Tags></div>
130
+ <div class="adminui-main" id="adminui-main">
131
+ <router-view v-slot="{ Component }">
132
+ <keep-alive :include="keepAliveStore().keepLiveRoute">
133
+ <component :is="Component" :key="$route.path" v-if="keepAliveStore().routeShow"/>
134
+ </keep-alive>
135
+ </router-view>
136
+ <iframe-view></iframe-view>
137
+ </div>
138
+ </div>
139
+ </section>
140
+ </template>
141
+
142
+ <!-- 默认布局 -->
143
+ <template v-else>
144
+ <section class="aminui-wrapper">
145
+ <div v-if="!ismobile && isSideAndHeadShow" class="aminui-side-split">
146
+ <div class="aminui-side-split-top">
147
+ <router-link :to="$CONFIG.DASHBOARD_URL">
148
+ <img class="logo" :title="$CONFIG.ArkosTitle" src="img/logo-r.png">
149
+ </router-link>
150
+ </div>
151
+ <div class="adminui-side-split-scroll">
152
+ <el-scrollbar>
153
+ <ul>
154
+ <li v-for="item in menu" :key="item" :class="pmenu.path==item.path?'active':''"
155
+ @click="showMenu(item)">
156
+ <el-icon><component :is="item.meta.icon || el-icon-menu" /></el-icon>
157
+ <p>{{ item.meta.title }}</p>
158
+ </li>
159
+ </ul>
160
+ </el-scrollbar>
161
+ </div>
162
+ </div >
163
+ <div v-if="!ismobile && nextMenu.length>0 || !pmenu.component"
164
+ :class="menuIsCollapse?'aminui-side isCollapse':'aminui-side'"
165
+ v-show="isSideAndHeadShow">
166
+ <div v-if="!menuIsCollapse" class="adminui-side-top">
167
+ <h2>{{ pmenu.meta?.title }}</h2>
168
+ </div>
169
+ <div class="adminui-side-scroll">
170
+ <div class="adminui-side-tree">
171
+ <el-scrollbar>
172
+ <el-menu :default-active="active" router :collapse="menuIsCollapse" :unique-opened="$CONFIG.MENU_UNIQUE_OPENED">
173
+ <NavMenu :navMenus="nextMenu"></NavMenu>
174
+ </el-menu>
175
+ </el-scrollbar>
176
+ </div>
177
+
178
+ <div class="adminui-side-icon" @click="globalStore().toggleMenuIsCollapse()">
179
+ <div class="bottom-icon" style="background:#222b45;">
180
+ <el-icon v-if="menuIsCollapse" class="right-line" size="18" color="#ffffff"><el-icon-right /></el-icon>
181
+ <el-icon v-else class="back-line" size="18" color="#ffffff"><el-icon-back /></el-icon>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ <Side-m v-if="ismobile"></Side-m>
187
+ <div class="aminui-body el-container">
188
+ <div v-show="isSideAndHeadShow"> <Topbar><userbar></userbar></Topbar></div>
189
+ <div v-show="isSideAndHeadShow"> <Tags v-if="!ismobile && layoutTags && isSideAndHeadShow"></Tags></div>
190
+ <div class="adminui-main" id="adminui-main">
191
+ <router-view v-slot="{ Component }">
192
+ <keep-alive :include="keepAliveStore().keepLiveRoute">
193
+ <component :is="Component" :key="$route.path" v-if="keepAliveStore().routeShow"/>
194
+ </keep-alive>
195
+ </router-view>
196
+ <iframe-view></iframe-view>
197
+ </div>
198
+ </div>
199
+ </section>
200
+ </template>
201
+
202
+ <div class="main-maximize-exit" @click="exitMaximize"><el-icon><el-icon-close /></el-icon></div>
203
+
204
+ <!-- <div class="layout-setting" @click="openSetting"><el-icon><el-icon-brush-filled /></el-icon></div>-->
205
+
206
+ <!-- <el-drawer title="布局实时演示" v-model="settingDialog" :size="400" append-to-body destroy-on-close>-->
207
+ <!-- <setting></setting>-->
208
+ <!-- </el-drawer>-->
209
+
210
+ <auto-exit></auto-exit>
211
+ </template>
212
+
213
+ <script setup>
214
+ import SideM from './components/sideM.vue';
215
+ import Topbar from './components/topbar.vue';
216
+ import Tags from './components/tags.vue';
217
+ import NavMenu from './components/NavMenu.vue';
218
+ import userbar from './components/userbar.vue';
219
+ // import setting from './components/setting.vue';
220
+ import iframeView from './components/iframeView.vue';
221
+ import autoExit from './other/autoExit.js';
222
+ import globalStore from '../store/modules/global';
223
+ import keepAliveStore from '../store/modules/keepAlive';
224
+ // import arkosStarter from '@arkxos/arkos-boot'
225
+ // const system = arkosStarter.system
226
+ import { computed, nextTick, onMounted, ref, watch, getCurrentInstance } from 'vue';
227
+ import { useRoute, useRouter } from 'vue-router';
228
+ const { proxy } = getCurrentInstance()
229
+
230
+ const route = useRoute()
231
+ const router = useRouter()
232
+ const global = globalStore()
233
+ const iconName = ref('Search')
234
+ const isSideAndHeadShow = ref(true)
235
+ const nextMenu = ref([])
236
+ const pmenu = ref({})
237
+ const active = ref('')
238
+
239
+ const ismobile = computed(() => {
240
+ return global.ismobile
241
+ })
242
+ const layout = computed(() => {
243
+ return global.layout
244
+ })
245
+ const layoutTags = computed(() => {
246
+ return global.layoutTags
247
+ })
248
+ const menuIsCollapse = computed(() => {
249
+ return global.menuIsCollapse
250
+ })
251
+ const menu = computed(() => {
252
+ return proxy.$pinia._s.get('system').menus
253
+ })
254
+
255
+ watch(() => route, (val) => {
256
+ if (val) {
257
+ if (isIntegrate()) {
258
+ isSideAndHeadShow.value = false
259
+ } else {
260
+ isSideAndHeadShow.value = true
261
+ } showThis()
262
+ }
263
+ })
264
+
265
+ watch(() => layout, (val) => {
266
+ if (val) {
267
+ document.body.setAttribute('data-layout', val)
268
+ }
269
+ }, { immediate: true })
270
+
271
+ onMounted(() => {
272
+ if (isIntegrate()) {
273
+ isSideAndHeadShow.value = false
274
+ } else {
275
+ isSideAndHeadShow.value = true
276
+ }
277
+ onLayoutResize();
278
+ window.addEventListener('resize', onLayoutResize)
279
+ showThis()
280
+ })
281
+ const onLayoutResize = () => {
282
+ globalStore().ismobile = document.body.clientWidth < 992
283
+ }
284
+ const isIntegrate = () => {
285
+ return route.query && route.query.integrate == 'true'
286
+ }
287
+
288
+ // 路由监听高亮
289
+ const showThis = () => {
290
+ console.log('showThis', route)
291
+ pmenu.value = route.meta.breadcrumb ? route.meta.breadcrumb[0] : {}
292
+ nextMenu.value = filterUrl(pmenu.value.children);
293
+ nextTick(() => {
294
+ active.value = route.meta.active || route.path
295
+ })
296
+ }
297
+ // 点击显示
298
+ const showMenu = (route) => {
299
+ pmenu.value = route
300
+ console.log(pmenu.value);
301
+ nextMenu.value = filterUrl(route.children);
302
+ if ((!route.children || route.children.length == 0) && route.component) {
303
+ router.push({ path: route.path })
304
+ }
305
+ }
306
+ // 转换外部链接的路由
307
+ const filterUrl = (map) => {
308
+ const newMap = []
309
+ map && map.forEach(item => {
310
+ item.meta = item.meta ? item.meta : {};
311
+ // 处理隐藏
312
+ if (item.meta.hidden || item.meta.type == 'button') {
313
+ return false
314
+ }
315
+ // 处理http
316
+ if (item.meta.type == 'iframe') {
317
+ item.path = `/i/${item.name}`;
318
+ }
319
+ // 递归循环
320
+ if (item.children && item.children.length > 0) {
321
+ item.children = filterUrl(item.children)
322
+ }
323
+ newMap.push(item)
324
+ })
325
+ return newMap;
326
+ }
327
+
328
+ // 退出最大化
329
+ const exitMaximize = () => {
330
+ document.getElementById('app').classList.remove('main-maximize')
331
+ }
332
+
333
+ // 路由初始化
334
+ watch(() => menu, (val) => {
335
+ if (val.value.length && !pmenu.value.path) {
336
+ nextTick(() => {
337
+ showMenu(val.value[0])
338
+ console.log('路由', val.value[0].children[0].path);
339
+ if (val.value[0].children.length) {
340
+ router.push(val.value[0].children[0].path)
341
+ active.value = route.meta.active || route.path
342
+ }
343
+ })
344
+ }
345
+ }, { deep: true })
346
+
347
+ </script>
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <div class="router-err">
3
+ <div class="router-err__icon">
4
+ <img src="img/404.png" />
5
+ </div>
6
+ <div class="router-err__content">
7
+ <h2>无权限或找不到页面</h2>
8
+ <p>当前页面无权限访问或者打开了一个不存在的链接,请检查当前账户权限和链接的可访问性。</p>
9
+ <el-button type="primary" plain round @click="gohome">返回首页</el-button>
10
+ <el-button type="primary" plain round @click="gologin">重新登录</el-button>
11
+ <el-button type="primary" round @click="goback">返回上一页</el-button>
12
+ </div>
13
+ </div>
14
+ </template>
15
+
16
+ <script>
17
+ export default {
18
+ methods: {
19
+ gohome() {
20
+ location.href = '#/'
21
+ },
22
+ goback() {
23
+ this.$router.go(-1);
24
+ },
25
+ gologin() {
26
+ this.$router.push('/login');
27
+ }
28
+ }
29
+ }
30
+ </script>
31
+
32
+ <style scoped>
33
+ .router-err {display: flex;width: 900px;margin: 50px auto;align-items: center;}
34
+ .router-err__icon {width: 400px;}
35
+ .router-err__icon img {width: 100%;}
36
+ .router-err__content {flex: 1;padding:40px;}
37
+ .router-err__content h2 {font-size: 26px;}
38
+ .router-err__content p {font-size: 14px;color: #999;margin: 15px 0 30px 0;line-height: 1.5;}
39
+
40
+ @media (max-width: 992px){
41
+ .router-err {display: block;width: 100%;margin-top: 10px;text-align: center;}
42
+ .router-err__icon {width: 280px;margin: 0 auto;}
43
+ }
44
+ </style>
@@ -0,0 +1,51 @@
1
+ export default {
2
+ render() {
3
+
4
+ },
5
+ data() {
6
+ return {
7
+ logoutCount: this.$TOOL.data.get('AUTO_EXIT')
8
+ }
9
+ },
10
+ mounted() {
11
+ if (this.logoutCount) {
12
+ this.setNewAutoExitTime()
13
+ document.onclick = () => {
14
+ this.setNewAutoExitTime()
15
+ }
16
+ document.onmousemove = () => {
17
+ this.setNewAutoExitTime()
18
+ }
19
+ document.onkeydown = () => {
20
+ this.setNewAutoExitTime()
21
+ }
22
+ document.onscroll = () => {
23
+ this.setNewAutoExitTime()
24
+ }
25
+ window.autoExitTimer = window.setInterval(this.autoExitfun, 1000)
26
+ }
27
+ },
28
+ unmounted() {
29
+ if (this.logoutCount) {
30
+ clearInterval(window.autoExitTimer)
31
+ window.autoExitTimer = null
32
+ }
33
+ },
34
+ methods: {
35
+ setNewAutoExitTime() {
36
+ window.autoExitTime = new Date().getTime()
37
+ },
38
+ autoExitfun() {
39
+ if (new Date().getTime() - window.autoExitTime > this.logoutCount * 60 * 1000) {
40
+ clearInterval(window.autoExitTimer)
41
+ window.autoExitTimer = null
42
+ this.$router.replace({ path: '/login' })
43
+ this.$alert('用户长时间无操作,为保证账户安全,系统已自动登出。', '提示', {
44
+ type: 'warning',
45
+ center: true,
46
+ roundButton: true
47
+ })
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,3 @@
1
+ <template>
2
+ <router-view></router-view>
3
+ </template>