create-young-proj 1.4.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/package.json +1 -1
  3. package/template-nuxt-admin/README.md +1 -1
  4. package/template-nuxt-admin/nuxt.config.ts +4 -5
  5. package/template-nuxt-admin/package.json +0 -1
  6. package/template-nuxt-admin/server/plugins/env.ts +8 -0
  7. package/template-nuxt-admin/yarn.lock +0 -5
  8. package/template-nuxt-mobile/.nvmrc +1 -0
  9. package/{template-vue-mobile → template-nuxt-mobile}/.vscode/extensions.json +5 -3
  10. package/template-nuxt-mobile/.vscode/settings.json +39 -0
  11. package/{template-vue-mobile → template-nuxt-mobile}/Dockerfile +12 -13
  12. package/template-nuxt-mobile/README.md +90 -0
  13. package/template-nuxt-mobile/_gitignore +26 -0
  14. package/template-nuxt-mobile/_npmrc +2 -0
  15. package/template-nuxt-mobile/_nvmrc +1 -0
  16. package/template-nuxt-mobile/app.vue +79 -0
  17. package/template-nuxt-mobile/boot.mjs +17 -0
  18. package/template-nuxt-mobile/components/young/CodeInput.vue +72 -0
  19. package/template-nuxt-mobile/composables/api.ts +57 -0
  20. package/template-nuxt-mobile/composables/apis/get.ts +22 -0
  21. package/template-nuxt-mobile/composables/apis/index.ts +8 -0
  22. package/template-nuxt-mobile/composables/apis/post.ts +39 -0
  23. package/template-nuxt-mobile/composables/share.ts +22 -0
  24. package/template-nuxt-mobile/composables/user.ts +48 -0
  25. package/template-nuxt-mobile/composables/utils.ts +80 -0
  26. package/template-nuxt-mobile/config/.devrc +2 -0
  27. package/template-nuxt-mobile/env.d.ts +65 -0
  28. package/template-nuxt-mobile/error.vue +69 -0
  29. package/template-nuxt-mobile/eslint.config.js +33 -0
  30. package/template-nuxt-mobile/layouts/blank.vue +11 -0
  31. package/template-nuxt-mobile/layouts/default.vue +32 -0
  32. package/template-nuxt-mobile/layouts/tabbar.vue +29 -0
  33. package/template-nuxt-mobile/middleware/auth.global.ts +34 -0
  34. package/template-nuxt-mobile/nuxt.config.ts +78 -0
  35. package/template-nuxt-mobile/package.json +40 -0
  36. package/template-nuxt-mobile/pages/base/login.vue +124 -0
  37. package/template-nuxt-mobile/pages/base/resetPasswd.vue +84 -0
  38. package/template-nuxt-mobile/pages/index.vue +22 -0
  39. package/template-nuxt-mobile/pages/my.vue +18 -0
  40. package/template-nuxt-mobile/pages/sub/[id].vue +21 -0
  41. package/template-nuxt-mobile/public/favicon.ico +0 -0
  42. package/template-nuxt-mobile/public/robots.txt +2 -0
  43. package/template-nuxt-mobile/server/plugins/init.ts +94 -0
  44. package/template-nuxt-mobile/server/routes/get/env.ts +13 -0
  45. package/template-nuxt-mobile/server/tsconfig.json +3 -0
  46. package/template-nuxt-mobile/server/utils/index.ts +12 -0
  47. package/template-nuxt-mobile/server/utils/proxy.ts +59 -0
  48. package/template-nuxt-mobile/tsconfig.json +4 -0
  49. package/template-nuxt-mobile/typings/system.d.ts +22 -0
  50. package/template-nuxt-mobile/uno.config.ts +40 -0
  51. package/template-nuxt-mobile/utils/tool.ts +153 -0
  52. package/template-nuxt-mobile/yarn.lock +7737 -0
  53. package/template-nuxt-website/README.md +3 -1
  54. package/template-nuxt-website/nuxt.config.ts +4 -5
  55. package/template-vitepress/Dockerfile +6 -2
  56. package/template-vue-mobile/.vscode/base.code-snippets +0 -24
  57. package/template-vue-mobile/.vscode/settings.json +0 -7
  58. package/template-vue-mobile/README.md +0 -71
  59. package/template-vue-mobile/_env +0 -6
  60. package/template-vue-mobile/_gitignore +0 -30
  61. package/template-vue-mobile/boot.mjs +0 -16
  62. package/template-vue-mobile/build/custom-plugin.ts +0 -30
  63. package/template-vue-mobile/build/index.ts +0 -7
  64. package/template-vue-mobile/build/plugins.ts +0 -68
  65. package/template-vue-mobile/config/.devrc +0 -2
  66. package/template-vue-mobile/index.html +0 -25
  67. package/template-vue-mobile/nitro.config.ts +0 -19
  68. package/template-vue-mobile/package.json +0 -48
  69. package/template-vue-mobile/plugins/env.ts +0 -26
  70. package/template-vue-mobile/public/vite.svg +0 -1
  71. package/template-vue-mobile/rome.json +0 -24
  72. package/template-vue-mobile/routes/[...all].ts +0 -11
  73. package/template-vue-mobile/routes/get/env.ts +0 -25
  74. package/template-vue-mobile/src/App.vue +0 -29
  75. package/template-vue-mobile/src/auto-components.d.ts +0 -24
  76. package/template-vue-mobile/src/auto-imports.d.ts +0 -289
  77. package/template-vue-mobile/src/components/Init.vue +0 -36
  78. package/template-vue-mobile/src/global.d.ts +0 -7
  79. package/template-vue-mobile/src/hooks/useVerifyCode.ts +0 -46
  80. package/template-vue-mobile/src/layouts/blank.vue +0 -9
  81. package/template-vue-mobile/src/layouts/default.vue +0 -27
  82. package/template-vue-mobile/src/layouts/sub.vue +0 -20
  83. package/template-vue-mobile/src/main.ts +0 -35
  84. package/template-vue-mobile/src/modules/1-router.ts +0 -40
  85. package/template-vue-mobile/src/modules/2-pinia.ts +0 -10
  86. package/template-vue-mobile/src/modules/3-net.ts +0 -46
  87. package/template-vue-mobile/src/modules/4-auth.ts +0 -64
  88. package/template-vue-mobile/src/views/[...all_404].vue +0 -557
  89. package/template-vue-mobile/src/views/base/login.vue +0 -110
  90. package/template-vue-mobile/src/views/base/resetPasswd.vue +0 -88
  91. package/template-vue-mobile/src/views/index.vue +0 -18
  92. package/template-vue-mobile/src/views/my.vue +0 -15
  93. package/template-vue-mobile/src/views/sub.vue +0 -18
  94. package/template-vue-mobile/src/vite-env.d.ts +0 -43
  95. package/template-vue-mobile/tsconfig.json +0 -21
  96. package/template-vue-mobile/tsconfig.node.json +0 -9
  97. package/template-vue-mobile/unocss.config.ts +0 -47
  98. package/template-vue-mobile/vite.config.ts +0 -32
  99. package/template-vue-mobile/yarn.lock +0 -4395
  100. /package/{template-vue-mobile → template-nuxt-mobile}/config/.onlinerc +0 -0
  101. /package/{template-vue-mobile → template-nuxt-mobile}/config/.testrc +0 -0
