vue3-admin-gpt 1.0.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 (118) hide show
  1. package/.env.development +14 -0
  2. package/.env.production +14 -0
  3. package/LICENSE +21 -0
  4. package/README.en.md +106 -0
  5. package/README.md +104 -0
  6. package/build-zip.cjs +53 -0
  7. package/cli.js +110 -0
  8. package/jsconfig.json +9 -0
  9. package/package.json +92 -0
  10. package/public/index.html +20 -0
  11. package/public/robots.txt +2 -0
  12. package/rspack.config.js +282 -0
  13. package/rspack.js +162 -0
  14. package/src/App.vue +9 -0
  15. package/src/api/icon.js +9 -0
  16. package/src/api/router.js +9 -0
  17. package/src/api/table.js +25 -0
  18. package/src/api/tree.js +9 -0
  19. package/src/api/user.js +34 -0
  20. package/src/assets/error_images/401.png +0 -0
  21. package/src/assets/error_images/404.png +0 -0
  22. package/src/assets/error_images/cloud.png +0 -0
  23. package/src/assets/login_images/background.jpg +0 -0
  24. package/src/assets/logo.png +0 -0
  25. package/src/assets/qr_logo/lqr_logo.png +0 -0
  26. package/src/assets/vuejs-fill.svg +4 -0
  27. package/src/components/VabPageHeader/index.vue +133 -0
  28. package/src/config/index.js +7 -0
  29. package/src/config/net.config.js +20 -0
  30. package/src/config/permission.js +136 -0
  31. package/src/config/setting.config.js +62 -0
  32. package/src/config/settings.js +6 -0
  33. package/src/config/theme.config.js +14 -0
  34. package/src/layouts/EmptyLayout.vue +3 -0
  35. package/src/layouts/components/VabAppMain/index.vue +109 -0
  36. package/src/layouts/components/VabAvatar/index.vue +255 -0
  37. package/src/layouts/components/VabBreadcrumb/index.vue +61 -0
  38. package/src/layouts/components/VabFullScreen/index.vue +61 -0
  39. package/src/layouts/components/VabLogo/index.vue +94 -0
  40. package/src/layouts/components/VabNav/index.vue +176 -0
  41. package/src/layouts/components/VabSide/components/VabMenuItem.vue +80 -0
  42. package/src/layouts/components/VabSide/components/VabSideItem.vue +100 -0
  43. package/src/layouts/components/VabSide/components/VabSubmenu.vue +56 -0
  44. package/src/layouts/components/VabSide/index.vue +123 -0
  45. package/src/layouts/components/VabTabs/index.vue +500 -0
  46. package/src/layouts/components/VabTheme/index.vue +603 -0
  47. package/src/layouts/components/VabTop/index.vue +286 -0
  48. package/src/layouts/export.js +29 -0
  49. package/src/layouts/index.vue +339 -0
  50. package/src/main.js +40 -0
  51. package/src/plugins/echarts.js +4 -0
  52. package/src/plugins/index.js +44 -0
  53. package/src/plugins/support.js +16 -0
  54. package/src/router/index.js +400 -0
  55. package/src/store/index.js +26 -0
  56. package/src/store/modules/errorLog.js +27 -0
  57. package/src/store/modules/routes.js +60 -0
  58. package/src/store/modules/settings.js +73 -0
  59. package/src/store/modules/table.js +22 -0
  60. package/src/store/modules/tabsBar.js +109 -0
  61. package/src/store/modules/user.js +131 -0
  62. package/src/styles/element-variables.scss +13 -0
  63. package/src/styles/loading.scss +345 -0
  64. package/src/styles/nav-icons.scss +52 -0
  65. package/src/styles/normalize.scss +353 -0
  66. package/src/styles/spinner/dots.css +68 -0
  67. package/src/styles/spinner/gauge.css +104 -0
  68. package/src/styles/spinner/inner-circles.css +51 -0
  69. package/src/styles/spinner/plus.css +341 -0
  70. package/src/styles/themes/default.scss +1 -0
  71. package/src/styles/transition.scss +18 -0
  72. package/src/styles/vab.scss +476 -0
  73. package/src/styles/variables.scss +69 -0
  74. package/src/utils/accessToken.js +56 -0
  75. package/src/utils/eventBus.js +8 -0
  76. package/src/utils/handleRoutes.js +100 -0
  77. package/src/utils/index.js +231 -0
  78. package/src/utils/message.js +67 -0
  79. package/src/utils/pageTitle.js +11 -0
  80. package/src/utils/password.js +43 -0
  81. package/src/utils/permission.js +19 -0
  82. package/src/utils/request.js +187 -0
  83. package/src/utils/static.js +81 -0
  84. package/src/utils/vab.js +218 -0
  85. package/src/utils/validate.js +48 -0
  86. package/src/views/401.vue +302 -0
  87. package/src/views/404.vue +302 -0
  88. package/src/views/demo/index.vue +591 -0
  89. package/src/views/index/index.vue +1489 -0
  90. package/src/views/login/index.vue +456 -0
  91. package/src/views/register/index.vue +524 -0
  92. package/src/views/vab/calendar.vue +488 -0
  93. package/src/views/vab/campaign.vue +1006 -0
  94. package/src/views/vab/chart.vue +189 -0
  95. package/src/views/vab/customer.vue +666 -0
  96. package/src/views/vab/editor.vue +84 -0
  97. package/src/views/vab/form.vue +151 -0
  98. package/src/views/vab/help.vue +390 -0
  99. package/src/views/vab/icon.vue +113 -0
  100. package/src/views/vab/knowledge.vue +820 -0
  101. package/src/views/vab/nested/menu1/menu2/menu3.vue +29 -0
  102. package/src/views/vab/nested/menu1/menu2.vue +33 -0
  103. package/src/views/vab/nested/menu1.vue +33 -0
  104. package/src/views/vab/nested.vue +97 -0
  105. package/src/views/vab/notification.vue +416 -0
  106. package/src/views/vab/order.vue +507 -0
  107. package/src/views/vab/permissions.vue +214 -0
  108. package/src/views/vab/product.vue +724 -0
  109. package/src/views/vab/project.vue +559 -0
  110. package/src/views/vab/settings.vue +319 -0
  111. package/src/views/vab/statistics.vue +431 -0
  112. package/src/views/vab/table.vue +110 -0
  113. package/src/views/vab/task.vue +613 -0
  114. package/src/views/vab/team.vue +662 -0
  115. package/src/views/vab/tree.vue +44 -0
  116. package/src/views/vab/upload.vue +180 -0
  117. package/src/views/vab/vue3Demo/index.vue +103 -0
  118. package/src/views/vab/workflow.vue +863 -0
