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,319 @@
1
+ <template>
2
+ <div class="settings-container">
3
+ <el-card shadow="never">
4
+ <el-tabs v-model="activeTab">
5
+ <el-tab-pane label="基本设置" name="basic">
6
+ <el-form
7
+ ref="basicFormRef"
8
+ :model="basicForm"
9
+ :rules="basicRules"
10
+ label-width="120px"
11
+ style="max-width: 600px"
12
+ >
13
+ <el-form-item label="网站名称" prop="siteName">
14
+ <el-input v-model="basicForm.siteName" />
15
+ </el-form-item>
16
+
17
+ <el-form-item label="网站描述" prop="description">
18
+ <el-input
19
+ v-model="basicForm.description"
20
+ type="textarea"
21
+ :rows="3"
22
+ />
23
+ </el-form-item>
24
+
25
+ <el-form-item label="网站Logo">
26
+ <el-upload
27
+ class="avatar-uploader"
28
+ action="https://jsonplaceholder.typicode.com/posts/"
29
+ :show-file-list="false"
30
+ :on-success="handleAvatarSuccess"
31
+ :before-upload="beforeAvatarUpload"
32
+ >
33
+ <img
34
+ v-if="basicForm.logo"
35
+ :src="basicForm.logo"
36
+ class="avatar"
37
+ alt="Logo"
38
+ />
39
+ <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
40
+ </el-upload>
41
+ </el-form-item>
42
+
43
+ <el-form-item label="启用维护模式">
44
+ <el-switch v-model="basicForm.maintenanceMode" />
45
+ </el-form-item>
46
+
47
+ <el-form-item>
48
+ <el-button type="primary" @click="saveBasicSettings">保存设置</el-button>
49
+ <el-button @click="resetBasicForm">重置</el-button>
50
+ </el-form-item>
51
+ </el-form>
52
+ </el-tab-pane>
53
+
54
+ <el-tab-pane label="安全设置" name="security">
55
+ <el-form
56
+ ref="securityFormRef"
57
+ :model="securityForm"
58
+ :rules="securityRules"
59
+ label-width="150px"
60
+ style="max-width: 600px"
61
+ >
62
+ <el-form-item label="密码最小长度" prop="minPasswordLength">
63
+ <el-input-number
64
+ v-model="securityForm.minPasswordLength"
65
+ :min="6"
66
+ :max="20"
67
+ />
68
+ </el-form-item>
69
+
70
+ <el-form-item label="启用双重认证">
71
+ <el-switch v-model="securityForm.twoFactorAuth" />
72
+ </el-form-item>
73
+
74
+ <el-form-item label="会话超时时间(分钟)" prop="sessionTimeout">
75
+ <el-input-number
76
+ v-model="securityForm.sessionTimeout"
77
+ :min="1"
78
+ :max="1440"
79
+ />
80
+ </el-form-item>
81
+
82
+ <el-form-item label="登录失败尝试次数" prop="maxLoginAttempts">
83
+ <el-input-number
84
+ v-model="securityForm.maxLoginAttempts"
85
+ :min="1"
86
+ :max="10"
87
+ />
88
+ </el-form-item>
89
+
90
+ <el-form-item>
91
+ <el-button type="primary" @click="saveSecuritySettings">保存设置</el-button>
92
+ <el-button @click="resetSecurityForm">重置</el-button>
93
+ </el-form-item>
94
+ </el-form>
95
+ </el-tab-pane>
96
+
97
+ <el-tab-pane label="邮件设置" name="email">
98
+ <el-form
99
+ ref="emailFormRef"
100
+ :model="emailForm"
101
+ :rules="emailRules"
102
+ label-width="120px"
103
+ style="max-width: 600px"
104
+ >
105
+ <el-form-item label="SMTP服务器" prop="smtpServer">
106
+ <el-input v-model="emailForm.smtpServer" />
107
+ </el-form-item>
108
+
109
+ <el-form-item label="SMTP端口" prop="smtpPort">
110
+ <el-input-number
111
+ v-model="emailForm.smtpPort"
112
+ :min="1"
113
+ :max="65535"
114
+ />
115
+ </el-form-item>
116
+
117
+ <el-form-item label="用户名" prop="username">
118
+ <el-input v-model="emailForm.username" />
119
+ </el-form-item>
120
+
121
+ <el-form-item label="密码" prop="password">
122
+ <el-input
123
+ v-model="emailForm.password"
124
+ type="password"
125
+ show-password
126
+ />
127
+ </el-form-item>
128
+
129
+ <el-form-item label="发件人邮箱" prop="senderEmail">
130
+ <el-input v-model="emailForm.senderEmail" />
131
+ </el-form-item>
132
+
133
+ <el-form-item>
134
+ <el-button type="primary" @click="saveEmailSettings">保存设置</el-button>
135
+ <el-button @click="resetEmailForm">重置</el-button>
136
+ <el-button @click="testEmailConnection">测试连接</el-button>
137
+ </el-form-item>
138
+ </el-form>
139
+ </el-tab-pane>
140
+ </el-tabs>
141
+ </el-card>
142
+ </div>
143
+ </template>
144
+
145
+ <script>
146
+ import { Plus } from "@element-plus/icons-vue";
147
+
148
+ export default {
149
+ name: "Settings",
150
+ components: {
151
+ Plus
152
+ },
153
+ data() {
154
+ return {
155
+ activeTab: "basic",
156
+ basicForm: {
157
+ siteName: "Vue Admin Better",
158
+ description: "一个基于Vue 3和Element Plus的后台管理系统",
159
+ logo: "",
160
+ maintenanceMode: false
161
+ },
162
+ securityForm: {
163
+ minPasswordLength: 8,
164
+ twoFactorAuth: false,
165
+ sessionTimeout: 30,
166
+ maxLoginAttempts: 5
167
+ },
168
+ emailForm: {
169
+ smtpServer: "smtp.example.com",
170
+ smtpPort: 587,
171
+ username: "user@example.com",
172
+ password: "",
173
+ senderEmail: "noreply@example.com"
174
+ },
175
+ basicRules: {
176
+ siteName: [
177
+ { required: true, message: "请输入网站名称", trigger: "blur" }
178
+ ],
179
+ description: [
180
+ { required: true, message: "请输入网站描述", trigger: "blur" }
181
+ ]
182
+ },
183
+ securityRules: {
184
+ minPasswordLength: [
185
+ { required: true, message: "请输入密码最小长度", trigger: "blur" }
186
+ ],
187
+ sessionTimeout: [
188
+ { required: true, message: "请输入会话超时时间", trigger: "blur" }
189
+ ],
190
+ maxLoginAttempts: [
191
+ { required: true, message: "请输入登录失败尝试次数", trigger: "blur" }
192
+ ]
193
+ },
194
+ emailRules: {
195
+ smtpServer: [
196
+ { required: true, message: "请输入SMTP服务器", trigger: "blur" }
197
+ ],
198
+ smtpPort: [
199
+ { required: true, message: "请输入SMTP端口", trigger: "blur" }
200
+ ],
201
+ username: [
202
+ { required: true, message: "请输入用户名", trigger: "blur" }
203
+ ],
204
+ password: [
205
+ { required: true, message: "请输入密码", trigger: "blur" }
206
+ ],
207
+ senderEmail: [
208
+ { required: true, message: "请输入发件人邮箱", trigger: "blur" },
209
+ { type: "email", message: "请输入正确的邮箱地址", trigger: "blur" }
210
+ ]
211
+ }
212
+ };
213
+ },
214
+ methods: {
215
+ handleAvatarSuccess(response, file) {
216
+ this.basicForm.logo = URL.createObjectURL(file.raw);
217
+ this.$message.success("Logo上传成功");
218
+ },
219
+ beforeAvatarUpload(file) {
220
+ const isJPG = file.type === "image/jpeg" || file.type === "image/png";
221
+ const isLt2M = file.size / 1024 / 1024 < 2;
222
+
223
+ if (!isJPG) {
224
+ this.$message.error("Logo图片只能是 JPG 或 PNG 格式!");
225
+ }
226
+ if (!isLt2M) {
227
+ this.$message.error("Logo图片大小不能超过 2MB!");
228
+ }
229
+ return isJPG && isLt2M;
230
+ },
231
+ saveBasicSettings() {
232
+ this.$refs.basicFormRef.validate((valid) => {
233
+ if (valid) {
234
+ this.$message.success("基本设置保存成功");
235
+ } else {
236
+ this.$message.error("请填写必填项");
237
+ }
238
+ });
239
+ },
240
+ resetBasicForm() {
241
+ this.$refs.basicFormRef.resetFields();
242
+ this.$message.info("表单已重置");
243
+ },
244
+ saveSecuritySettings() {
245
+ this.$refs.securityFormRef.validate((valid) => {
246
+ if (valid) {
247
+ this.$message.success("安全设置保存成功");
248
+ } else {
249
+ this.$message.error("请填写必填项");
250
+ }
251
+ });
252
+ },
253
+ resetSecurityForm() {
254
+ this.$refs.securityFormRef.resetFields();
255
+ this.$message.info("表单已重置");
256
+ },
257
+ saveEmailSettings() {
258
+ this.$refs.emailFormRef.validate((valid) => {
259
+ if (valid) {
260
+ this.$message.success("邮件设置保存成功");
261
+ } else {
262
+ this.$message.error("请填写必填项");
263
+ }
264
+ });
265
+ },
266
+ resetEmailForm() {
267
+ this.$refs.emailFormRef.resetFields();
268
+ this.$message.info("表单已重置");
269
+ },
270
+ testEmailConnection() {
271
+ this.$refs.emailFormRef.validateField("smtpServer", (valid) => {
272
+ if (!valid) {
273
+ this.$message.info("正在测试邮件连接...");
274
+ setTimeout(() => {
275
+ this.$message.success("邮件连接测试成功");
276
+ }, 1000);
277
+ }
278
+ });
279
+ }
280
+ }
281
+ };
282
+ </script>
283
+
284
+ <style lang="scss" scoped>
285
+ .settings-container {
286
+ padding: 20px;
287
+
288
+ :deep(.el-tabs__content) {
289
+ padding: 20px 0;
290
+ }
291
+
292
+ .avatar-uploader .avatar {
293
+ width: 120px;
294
+ height: 120px;
295
+ display: block;
296
+ }
297
+ }
298
+
299
+ .avatar-uploader .el-upload {
300
+ border: 1px dashed #d9d9d9;
301
+ border-radius: 6px;
302
+ cursor: pointer;
303
+ position: relative;
304
+ overflow: hidden;
305
+ transition: var(--el-transition-duration-fast);
306
+ }
307
+
308
+ .avatar-uploader .el-upload:hover {
309
+ border-color: var(--el-color-primary);
310
+ }
311
+
312
+ .el-icon.avatar-uploader-icon {
313
+ font-size: 28px;
314
+ color: #8c939d;
315
+ width: 120px;
316
+ height: 120px;
317
+ text-align: center;
318
+ }
319
+ </style>