@@ -1,557 +0,0 @@
1
- <!--
2
- * @Author: zhangyang
3
- * @Date: 2020-12-03 15:02:28
4
- * @LastEditTime: 2023-01-13 15:35:44
5
- * @Description: 404
6
- -->
7
- <route lang="yaml">
8
- meta:
9
- auth: false
10
- title: 页面不存在
11
- layout: 'blank'
12
- </route>
13
- <template>
14
- <div>
15
- <div class="g-container">
16
- <div class="rail">
17
- <div class="stamp four">4</div>
18
- <div class="stamp zero">0</div>
19
- <div class="stamp four">4</div>
20
- <div class="stamp zero">0</div>
21
- <div class="stamp four">4</div>
22
- <div class="stamp zero">0</div>
23
- <div class="stamp four">4</div>
24
- <div class="stamp zero">0</div>
25
- <div class="stamp four">4</div>
26
- <div class="stamp zero">0</div>
27
- <div class="stamp four">4</div>
28
- <div class="stamp zero">0</div>
29
- <div class="stamp four">4</div>
30
- <div class="stamp zero">0</div>
31
- <div class="stamp four">4</div>
32
- <div class="stamp zero">0</div>
33
- <div class="stamp four">4</div>
34
- <div class="stamp zero">0</div>
35
- <div class="stamp four">4</div>
36
- <div class="stamp zero">0</div>
37
- </div>
38
- <div class="world">
39
- <div class="forward">
40
- <div class="box">
41
- <div class="wall"></div>
42
- <div class="wall"></div>
43
- <div class="wall"></div>
44
- <div class="wall"></div>
45
- <div class="wall"></div>
46
- <div class="wall"></div>
47
- </div>
48
- </div>
49
- </div>
50
- </div>
51
- <div class="bullshit">
52
- <div class="bullshit__oops">似乎出了什么问题!</div>
53
- <div class="bullshit__headline">{{ tips }}</div>
54
- <div class="bullshit__info">请仔细检查链接是否正确,点击按钮可返回上页</div>
55
- <a class="bullshit__return-home" @click.prevent="goBack">返回上个页面</a>
56
- </div>
57
- </div>
58
- </template>
59
-
60
- <script lang="ts" setup>
61
- withDefaults(defineProps<{ tips?: string; }>(), {
62
- tips: '页面不存在......'
63
- });
64
- const router = useRouter();
65
- const goBack = () => router.back();
66
-
67
- </script>
68
- <style lang="less" scoped>
69
- body {
70
- background: #fff;
71
- height: 100vh;
72
- overflow: hidden;
73
- display: flex;
74
- flex-wrap: wrap;
75
- font-family: "Anton", sans-serif;
76
- align-items: flex-start;
77
- perspective: 1000px;
78
- }
79
-
80
- body>a {
81
- opacity: 0;
82
- position: fixed;
83
- bottom: -100px;
84
- left: -100px;
85
- }
86
-
87
- div {
88
- transform-style: preserve-3d;
89
- }
90
-
91
- .g-container {
92
- display: flex;
93
- width: 100vw;
94
- height: 30vh;
95
- justify-content: center;
96
- align-items: center;
97
- /* perspective: 1000px; */
98
- }
99
-
100
- .rail {
101
- position: absolute;
102
- width: 100%;
103
- height: 100%;
104
- display: flex;
105
- justify-content: center;
106
- align-items: center;
107
- transform: rotateX(-30deg) rotateY(-30deg);
108
- }
109
-
110
- .rail .stamp {
111
- position: absolute;
112
- width: 200px;
113
- height: 200px;
114
- display: flex;
115
- justify-content: center;
116
- align-items: center;
117
- background: #333;
118
- color: #fff;
119
- font-size: 7rem;
120
- }
121
-
122
- .rail .stamp:nth-child(1) {
123
- -webkit-animation: stampSlide 40000ms -2300ms linear infinite;
124
- animation: stampSlide 40000ms -2300ms linear infinite;
125
- }
126
-
127
- .rail .stamp:nth-child(2) {
128
- -webkit-animation: stampSlide 40000ms -4300ms linear infinite;
129
- animation: stampSlide 40000ms -4300ms linear infinite;
130
- }
131
-
132
- .rail .stamp:nth-child(3) {
133
- -webkit-animation: stampSlide 40000ms -6300ms linear infinite;
134
- animation: stampSlide 40000ms -6300ms linear infinite;
135
- }
136
-
137
- .rail .stamp:nth-child(4) {
138
- -webkit-animation: stampSlide 40000ms -8300ms linear infinite;
139
- animation: stampSlide 40000ms -8300ms linear infinite;
140
- }
141
-
142
- .rail .stamp:nth-child(5) {
143
- -webkit-animation: stampSlide 40000ms -10300ms linear infinite;
144
- animation: stampSlide 40000ms -10300ms linear infinite;
145
- }
146
-
147
- .rail .stamp:nth-child(6) {
148
- -webkit-animation: stampSlide 40000ms -12300ms linear infinite;
149
- animation: stampSlide 40000ms -12300ms linear infinite;
150
- }
151
-
152
- .rail .stamp:nth-child(7) {
153
- -webkit-animation: stampSlide 40000ms -14300ms linear infinite;
154
- animation: stampSlide 40000ms -14300ms linear infinite;
155
- }
156
-
157
- .rail .stamp:nth-child(8) {
158
- -webkit-animation: stampSlide 40000ms -16300ms linear infinite;
159
- animation: stampSlide 40000ms -16300ms linear infinite;
160
- }
161
-
162
- .rail .stamp:nth-child(9) {
163
- -webkit-animation: stampSlide 40000ms -18300ms linear infinite;
164
- animation: stampSlide 40000ms -18300ms linear infinite;
165
- }
166
-
167
- .rail .stamp:nth-child(10) {
168
- -webkit-animation: stampSlide 40000ms -20300ms linear infinite;
169
- animation: stampSlide 40000ms -20300ms linear infinite;
170
- }
171
-
172
- .rail .stamp:nth-child(11) {
173
- -webkit-animation: stampSlide 40000ms -22300ms linear infinite;
174
- animation: stampSlide 40000ms -22300ms linear infinite;
175
- }
176
-
177
- .rail .stamp:nth-child(12) {
178
- -webkit-animation: stampSlide 40000ms -24300ms linear infinite;
179
- animation: stampSlide 40000ms -24300ms linear infinite;
180
- }
181
-
182
- .rail .stamp:nth-child(13) {
183
- -webkit-animation: stampSlide 40000ms -26300ms linear infinite;
184
- animation: stampSlide 40000ms -26300ms linear infinite;
185
- }
186
-
187
- .rail .stamp:nth-child(14) {
188
- -webkit-animation: stampSlide 40000ms -28300ms linear infinite;
189
- animation: stampSlide 40000ms -28300ms linear infinite;
190
- }
191
-
192
- .rail .stamp:nth-child(15) {
193
- -webkit-animation: stampSlide 40000ms -30300ms linear infinite;
194
- animation: stampSlide 40000ms -30300ms linear infinite;
195
- }
196
-
197
- .rail .stamp:nth-child(16) {
198
- -webkit-animation: stampSlide 40000ms -32300ms linear infinite;
199
- animation: stampSlide 40000ms -32300ms linear infinite;
200
- }
201
-
202
- .rail .stamp:nth-child(17) {
203
- -webkit-animation: stampSlide 40000ms -34300ms linear infinite;
204
- animation: stampSlide 40000ms -34300ms linear infinite;
205
- }
206
-
207
- .rail .stamp:nth-child(18) {
208
- -webkit-animation: stampSlide 40000ms -36300ms linear infinite;
209
- animation: stampSlide 40000ms -36300ms linear infinite;
210
- }
211
-
212
- .rail .stamp:nth-child(19) {
213
- -webkit-animation: stampSlide 40000ms -38300ms linear infinite;
214
- animation: stampSlide 40000ms -38300ms linear infinite;
215
- }
216
-
217
- .rail .stamp:nth-child(20) {
218
- -webkit-animation: stampSlide 40000ms -40300ms linear infinite;
219
- animation: stampSlide 40000ms -40300ms linear infinite;
220
- }
221
-
222
- @-webkit-keyframes stampSlide {
223
- 0% {
224
- transform: rotateX(90deg) rotateZ(-90deg) translateZ(-200px) translateY(130px);
225
- }
226
-
227
- 100% {
228
- transform: rotateX(90deg) rotateZ(-90deg) translateZ(-200px) translateY(-3870px);
229
- }
230
- }
231
-
232
- @keyframes stampSlide {
233
- 0% {
234
- transform: rotateX(90deg) rotateZ(-90deg) translateZ(-200px) translateY(130px);
235
- }
236
-
237
- 100% {
238
- transform: rotateX(90deg) rotateZ(-90deg) translateZ(-200px) translateY(-3870px);
239
- }
240
- }
241
-
242
- .world {
243
- transform: rotateX(-30deg) rotateY(-30deg);
244
- }
245
-
246
- .world .forward {
247
- position: absolute;
248
- -webkit-animation: slide 2000ms linear infinite;
249
- animation: slide 2000ms linear infinite;
250
- }
251
-
252
- .world .box {
253
- width: 200px;
254
- height: 200px;
255
- transform-origin: 100% 100%;
256
- -webkit-animation: roll 2000ms cubic-bezier(1, 0.01, 1, 1) infinite;
257
- animation: roll 2000ms cubic-bezier(1, 0.01, 1, 1) infinite;
258
- }
259
-
260
- .world .box .wall {
261
- position: absolute;
262
- width: 200px;
263
- height: 200px;
264
- background: rgba(0, 0, 0, 0.5);
265
- border: 1px solid #fafafa;
266
- box-sizing: border-box;
267
- }
268
-
269
- .world .box .wall::before {
270
- content: "";
271
- position: absolute;
272
- width: 100%;
273
- height: 100%;
274
- display: flex;
275
- justify-content: center;
276
- align-items: center;
277
- color: #fff;
278
- font-size: 7rem;
279
- }
280
-
281
- .world .box .wall:nth-child(1) {
282
- transform: translateZ(100px);
283
- }
284
-
285
- .world .box .wall:nth-child(2) {
286
- transform: rotateX(180deg) translateZ(100px);
287
- }
288
-
289
- .world .box .wall:nth-child(3) {
290
- transform: rotateX(90deg) translateZ(100px);
291
- }
292
-
293
- .world .box .wall:nth-child(3)::before {
294
- transform: rotateX(180deg) rotateZ(90deg) translateZ(-1px);
295
- -webkit-animation: zeroFour 4000ms -2000ms linear infinite;
296
- animation: zeroFour 4000ms -2000ms linear infinite;
297
- }
298
-
299
- .world .box .wall:nth-child(4) {
300
- transform: rotateX(-90deg) translateZ(100px);
301
- }
302
-
303
- .world .box .wall:nth-child(4)::before {
304
- transform: rotateX(180deg) rotateZ(-90deg) translateZ(-1px);
305
- -webkit-animation: zeroFour 4000ms -2000ms linear infinite;
306
- animation: zeroFour 4000ms -2000ms linear infinite;
307
- }
308
-
309
- .world .box .wall:nth-child(5) {
310
- transform: rotateY(90deg) translateZ(100px);
311
- }
312
-
313
- .world .box .wall:nth-child(5)::before {
314
- transform: rotateX(180deg) translateZ(-1px);
315
- -webkit-animation: zeroFour 4000ms linear infinite;
316
- animation: zeroFour 4000ms linear infinite;
317
- }
318
-
319
- .world .box .wall:nth-child(6) {
320
- transform: rotateY(-90deg) translateZ(100px);
321
- }
322
-
323
- .world .box .wall:nth-child(6)::before {
324
- transform: rotateX(180deg) rotateZ(180deg) translateZ(-1px);
325
- -webkit-animation: zeroFour 4000ms linear infinite;
326
- animation: zeroFour 4000ms linear infinite;
327
- }
328
-
329
- @-webkit-keyframes zeroFour {
330
- 0% {
331
- content: "4";
332
- }
333
-
334
- 100% {
335
- content: "0";
336
- }
337
- }
338
-
339
- @keyframes zeroFour {
340
- 0% {
341
- content: "4";
342
- }
343
-
344
- 100% {
345
- content: "0";
346
- }
347
- }
348
-
349
- @-webkit-keyframes roll {
350
- 0% {
351
- transform: rotateZ(0deg);
352
- }
353
-
354
- 85% {
355
- transform: rotateZ(90deg);
356
- }
357
-
358
- 87% {
359
- transform: rotateZ(88deg);
360
- }
361
-
362
- 90% {
363
- transform: rotateZ(90deg);
364
- }
365
-
366
- 100% {
367
- transform: rotateZ(90deg);
368
- }
369
- }
370
-
371
- @keyframes roll {
372
- 0% {
373
- transform: rotateZ(0deg);
374
- }
375
-
376
- 85% {
377
- transform: rotateZ(90deg);
378
- }
379
-
380
- 87% {
381
- transform: rotateZ(88deg);
382
- }
383
-
384
- 90% {
385
- transform: rotateZ(90deg);
386
- }
387
-
388
- 100% {
389
- transform: rotateZ(90deg);
390
- }
391
- }
392
-
393
- @-webkit-keyframes slide {
394
- 0% {
395
- transform: translateX(0);
396
- }
397
-
398
- 100% {
399
- transform: translateX(-200px);
400
- }
401
- }
402
-
403
- @keyframes slide {
404
- 0% {
405
- transform: translateX(0);
406
- }
407
-
408
- 100% {
409
- transform: translateX(-200px);
410
- }
411
- }
412
-
413
- footer {
414
- position: fixed;
415
- left: 0;
416
- right: 0;
417
- bottom: 0;
418
- height: 32px;
419
- color: #666;
420
- font-size: 12px;
421
- text-align: center;
422
- }
423
-
424
- .g-goto {
425
- width: 100vw;
426
- padding: 12px 0;
427
- }
428
-
429
- .g-goto p {
430
- font-size: 14px;
431
- text-align: center;
432
- color: #999;
433
- padding: 0 12px;
434
- margin-bottom: 24px;
435
- }
436
-
437
- .g-btn-box {
438
- /* width: 600px; */
439
- display: flex;
440
- flex-wrap: wrap;
441
- margin: 0 auto;
442
- justify-content: center;
443
- }
444
-
445
- .svg-border-animation {
446
- position: relative;
447
- width: 80px;
448
- height: 32px;
449
- margin: 12px;
450
- }
451
-
452
- .hover-text {
453
- position: absolute;
454
- line-height: 32px;
455
- width: 80px;
456
- top: 0;
457
- color: #333;
458
- font-size: 14px;
459
- text-align: center;
460
- cursor: pointer;
461
- transition: all .4s;
462
- }
463
-
464
- .hover-text:active {
465
- background: #3F51B50b;
466
- }
467
-
468
- .shape {
469
- fill: transparent;
470
- stroke-width: 2px;
471
- stroke: #333;
472
- stroke-dasharray: 30 150;
473
- stroke-dashoffset: 42;
474
- }
475
-
476
- .svg-border-animation:hover .hover-text {
477
- transition: 0.4s;
478
- color: #3F51B5;
479
- }
480
-
481
- .svg-border-animation:hover .shape {
482
- animation: draw 0.4s linear forwards;
483
- }
484
-
485
- @keyframes draw {
486
- 0% {
487
- stroke-dasharray: 30 150;
488
- stroke-dashoffset: 42;
489
- stroke-width: 2px;
490
- }
491
-
492
- 100% {
493
- stroke-dasharray: 224;
494
- stroke-dashoffset: 0;
495
- stroke-width: 2px;
496
- stroke: #3F51B5;
497
- }
498
- }
499
-
500
- .bullshit {
501
- @apply relative float-left ml-10 top-50 w-300px overflow-hidden;
502
-
503
- @media (min-width: 768px) {
504
- @apply float-right -top-32 mr-52;
505
- }
506
-
507
- &__oops {
508
- @apply text-3xl font-bold opacity-0 mb-4;
509
- color: #1482f0;
510
- animation-name: slideUp;
511
- animation-duration: 0.5s;
512
- animation-fill-mode: forwards;
513
- }
514
-
515
- &__headline {
516
- @apply text-xl font-bold opacity-0 mb-2;
517
- color: #222;
518
- animation-name: slideUp;
519
- animation-duration: 0.5s;
520
- animation-delay: 0.1s;
521
- animation-fill-mode: forwards;
522
- }
523
-
524
- &__info {
525
- @apply text-sm opacity-0 mb-6;
526
- color: grey;
527
- animation-name: slideUp;
528
- animation-duration: 0.5s;
529
- animation-delay: 0.2s;
530
- animation-fill-mode: forwards;
531
- }
532
-
533
- &__return-home {
534
- @apply block float-left w-28 h-10 rounded-3xl text-center font-bold opacity-0 cursor-pointer;
535
- background: #1482f0;
536
- color: #ffffff;
537
- font-size: 14px;
538
- line-height: 36px;
539
- animation-name: slideUp;
540
- animation-duration: 0.5s;
541
- animation-delay: 0.3s;
542
- animation-fill-mode: forwards;
543
- }
544
-
545
- @keyframes slideUp {
546
- 0% {
547
- transform: translateY(60px);
548
- opacity: 0;
549
- }
550
-
551
- 100% {
552
- transform: translateY(0);
553
- opacity: 1;
554
- }
555
- }
556
- }
557
- </style>
@@ -1,110 +0,0 @@
1
- <!--
2
- * @Author: zhangyang
3
- * @Date: 2023-01-13 16:18:47
4
- * @LastEditTime: 2023-01-13 16:51:15
5
- * @Description:
6
- -->
7
- <route lang="yaml">
8
- meta:
9
- title: 用户登录
10
- layout: blank
11
- </route>
12
-
13
- <script lang="ts" setup>
14
- import { isMobile } from '@bluesyoung/utils';
15
- import { useVerifyCode } from '@/hooks/useVerifyCode';
16
- import type { FormInstance } from 'vant';
17
- const formRef = ref<FormInstance>();
18
- const router = useRouter();
19
- const route = useRoute();
20
- const isPass = ref(true);
21
- const form = ref({ tel: '', passwd: '' });
22
- const { countDown, isClicked, sendClick } = useVerifyCode();
23
- const isReaded = ref(true);
24
- const showPopup = ref(false);
25
- const popupContent = ref(`<h1>我是用户协议</h1>`);
26
- const read = (type: 0 | 1) => {
27
- if (type === 0) {
28
- popupContent.value = `<h1>我是用户协议</h1>`;
29
- } else {
30
- popupContent.value = `<h1>我是隐私政策</h1>`;
31
- }
32
- showPopup.value = true;
33
- };
34
- const [showPass, toggle] = useToggle(false);
35
-
36
- watch(() => isPass.value, () => form.value.passwd = '');
37
-
38
- const loginHandler = async () => {
39
- try {
40
- await formRef.value?.validate();
41
- if (!isReaded.value) {
42
- showToast('请先同意服务协议!');
43
- return;
44
- }
45
- // todo: 登录
46
- // const data = await login(form.value);
47
- const data = true;
48
- if (data) {
49
- // todo: change login state
50
- // setToken(data as unknown as UserKey);
51
- // await generateUserInfo();
52
- if (route.query.redirect) {
53
- router.push({ path: route.query.redirect as string });
54
- } else {
55
- router.push('/');
56
- }
57
- }
58
- } catch (error) {
59
- return;
60
- }
61
- }
62
- </script>
63
-
64
- <template>
65
- <VanNavBar title="登录" safe-area-inset-bottom />
66
- <div v-bind="$attrs" class="w-full h-full mt-10">
67
- <VanForm ref="formRef">
68
- <VanCellGroup inset>
69
- <VanField v-model.trim="form.tel" placeholder="手机号" :rules="[
70
- { required: true, message: '请填写手机号' },
71
- { validator: isMobile, message: '请输入合法的手机号' }
72
- ]" />
73
- <VanField v-if="isPass" v-model.trim="form.passwd" placeholder="密码" :type="showPass ? 'password' : 'text'"
74
- :rules="[{ required: true, message: '请填写密码' }]">
75
- <template #right-icon>
76
- <VanIcon :name="!showPass ? 'eye' : 'closed-eye'" @click="toggle(!showPass)" />
77
- </template>
78
- </VanField>
79
- <VanField v-else v-model.trim="form.passwd" placeholder="验证码" :rules="[{ required: true, message: '请填写验证码' }]">
80
- <template #button>
81
- <VanButton v-if="!isClicked" :disabled="!isMobile(form.tel)" size="small" type="primary" plain
82
- @click="sendClick">发送验证码</VanButton>
83
- <VanButton v-else size="small" :disabled="true">
84
- {{ countDown.current.value.seconds }}秒后重发
85
- </VanButton>
86
- </template>
87
- </VanField>
88
- </VanCellGroup>
89
- <VanCheckbox v-model="isReaded" shape="square" icon-size="small" class="p-4">
90
- 我已阅读并同意
91
- <a class=" text-purple-500" @click.prevent="read(0)">用户协议</a>
92
-
93
- <a class=" text-purple-500" @click.prevent="read(1)">隐私政策</a>
94
- </VanCheckbox>
95
- <div class="m-4">
96
- <VanButton block type="primary" @click="loginHandler">
97
- 登录
98
- </VanButton>
99
- </div>
100
- <div class="flex justify-between p-4">
101
- <a v-if="isPass" class="text-purple-500" @click.prevent="isPass = false">短信登录</a>
102
- <a v-if="isPass" class="text-purple-500" @click.prevent="$router.push('/base/resetPasswd')">找回密码</a>
103
- <a v-else class="text-purple-500" @click.prevent="isPass = true">密码登录</a>
104
- </div>
105
- </VanForm>
106
- <VanPopup v-model:show="showPopup" position="center" :style="{ height: '80%', width: '90%', overflow: 'auto' }">
107
- <div v-html="popupContent" />
108
- </VanPopup>
109
- </div>
110
- </template>