@@ -0,0 +1,218 @@
1
+ import { loadingText, messageDuration, title } from "@/config";
2
+ import * as lodash from "lodash";
3
+ import {
4
+ ElLoading,
5
+ ElMessage,
6
+ ElMessageBox,
7
+ ElNotification,
8
+ } from "element-plus";
9
+ import { getAccessToken } from "@/utils/accessToken";
10
+
11
+ /**
12
+ * 将FontAwesome图标名转换为Element Plus图标组件名
13
+ * @param {Array|String} icon FontAwesome图标配置,例如['fas', 'user']或直接的图标名称
14
+ * @returns {String} Element Plus图标组件名
15
+ */
16
+ export const faToElIcon = (icon) => {
17
+ // 如果是数组,获取第二个元素(图标名)
18
+ // 如果不是数组,直接使用icon作为图标名
19
+ const iconName = Array.isArray(icon) ? icon[1] : icon;
20
+
21
+ // 图标名映射表(可根据需要扩展)
22
+ const iconMap = {
23
+ // 常用图标
24
+ user: "User",
25
+ "user-alt": "User",
26
+ "mobile-alt": "Cellphone",
27
+ "envelope-open": "Message",
28
+ unlock: "Unlock",
29
+ download: "Download",
30
+ star: "Star",
31
+ users: "User",
32
+ coffee: "Coffee",
33
+ "code-branch": "Share",
34
+ gem: "Trophy",
35
+ palette: "Brush",
36
+ "info-circle": "InfoFilled",
37
+ crown: "Crown",
38
+ edit: "Edit",
39
+ "exchange-alt": "Sort",
40
+ "sync-alt": "Refresh",
41
+ "mouse-pointer": "Pointer",
42
+ route: "Connection",
43
+ check: "Check",
44
+ "arrow-right": "ArrowRight",
45
+ "shopping-cart": "ShoppingCart",
46
+ "paint-brush": "Brush",
47
+ "check-circle": "SuccessFilled",
48
+ bug: "Warning",
49
+ search: "Search",
50
+ "expand-arrows-alt": "FullScreen",
51
+ "compress-arrows-alt": "ScaleToOriginal",
52
+ redo: "Refresh",
53
+
54
+ // 基础图标
55
+ home: "HomeFilled",
56
+ marker: "Location",
57
+ "box-open": "Box",
58
+ "horse-head": "Promotion",
59
+
60
+ // 常用图标
61
+ "chart-line": "TrendCharts",
62
+ "chart-pie": "PieChart",
63
+ "chart-bar": "Histogram",
64
+ table: "Grid",
65
+ form: "Document",
66
+ "list-ul": "List",
67
+ "user-cog": "Setting",
68
+ cog: "Setting",
69
+ cogs: "Tools",
70
+ tools: "Tools",
71
+ wrench: "Tools",
72
+ code: "Terminal",
73
+ "file-code": "Document",
74
+ "file-alt": "Document",
75
+ "folder-open": "Folder",
76
+ folder: "FolderOpened",
77
+ "folder-plus": "FolderAdd",
78
+ "calendar-alt": "Calendar",
79
+ image: "Picture",
80
+ images: "PictureFilled",
81
+ video: "VideoPlay",
82
+ music: "Headset",
83
+ store: "Shop",
84
+ "credit-card": "CreditCard",
85
+ "money-bill": "Money",
86
+ "dollar-sign": "Money",
87
+ comments: "ChatDotRound",
88
+ comment: "ChatLineRound",
89
+ envelope: "Message",
90
+ bell: "Bell",
91
+ database: "Collection",
92
+ server: "Monitor",
93
+ desktop: "Monitor",
94
+ mobile: "Cellphone",
95
+ tablet: "Cellphone",
96
+ lock: "Lock",
97
+ shield: "Shield",
98
+ "exclamation-triangle": "Warning",
99
+ "exclamation-circle": "Warning",
100
+ "question-circle": "QuestionFilled",
101
+ "times-circle": "CircleCloseFilled",
102
+ plus: "Plus",
103
+ minus: "Minus",
104
+ times: "Close",
105
+ filter: "Filter",
106
+ bars: "Menu",
107
+ th: "Grid",
108
+ "th-large": "Grid",
109
+ "ellipsis-v": "More",
110
+ "ellipsis-h": "More",
111
+ "caret-down": "ArrowDown",
112
+ "caret-up": "ArrowUp",
113
+ "caret-left": "ArrowLeft",
114
+ "caret-right": "ArrowRight",
115
+ "arrow-down": "ArrowDown",
116
+ "arrow-up": "ArrowUp",
117
+ "arrow-left": "ArrowLeft",
118
+ undo: "RefreshLeft",
119
+ sync: "Refresh",
120
+ refresh: "Refresh",
121
+ "sign-out-alt": "SwitchButton",
122
+
123
+ // 品牌图标
124
+ github: "Platform",
125
+ qq: "ChatDotRound",
126
+ vuejs: "ElementPlus",
127
+
128
+ // 默认情况
129
+ default: "More",
130
+ };
131
+
132
+ // 返回映射的Element Plus图标名,如果没有映射则返回默认图标
133
+ return iconMap[iconName] || iconMap["default"];
134
+ };
135
+
136
+ const install = (app) => {
137
+ // 全局方法
138
+ const vab = {
139
+ /* 全局accessToken */
140
+ get accessToken() {
141
+ return getAccessToken();
142
+ },
143
+ /* 全局标题 */
144
+ get title() {
145
+ return title;
146
+ },
147
+ /* 全局加载层 */
148
+ loading: (options = {}) => {
149
+ const defaultOptions = {
150
+ lock: true,
151
+ text: loadingText,
152
+ background: "rgba(0, 0, 0, 0.7)",
153
+ };
154
+ return ElLoading.service({ ...defaultOptions, ...options });
155
+ },
156
+ /* 全局多彩加载层 */
157
+ colorfulLoading: (options = {}) => {
158
+ let defaultOptions = {
159
+ lock: true,
160
+ text: loadingText,
161
+ spinner: "dots",
162
+ background: "rgba(0, 0, 0, 0.7)",
163
+ };
164
+ if (options.spinner) {
165
+ defaultOptions.spinner = options.spinner;
166
+ }
167
+ return ElLoading.service({ ...defaultOptions, ...options });
168
+ },
169
+ /* 全局Message */
170
+ message: (message, type = "info", options = {}) => {
171
+ if (message) {
172
+ const defaultOptions = {
173
+ message,
174
+ type,
175
+ duration: messageDuration,
176
+ };
177
+ return ElMessage({ ...defaultOptions, ...options });
178
+ }
179
+ },
180
+ /* 全局Alert */
181
+ alert: (content, options = {}) => {
182
+ const defaultOptions = {
183
+ closeOnClickModal: false,
184
+ closeOnPressEscape: false,
185
+ showClose: true,
186
+ ...options,
187
+ };
188
+ return ElMessageBox.alert(content, "温馨提示", defaultOptions);
189
+ },
190
+ /* 全局Confirm */
191
+ confirm: (content, options = {}) => {
192
+ const defaultOptions = {
193
+ closeOnClickModal: false,
194
+ closeOnPressEscape: false,
195
+ ...options,
196
+ };
197
+ return ElMessageBox.confirm(content, "温馨提示", defaultOptions);
198
+ },
199
+ /* 全局Notification */
200
+ notification: (message, options = {}) => {
201
+ if (message) {
202
+ ElNotification({
203
+ title: "温馨通知",
204
+ message,
205
+ ...options,
206
+ });
207
+ }
208
+ },
209
+ /* Lodash */
210
+ lodash,
211
+ };
212
+
213
+ app.config.globalProperties.$vab = vab;
214
+ };
215
+
216
+ export default {
217
+ install,
218
+ };
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @description 判读是否为外链
3
+ * @param path
4
+ * @returns {boolean}
5
+ */
6
+ export function isExternal(path) {
7
+ return /^(https?:|mailto:|tel:)/.test(path)
8
+ }
9
+
10
+ /**
11
+ * @description 校验密码是否小于6位
12
+ * @param str
13
+ * @returns {boolean}
14
+ */
15
+ export function isPassword(str) {
16
+ return str.length >= 6
17
+ }
18
+
19
+ /**
20
+ * @description 判断是否是字符串
21
+ * @param str
22
+ * @returns {boolean}
23
+ */
24
+ export function isString(str) {
25
+ return typeof str === 'string' || str instanceof String
26
+ }
27
+
28
+ /**
29
+ * @description 判断是否是数组
30
+ * @param arg
31
+ * @returns {arg is any[]|boolean}
32
+ */
33
+ export function isArray(arg) {
34
+ if (typeof Array.isArray === 'undefined') {
35
+ return Object.prototype.toString.call(arg) === '[object Array]'
36
+ }
37
+ return Array.isArray(arg)
38
+ }
39
+
40
+ /**
41
+ * @description 判断是否是手机号
42
+ * @param str
43
+ * @returns {boolean}
44
+ */
45
+ export function isPhone(str) {
46
+ const reg = /^1\d{10}$/
47
+ return reg.test(str)
48
+ }
@@ -0,0 +1,302 @@
1
+ <template>
2
+ <div class="error-container">
3
+ <div class="error-content">
4
+ <el-row :gutter="20">
5
+ <el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
6
+ <div class="pic-error">
7
+ <img
8
+ alt="401"
9
+ class="pic-error-parent"
10
+ src="@/assets/error_images/401.png"
11
+ />
12
+ <img
13
+ alt="401"
14
+ class="pic-error-child left"
15
+ src="@/assets/error_images/cloud.png"
16
+ />
17
+ <img
18
+ alt="401"
19
+ class="pic-error-child mid"
20
+ src="@/assets/error_images/cloud.png"
21
+ />
22
+ <img
23
+ alt="401"
24
+ class="pic-error-child right"
25
+ src="@/assets/error_images/cloud.png"
26
+ />
27
+ </div>
28
+ </el-col>
29
+
30
+ <el-col :lg="12" :md="12" :sm="24" :xl="12" :xs="24">
31
+ <div class="bullshit">
32
+ <div class="bullshit-oops">
33
+ {{ oops }}
34
+ </div>
35
+ <div class="bullshit-headline">
36
+ {{ headline }}
37
+ </div>
38
+ <div class="bullshit-info">
39
+ {{ info }}
40
+ </div>
41
+ <a class="bullshit-return-home" href="#/index"
42
+ >{{ jumpTime }}s&nbsp;{{ btn }}</a
43
+ >
44
+ </div>
45
+ </el-col>
46
+ </el-row>
47
+ </div>
48
+ </div>
49
+ </template>
50
+
51
+ <script>
52
+ export default {
53
+ name: "Page401",
54
+ data() {
55
+ return {
56
+ jumpTime: 5,
57
+ oops: "抱歉!",
58
+ headline: "您没有操作权限...",
59
+ info: "当前帐号没有操作权限,请联系管理员。",
60
+ btn: "返回",
61
+ timer: 0,
62
+ };
63
+ },
64
+ mounted() {
65
+ this.timeChange();
66
+ },
67
+ beforeUnmount() {
68
+ clearInterval(this.timer);
69
+ },
70
+ methods: {
71
+ timeChange() {
72
+ this.timer = setInterval(() => {
73
+ if (this.jumpTime) {
74
+ this.jumpTime--;
75
+ } else {
76
+ this.$router.push({ path: "/" });
77
+ this.$store.dispatch("tabsBar/delOthersRoutes", {
78
+ path: "/",
79
+ });
80
+ clearInterval(this.timer);
81
+ }
82
+ }, 1000);
83
+ },
84
+ },
85
+ };
86
+ </script>
87
+
88
+ <style lang="scss" scoped>
89
+ .error-container {
90
+ position: absolute;
91
+ top: 40%;
92
+ left: 50%;
93
+ transform: translate(-50%, -50%);
94
+
95
+ .error-content {
96
+ .pic-error {
97
+ position: relative;
98
+ float: left;
99
+ width: 120%;
100
+ overflow: hidden;
101
+
102
+ &-parent {
103
+ width: 100%;
104
+ }
105
+
106
+ &-child {
107
+ position: absolute;
108
+
109
+ &.left {
110
+ top: 17px;
111
+ left: 220px;
112
+ width: 80px;
113
+ opacity: 0;
114
+ animation-name: cloudLeft;
115
+ animation-duration: 2s;
116
+ animation-timing-function: linear;
117
+ animation-delay: 1s;
118
+ animation-fill-mode: forwards;
119
+ }
120
+
121
+ &.mid {
122
+ top: 10px;
123
+ left: 420px;
124
+ width: 46px;
125
+ opacity: 0;
126
+ animation-name: cloudMid;
127
+ animation-duration: 2s;
128
+ animation-timing-function: linear;
129
+ animation-delay: 1.2s;
130
+ animation-fill-mode: forwards;
131
+ }
132
+
133
+ &.right {
134
+ top: 100px;
135
+ left: 500px;
136
+ width: 62px;
137
+ opacity: 0;
138
+ animation-name: cloudRight;
139
+ animation-duration: 2s;
140
+ animation-timing-function: linear;
141
+ animation-delay: 1s;
142
+ animation-fill-mode: forwards;
143
+ }
144
+
145
+ @keyframes cloudLeft {
146
+ 0% {
147
+ top: 17px;
148
+ left: 220px;
149
+ opacity: 0;
150
+ }
151
+
152
+ 20% {
153
+ top: 33px;
154
+ left: 188px;
155
+ opacity: 1;
156
+ }
157
+
158
+ 80% {
159
+ top: 81px;
160
+ left: 92px;
161
+ opacity: 1;
162
+ }
163
+
164
+ 100% {
165
+ top: 97px;
166
+ left: 60px;
167
+ opacity: 0;
168
+ }
169
+ }
170
+
171
+ @keyframes cloudMid {
172
+ 0% {
173
+ top: 10px;
174
+ left: 420px;
175
+ opacity: 0;
176
+ }
177
+
178
+ 20% {
179
+ top: 40px;
180
+ left: 360px;
181
+ opacity: 1;
182
+ }
183
+
184
+ 70% {
185
+ top: 130px;
186
+ left: 180px;
187
+ opacity: 1;
188
+ }
189
+
190
+ 100% {
191
+ top: 160px;
192
+ left: 120px;
193
+ opacity: 0;
194
+ }
195
+ }
196
+
197
+ @keyframes cloudRight {
198
+ 0% {
199
+ top: 100px;
200
+ left: 500px;
201
+ opacity: 0;
202
+ }
203
+
204
+ 20% {
205
+ top: 120px;
206
+ left: 460px;
207
+ opacity: 1;
208
+ }
209
+
210
+ 80% {
211
+ top: 180px;
212
+ left: 340px;
213
+ opacity: 1;
214
+ }
215
+
216
+ 100% {
217
+ top: 200px;
218
+ left: 300px;
219
+ opacity: 0;
220
+ }
221
+ }
222
+ }
223
+ }
224
+
225
+ .bullshit {
226
+ position: relative;
227
+ float: left;
228
+ width: 300px;
229
+ padding: 30px 0;
230
+ overflow: hidden;
231
+
232
+ &-oops {
233
+ margin-bottom: 20px;
234
+ font-size: 32px;
235
+ font-weight: bold;
236
+ line-height: 40px;
237
+ color: $base-color-blue;
238
+ opacity: 0;
239
+ animation-name: slideUp;
240
+ animation-duration: 0.5s;
241
+ animation-fill-mode: forwards;
242
+ }
243
+
244
+ &-headline {
245
+ margin-bottom: 10px;
246
+ font-size: 20px;
247
+ font-weight: bold;
248
+ line-height: 24px;
249
+ color: #222;
250
+ opacity: 0;
251
+ animation-name: slideUp;
252
+ animation-duration: 0.5s;
253
+ animation-delay: 0.1s;
254
+ animation-fill-mode: forwards;
255
+ }
256
+
257
+ &-info {
258
+ margin-bottom: 30px;
259
+ font-size: 13px;
260
+ line-height: 21px;
261
+ color: $base-color-gray;
262
+ opacity: 0;
263
+ animation-name: slideUp;
264
+ animation-duration: 0.5s;
265
+ animation-delay: 0.2s;
266
+ animation-fill-mode: forwards;
267
+ }
268
+
269
+ &-return-home {
270
+ display: block;
271
+ float: left;
272
+ width: 110px;
273
+ height: 36px;
274
+ font-size: 14px;
275
+ line-height: 36px;
276
+ color: #fff;
277
+ text-align: center;
278
+ cursor: pointer;
279
+ background: $base-color-blue;
280
+ border-radius: 100px;
281
+ opacity: 0;
282
+ animation-name: slideUp;
283
+ animation-duration: 0.5s;
284
+ animation-delay: 0.3s;
285
+ animation-fill-mode: forwards;
286
+ }
287
+
288
+ @keyframes slideUp {
289
+ 0% {
290
+ opacity: 0;
291
+ transform: translateY(60px);
292
+ }
293
+
294
+ 100% {
295
+ opacity: 1;
296
+ transform: translateY(0);
297
+ }
298
+ }
299
+ }
300
+ }
301
+ }
302
+ </style>