Compare commits
	
		
			626 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | ead48f4502 | ||
|  | 305d95672a | ||
|  | 8a792c7d63 | ||
|  | 93ed5ad085 | ||
|  | 41f23386b2 | ||
|  | c91644b829 | ||
|  | 073fd16bd7 | ||
|  | f92ee770e0 | ||
|  | 1e6d52357e | ||
|  | 751ded44f3 | ||
|  | 8567f3e34e | ||
|  | 83f2514403 | ||
|  | ad6ac7222c | ||
|  | 3ae1952624 | ||
|  | 3db549af40 | ||
|  | 94179ae552 | ||
|  | 7f35e87ed8 | ||
|  | 00da0009ef | ||
|  | cffc30afa3 | ||
|  | 24cf1d9284 | ||
|  | 9296e6987d | ||
|  | 809fa85706 | ||
|  | b3ae7605d3 | ||
|  | 864ec4737d | ||
|  | 854d0bcf20 | ||
|  | 458e387b68 | ||
|  | 56c770c49d | ||
|  | 946447394d | ||
|  | 44ba3273cb | ||
|  | 0f7b9d5e2b | ||
|  | 8a3f66db7b | ||
|  | 0eaa327d47 | ||
|  | 08e0cf5ad5 | ||
|  | d7aea9d11c | ||
|  | 135ce77288 | ||
|  | 19141a73d2 | ||
|  | 9d1051b0bd | ||
|  | c46a5920e5 | ||
|  | 43ac23f113 | ||
|  | 13f6cd8ef4 | ||
|  | 0e6d289128 | ||
|  | bba68bff29 | ||
|  | 6e0cce4d49 | ||
|  | d3ebe95076 | ||
|  | cbda4a38a3 | ||
|  | 3318041b92 | ||
|  | af53ec7625 | ||
|  | de2829fde7 | ||
|  | c1bee4046c | ||
|  | 473095b01b | ||
|  | e6abf93457 | ||
|  | 882f281482 | ||
|  | 0b2f68ac04 | ||
|  | 2ca2b766f8 | ||
|  | da611fb10b | ||
|  | eb8e49e23c | ||
|  | 0907d38c06 | ||
|  | 2a9b725c6a | ||
|  | 8f24a94ed3 | ||
|  | 4eefc95baa | ||
|  | 1681c34a52 | ||
|  | 47ab0184b7 | ||
|  | 58591f660a | ||
|  | 3c7e1cf442 | ||
|  | 055d4cce33 | ||
|  | a3dfe61a7b | ||
|  | f9d47c081f | ||
|  | ff5bf62989 | ||
|  | 1f6d079644 | ||
|  | 5c085a1986 | ||
|  | 9a23817473 | ||
|  | 56ea8937f6 | ||
|  | 4f51263501 | ||
|  | bb2eab60f4 | ||
|  | 44e4c04811 | ||
|  | b5839eab26 | ||
|  | 780ac75bf6 | ||
|  | a252138594 | ||
|  | 270a055072 | ||
|  | 08e194efe9 | ||
|  | 5f6caab338 | ||
|  | 5aaa318142 | ||
|  | cebbef680f | ||
|  | 0abde46ef4 | ||
|  | f2b518ed26 | ||
|  | c6207f35e1 | ||
|  | ee8fa04814 | ||
|  | 7b746fa053 | ||
|  | b7fea53107 | ||
|  | f89f3e6a38 | ||
|  | a0da2f6e16 | ||
|  | 3b5380e0d1 | ||
|  | 35276bfe41 | ||
|  | 215c1ecbd9 | ||
|  | 1698b21d7a | ||
|  | ca1e66be47 | ||
|  | 22bf2823e8 | ||
|  | 32e98f1b3a | ||
|  | c1c4335ce7 | ||
|  | 6c50662280 | ||
|  | f3a1707b94 | ||
|  | 6ea755f2a8 | ||
|  | a989b44a15 | ||
|  | 40f8587fd6 | ||
|  | 9f5638f16d | ||
|  | 9b19f96ff6 | ||
|  | 15da557892 | ||
|  | 2d23c9a2e6 | ||
|  | ab49afd3db | ||
|  | 86a370fd69 | ||
|  | 36fc74ce07 | ||
|  | 8da8843fd0 | ||
|  | f68285fbe5 | ||
|  | 85b8ef8f88 | ||
|  | 3d48aa8bbe | ||
|  | a765da6e28 | ||
|  | c57640acd0 | ||
|  | c264216053 | ||
|  | 9d3c732993 | ||
|  | 34f023c4b1 | ||
|  | 5a4f842774 | ||
|  | bae1767141 | ||
|  | 5957833a4f | ||
|  | 397092c21f | ||
|  | f309003e67 | ||
|  | eaf3678758 | ||
|  | f2e82da7c8 | ||
|  | 211ae1f905 | ||
|  | db629593c6 | ||
|  | 80d58cce2b | ||
|  | a0f55aca69 | ||
|  | d203a3586c | ||
|  | f74a6424d0 | ||
|  | 209ef3d890 | ||
|  | b549b32cbb | ||
|  | 54e2cb51cf | ||
|  | 42e6de395f | ||
|  | c0066b22b0 | ||
|  | aaef0bec27 | ||
|  | 912c3531c5 | ||
|  | 488e6e3204 | ||
|  | f73e3f648d | ||
|  | 36e5feac98 | ||
|  | cc13fcc8aa | ||
|  | 7f748f2a61 | ||
|  | 4a6fec8af0 | ||
|  | e2b320ad27 | ||
|  | 21d5214247 | ||
|  | 44b544745d | ||
|  | 5499a559c8 | ||
|  | ebe2c56348 | ||
|  | 8debfe7e95 | ||
|  | 1ef1b6bda9 | ||
|  | fb46d7ec7c | ||
|  | cea600f12c | ||
|  | bf2f617255 | ||
|  | cf8c7cb258 | ||
|  | 4e87f0b665 | ||
|  | d8baba586b | ||
|  | 3cff2eb4ce | ||
|  | f355a698ad | ||
|  | c3d0b74c75 | ||
|  | b0f98e4bfa | ||
|  | 506ffb8adf | ||
|  | e1afc10b80 | ||
|  | 960b436c79 | ||
|  | 6059891556 | ||
|  | 3503dff663 | ||
|  | 61998886ac | ||
|  | 608d7fb34d | ||
|  | 6bb6d9f71e | ||
|  | 918894147a | ||
|  | 0b5afda287 | ||
|  | a8a6ed97b9 | ||
|  | 919376b77c | ||
|  | 7e505f9b96 | ||
|  | de517be613 | ||
|  | bd5dd2cf28 | ||
|  | da521b35e6 | ||
|  | 34ffd9c1f3 | ||
|  | 3131e00f0f | ||
|  | f71812d622 | ||
|  | 0c12665fda | ||
|  | 458b7adb29 | ||
|  | 264da00e5d | ||
|  | 0882c25034 | ||
|  | a3562d9212 | ||
|  | b08c389e4a | ||
|  | 91bc1519f1 | ||
|  | 58b27c9693 | ||
|  | 25daa23606 | ||
|  | 9110d87580 | ||
|  | c097b5681d | ||
|  | beb705f8a9 | ||
|  | fd9488673c | ||
|  | 70aeefea02 | ||
|  | 1b3d2a6168 | ||
|  | fcb7ad965d | ||
|  | 828a2f5b60 | ||
|  | be6d431485 | ||
|  | 61a43b8efd | ||
|  | e3a9c77fd1 | ||
|  | e772ff05fb | ||
|  | d064f6285a | ||
|  | 091ca1a4fe | ||
|  | 9cec6a31a5 | ||
|  | bb8af263e1 | ||
|  | 7211a17a81 | ||
|  | 810398abb8 | ||
|  | f2b580fc06 | ||
|  | 3bd8858121 | ||
|  | 5efd1dbec4 | ||
|  | 971915948b | ||
|  | a9a37036d5 | ||
|  | 7a58035514 | ||
|  | 57bfe27819 | ||
|  | fcc65c3751 | ||
|  | f2d8dfc3ef | ||
|  | b5c570adf5 | ||
|  | 94098d02e8 | ||
|  | 436b15f010 | ||
|  | 0282feb173 | ||
|  | 8456750901 | ||
|  | 1a02cab97c | ||
|  | 1bdd81a1d8 | ||
|  | a9d58f88aa | ||
|  | 6a344ff2c7 | ||
|  | cc00c8f03a | ||
|  | c7b6a3fbec | ||
|  | 40c1e13b50 | ||
|  | 288d586dbc | ||
|  | 7d69992694 | ||
|  | 6c14bfe6a9 | ||
|  | 6773659e89 | ||
|  | 9455ad9a4f | ||
|  | 428d41b485 | ||
|  | 74772a1f03 | ||
|  | 1f3e6e4fac | ||
|  | 41b3bcb445 | ||
|  | 8e801dd790 | ||
|  | d6b1530720 | ||
|  | b632b7ffed | ||
|  | 1b45b71f20 | ||
|  | 149d22a4a4 | ||
|  | 83a2e01070 | ||
|  | 11d615f807 | ||
|  | 853745587d | ||
|  | f29108aa14 | ||
|  | abd02d1990 | ||
|  | 65ac69ef71 | ||
|  | 8998581b99 | ||
|  | 468b4bb0e1 | ||
|  | 88e535f63c | ||
|  | 13d0c4153a | ||
|  | 331b14e74d | ||
|  | c29b887eb2 | ||
|  | 8a1ec938e7 | ||
|  | c045e3fe4e | ||
|  | 811f820644 | ||
|  | fe8cab3d1c | ||
|  | 78efd7793a | ||
|  | 82c4b09b94 | ||
|  | a539112a0f | ||
|  | 22c05674f8 | ||
|  | 7dd7c71d01 | ||
|  | 22c90257de | ||
|  | 3d03d6ddb5 | ||
|  | 6fbde1eb57 | ||
|  | 0ee16e0228 | ||
|  | af74046124 | ||
|  | d823ee5684 | ||
|  | f7ca2782b0 | ||
|  | af8c133914 | ||
|  | 21b6fb697e | ||
|  | 3e0cc8c2c1 | ||
|  | 3540b75557 | ||
|  | 73ce53a388 | ||
|  | f408ea017c | ||
|  | c5ba63182e | ||
|  | 07325a4236 | ||
|  | 7240be8495 | ||
|  | 71a753f323 | ||
|  | 639c4458be | ||
|  | 1ad92a2d1b | ||
|  | 49f95c4e45 | ||
|  | 44ab07779e | ||
|  | 40ecc320a5 | ||
|  | 695ec7e50d | ||
|  | 85901d2d5e | ||
|  | 97e2ffddf4 | ||
|  | 907cf44cc1 | ||
|  | d9324f07b5 | ||
|  | d7f5bf3373 | ||
|  | 36f06bc899 | ||
|  | 182dac0d2e | ||
|  | f4d37cf7f0 | ||
|  | 16dce9a4ce | ||
|  | 0f0cd0b759 | ||
|  | 472f93bfc1 | ||
|  | 77572855c3 | ||
|  | 19942625d5 | ||
|  | dbd676095b | ||
|  | ed9cd6ce39 | ||
|  | ee434b465a | ||
|  | 2aba58c973 | ||
|  | 2c56233155 | ||
|  | 8d11a6affc | ||
|  | f6b61418e5 | ||
|  | 7f9c98ab8d | ||
|  | 02992dc02d | ||
|  | b32bca4984 | ||
|  | c37d0ac788 | ||
|  | 35aeedf320 | ||
|  | 94ff787053 | ||
|  | d0823b030b | ||
|  | 2d722db243 | ||
|  | 6143605297 | ||
|  | e2d6554313 | ||
|  | 872bb84502 | ||
|  | ee7eb3ac0d | ||
|  | dd1132482e | ||
|  | c33b5ebfef | ||
|  | 711a4ae34f | ||
|  | d9cfeabb47 | ||
|  | 296b154be5 | ||
|  | cec0f25c6b | ||
|  | b18c49e9d2 | ||
|  | f64bc91ce2 | ||
|  | b60db89801 | ||
|  | da407b6653 | ||
|  | 6a9a362caa | ||
|  | aa2f78a86f | ||
|  | a444731e9e | ||
|  | 1523c7b075 | ||
|  | 896e6f2eac | ||
|  | 8dcfbb29f9 | ||
|  | 750000ec66 | ||
|  | a792bb5cb3 | ||
|  | 973ab14442 | ||
|  | 3fe4e92f4a | ||
|  | 9ce58073dd | ||
|  | e2727e6fa1 | ||
|  | 73fa3d14c5 | ||
|  | ea1a336535 | ||
|  | 69e39c142e | ||
|  | 718c36263e | ||
|  | 5c1b086cb4 | ||
|  | 414ccbe360 | ||
|  | 41147b34fa | ||
|  | 894b0f1c18 | ||
|  | d214bb2f2a | ||
|  | 9518372fe0 | ||
|  | afa0134fdd | ||
|  | c6ed9b1558 | ||
|  | 0523f08382 | ||
|  | 8237adb9c0 | ||
|  | 65c21812bb | ||
|  | c3c975ee11 | ||
|  | 833018a831 | ||
|  | 3eb7f6f593 | ||
|  | efcfa576d5 | ||
|  | 487213b648 | ||
|  | 4ee0d94f1b | ||
|  | 5fa822f4d4 | ||
|  | 8e6e787543 | ||
|  | 9917b5e53c | ||
|  | 8f3e855f41 | ||
|  | 808051b29d | ||
|  | 906aed5e75 | ||
|  | 2d64a2e57c | ||
|  | 0c70a9e083 | ||
|  | 08d83ecbea | ||
|  | 4122685803 | ||
|  | 434ab1c560 | ||
|  | ae99e57c52 | ||
|  | e3c4a6ece6 | ||
|  | c8717c25b8 | ||
|  | e9656c6e76 | ||
|  | fd78791229 | ||
|  | de09f82586 | ||
|  | c7762490de | ||
|  | 4558c24d1c | ||
|  | d9ac7e4de0 | ||
|  | 6a5a357f50 | ||
|  | 44b022aefd | ||
|  | 0a46ea0844 | ||
|  | 39854a492b | ||
|  | 4c2f535a9b | ||
|  | be45d83766 | ||
|  | d28b9039bb | ||
|  | 8f6d6ce3cb | ||
|  | 07baac7cf8 | ||
|  | 7487ab79b3 | ||
|  | a70e4161be | ||
|  | 095c432363 | ||
|  | 028096e53f | ||
|  | 44ab55d594 | ||
|  | 4b80a66114 | ||
|  | cc0bb088ec | ||
|  | 3e4f9e2824 | ||
|  | ebd16a4d1a | ||
|  | 84cb07baec | ||
|  | 0811ffa5ae | ||
|  | 3f822a7d76 | ||
|  | a1c7e10574 | ||
|  | 50d7ccd82d | ||
|  | e0233061d3 | ||
|  | a0c405dadd | ||
|  | 60f912508b | ||
|  | 3590b65e22 | ||
|  | 92b8406444 | ||
|  | e7ad08685e | ||
|  | 14c145eef1 | ||
|  | 518f7eed28 | ||
|  | 21e63998d0 | ||
|  | 38ee2a62cd | ||
|  | 716528206e | ||
|  | b81143e55e | ||
|  | 0243b27505 | ||
|  | 909c12d3c6 | ||
|  | 01d0bcbfd0 | ||
|  | ba07b695dd | ||
|  | 3d8befa376 | ||
|  | 97c92626cc | ||
|  | 55ddc9cab0 | ||
|  | 401f0c748d | ||
|  | d5c751153c | ||
|  | 69d51318ff | ||
|  | de5fb84215 | ||
|  | c275f2632c | ||
|  | e899914426 | ||
|  | 861c8b9852 | ||
|  | a782461453 | ||
|  | e8488e4d52 | ||
|  | 889c859865 | ||
|  | 3c8dd772f8 | ||
|  | 251b5b9664 | ||
|  | 41e46a5d80 | ||
|  | 5c75e9d958 | ||
|  | 7f4350aeb6 | ||
|  | 807448aec5 | ||
|  | b9c5c34979 | ||
|  | 20347b7d65 | ||
|  | dbeb595c0b | ||
|  | c9d3e5a3fd | ||
|  | 5e276421ad | ||
|  | 219f87f467 | ||
|  | b35ed8960d | ||
|  | 24010d05fb | ||
|  | ec0776e268 | ||
|  | cecce83bc3 | ||
|  | 4eb46ea3dd | ||
|  | e8b534b84e | ||
|  | 46e1ae7825 | ||
|  | 60a55a776e | ||
|  | bed4292ed3 | ||
|  | 6bed9ead38 | ||
|  | 3fb13ca9e7 | ||
|  | 2d6d179d66 | ||
|  | eebb753884 | ||
|  | bb1bbf2724 | ||
|  | df56abe18d | ||
|  | ca2dfa6185 | ||
|  | bbfdcc8276 | ||
|  | 1715504789 | ||
|  | 9a90f18e77 | ||
|  | 21645537d5 | ||
|  | e6c26fcb4a | ||
|  | 20911dd882 | ||
|  | cd7ca8f4c7 | ||
|  | ca707a456b | ||
|  | d0522ce514 | ||
|  | f83c7b59b8 | ||
|  | f5a043b11a | ||
|  | 094dca961f | ||
|  | 8191490f39 | ||
|  | 75de2b0604 | ||
|  | 4093dcd6dc | ||
|  | d00643c9f5 | ||
|  | b8db2116df | ||
|  | a0dfa3d30d | ||
|  | 4e31abd446 | ||
|  | f42ee9dbe5 | ||
|  | f5c56c355c | ||
|  | a1a57a185c | ||
|  | b298af1ddb | ||
|  | 43d685ccd3 | ||
|  | 72d7dcfa5e | ||
|  | 1e2fdda090 | ||
|  | 8d00b238f7 | ||
|  | 8cdad54236 | ||
|  | 6298e61328 | ||
|  | 9d4ed617fb | ||
|  | f92d7ecfbe | ||
|  | ce4e039f48 | ||
|  | 1a9efee591 | ||
|  | 378d55ac0e | ||
|  | 50c8b9daa1 | ||
|  | c4546bdfa3 | ||
|  | 5b401a79ba | ||
|  | 7add5c2edf | ||
|  | 811b15e672 | ||
|  | c1182fef0a | ||
|  | 7ba332cd6a | ||
|  | a810ef85b1 | ||
|  | 225e7128b6 | ||
|  | 3aded40461 | ||
|  | 57c692be74 | ||
|  | 284af63cfe | ||
|  | e856cdb7b2 | ||
|  | 114072277f | ||
|  | e65034d946 | ||
|  | a7a269d6a6 | ||
|  | 2c9660fdbf | ||
|  | e93b94cb24 | ||
|  | 3befb22903 | ||
|  | 7ed5d0de2d | ||
|  | 47f2871cb5 | ||
|  | 852ddb64ad | ||
|  | 7e1f9f1138 | ||
|  | 554d7fd611 | ||
|  | 1797f29a79 | ||
|  | 50063187ec | ||
|  | b16721b2b7 | ||
|  | facc00e8b4 | ||
|  | 02c51e6fb9 | ||
|  | be374089ba | ||
|  | 68b42304d5 | ||
|  | 32a7cc408e | ||
|  | 651e58dcb6 | ||
|  | b61b0ce25f | ||
|  | 21bab1f7c3 | ||
|  | 4f9d544d43 | ||
|  | db75c91400 | ||
|  | 37092974d3 | ||
|  | 1d63a83822 | ||
|  | db3c25ea14 | ||
|  | 5eddb4910c | ||
|  | ce531ce5dd | ||
|  | 28efbdbc70 | ||
|  | cc290accc2 | ||
|  | 579e07400e | ||
|  | b2a4ddf5e3 | ||
|  | 28b5d22401 | ||
|  | 839b82ba8b | ||
|  | 09c7658c21 | ||
|  | e25afe2fad | ||
|  | 371fad4f26 | ||
|  | a090d398fc | ||
|  | 6d132c5977 | ||
|  | 912bfdf439 | ||
|  | bf020a8258 | ||
|  | 10e4d81bd6 | ||
|  | 0653fb144f | ||
|  | 006467a062 | ||
|  | 0c5770dfd2 | ||
|  | 0e783bcf7b | ||
|  | e5793e1c8d | ||
|  | 85b55bb37a | ||
|  | b36a62b150 | ||
|  | c804b21ceb | ||
|  | 5bfb8199b4 | ||
|  | ab9a6a2f39 | ||
|  | b93b80cb4b | ||
|  | f5a36a05cb | ||
|  | 035fa114c9 | ||
|  | 2c196841bd | ||
|  | 0d2a5629e8 | ||
|  | de2057f141 | ||
|  | 7a0648dba5 | ||
|  | 25d3404c9c | ||
|  | 29078689b0 | ||
|  | 078433da43 | ||
|  | b9ce69130b | ||
|  | 90ddf9837c | ||
|  | 777cf8e06a | ||
|  | 9bc682dae8 | ||
|  | c9c5ca9989 | ||
|  | e776df49e4 | ||
|  | 659e460653 | ||
|  | 186f53f634 | ||
|  | 5aac013597 | ||
|  | 1901a0bfb7 | ||
|  | 25bead0039 | ||
|  | 041012b3ee | ||
|  | 9472b51811 | ||
|  | f3c86efbe5 | ||
|  | 51c744c8e2 | ||
|  | 230a50a4cf | ||
|  | e755caabf2 | ||
|  | ae7ec99a98 | ||
|  | 987cef3363 | ||
|  | 2ad1ad32b8 | ||
|  | ff9216b621 | ||
|  | 225c4fe022 | ||
|  | f29106e480 | ||
|  | 21c2f5a857 | ||
|  | e53e7936df | ||
|  | bdc39aff1b | ||
|  | 0b10b5056e | ||
|  | d683894beb | ||
|  | 9fb641f71e | ||
|  | a6bdc380a8 | ||
|  | 8b27fc8bb8 | ||
|  | 738964a769 | ||
|  | c429cd0293 | ||
|  | 20aa39f14e | ||
|  | 93f9aa9584 | ||
|  | 8ce627a397 | ||
|  | 1ffb75afce | ||
|  | 32aa5ee75a | ||
|  | 98a7d25cf8 | ||
|  | 1b3463d2e7 | ||
|  | cff11d9175 | ||
|  | 54577f10fc | ||
|  | 6261156c5a | ||
|  | f5a5f44a2b | ||
|  | 3fb7a5f709 | ||
|  | e6c9b35ab4 | ||
|  | 0569666a8f | ||
|  | e1dacdbc39 | ||
|  | 03b398af2f | ||
|  | 451c7547af | ||
|  | c81221efac | ||
|  | 4e04a8f8ad | ||
|  | 9f64321d73 | 
| @@ -1,45 +0,0 @@ | ||||
| module.exports = { | ||||
|   types: [ | ||||
|     { value: 'feat', name: 'feat:     新增功能' }, | ||||
|     { value: 'fix', name: 'fix:      修复bug' }, | ||||
|     { value: 'docs', name: 'docs:     文档变更' }, | ||||
|     { value: 'style', name: 'style:    代码格式(不影响功能,例如空格、分号等格式修正)' }, | ||||
|     { value: 'refactor', name: 'refactor: 代码重构(不包括 bug 修复、功能新增)' }, | ||||
|     { value: 'perf', name: 'perf:     性能优化' }, | ||||
|     { value: 'test', name: 'test:     添加、修改测试用例' }, | ||||
|     { value: 'build', name: 'build:    构建流程、外部依赖变更(如升级 npm 包、修改 脚手架 配置等)' }, | ||||
|     { value: 'ci', name: 'ci:       修改 CI 配置、脚本' }, | ||||
|     { value: 'chore', name: 'chore:    对构建过程或辅助工具和库的更改(不影响源文件、测试用例)' }, | ||||
|     { value: 'revert', name: 'revert:   回滚 commit' } | ||||
|   ], | ||||
|   scopes: [ | ||||
| 		['projects', '项目搭建'], | ||||
|     ['components', '组件相关'], | ||||
|     ['hooks', 'hook 相关'], | ||||
|     ['utils', 'utils 相关'], | ||||
|     ['types', 'ts类型相关'], | ||||
|     ['styles', '样式相关'], | ||||
|     ['deps', '项目依赖'], | ||||
|     ['auth', '对 auth 修改'], | ||||
|     ['other', '其他修改'], | ||||
|     ['custom', '以上都不是?我要自定义'] | ||||
|   ].map(([value, description]) => { | ||||
|     return { | ||||
|       value, | ||||
|       name: `${value.padEnd(30)} (${description})` | ||||
|     } | ||||
|   }), | ||||
|   messages: { | ||||
|     type: '确保本次提交遵循 Angular 规范!\n选择你要提交的类型:', | ||||
|     scope: '\n选择一个 scope(可选):', | ||||
|     customScope: '请输入自定义的 scope:', | ||||
|     subject: '填写简短精炼的变更描述:\n', | ||||
|     body: '填写更加详细的变更描述(可选)。使用 "|" 换行:\n', | ||||
|     breaking: '列举非兼容性重大的变更(可选):\n', | ||||
|     footer: '列举出所有变更的 ISSUES CLOSED(可选)。 例如: #31, #34:\n', | ||||
|     confirmCommit: '确认提交?' | ||||
|   }, | ||||
|   allowBreakingChanges: ['feat', 'fix'], | ||||
|   subjectLimit: 100, | ||||
|   breaklineChar: '|' | ||||
| } | ||||
| @@ -1,12 +1,11 @@ | ||||
| # Editor configuration, see http://editorconfig.org | ||||
|  | ||||
| # 表示是最顶层的 EditorConfig 配置文件 | ||||
| root = true | ||||
|  | ||||
| [*] # 表示所有文件适用 | ||||
| charset = utf-8 # 设置文件字符集为 utf-8 | ||||
| indent_style = tab # 缩进风格(tab | space) | ||||
| indent_size = 2 # 缩进大小 | ||||
| end_of_line = lf # 控制换行类型(lf | cr | crlf) | ||||
| trim_trailing_whitespace = true # 去除行首的任意空白字符 | ||||
| insert_final_newline = true # 始终在文件末尾插入一个新行 | ||||
| [*] | ||||
| charset = utf-8 | ||||
| indent_style = tab | ||||
| indent_size = 2 | ||||
| end_of_line = lf | ||||
| trim_trailing_whitespace = true | ||||
| insert_final_newline = true | ||||
|   | ||||
							
								
								
									
										23
									
								
								.env
									
									
									
									
									
								
							
							
						
						| @@ -1,5 +1,20 @@ | ||||
| # 变量需要以VITE开头 | ||||
|  | ||||
| VITE_APP_TITLE=SoybeanAdmin | ||||
| VITE_APP_TITLE_LABEL=SoybeanAdmin | ||||
| VITE_BASE_URL=/ | ||||
|  | ||||
| VITE_APP_NAME=SoybeanAdmin | ||||
|  | ||||
| VITE_APP_TITLE=Soybean管理系统 | ||||
|  | ||||
| VITE_APP_DESC=SoybeanAdmin是一个中后台管理系统模版 | ||||
|  | ||||
| # 权限路由模式: static | dynamic | ||||
| VITE_AUTH_ROUTE_MODE=static | ||||
|  | ||||
| # 路由首页(根路由重定向), 用于static模式的权限路由,dynamic模式取决于后端返回的路由首页 | ||||
| VITE_ROUTE_HOME_PATH=/dashboard/analysis | ||||
|  | ||||
| # iconify图标作为组件的前缀 | ||||
| VITE_ICON_PREFIX=icon | ||||
|  | ||||
| # 本地SVG图标作为组件的前缀, 请注意一定要包含 VITE_ICON_PREFIX | ||||
| # 格式 {VITE_ICON_PREFIX}-{本地图标集合名称} | ||||
| VITE_ICON_LOCAL_PREFIX=icon-local | ||||
|   | ||||
							
								
								
									
										30
									
								
								.env-config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,30 @@ | ||||
| /** 请求服务的环境配置 */ | ||||
| type ServiceEnv = Record<ServiceEnvType, ServiceEnvConfig>; | ||||
|  | ||||
| /** 不同请求服务的环境配置 */ | ||||
| const serviceEnv: ServiceEnv = { | ||||
|   dev: { | ||||
|     url: 'http://localhost:8080' | ||||
|   }, | ||||
|   test: { | ||||
|     url: 'http://localhost:8080' | ||||
|   }, | ||||
|   prod: { | ||||
|     url: 'http://localhost:8080' | ||||
|   } | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * 获取当前环境模式下的请求服务的配置 | ||||
|  * @param env 环境 | ||||
|  */ | ||||
| export function getServiceEnvConfig(env: ImportMetaEnv): ServiceEnvConfigWithProxyPattern { | ||||
|   const { VITE_SERVICE_ENV = 'dev' } = env; | ||||
|  | ||||
|   const config = serviceEnv[VITE_SERVICE_ENV]; | ||||
|  | ||||
|   return { | ||||
|     ...config, | ||||
|     proxyPattern: '/proxy-pattern' | ||||
|   }; | ||||
| } | ||||
| @@ -1,4 +1,2 @@ | ||||
| #请求的环境 | ||||
| VITE_HTTP_ENV=DEV | ||||
| #请求地址 | ||||
| VITE_HTTP_URL=http://192.168.100.57/ | ||||
| VITE_HTTP_PROXY=Y | ||||
| VITE_SOYBEAN_ROUTE_PLUGIN=Y | ||||
|   | ||||
| @@ -1,4 +1,10 @@ | ||||
| #请求的环境 正式环境 | ||||
| VITE_HTTP_ENV=PROD | ||||
| #请求地址 | ||||
| VITE_HTTP_URL=http://119.23.220.176:17321 | ||||
| VITE_VISUALIZER=N | ||||
|  | ||||
| VITE_COMPRESS=N | ||||
|  | ||||
| # gzip | brotliCompress | deflate | deflateRaw | ||||
| VITE_COMPRESS_TYPE=gzip | ||||
|  | ||||
| VITE_PWA=N | ||||
|  | ||||
| VITE_PROD_MOCK=Y | ||||
|   | ||||
| @@ -1,3 +0,0 @@ | ||||
| VITE_HTTP_ENV=STAGING | ||||
| #请求地址 | ||||
| VITE_HTTP_URL=http://119.23.220.176:17321 | ||||
| @@ -1,14 +1,3 @@ | ||||
| *.sh | ||||
| node_modules | ||||
| lib | ||||
| *.md | ||||
| *.woff | ||||
| *.ttf | ||||
| .vscode | ||||
| .idea | ||||
| /dist/ | ||||
| /mock/ | ||||
| /public | ||||
| /docs | ||||
| .vscode | ||||
| .local | ||||
| !.env-config.ts | ||||
| router-page.d.ts | ||||
|  | ||||
|   | ||||
							
								
								
									
										175
									
								
								.eslintrc.js
									
									
									
									
									
								
							
							
						
						| @@ -1,52 +1,133 @@ | ||||
| module.exports = { | ||||
|   env: { | ||||
|     browser: true, | ||||
|     es2021: true | ||||
|   }, | ||||
|   globals: { | ||||
|     defineProps: 'readonly', | ||||
|     defineEmits: 'readonly', | ||||
|     defineExpose: 'readonly', | ||||
|     withDefaults: 'readonly', | ||||
|     PROJECT_BUILD_TIME: 'readonly', | ||||
|     AMap: 'readonly', | ||||
|     BMap: 'readonly', | ||||
|     TMap: 'readonly' | ||||
|   }, | ||||
|   parser: 'vue-eslint-parser', | ||||
|   parserOptions: { | ||||
|     ecmaVersion: 12, | ||||
|     parser: '@typescript-eslint/parser', | ||||
|     sourceType: 'module' | ||||
|   }, | ||||
|   plugins: ['vue', '@typescript-eslint'], | ||||
|   extends: [ | ||||
|     'plugin:vue/vue3-recommended', | ||||
|     'airbnb-base', | ||||
|     '@vue/typescript/recommended', | ||||
|     'plugin:prettier/recommended', | ||||
|     '@vue/prettier/@typescript-eslint' | ||||
|   extends: ['soybeanjs/vue'], | ||||
|   overrides: [ | ||||
|     { | ||||
|       files: ['./scripts/*.ts'], | ||||
|       rules: { | ||||
|         'no-unused-expressions': 'off' | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       files: ['*.vue'], | ||||
|       rules: { | ||||
|         'no-undef': 'off', // use tsc to check the ts code of the vue | ||||
|         'vue/no-setup-props-destructure': 'off' // wait to fix this rule | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   settings: { | ||||
|     'import/core-modules': ['uno.css', '~icons/*', 'virtual:svg-icons-register'] | ||||
|   }, | ||||
|   rules: { | ||||
|     'no-unused-vars': 'off', | ||||
|     'import/extensions': 'off', | ||||
|     'import/no-extraneous-dependencies': 'off', | ||||
|     'import/no-unresolved': 0, | ||||
|     'no-shadow': 0, | ||||
|     'import/prefer-default-export': 0, | ||||
|     'no-use-before-define': 'off', | ||||
|     'vue/multi-word-component-names': 0, | ||||
|     'max-classes-per-file': 0, | ||||
|     '@typescript-eslint/no-explicit-any': 0, | ||||
|     '@typescript-eslint/no-inferrable-types': 0, | ||||
|     '@typescript-eslint/ban-ts-ignore': 'off', | ||||
|     '@typescript-eslint/ban-types': 'off', | ||||
|     '@typescript-eslint/no-var-requires': 'off', | ||||
|     '@typescript-eslint/explicit-module-boundary-types': 'off', | ||||
|     '@typescript-eslint/explicit-function-return-type': 'off', | ||||
|     '@typescript-eslint/no-empty-function': 'off', | ||||
|     '@typescript-eslint/no-non-null-assertion': 'off', | ||||
|     '@typescript-eslint/no-unused-vars': ['warn', { ignoreRestSiblings: true }], | ||||
|     '@typescript-eslint/no-use-before-define': ['error', { classes: true, functions: false, typedefs: false }] | ||||
|     'import/order': [ | ||||
|       'error', | ||||
|       { | ||||
|         'newlines-between': 'never', | ||||
|         groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], | ||||
|         pathGroups: [ | ||||
|           { | ||||
|             pattern: 'vue', | ||||
|             group: 'external', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: 'vue-router', | ||||
|             group: 'external', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: 'pinia', | ||||
|             group: 'external', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: 'naive-ui', | ||||
|             group: 'external', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/constants', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/config', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/settings', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/plugins', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/layouts', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/views', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/components', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/router', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/service', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/store', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/context', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/composables', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/hooks', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/utils', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/assets', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           }, | ||||
|           { | ||||
|             pattern: '@/**', | ||||
|             group: 'internal', | ||||
|             position: 'before' | ||||
|           } | ||||
|         ], | ||||
|         pathGroupsExcludedImportTypes: ['vue', 'vue-router', 'pinia', 'naive-ui'] | ||||
|       } | ||||
|     ] | ||||
|   } | ||||
| }; | ||||
|   | ||||
							
								
								
									
										17
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| "*.vue"    eol=lf | ||||
| "*.js"     eol=lf | ||||
| "*.ts"     eol=lf | ||||
| "*.jsx"    eol=lf | ||||
| "*.tsx"    eol=lf | ||||
| "*.cjs"    eol=lf | ||||
| "*.cts"    eol=lf | ||||
| "*.mjs"    eol=lf | ||||
| "*.mts"    eol=lf | ||||
| "*.json"   eol=lf | ||||
| "*.html"   eol=lf | ||||
| "*.css"    eol=lf | ||||
| "*.less"   eol=lf | ||||
| "*.scss"   eol=lf | ||||
| "*.sass"   eol=lf | ||||
| "*.styl"   eol=lf | ||||
| "*.md"   eol=lf | ||||
							
								
								
									
										90
									
								
								.github/ISSUE_TEMPLATE/bug-report.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,90 @@ | ||||
| name: Bug提交 | ||||
| description: 在使用软件或功能的过程中遇到了错误 | ||||
| title: '[Bug]: ' | ||||
| labels: [ "bug?" ] | ||||
|  | ||||
| body: | ||||
|   - type: markdown | ||||
|     attributes: | ||||
|       value: | | ||||
|         ## 请按照以下要求进行提交 | ||||
|         ### 1. 提交后需要指定标签和截止时间。 | ||||
|         --- | ||||
|  | ||||
|   - type: markdown | ||||
|     attributes: | ||||
|       value: | | ||||
|         ## 环境信息 | ||||
|         请根据实际使用环境修改以下信息。 | ||||
|  | ||||
|   - type: input | ||||
|     id: env-program-ver | ||||
|     attributes: | ||||
|       label: 软件版本 | ||||
|     validations: | ||||
|       required: true | ||||
|  | ||||
|   - type: dropdown | ||||
|     id: env-vm-ver | ||||
|     attributes: | ||||
|       label: 运行环境 | ||||
|       description: 选择运行软件的系统版本 | ||||
|       options: | ||||
|         - Windows (64) | ||||
|         - Windows (32/x84) | ||||
|         - MacOS | ||||
|         - Linux | ||||
|         - Ubuntu | ||||
|         - CentOS | ||||
|         - ArchLinux | ||||
|         - UNIX (Android) | ||||
|         - 其它(请在下方说明) | ||||
|     validations: | ||||
|       required: true | ||||
|  | ||||
|   - type: dropdown | ||||
|     id: env-vm-arch | ||||
|     attributes: | ||||
|       label: 运行架构 | ||||
|       description: (可选) 选择运行软件的系统架构 | ||||
|       options: | ||||
|         - AMD64 | ||||
|         - x86 | ||||
|         - ARM [32] (别名:AArch32 / ARMv7) | ||||
|         - ARM [64] (别名:AArch64 / ARMv8) | ||||
|         - 其它 | ||||
|  | ||||
|   - type: textarea | ||||
|     id: reproduce-steps | ||||
|     attributes: | ||||
|       label: 重现步骤 | ||||
|       description: | | ||||
|         我们需要执行哪些操作才能让 bug 出现? | ||||
|         简洁清晰的重现步骤能够帮助我们更迅速地定位问题所在。 | ||||
|     validations: | ||||
|       required: true | ||||
|  | ||||
|   - type: textarea | ||||
|     id: expected | ||||
|     attributes: | ||||
|       label: 期望的结果是什么? | ||||
|     validations: | ||||
|       required: true | ||||
|  | ||||
|   - type: textarea | ||||
|     id: actual | ||||
|     attributes: | ||||
|       label: 实际的结果是什么? | ||||
|     validations: | ||||
|       required: true | ||||
|  | ||||
|   - type: textarea | ||||
|     id: logging | ||||
|     attributes: | ||||
|       label: 日志记录(可选) | ||||
|       render: golang | ||||
|  | ||||
|   - type: textarea | ||||
|     id: extra-desc | ||||
|     attributes: | ||||
|       label: 补充说明(可选) | ||||
							
								
								
									
										11
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| ## Pull Request 详情 | ||||
|  | ||||
| 请根据实际使用情况修改以下信息。 | ||||
|  | ||||
| ## 版本信息 | ||||
|  | ||||
| ## 解决了哪些问题 | ||||
|  | ||||
| ## 是否关闭了某个 Issue | ||||
|  | ||||
| Closes # | ||||
							
								
								
									
										30
									
								
								.github/workflows/linter.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,30 @@ | ||||
| --- | ||||
| name: Lint Code | ||||
|  | ||||
| permissions: | ||||
|   contents: write | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|     branches: [main] | ||||
|  | ||||
| jobs: | ||||
|   lint: | ||||
|     name: Lint All Code | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - name: Checkout Code | ||||
|         uses: actions/checkout@v3 | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|  | ||||
|       - name: Lint Code Base | ||||
|         uses: github/super-linter@v4 | ||||
|         env: | ||||
|           VALIDATE_ALL_CODEBASE: false | ||||
|           DEFAULT_BRANCH: main | ||||
|           # To change branch master or main | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|           FILTER_REGEX_EXCLUDE: (docs|.github) | ||||
|           VALIDATE_MARKDOWN: false | ||||
							
								
								
									
										25
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | ||||
| name: Release | ||||
|  | ||||
| permissions: | ||||
|   contents: write | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - "v*" | ||||
|  | ||||
| jobs: | ||||
|   release: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|  | ||||
|       - uses: actions/setup-node@v3 | ||||
|         with: | ||||
|           node-version: 16.x | ||||
|  | ||||
|       - run: npx githublogen | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} | ||||
							
								
								
									
										32
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,7 +1,37 @@ | ||||
| # Logs | ||||
| logs | ||||
| *.log | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| pnpm-debug.log* | ||||
| lerna-debug.log* | ||||
|  | ||||
| node_modules | ||||
| .DS_Store | ||||
| dist | ||||
| dist-ssr | ||||
| dist.zip | ||||
| coverage | ||||
| *.local | ||||
| .idea | ||||
| stats.html | ||||
|  | ||||
| /cypress/videos/ | ||||
| /cypress/screenshots/ | ||||
|  | ||||
| # Editor directories and files | ||||
| .vscode/* | ||||
| !.vscode/extensions.json | ||||
| !.vscode/launch.json | ||||
| !.vscode/settings.json | ||||
| .idea | ||||
| *.suo | ||||
| *.ntvs* | ||||
| *.njsproj | ||||
| *.sln | ||||
| *.sw? | ||||
|  | ||||
| /src/typings/components.d.ts | ||||
| package-lock.json | ||||
| yarn.lock | ||||
| pnpm-lock.yaml | ||||
|   | ||||
							
								
								
									
										1
									
								
								.husky/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1 +0,0 @@ | ||||
| _ | ||||
| @@ -1,4 +0,0 @@ | ||||
| #!/bin/sh | ||||
| . "$(dirname "$0")/_/husky.sh" | ||||
|  | ||||
| npx --no-install commitlint --edit | ||||
| @@ -1,4 +0,0 @@ | ||||
| #!/bin/sh | ||||
| . "$(dirname "$0")/_/husky.sh" | ||||
|  | ||||
| pnpm lint:fix | ||||
							
								
								
									
										2
									
								
								.npmrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,2 @@ | ||||
| registry=https://registry.npmmirror.com/ | ||||
| shamefully-hoist=true | ||||
| @@ -1,19 +0,0 @@ | ||||
| module.exports = { | ||||
|   printWidth: 120, // 超过最大值换行 | ||||
|   tabWidth: 2, // 缩进字节数 | ||||
|   useTabs: false, // 缩进使用tab,不使用空格 | ||||
|   semi: true, // 句尾添加分号 | ||||
|   singleQuote: true, // 使用单引号代替双引号 | ||||
|   proseWrap: 'preserve', // 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行 | ||||
|   arrowParens: 'avoid', //  (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 | ||||
|   bracketSpacing: true, // 在对象,数组括号与文字之间加空格 "{ foo: bar }" | ||||
|   endOfLine: 'auto', // 结尾是 \n \r \n\r auto | ||||
|   eslintIntegration: false, //不让prettier使用eslint的代码格式进行校验 | ||||
|   htmlWhitespaceSensitivity: 'ignore', // 指定HTML文件的全局空白区域敏感度 有效选项:"css"- 遵守CSS display属性的默认值。"strict" - 空格被认为是敏感的。"ignore" - 空格被认为是不敏感的。html 中空格也会占位,影响布局,prettier 格式化的时候可能会将文本换行,造成布局错乱 | ||||
|   ignorePath: '.prettierignore', // 不使用prettier格式化的文件填写在项目的.prettierignore文件中 | ||||
|   jsxSingleQuote: false, // 在jsx中使用单引号代替双引号 | ||||
|   requireConfig: false, // Require a 'prettierconfig' to format prettier | ||||
|   stylelintIntegration: false, //不让prettier使用stylelint的代码格式进行校验 | ||||
|   trailingComma: 'none', // 在对象或数组最后一个元素后面是否加逗号(在ES5中加尾逗号) | ||||
|   tslintIntegration: false // 不让prettier使用tslint的代码格式进行校验 | ||||
| } | ||||
							
								
								
									
										49
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,34 +1,19 @@ | ||||
| { | ||||
| 	"recommendations": [ | ||||
| 		"formulahendry.auto-close-tag", | ||||
| 		"formulahendry.auto-complete-tag", | ||||
| 		"steoates.autoimport", | ||||
| 		"formulahendry.auto-rename-tag", | ||||
| 		"coenraads.bracket-pair-colorizer", | ||||
| 		"pranaygp.vscode-css-peek", | ||||
| 		"mikestead.dotenv", | ||||
| 		"editorconfig.editorconfig", | ||||
| 		"dsznajder.es7-react-js-snippets", | ||||
| 		"dbaeumer.vscode-eslint", | ||||
| 		"miguelsolorio.fluent-icons", | ||||
| 		"mhutchie.git-graph", | ||||
| 		"eamodio.gitlens", | ||||
| 		"lokalise.i18n-ally", | ||||
| 		"afzalsayed96.icones", | ||||
| 		"antfu.iconify", | ||||
| 		"kisstkondoros.vscode-gutter-preview", | ||||
| 		"xabikos.javascriptsnippets", | ||||
| 		"whtouche.vscode-js-console-utils", | ||||
| 		"ritwickdey.liveserver", | ||||
| 		"yzhang.markdown-all-in-one", | ||||
| 		"pkief.material-icon-theme", | ||||
| 		"zhuangtongfa.material-theme", | ||||
| 		"christian-kohler.path-intellisense", | ||||
| 		"esbenp.prettier-vscode", | ||||
| 		"johnsoncodehk.volar", | ||||
| 		"johnsoncodehk.vscode-typescript-vue-plugin", | ||||
| 		"dariofuzinato.vue-peek", | ||||
| 		"wscats.vue", | ||||
| 		"voorjaar.windicss-intellisense" | ||||
| 	] | ||||
|   "recommendations": [ | ||||
|     "antfu.unocss", | ||||
|     "dbaeumer.vscode-eslint", | ||||
|     "editorconfig.editorconfig", | ||||
|     "esbenp.prettier-vscode", | ||||
|     "formulahendry.auto-complete-tag", | ||||
|     "formulahendry.auto-close-tag", | ||||
|     "formulahendry.auto-rename-tag", | ||||
|     "kisstkondoros.vscode-gutter-preview", | ||||
|     "lokalise.i18n-ally", | ||||
|     "mariusalchimavicius.json-to-ts", | ||||
|     "mhutchie.git-graph", | ||||
|     "sdras.vue-vscode-snippets", | ||||
|     "streetsidesoftware.code-spell-checker", | ||||
|     "vue.volar", | ||||
|     "vue.vscode-typescript-vue-plugin" | ||||
|   ] | ||||
| } | ||||
|   | ||||
							
								
								
									
										20
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| { | ||||
|   "version": "0.2.0", | ||||
|   "configurations": [ | ||||
|     { | ||||
|       "type": "chrome", | ||||
|       "request": "launch", | ||||
|       "name": "Vue debugger", | ||||
|       "url": "http://localhost:3200", | ||||
|       "webRoot": "${workspaceFolder}" | ||||
|     }, | ||||
|     { | ||||
|       "type": "node", | ||||
|       "request": "launch", | ||||
|       "name": "TS debugger", | ||||
|       "skipFiles": ["<node_internals>/**"], | ||||
|       "runtimeArgs": ["--loader", "tsx"], | ||||
|       "program": "${relativeFile}" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										140
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,68 +1,76 @@ | ||||
| { | ||||
| 	"editor.quickSuggestions": { | ||||
| 		"strings": true | ||||
| 	}, | ||||
| 	"workbench.iconTheme": "material-icon-theme", | ||||
| 	"workbench.colorTheme": "One Dark Pro", | ||||
| 	"editor.tabSize": 2, | ||||
| 	"editor.fontLigatures": true, | ||||
| 	"editor.codeActionsOnSave": { | ||||
| 		"source.fixAll.eslint": true | ||||
| 	}, | ||||
| 	"git.enableSmartCommit": true, | ||||
| 	"path-intellisense.mappings": { | ||||
| 		"@": "${workspaceFolder}/src", | ||||
| 		"~@": "${workspaceFolder}/src", | ||||
| 	}, | ||||
| 	"gutterpreview.paths": { | ||||
| 		"@": "/src", | ||||
| 		"~@": "/src" | ||||
| 	}, | ||||
| 	"terminal.integrated.cursorStyle": "line", | ||||
| 	"files.associations": { | ||||
| 		"*.env.*": "dotenv" | ||||
| 	}, | ||||
| 	"[jsonc]": { | ||||
| 		"editor.defaultFormatter": "vscode.json-language-features" | ||||
| 	}, | ||||
| 	"[json]": { | ||||
| 		"editor.defaultFormatter": "vscode.json-language-features" | ||||
| 	}, | ||||
| 	"[javascript]": { | ||||
| 		"editor.defaultFormatter": "esbenp.prettier-vscode" | ||||
| 	}, | ||||
| 	"javascript.updateImportsOnFileMove.enabled": "always", | ||||
| 	"[javascriptreact]": { | ||||
| 		"editor.defaultFormatter": "esbenp.prettier-vscode" | ||||
| 	}, | ||||
| 	"terminal.integrated.fontSize": 14, | ||||
| 	"terminal.integrated.fontWeight": 500, | ||||
| 	"i18n-ally.displayLanguage": "zh", | ||||
| 	"[html]": { | ||||
| 		"editor.defaultFormatter": "esbenp.prettier-vscode" | ||||
| 	}, | ||||
| 	"[typescript]": { | ||||
| 		"editor.defaultFormatter": "esbenp.prettier-vscode" | ||||
| 	}, | ||||
| 	"[vue]": { | ||||
| 		"editor.defaultFormatter": "johnsoncodehk.volar" | ||||
| 	}, | ||||
| 	"terminal.integrated.tabs.enabled": true, | ||||
| 	"[typescriptreact]": { | ||||
| 		"editor.defaultFormatter": "esbenp.prettier-vscode" | ||||
| 	}, | ||||
| 	"[markdown]": { | ||||
| 		"editor.defaultFormatter": "yzhang.markdown-all-in-one" | ||||
| 	}, | ||||
| 	"workbench.productIconTheme": "fluent-icons", | ||||
| 	"vue3snippets.enable-compile-vue-file-on-did-save-code": false, | ||||
| 	"editor.formatOnSave": false, | ||||
| 	"material-icon-theme.activeIconPack": "angular", | ||||
| 	"material-icon-theme.files.associations": {}, | ||||
| 	"material-icon-theme.folders.associations": { | ||||
| 		"enum": "typescript", | ||||
| 		"store": "context", | ||||
| 		"composables": "hook", | ||||
| 		"business": "core", | ||||
| 	} | ||||
|   "cSpell.ignorePaths": [ | ||||
|     "package.json", | ||||
|     "package-lock.json", | ||||
|     "yarn.lock", | ||||
|     "pnpm-lock.yaml", | ||||
|     "node_modules", | ||||
|     "vscode-extension", | ||||
|     ".git/objects", | ||||
|     ".vscode", | ||||
|     ".vscode-insiders", | ||||
|     "CHANGELOG.md", | ||||
|     "dist", | ||||
|     "public", | ||||
|     "styles" | ||||
|   ], | ||||
|   "cSpell.words": [ | ||||
|     "AMAP", | ||||
|     "antdesign", | ||||
|     "antv", | ||||
|     "apacheecharts", | ||||
|     "areaspline", | ||||
|     "bmapgl", | ||||
|     "colord", | ||||
|     "echarts", | ||||
|     "gitee", | ||||
|     "gridicons", | ||||
|     "iconify", | ||||
|     "jsapi", | ||||
|     "naiveui", | ||||
|     "Popconfirm", | ||||
|     "Posva", | ||||
|     "Shenzhen", | ||||
|     "Sider", | ||||
|     "tauri", | ||||
|     "unocss", | ||||
|     "unplugin", | ||||
|     "vditor", | ||||
|     "VERCEL", | ||||
|     "Vite", | ||||
|     "vitejs", | ||||
|     "vuedraggable", | ||||
|     "vueuse", | ||||
|     "wangeditor", | ||||
|     "wechat", | ||||
|     "xgplayer", | ||||
|     "yanbowe", | ||||
|     "ភាសាខ្មែរ" | ||||
|   ], | ||||
|   "editor.codeActionsOnSave": { | ||||
|     "source.fixAll.eslint": true | ||||
|   }, | ||||
|   "editor.fontLigatures": true, | ||||
|   "editor.formatOnSave": false, | ||||
|   "editor.quickSuggestions": { | ||||
|     "strings": true | ||||
|   }, | ||||
|   "editor.tabSize": 2, | ||||
|   "eslint.validate": ["json"], | ||||
|   "files.associations": { | ||||
|     "*.env.*": "dotenv", | ||||
|     "*.svg": "html" | ||||
|   }, | ||||
|   "files.eol": "\n", | ||||
|   "i18n-ally.displayLanguage": "zh-CN", | ||||
|   "i18n-ally.enabledParsers": ["ts"], | ||||
|   "i18n-ally.enabledFrameworks": ["vue"], | ||||
|   "i18n-ally.editor.preferEditor": true, | ||||
|   "i18n-ally.keystyle": "nested", | ||||
|   "i18n-ally.localesPaths": ["src/locales/lang"], | ||||
|   "material-icon-theme.activeIconPack": "vue", | ||||
|   "[html][css][less][scss][sass][markdown][yaml][yml][jsonc]": { | ||||
|     "editor.defaultFormatter": "esbenp.prettier-vscode", | ||||
|     "editor.formatOnSave": true | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										1372
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
							
								
								
									
										16
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | ||||
| ImageTag ?=v0.9.6 | ||||
| SoybeanAdminImg ?= soybeanjs/soybean-admin:$(ImageTag) | ||||
|  | ||||
| VERSION=$(shell git rev-parse --short HEAD) | ||||
|  | ||||
| soybean-admin: soybean-admin-build soybean-admin-push | ||||
|  | ||||
| soybean-admin-build: | ||||
| 	docker build --build-arg version=$(VERSION) -t ${SoybeanAdminImg} -f docker/Dockerfile . | ||||
|  | ||||
| soybean-admin-push: | ||||
| 	docker push ${SoybeanAdminImg} | ||||
|  | ||||
| # run tauri app: | ||||
| run: | ||||
| 	pnpm tauri dev | ||||
							
								
								
									
										159
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -1,63 +1,99 @@ | ||||
| <div align="center"> | ||||
|   <a href="https://github.com/honghuangdc/soybean-admin"> | ||||
|     <img alt="SoybeanAdmin Logo" width="200" height="200" src="https://s3.bmp.ovh/imgs/2021/09/088571214c76b1e5.png"> | ||||
|   </a><br /><br /> | ||||
| 	<img src="./public/favicon.svg" style="width: 160px;"/> | ||||
| 	<h1>Soybean Admin</h1> | ||||
|   <br /> | ||||
| </div> | ||||
|  | ||||
| [](LICENSE) | ||||
|  | ||||
|  | ||||
| [](./LICENSE)   | ||||
|  | ||||
| ## 简介 | ||||
|  | ||||
| Soybean Admin 是一个基于 Vue3、Vite、Naive UI、TypeScript 的免费中后台模版,它使用了最新的前端技术栈,内置丰富的插件,有着极高的代码规范,开箱即用的中后台前端解决方案,也可用于学习参考。 | ||||
| [Soybean Admin](https://github.com/honghuangdc/soybean-admin) 是一个基于 Vue3、Vite3、TypeScript、NaiveUI、Pinia 和 UnoCSS 的清新优雅的中后台模版,它使用了最新流行的前端技术栈,内置丰富的主题配置,有着极高的代码规范,基于文件的路由系统以及基于 Mock 的动态权限路由,开箱即用的中后台前端解决方案,也可用于学习参考。 | ||||
|  | ||||
| ## 特性 | ||||
|  | ||||
| - **最新技术栈**:使用 Vue3/vite2 等前端前沿技术开发, 使用高效率的npm包管理器pnpm | ||||
| - **最新流行技术栈**:使用 Vue3/Vite 等前端前沿技术开发, 使用高效率的 npm 包管理器 pnpm | ||||
| - **TypeScript**: 应用程序级 JavaScript 的语言 | ||||
| - **主题**:丰富可配置的主题 | ||||
| - **主题**:丰富可配置的主题、暗黑模式,基于原子 css 框架 - UnoCss 的动态主题颜色 | ||||
| - **代码规范**:丰富的规范插件及极高的代码规范 | ||||
| - **路由配置**:简易的路由配置 | ||||
| - **文件路由系统**:基于文件的路由系统,根据页面文件自动生成路由声明、路由导入和路由模块 | ||||
| - **权限路由**:提供前端静态和后端动态两种路由模式,基于 mock 的动态路由能快速实现后端动态路由 | ||||
| - **请求函数**:基于 axios 的完善的请求函数封装,提供 Promise 和 hooks 两种请求函数,加入请求结果数据转换的适配器 | ||||
|  | ||||
| ## 预览 | ||||
| ## SoybeanJS 工具库 | ||||
|  | ||||
| - [soybean-admin](https://soybean.pro/) | ||||
| - [@soybeanjs/cli](https://github.com/soybeanjs/cli): SoybeanJS 命令行工具,包含发布、git 和依赖等相关的实用命令 | ||||
| - [@soybeanjs/changelog](https://github.com/soybeanjs/changelog): 根据 git tags 和 commits 生成 changelog [示例](./CHANGELOG.md) | ||||
| - [eslint-config-soybeanjs](https://github.com/soybeanjs/eslint-config): SoybeanJS 的 eslint 预设配置 | ||||
| - [@soybeanjs/materials](https://github.com/soybeanjs/materials): SoybeanJS 的物料仓库 | ||||
| - [@soybeanjs/vite-plugin-vue-page-route](https://github.com/soybeanjs/vite-plugin-vue-page-route): SoybeanAdmin 的路由插件 | ||||
|  | ||||
| <p align="center"> | ||||
| ## 基于 SoybeanAdmin 二次开发的项目 | ||||
|  | ||||
|     <img alt="SoybeanAdmin" width="100%" src="https://raw.githubusercontent.com/honghuangdc/project-assets/main/img/02.png"> | ||||
| - [electron-mock-admin](https://github.com/lixin59/electron-mock-api): 一个 Mock Api 管理系统,帮助前端开发伙伴快速实现接口的 mock。 | ||||
| - [T-Shell](https://github.com/TheBlindM/T-Shell): 是一个可配置命令提示的终端模拟器和 SSH 客户端。 | ||||
|  | ||||
|     <img alt="SoybeanAdmin" width="100%" src="https://raw.githubusercontent.com/honghuangdc/project-assets/main/img/03.png"> | ||||
| ## 在线预览 | ||||
|  | ||||
|     <img alt="SoybeanAdmin" width="100%" src="https://raw.githubusercontent.com/honghuangdc/project-assets/main/img/01.png"> | ||||
|  | ||||
| <img alt="SoybeanAdmin" width="100%" src="https://raw.githubusercontent.com/honghuangdc/project-assets/main/img/04.png"> | ||||
|  | ||||
| <img alt="SoybeanAdmin" width="100%" src="https://raw.githubusercontent.com/honghuangdc/project-assets/main/img/05.png"> | ||||
|  | ||||
| </p> | ||||
|  | ||||
| ### 代码仓库 | ||||
|  | ||||
| **github**:https://github.com/honghuangdc/soybean-admin | ||||
|  | ||||
| **gitee**:https://gitee.com/honghuangdc/soybean-admin | ||||
|  | ||||
| ### 使用 Gitpod | ||||
|  | ||||
| 在 Gitpod(适用于 GitHub 的免费在线开发环境)中打开项目,并立即开始编码. | ||||
|  | ||||
| [](https://gitpod.io/#https://github.com/honghuangdc/soybean-admin) | ||||
| - [Soybean Admin 预览地址](https://admin.soybeanjs.cn/) | ||||
|  | ||||
| ## 文档 | ||||
|  | ||||
| [项目相关文档](./doc) | ||||
| - [项目文档预览地址](https://admin-docs.soybeanjs.cn/) | ||||
|  | ||||
| ## 代码仓库 | ||||
|  | ||||
| | 仓库           | GitHub 地址                                                                   | gitee 镜像                                                                   | 预览                                                      | | ||||
| | -------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------- | | ||||
| | soybean-admin  | [GitHub](https://github.com/honghuangdc/soybean-admin)                        | [gitee](https://gitee.com/honghuangdc/soybean-admin)                         | [预览](https://admin.soybeanjs.cn/)                       | | ||||
| | tauri 版       | [tauri 版](https://github.com/honghuangdc/soybean-admin/tree/tauri)           | [tauri 版](https://gitee.com/honghuangdc/soybean-admin/tree/tauri)           |                                                           | | ||||
| | 精简版         | [精简版](https://github.com/honghuangdc/soybean-admin/tree/thin)              | [精简版](https://gitee.com/honghuangdc/soybean-admin/tree/thin)              |                                                           | | ||||
| | 集成 fast-crud | [集成 fast-crud](https://github.com/honghuangdc/soybean-admin/tree/fast-crud) | [集成 fast-crud](https://gitee.com/honghuangdc/soybean-admin/tree/fast-crud) | [预览](http://fast-crud.docmirror.cn/soybean/#/crud/demo) | | ||||
|  | ||||
| ## 更新日志 | ||||
|  | ||||
| [CHANGELOG](./CHANGELOG.md) | ||||
|  | ||||
| ## 后端服务 | ||||
|  | ||||
| - [soybean-admin-java](https://github.com/honghuangdc/soybean-admin-java) | ||||
|  | ||||
| ## 项目示例图 | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| <div align="center"> | ||||
| 	<img style="width:380px;margin-right:18px;border:1px solid #dedede;" src="https://s2.loli.net/2023/06/07/A5Nonc9vI6pB1lr.png" /> | ||||
| 	  | ||||
| 	<img style="width:380px;border:1px solid #dedede;" src="https://s2.loli.net/2023/06/07/VwBjqEhTke3OxXF.png" /> | ||||
| </div> | ||||
|  | ||||
| ## 安装使用 | ||||
|  | ||||
| - 环境配置 | ||||
|   **本地环境需要安装 pnpm 7.x 、Node.js 14.18+ 和 Git** | ||||
|  | ||||
| - 克隆代码 | ||||
|  | ||||
| ```bash | ||||
| @@ -82,19 +118,28 @@ pnpm dev | ||||
| pnpm build | ||||
| ``` | ||||
|  | ||||
| ## Docker 部署 | ||||
|  | ||||
| - Docker 部署 Soybean | ||||
|  | ||||
| ```bash | ||||
| docker build -t soybean-admin-image -f docker/Dockerfile . | ||||
| docker run -d -p 80:80 soybean-admin-image | ||||
| ``` | ||||
|  | ||||
| - 访问 SoybeanAdmin | ||||
|  | ||||
| 打开本地浏览器访问`http://localhost` | ||||
|  | ||||
| ## 如何贡献 | ||||
|  | ||||
| 非常欢迎您的加入 或者提交一个 Pull Request。 | ||||
|  | ||||
| ## Git 贡献提交规范 | ||||
|  | ||||
| 项目已经内置angular提交规范,通过git cz 代替git commit 命令即可。 | ||||
| 项目已经内置 Angular 提交规范,直接执行 commit 命令即可生成符合 Angular 提交规范的 commit。 | ||||
|  | ||||
| git cz命令需要全局安装 commitizen | ||||
|  | ||||
| ```bash | ||||
| pnpm i -g commitizen | ||||
| ``` | ||||
| 项目已用 simple-git-hooks 代替了 husky, 旧版本用了 husky,执行 pnpm soy init-simple-git-hooks 进行初始化配置 | ||||
|  | ||||
| ## 浏览器支持 | ||||
|  | ||||
| @@ -102,27 +147,35 @@ pnpm i -g commitizen | ||||
|  | ||||
| 支持现代浏览器, 不支持 IE | ||||
|  | ||||
| | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | | ||||
| | :-: | :-: | :-: | :-: | :-: | | ||||
| | not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | | ||||
| | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png" alt="IE" width="24px" height="24px"  />](http://godban.github.io/browsers-support-badges/)IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)Safari | | ||||
| | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | | ||||
| |                                                                                                                not support                                                                                                                |                                                                                          last 2 versions                                                                                          |                                                                                               last 2 versions                                                                                                |                                                                                             last 2 versions                                                                                              |                                                                                             last 2 versions                                                                                              | | ||||
|  | ||||
| ## 开源作者 | ||||
|  | ||||
| [@Soybean](https://github.com/honghuangdc) | ||||
|  | ||||
| ## 交流 | ||||
|  | ||||
| `Soybean Admin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供 QQ 交流群使用问题欢迎在群内提问。 | ||||
| `Soybean Admin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供微信和 QQ 交流群,使用问题欢迎在群内提问。 | ||||
|  | ||||
| - QQ 群 `711301266` | ||||
|  | ||||
|   <div style="text-align:left;"> | ||||
|     <img src="https://raw.githubusercontent.com/honghuangdc/project-assets/main/img/qq_qrcode.JPG" style="width:200px" /> | ||||
|   <div style="display:flex;"> | ||||
|   	<div style="padding-right:24px;"> | ||||
|   		<p>QQ交流群</p> | ||||
|       <img src="https://i.loli.net/2021/11/24/1J6REWXiHomU2kM.jpg" style="width:200px" /> | ||||
|   	</div> | ||||
| 		<div> | ||||
| 			<p>添加本人微信,欢迎来技术交流,业务咨询</p> | ||||
| 			<img src="https://s2.loli.net/2023/06/07/sVyCUFBvzQ9f5b7.jpg" style="width:200px" /> | ||||
| 		</div> | ||||
|   </div> | ||||
|  | ||||
|    | ||||
| ## 捐赠 | ||||
|  | ||||
| - 本人微信号:honghuangdc,欢迎来技术交流。 | ||||
| 如果你觉得这个项目对你有帮助,可以请 Soybean 喝杯饮料表示支持,Soybean 开源的动力离不开各位的支持和鼓励。 | ||||
|  | ||||
|  | ||||
|  | ||||
| ## License | ||||
|  | ||||
| [MIT © Soybean-2021](./LICENSE) | ||||
| 本项目基于[MIT © Soybean-2021](./LICENSE) 协议,仅供参考学习,商用时请保留作者的版权信息,作者不对软件做担保和负责。 | ||||
|   | ||||
| @@ -3,6 +3,6 @@ import dayjs from 'dayjs'; | ||||
| /** 项目构建时间 */ | ||||
| const PROJECT_BUILD_TIME = JSON.stringify(dayjs().format('YYYY-MM-DD HH:mm:ss')); | ||||
| 
 | ||||
| export default { | ||||
| export const viteDefine = { | ||||
|   PROJECT_BUILD_TIME | ||||
| }; | ||||
							
								
								
									
										2
									
								
								build/config/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,2 @@ | ||||
| export * from './define'; | ||||
| export * from './proxy'; | ||||
							
								
								
									
										20
									
								
								build/config/proxy.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| import type { ProxyOptions } from 'vite'; | ||||
|  | ||||
| /** | ||||
|  * 设置网络代理 | ||||
|  * @param isOpenProxy - 是否开启代理 | ||||
|  * @param envConfig - env环境配置 | ||||
|  */ | ||||
| export function createViteProxy(isOpenProxy: boolean, envConfig: ServiceEnvConfigWithProxyPattern) { | ||||
|   if (!isOpenProxy) return undefined; | ||||
|  | ||||
|   const proxy: Record<string, string | ProxyOptions> = { | ||||
|     [envConfig.proxyPattern]: { | ||||
|       target: envConfig.url, | ||||
|       changeOrigin: true, | ||||
|       rewrite: path => path.replace(new RegExp(`^${envConfig.proxyPattern}`), '') | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   return proxy; | ||||
| } | ||||
							
								
								
									
										5
									
								
								build/env/index.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,5 +0,0 @@ | ||||
| import dotenv from 'dotenv'; | ||||
|  | ||||
| const { parsed: viteEnv } = dotenv.config(); // 加载环境 | ||||
|  | ||||
| export default viteEnv; | ||||
| @@ -1,5 +1,3 @@ | ||||
| import viteEnv from './env'; | ||||
| import plugins from './plugins'; | ||||
| import define from './define'; | ||||
|  | ||||
| export { viteEnv, plugins, define }; | ||||
| export * from './plugins'; | ||||
| export * from './config'; | ||||
| export * from './utils'; | ||||
|   | ||||
							
								
								
									
										6
									
								
								build/plugins/compress.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | ||||
| import ViteCompression from 'vite-plugin-compression'; | ||||
|  | ||||
| export default (viteEnv: ImportMetaEnv) => { | ||||
|   const { VITE_COMPRESS_TYPE = 'gzip' } = viteEnv; | ||||
|   return ViteCompression({ algorithm: VITE_COMPRESS_TYPE }); | ||||
| }; | ||||
| @@ -1,12 +0,0 @@ | ||||
| import { minifyHtml, injectHtml } from 'vite-plugin-html'; // html插件(使用变量、压缩) | ||||
| import viteEnv from '../env'; | ||||
|  | ||||
| export default [ | ||||
|   minifyHtml(), | ||||
|   injectHtml({ | ||||
|     injectData: { | ||||
|       title: viteEnv.VITE_APP_TITLE, | ||||
|       appName: viteEnv.VITE_APP_TITLE_LABEL | ||||
|     } | ||||
|   }) | ||||
| ]; | ||||
| @@ -1,10 +0,0 @@ | ||||
| import Icons from 'unplugin-icons/vite'; // iconify图标 | ||||
| import IconsResolver from 'unplugin-icons/resolver'; | ||||
| import Components from 'unplugin-vue-components/vite'; // 从指定目录自动导入组件 | ||||
|  | ||||
| export default [ | ||||
|   Components({ | ||||
|     resolvers: [IconsResolver({ componentPrefix: 'icon' })] | ||||
|   }), | ||||
|   Icons() | ||||
| ]; | ||||
| @@ -1,9 +1,56 @@ | ||||
| import vue from './vue'; | ||||
| import html from './html'; | ||||
| import iconify from './iconify'; | ||||
| import windicss from './windicss'; | ||||
| import type { PluginOption } from 'vite'; | ||||
| import vue from '@vitejs/plugin-vue'; | ||||
| import vueJsx from '@vitejs/plugin-vue-jsx'; | ||||
| import unocss from '@unocss/vite'; | ||||
| import progress from 'vite-plugin-progress'; | ||||
| import VueDevtools from 'vite-plugin-vue-devtools'; | ||||
| import pageRoute from '@soybeanjs/vite-plugin-vue-page-route'; | ||||
| import { webUpdateNotice } from '@plugin-web-update-notification/vite'; | ||||
| import unplugin from './unplugin'; | ||||
| import mock from './mock'; | ||||
| import visualizer from './visualizer'; | ||||
| import compress from './compress'; | ||||
| import pwa from './pwa'; | ||||
|  | ||||
| const plugins = [vue, ...html, ...iconify, windicss, visualizer]; | ||||
| /** | ||||
|  * vite插件 | ||||
|  * @param viteEnv - 环境变量配置 | ||||
|  */ | ||||
| export function setupVitePlugins(viteEnv: ImportMetaEnv): (PluginOption | PluginOption[])[] { | ||||
|   const plugins = [ | ||||
|     vue({ | ||||
|       script: { | ||||
|         defineModel: true | ||||
|       } | ||||
|     }), | ||||
|     vueJsx(), | ||||
|     VueDevtools(), | ||||
|     ...unplugin(viteEnv), | ||||
|     unocss(), | ||||
|     mock(viteEnv), | ||||
|     progress(), | ||||
|     webUpdateNotice({ | ||||
|       notificationProps: { | ||||
|         title: '👋 有新版本了', | ||||
|         description: '点击刷新页面获取最新版本', | ||||
|         buttonText: '刷新', | ||||
|         dismissButtonText: '忽略' | ||||
|       } | ||||
|     }) | ||||
|   ]; | ||||
|  | ||||
| export default plugins; | ||||
|   if (viteEnv.VITE_VISUALIZER === 'Y') { | ||||
|     plugins.push(visualizer as PluginOption); | ||||
|   } | ||||
|   if (viteEnv.VITE_COMPRESS === 'Y') { | ||||
|     plugins.push(compress(viteEnv)); | ||||
|   } | ||||
|   if (viteEnv.VITE_PWA === 'Y' || viteEnv.VITE_VERCEL === 'Y') { | ||||
|     plugins.push(pwa()); | ||||
|   } | ||||
|   if (viteEnv.VITE_SOYBEAN_ROUTE_PLUGIN === 'Y') { | ||||
|     plugins.push(pageRoute()); | ||||
|   } | ||||
|  | ||||
|   return plugins; | ||||
| } | ||||
|   | ||||
							
								
								
									
										14
									
								
								build/plugins/mock.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| import { viteMockServe } from 'vite-plugin-mock'; | ||||
|  | ||||
| export default (viteEnv: ImportMetaEnv) => { | ||||
|   const prodMock = viteEnv.VITE_PROD_MOCK === 'Y'; | ||||
|  | ||||
|   return viteMockServe({ | ||||
|     mockPath: 'mock', | ||||
|     prodEnabled: prodMock, | ||||
|     injectCode: ` | ||||
| 			import { setupMockServer } from '../mock'; | ||||
| 			setupMockServer(); | ||||
| 		` | ||||
|   }); | ||||
| }; | ||||
							
								
								
									
										31
									
								
								build/plugins/pwa.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,31 @@ | ||||
| import { VitePWA } from 'vite-plugin-pwa'; | ||||
|  | ||||
| export default function setupVitePwa() { | ||||
|   return VitePWA({ | ||||
|     registerType: 'autoUpdate', | ||||
|     includeAssets: ['favicon.ico'], | ||||
|     manifest: { | ||||
|       name: 'SoybeanAdmin', | ||||
|       short_name: 'SoybeanAdmin', | ||||
|       theme_color: '#fff', | ||||
|       icons: [ | ||||
|         { | ||||
|           src: '/logo.png', | ||||
|           sizes: '192x192', | ||||
|           type: 'image/png' | ||||
|         }, | ||||
|         { | ||||
|           src: '/logo.png', | ||||
|           sizes: '512x512', | ||||
|           type: 'image/png' | ||||
|         }, | ||||
|         { | ||||
|           src: '/logo.png', | ||||
|           sizes: '512x512', | ||||
|           type: 'image/png', | ||||
|           purpose: 'any maskable' | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										44
									
								
								build/plugins/unplugin.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,44 @@ | ||||
| import Icons from 'unplugin-icons/vite'; | ||||
| import IconsResolver from 'unplugin-icons/resolver'; | ||||
| import Components from 'unplugin-vue-components/vite'; | ||||
| import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'; | ||||
| import { FileSystemIconLoader } from 'unplugin-icons/loaders'; | ||||
| import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; | ||||
| import { getSrcPath } from '../utils'; | ||||
|  | ||||
| export default function unplugin(viteEnv: ImportMetaEnv) { | ||||
|   const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv; | ||||
|  | ||||
|   const srcPath = getSrcPath(); | ||||
|   const localIconPath = `${srcPath}/assets/svg-icon`; | ||||
|  | ||||
|   /** 本地svg图标集合名称 */ | ||||
|   const collectionName = VITE_ICON_LOCAL_PREFIX.replace(`${VITE_ICON_PREFIX}-`, ''); | ||||
|  | ||||
|   return [ | ||||
|     Icons({ | ||||
|       compiler: 'vue3', | ||||
|       customCollections: { | ||||
|         [collectionName]: FileSystemIconLoader(localIconPath, svg => | ||||
|           svg.replace(/^<svg\s/, '<svg width="1em" height="1em" ') | ||||
|         ) | ||||
|       }, | ||||
|       scale: 1, | ||||
|       defaultClass: 'inline-block' | ||||
|     }), | ||||
|     Components({ | ||||
|       dts: 'src/typings/components.d.ts', | ||||
|       types: [{ from: 'vue-router', names: ['RouterLink', 'RouterView'] }], | ||||
|       resolvers: [ | ||||
|         NaiveUiResolver(), | ||||
|         IconsResolver({ customCollections: [collectionName], componentPrefix: VITE_ICON_PREFIX }) | ||||
|       ] | ||||
|     }), | ||||
|     createSvgIconsPlugin({ | ||||
|       iconDirs: [localIconPath], | ||||
|       symbolId: `${VITE_ICON_LOCAL_PREFIX}-[dir]-[name]`, | ||||
|       inject: 'body-last', | ||||
|       customDomId: '__SVG_ICON_LOCAL__' | ||||
|     }) | ||||
|   ]; | ||||
| } | ||||
| @@ -1,7 +1,7 @@ | ||||
| import { visualizer } from 'rollup-plugin-visualizer'; | ||||
|  | ||||
| export default visualizer({ | ||||
|   open: true, | ||||
|   gzipSize: true, | ||||
|   brotliSize: true | ||||
|   brotliSize: true, | ||||
|   open: true | ||||
| }); | ||||
|   | ||||
| @@ -1,3 +0,0 @@ | ||||
| import vue from '@vitejs/plugin-vue'; | ||||
|  | ||||
| export default vue({}); | ||||
| @@ -1,3 +0,0 @@ | ||||
| import windiCSS from 'vite-plugin-windicss'; | ||||
|  | ||||
| export default windiCSS(); | ||||
							
								
								
									
										20
									
								
								build/utils/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| import path from 'path'; | ||||
|  | ||||
| /** | ||||
|  * 获取项目根路径 | ||||
|  * @descrition 末尾不带斜杠 | ||||
|  */ | ||||
| export function getRootPath() { | ||||
|   return path.resolve(process.cwd()); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * 获取项目src路径 | ||||
|  * @param srcName - src目录名称(默认: "src") | ||||
|  * @descrition 末尾不带斜杠 | ||||
|  */ | ||||
| export function getSrcPath(srcName = 'src') { | ||||
|   const rootPath = getRootPath(); | ||||
|  | ||||
|   return `${rootPath}/${srcName}`; | ||||
| } | ||||
| @@ -1 +0,0 @@ | ||||
| module.exports = { extends: ['@commitlint/config-conventional'] }; | ||||
| @@ -1,47 +0,0 @@ | ||||
| ### 1.interface和type | ||||
|  | ||||
| ##### interface和type使用优先级:能用interface表示的类型就用interface。 | ||||
|  | ||||
| ### 2.请求函数 | ||||
|  | ||||
| #### api接口: | ||||
|  | ||||
| 统一以 **fetch** 开头,例如: | ||||
|  | ||||
| ```typescript | ||||
| /** | ||||
|  * 获取用户信息 | ||||
|  * @param id - 用户唯一标识id | ||||
|  */ | ||||
| function fetchUserInfo(id:string) { | ||||
| 	// *** | ||||
| } | ||||
| /** | ||||
|  * 删除列表项 | ||||
|  * @param id - 列表id | ||||
|  */ | ||||
| function fetchDeleteListItem(id:string) { | ||||
| 	// *** | ||||
| } | ||||
| ``` | ||||
|  | ||||
| #### middleware中间件: | ||||
|  | ||||
| 统一以 **handle** 开头,例如 | ||||
|  | ||||
| ```typescript | ||||
| /**接口返回的用户信息 */ | ||||
| interface ResponseUserInfo { | ||||
|   userId: string; | ||||
|   userName: string; | ||||
|   userAge: number; | ||||
| } | ||||
| /** | ||||
|  * 获取用户信息 中间件 | ||||
|  @param data - 返回的用户信息 | ||||
|  */ | ||||
| function handleUserInfo(data: ResponseUserInfo): UserInfo { | ||||
|   // *** | ||||
| } | ||||
| ``` | ||||
|  | ||||
| @@ -1,35 +0,0 @@ | ||||
| ### css书写顺序 | ||||
|  | ||||
| 1. 定位属性: | ||||
|  | ||||
|    `position display float left top right bottom overflow clear z-index` | ||||
|  | ||||
| 2. 自身属性: | ||||
|  | ||||
|    `width height padding border margin background` | ||||
|  | ||||
| 3. 文字样式: | ||||
|  | ||||
|    `font-family font-size font-style font-weight font-varient color` | ||||
|  | ||||
| 4. 文本属性: | ||||
|  | ||||
|    `text-align vertical-align text-wrap text-transform text-indent text-decoration letter-spacing word-spacing white-space text-overflow` | ||||
|  | ||||
| 5. css3中新增属性: | ||||
|  | ||||
|    `content box-shadow border-radius transform` | ||||
|  | ||||
| #### class类名的顺序: | ||||
|  | ||||
| 1. 自定义的class类名(遵循BEM命名法) | ||||
| 2. css插件提供的类名按照以上的css属性对应的顺序 | ||||
|  | ||||
| 例如:自定义类名结合tailwind css | ||||
|  | ||||
| <div class="demo-container absolute flex justify-center items-center left-10px top-12px overflow-hidden wh-full p-10px border-1px border-[#f00] m-24px bg-[#fff] text-32px text-[#0f0]"></div> | ||||
| <style> | ||||
| 	.demo-container { | ||||
| 		box-shadow: 2px 0 8px 0 rgb(29 35 41 / 5%); | ||||
| 	} | ||||
| </style> | ||||
| @@ -1,41 +0,0 @@ | ||||
| ### iconify用法 | ||||
|  | ||||
| #### 一、静态用法:直接用图标的组件名称 | ||||
|  | ||||
| 1. 安装vscode智能提示的插件: Iconify IntelliSense | ||||
| 2. 找图标:网址 https://icones.js.org/ 或者 vscode安装 icones插件 | ||||
| 3. 确定图标名字:找到图标后复制名字 如:**'mdi:emoticon'** 组件为: `<icon-mdi:emoticon />`, icon-为设置的前缀 | ||||
| 4. 设置样式:同html标签一样直接应用style属性或者class属性; 通过设置color和font-size属性设置对应的颜色和大小 | ||||
|  | ||||
| #### 二、多个图标动态渲染 | ||||
|  | ||||
| 1. 确定图标名字,如:'mdi:emoticon' | ||||
|  | ||||
| 2. 引入Icon组件: | ||||
|  | ||||
|    `import { Icon } from '@iconify/vue';` | ||||
|  | ||||
| 3. 动态渲染 | ||||
|  | ||||
|     `<Icon icon="mdi:emoticon" />` | ||||
|  | ||||
| *ps:Icon组件属性 https://docs.iconify.design/icon-components/vue/* | ||||
|  | ||||
| #### 三、结合naiveUI组件动态渲染 | ||||
|  | ||||
| 1. 确定图标名字,如:**'mdi:emoticon'** | ||||
|  | ||||
| 2. 引入vue的h函数: | ||||
|  | ||||
|    `import { h } from 'vue';` | ||||
|  | ||||
| 3. 引入Icon组件 | ||||
|  | ||||
|    `import { Icon } from '@iconify/vue';` | ||||
|  | ||||
| 4. 动态渲染 | ||||
|  | ||||
|    `() => h(Icon, { icon: 'mdi:emoticon', style: { color: '#f00', fontSize: '16px' } })` | ||||
|  | ||||
| *ps:@/uitls已封装好了函数:iconifyRender* | ||||
|  | ||||
							
								
								
									
										209
									
								
								doc/vue书写规范.md
									
									
									
									
									
								
							
							
						
						| @@ -1,209 +0,0 @@ | ||||
| ### script-setup写法 | ||||
|  | ||||
| #### 第一部分 | ||||
|  | ||||
| ##### template | ||||
|  | ||||
| #### 第二部分 | ||||
|  | ||||
| ##### script | ||||
|  | ||||
| ##### 一、import的顺序, 依次按照下面的顺序。 | ||||
|  | ||||
| 1. vue模块 | ||||
|  | ||||
|    ```typescript | ||||
|    import {  } from 'vue'; | ||||
|    ``` | ||||
|  | ||||
| 2. vue相关类型 | ||||
|  | ||||
|    ```typescript | ||||
|    import type {  } from 'vue'; | ||||
|    ``` | ||||
|  | ||||
| 3. vue-router模块 | ||||
|  | ||||
|    ```typescript | ||||
|    import {  } from 'vue-router'; | ||||
|    ``` | ||||
|  | ||||
| 4. vue-router相关类型 | ||||
|  | ||||
|    ```typescript | ||||
|    import type {  } from 'vue-router'; | ||||
|    ``` | ||||
|  | ||||
| 5. UI框架模块 | ||||
|  | ||||
|    ```typescript | ||||
|    import {  } from 'naive-ui'; | ||||
|    ``` | ||||
|  | ||||
| 6. UI框架相关类型 | ||||
|  | ||||
|    ```typescript | ||||
|    import type {  } from 'naive-ui'; | ||||
|    ``` | ||||
|  | ||||
| 7. 第三方依赖 | ||||
|  | ||||
|    ```typescript | ||||
|    import BScroll from 'bscroll'; | ||||
|    ``` | ||||
|  | ||||
| 8. 第三方依赖相关类型 | ||||
|  | ||||
|    ```typescript | ||||
|    import type {  } from 'bscroll'; | ||||
|    ``` | ||||
|  | ||||
| 9. @/enum | ||||
|  | ||||
|    ```typescript | ||||
|    import {  } from '@/enum'; | ||||
|    ``` | ||||
|  | ||||
| 10. @/setting | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/setting'; | ||||
|     ``` | ||||
|  | ||||
| 11. @/plugins | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/plugins'; | ||||
|     ``` | ||||
|  | ||||
| 12. @/layouts | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/layouts'; | ||||
|     ``` | ||||
|  | ||||
| 13. @/views | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/views'; | ||||
|     ``` | ||||
|  | ||||
| 14. @/components | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/components'; | ||||
|     ``` | ||||
|  | ||||
| 15. @/hooks | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/hooks'; | ||||
|     ``` | ||||
|  | ||||
| 16. @/store | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/store'; | ||||
|     ``` | ||||
|  | ||||
| 17. @/context | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/context'; | ||||
|     ``` | ||||
|  | ||||
| 18. @/router | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/router'; | ||||
|     ``` | ||||
|  | ||||
| 19. @/service | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/service'; | ||||
|     ``` | ||||
|  | ||||
| 20. @/utils | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/utils'; | ||||
|     ``` | ||||
|  | ||||
| 21. @/interface | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/interface'; | ||||
|     ``` | ||||
|  | ||||
| 22. @/assets | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from '@/assets'; | ||||
|     ``` | ||||
|  | ||||
| 23. 相对路径依赖 | ||||
|  | ||||
|     ```typescript | ||||
|     import {  } from './components'; | ||||
|     ``` | ||||
|  | ||||
| ##### 二、TS类型声明 | ||||
|  | ||||
| ```typescript | ||||
| interface Props { | ||||
| 	/**姓名 */ | ||||
|   name: string; | ||||
| 	/**年龄 */ | ||||
|   age?: number; | ||||
| } | ||||
| interface Emits { | ||||
|   /** | ||||
|    * 删除事件 | ||||
|    * @param id - 删除项的id | ||||
|    */ | ||||
| 	(e: 'delete', id: number): void; | ||||
| } | ||||
| ``` | ||||
|   | ||||
|  | ||||
| ##### 三、defineProps、defineEmits、withDefaults | ||||
|  | ||||
| 1. 定义属性,如: | ||||
|  | ||||
| ```typescript | ||||
| const props = withDefaults(defineProps<Props>(), { | ||||
|   age: 24 | ||||
| }); | ||||
| ``` | ||||
|  | ||||
| 其中name是必须的属性,age是可选属性,通过withDefaults添加默认值 | ||||
|  | ||||
| 2. 定义emit事件 | ||||
|  | ||||
| ```typescript | ||||
| const emit = defineEmits<Emits>(); | ||||
| ``` | ||||
|  | ||||
| ##### 四、响应式use函数 | ||||
|  | ||||
| 有些use函数需要传入响应式的变量参数时,则书写在声明的变量下面。 | ||||
|  | ||||
| ```typescript | ||||
| const router = useRouter(); | ||||
| const route = useRoute(); | ||||
| ``` | ||||
|  | ||||
| ```typescript | ||||
| /**dom引用 */ | ||||
| const domRef = ref<HTMLElement | null>(null); | ||||
| const { height: domRefHeight } = useElementSize(domRef); //获取domRef的响应式高度 | ||||
| ``` | ||||
|  | ||||
|  | ||||
|  | ||||
| ##### 五、变量、函数声明 | ||||
|  | ||||
| ##### 六、vue生命周期函数、nextTick执行 | ||||
|  | ||||
| ##### 七、defineExpose | ||||
							
								
								
									
										72
									
								
								doc/命名规范.md
									
									
									
									
									
								
							
							
						
						| @@ -1,72 +0,0 @@ | ||||
| ### 命名法: | ||||
|  | ||||
| #### 1.驼峰命名法(小驼峰) | ||||
|  | ||||
| **getUser** | ||||
|  | ||||
| #### 2.帕斯卡命名法(大驼峰) | ||||
|  | ||||
|  **GlobalHeader** | ||||
|  | ||||
| #### 3.短横线命名法 | ||||
|  | ||||
| **user-center** | ||||
|  | ||||
| #### 4.下划线命名法 | ||||
|  | ||||
|  **MAX_LENGTH** | ||||
|  | ||||
| ### 文件、文件夹命名: | ||||
|  | ||||
| 1. 文件夹作为**路由页面**时用小写字母,包含多个单词时,单词之间建议使用半角的连词线 ( - ) 分隔, 即**短横线命名法**,此时vue文件为**index.vue**。 | ||||
| 2. 文件夹作为**vue组件**时用**大写驼峰命名法**。 | ||||
| 3. 文件作为**vue组件**时用**大写驼峰命名法**。 | ||||
| 4. 文件作为**use函数**时用**小驼峰命名法**。 | ||||
| 5. 其余文件用**短横线命名法**。 | ||||
|  | ||||
| ### 变量命名: | ||||
| #### 命名方式 : 小驼峰式命名方法 | ||||
| **命名规范 : 类型+对象描述的方式,如果没有明确的类型,就可以使前缀为名词** | ||||
|  | ||||
| 动词 | 含义 | 返回值 | ||||
| ---|---|--- | ||||
| can | 判断是否可执行某个动作 | 函数返回一个布尔值。true:可执行;false:不可执行。 | ||||
| has | 判断是否含有某个值 | 函数返回一个布尔值。true:含有此值;false:不含有此值。 | ||||
| is | 判断是否为某个值 | 函数返回一个布尔值。true:为某个值;false:不为某个值。 | ||||
| get | 获取某个值 | 函数返回一个非布尔值。 | ||||
| set | 设置某个值 | 无返回值、返回是否设置成功或者返回链式对象。 | ||||
|  | ||||
| ```javascript | ||||
| /** 是否可读 */ | ||||
| function canRead(){ | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| /** 获取姓名 */ | ||||
| function getName(){ | ||||
|   return this.name; | ||||
| } | ||||
| ``` | ||||
|  | ||||
|  | ||||
| ### 常量 | ||||
| #### 命名方法 : 使用大写字母和下划线来组合命名,下划线用以分割单词。 | ||||
| ```javascript | ||||
| const MAX_COUNT = 10; | ||||
| const URL = 'http://www.baidu.com'; | ||||
| ``` | ||||
|  | ||||
| ### TS类型接口interface和type | ||||
|  | ||||
| ##### 命名方法:大写驼峰 | ||||
|  | ||||
| ```typescript | ||||
| interface PersonInfo { | ||||
|   /**姓名 */ | ||||
|   name: string; | ||||
|   /**性别 '0':男; '1': 女; '2': 未知 */ | ||||
|   gender: '0' | '1' | '2'; | ||||
|   /**年龄 */ | ||||
|   age: 25; | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										101
									
								
								doc/目录.md
									
									
									
									
									
								
							
							
						
						| @@ -1,101 +0,0 @@ | ||||
|  | ||||
| ## 目录规范 | ||||
|  | ||||
| ```javascript | ||||
| qitan-pc | ||||
| ├── build                      //vite构建相关配置和插件 | ||||
| │   ├── define                 //定义的全局常量,通过vite构建时注入 | ||||
| │   ├── env                    //.env环境文件内容加载插件 | ||||
| │   └── plugins                //构建插件 | ||||
| │       ├── html.ts            //html插件(注入变量,压缩代码等) | ||||
| │       ├── iconify.ts         //iconify图标插件 | ||||
| │       ├── visualizer.ts      //构建的依赖大小占比分析插件 | ||||
| │       ├── vue.ts             //vue相关vite插件 | ||||
| │       └── windicss.ts        //css框架插件 | ||||
| ├── doc                        //项目相关说明文档 | ||||
| ├── public                     //公共目录 | ||||
| │   ├── resource               //资源文件夹(不会被打包) | ||||
| │   └── favicon.ico            //网站标签图标 | ||||
| ├── src | ||||
| │   ├── assets                 //静态资源 | ||||
| │   ├── components             //全局组件 | ||||
| │   │   ├── business           //业务相关组件 | ||||
| │   │   ├── common             //公共组件 | ||||
| │   │   └── custom             //自定义组件 | ||||
| │   ├── context                //全局上下文(通过provide和inject实现) | ||||
| │   │   ├── app                //从app.vue注入的上下文 | ||||
| │   │   └── part               //局部组件注入的上下文 | ||||
| │   ├── enum                   //TS枚举 | ||||
| │   │   ├── animate.ts         //动画枚举 | ||||
| │   │   ├── business.ts        //业务相关枚举 | ||||
| │   │   ├── common.ts          //通用枚举 | ||||
| │   │   ├── route.ts           //路由相关枚举 | ||||
| │   │   ├── storage.ts         //存储相关枚举 | ||||
| │   │   └── theme.ts           //系统主题配置相关枚举 | ||||
| │   ├── hooks                  //组合式的钩子函数hooks | ||||
| │   │   ├── business           //业务相关hooks | ||||
| │   │   └── common             //通用hooks | ||||
| │   ├── interface              //TS类型接口 | ||||
| │   │   ├── business.ts        //业务相关类型接口 | ||||
| │   │   ├── common.ts          //通用类型接口 | ||||
| │   │   └── theme.ts           //系统主题配置相关类型接口 | ||||
| │   ├── layouts                //布局组件 | ||||
| │   │   ├── BasicLayout        //基本布局(包含全局头部、侧边栏、底部等公共部分) | ||||
| │   │   ├── BlankLayout        //空白布局组件(单个页面) | ||||
| │   │   └── RouterViewLayout   //路由组件(用于多级路由之间的桥接) | ||||
| │   ├── plugins                //插件 | ||||
| │   │   └── dark-mode.ts       //windicss暗黑模式插件 | ||||
| │   ├── router                 //vue路由 | ||||
| │   │   ├── modules            //路由页面(按模块划分) | ||||
| │   │   ├── permission         //路由权限(路由守卫) | ||||
| │   │   ├── routes         		 //声明的路由 | ||||
| │   │   └── setup              //路由挂载函数 | ||||
| │   ├── service                //网络请求 | ||||
| │   │   ├── api                //接口api | ||||
| │   │   ├── middleware         //请求结果的处理中间件 | ||||
| │   │   └── request            //封装的请求函数 | ||||
| │   ├── settings               //项目初始配置 | ||||
| │   │   └── theme.ts           //项目主题初始配置 | ||||
| │   ├── store                  //状态管理 | ||||
| │   │   └── modules            //状态管理划分的模块 | ||||
| │   ├── styles                 //样式 | ||||
| │   │   ├── css                //css | ||||
| │   │   └── scss               //scss | ||||
| │   ├── typings                //TS类型声明文件(*.d.ts) | ||||
| │   ├── utils                  //全局工具函数 | ||||
| │   │   ├── auth               //用户鉴权 | ||||
| │   │   ├── common             //通用工具函数 | ||||
| │   │   ├── package            //npm依赖 | ||||
| │   │   ├── router             //路由 | ||||
| │   │   ├── request            //请求工具函数 | ||||
| │   │   └── storage            //存储 | ||||
| │   ├── views                  //页面 | ||||
| │   │   ├── about | ||||
| │   │   ├── component | ||||
| │   │   ├── dashboard | ||||
| │   │   ├── document | ||||
| │   │   ├── multi-menu | ||||
| │   │   └── system             //系统内置页面:登录、异常页等 | ||||
| │   ├── App.vue                //vue文件入口 | ||||
| │   ├── AppProvider.vue        //配置naive UI的vue文件(国际化,loadingBar、message等组件) | ||||
| │   └── main.ts                //项目入口ts文件 | ||||
| ├── .cz-config.js              //git cz提交配置 | ||||
| ├── .editorconfig              //统一编辑器配置 | ||||
| ├── .env                       //环境文件 | ||||
| ├── .env.development           //环境文件(开发模式) | ||||
| ├── .env.production            //环境文件(生产模式) | ||||
| ├── .env.staging               //环境文件(自定义staging模式) | ||||
| ├── .eslintignore              //忽略eslint检查的配置文件 | ||||
| ├── .eslintrc.js               //eslint配置文件 | ||||
| ├── .gitignore                 //忽略git提交的配置文件 | ||||
| ├── .husky                     //git commit提交钩子,提交前检查代码格式和提交commit内容的格式 | ||||
| ├── .prettierrc.js             //prettier代码格式插件配置 | ||||
| ├── commitlint.config.js       //commitlint提交规范插件配置 | ||||
| ├── index.html | ||||
| ├── package.json               //npm依赖描述文件 | ||||
| ├── pnpm-lock.yaml             //npm包管理器pnpm依赖锁定文件 | ||||
| ├── README.md                  //项目介绍文档 | ||||
| ├── tsconfig.json              //TS配置 | ||||
| ├── vite.config.ts             //vite配置 | ||||
| └── windi.config.ts            //windicss框架配置 | ||||
| ``` | ||||
							
								
								
									
										32
									
								
								docker/.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | ||||
| node_modules | ||||
| .DS_Store | ||||
| dist | ||||
| .npmrc | ||||
| .cache | ||||
|  | ||||
| tests/server/static | ||||
| tests/server/static/upload | ||||
|  | ||||
| .local | ||||
| # local env files | ||||
| .env.local | ||||
| .env.*.local | ||||
| .eslintcache | ||||
|  | ||||
| # Log files | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| pnpm-debug.log* | ||||
|  | ||||
| # Editor directories and files | ||||
| .idea | ||||
| # .vscode | ||||
| *.suo | ||||
| *.ntvs* | ||||
| *.njsproj | ||||
| *.sln | ||||
| *.sw? | ||||
| yarn.lock | ||||
| pnpm-lock.yaml | ||||
| /vite-profile.cpuprofile | ||||
							
								
								
									
										24
									
								
								docker/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,24 @@ | ||||
| FROM node:16.17.0 as builder | ||||
|  | ||||
| ENV WORKDIR=/soybean-admin | ||||
|  | ||||
| WORKDIR $WORKDIR | ||||
|  | ||||
| COPY ./ $WORKDIR/ | ||||
|  | ||||
| ARG version | ||||
| ENV COMMITID=$version | ||||
|  | ||||
| RUN npm i -g pnpm | ||||
|  | ||||
| RUN pnpm install | ||||
| RUN pnpm build | ||||
|  | ||||
| FROM nginx:alpine as prod | ||||
|  | ||||
| RUN mkdir /soybean | ||||
|  | ||||
| COPY --from=builder /soybean-admin/dist /soybean-admin | ||||
| COPY --from=builder /soybean-admin/docker/nginx.conf /etc/nginx/nginx.conf | ||||
|  | ||||
| EXPOSE 80 | ||||
							
								
								
									
										54
									
								
								docker/nginx.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,54 @@ | ||||
| user  nginx; | ||||
| worker_processes  1; | ||||
| error_log  /var/log/nginx/error.log warn; | ||||
| pid        /var/run/nginx.pid; | ||||
|  | ||||
| events { | ||||
|   worker_connections  1024; | ||||
| } | ||||
|  | ||||
| http { | ||||
|   include       /etc/nginx/mime.types; | ||||
|   default_type  application/octet-stream; | ||||
|   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' | ||||
|                     '$status $body_bytes_sent "$http_referer" ' | ||||
|                     '"$http_user_agent" "$http_x_forwarded_for"'; | ||||
|   access_log  /var/log/nginx/access.log  main; | ||||
|   sendfile        on; | ||||
|   keepalive_timeout  65; | ||||
|  | ||||
|   server { | ||||
|     listen       80; | ||||
|     server_name  localhost; | ||||
|  | ||||
|     location / { | ||||
|       # 不缓存html,防止程序更新后缓存继续生效 | ||||
|       if ($request_filename ~* .*\.(?:htm|html)$) { | ||||
|         add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate"; | ||||
|         access_log on; | ||||
|       } | ||||
|       root   /soybean-admin/; | ||||
|       index  index.html index.htm; | ||||
|       try_files $uri $uri/ /index.html; | ||||
|     } | ||||
|  | ||||
|     # location /soybean/soybean-webserver/v1 { | ||||
|     #     proxy_set_header Host $host; | ||||
|     #     proxy_set_header X-Real-IP $remote_addr; | ||||
|     #     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||
|     #     proxy_set_header REMOTE-HOST $remote_addr; | ||||
|  | ||||
|     #     # 后台接口地址 | ||||
|     #     proxy_pass http://192.168.1.99:30597/v1; | ||||
|     #     proxy_redirect default; | ||||
|     #     add_header Access-Control-Allow-Origin *; | ||||
|     #     add_header Access-Control-Allow-Headers X-Requested-With; | ||||
|     #     add_header Access-Control-Allow-Methods GET,POST,OPTIONS; | ||||
|     # } | ||||
|  | ||||
|     error_page   500 502 503 504  /50x.html; | ||||
|     location = /50x.html { | ||||
|       root   /usr/share/nginx/html; | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										46
									
								
								index.html
									
									
									
									
									
								
							
							
						
						| @@ -1,32 +1,20 @@ | ||||
| <!-- prettier-ignore --> | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head> | ||||
|     <meta charset="UTF-8" /> | ||||
|     <link rel="icon" href="/favicon.ico" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <title><%= title %></title> | ||||
|   </head> | ||||
|   <body> | ||||
| 		<div id="appProvider" style="display: none"></div> | ||||
|     <div id="app"> | ||||
| 			<!-- 页面渲染之前加载动画 --> | ||||
|       <div class="app-loading"> | ||||
|         <img class="app-loading_logo" src="/resource/logo.png" /> | ||||
|         <div class="app-loading__dot-wrapper"> | ||||
|           <div class="app-loading__dot"> | ||||
|             <i class="left top"></i> | ||||
|             <i class="left bottom delay-400"></i> | ||||
|             <i class="right top delay-800"></i> | ||||
|             <i class="right bottom delay-1200"></i> | ||||
|           </div> | ||||
|         </div> | ||||
|         <h2 class="app-loading_title"><%= appName %></h2> | ||||
|         <style> | ||||
|           @import '/resource/loading.css'; | ||||
|         </style> | ||||
|       </div> | ||||
|       <!-- End --> | ||||
| <html lang="zh-cmn-Hans"> | ||||
| 	<head> | ||||
| 		<meta charset="UTF-8" /> | ||||
| 		<meta http-equiv="Expires" content="0" /> | ||||
| 		<meta http-equiv="Pragma" content="no-cache" /> | ||||
| 		<meta http-equiv="Cache-control" content="no-cache" /> | ||||
| 		<meta http-equiv="Cache" content="no-cache" /> | ||||
| 		<link rel="icon" href="/favicon.svg" /> | ||||
| 		<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
| 		<title>%VITE_APP_NAME%</title> | ||||
| 	</head> | ||||
| 	<body> | ||||
| 		<div id="app"> | ||||
| 			<div id="appLoading"></div> | ||||
| 		</div> | ||||
|     <script type="module" src="/src/main.ts"></script> | ||||
|   </body> | ||||
| 		<script type="module" src="/src/main.ts"></script> | ||||
| 	</body> | ||||
| </html> | ||||
|   | ||||
							
								
								
									
										128
									
								
								mock/api/auth.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,128 @@ | ||||
| import type { MockMethod } from 'vite-plugin-mock'; | ||||
| import { userModel } from '../model'; | ||||
|  | ||||
| /** 参数错误的状态码 */ | ||||
| const ERROR_PARAM_CODE = 10000; | ||||
|  | ||||
| const ERROR_PARAM_MSG = '参数校验失败!'; | ||||
|  | ||||
| const apis: MockMethod[] = [ | ||||
|   // 获取验证码 | ||||
|   { | ||||
|     url: '/mock/getSmsCode', | ||||
|     method: 'post', | ||||
|     response: (): Service.MockServiceResult<boolean> => { | ||||
|       return { | ||||
|         code: 200, | ||||
|         message: 'ok', | ||||
|         data: true | ||||
|       }; | ||||
|     } | ||||
|   }, | ||||
|   // 用户+密码 登录 | ||||
|   { | ||||
|     url: '/mock/login', | ||||
|     method: 'post', | ||||
|     response: (options: Service.MockOption): Service.MockServiceResult<ApiAuth.Token | null> => { | ||||
|       const { userName = undefined, password = undefined } = options.body; | ||||
|  | ||||
|       if (!userName || !password) { | ||||
|         return { | ||||
|           code: ERROR_PARAM_CODE, | ||||
|           message: ERROR_PARAM_MSG, | ||||
|           data: null | ||||
|         }; | ||||
|       } | ||||
|  | ||||
|       const findItem = userModel.find(item => item.userName === userName && item.password === password); | ||||
|  | ||||
|       if (findItem) { | ||||
|         return { | ||||
|           code: 200, | ||||
|           message: 'ok', | ||||
|           data: { | ||||
|             token: findItem.token, | ||||
|             refreshToken: findItem.refreshToken | ||||
|           } | ||||
|         }; | ||||
|       } | ||||
|       return { | ||||
|         code: 1000, | ||||
|         message: '用户名或密码错误!', | ||||
|         data: null | ||||
|       }; | ||||
|     } | ||||
|   }, | ||||
|   // 获取用户信息(请求头携带token, 根据token获取用户信息) | ||||
|   { | ||||
|     url: '/mock/getUserInfo', | ||||
|     method: 'get', | ||||
|     response: (options: Service.MockOption): Service.MockServiceResult<ApiAuth.UserInfo | null> => { | ||||
|       // 这里的mock插件得到的字段是authorization, 前端传递的是Authorization字段 | ||||
|       const { authorization = '' } = options.headers; | ||||
|       const REFRESH_TOKEN_CODE = 66666; | ||||
|  | ||||
|       if (!authorization) { | ||||
|         return { | ||||
|           code: REFRESH_TOKEN_CODE, | ||||
|           message: '用户已失效或不存在!', | ||||
|           data: null | ||||
|         }; | ||||
|       } | ||||
|       const userInfo: Auth.UserInfo = { | ||||
|         userId: '', | ||||
|         userName: '', | ||||
|         userRole: 'user' | ||||
|       }; | ||||
|       const isInUser = userModel.some(item => { | ||||
|         const flag = item.token === authorization; | ||||
|         if (flag) { | ||||
|           const { userId: itemUserId, userName, userRole } = item; | ||||
|           Object.assign(userInfo, { userId: itemUserId, userName, userRole }); | ||||
|         } | ||||
|         return flag; | ||||
|       }); | ||||
|  | ||||
|       if (isInUser) { | ||||
|         return { | ||||
|           code: 200, | ||||
|           message: 'ok', | ||||
|           data: userInfo | ||||
|         }; | ||||
|       } | ||||
|  | ||||
|       return { | ||||
|         code: REFRESH_TOKEN_CODE, | ||||
|         message: '用户信息异常!', | ||||
|         data: null | ||||
|       }; | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     url: '/mock/updateToken', | ||||
|     method: 'post', | ||||
|     response: (options: Service.MockOption): Service.MockServiceResult<ApiAuth.Token | null> => { | ||||
|       const { refreshToken = '' } = options.body; | ||||
|  | ||||
|       const findItem = userModel.find(item => item.refreshToken === refreshToken); | ||||
|  | ||||
|       if (findItem) { | ||||
|         return { | ||||
|           code: 200, | ||||
|           message: 'ok', | ||||
|           data: { | ||||
|             token: findItem.token, | ||||
|             refreshToken: findItem.refreshToken | ||||
|           } | ||||
|         }; | ||||
|       } | ||||
|       return { | ||||
|         code: 3000, | ||||
|         message: '用户已失效或不存在!', | ||||
|         data: null | ||||
|       }; | ||||
|     } | ||||
|   } | ||||
| ]; | ||||
|  | ||||
| export default apis; | ||||
							
								
								
									
										5
									
								
								mock/api/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| import auth from './auth'; | ||||
| import route from './route'; | ||||
| import management from './management'; | ||||
|  | ||||
| export default [...auth, ...route, ...management]; | ||||
							
								
								
									
										33
									
								
								mock/api/management.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| import { mock } from 'mockjs'; | ||||
| import type { MockMethod } from 'vite-plugin-mock'; | ||||
|  | ||||
| const apis: MockMethod[] = [ | ||||
|   { | ||||
|     url: '/mock/getAllUserList', | ||||
|     method: 'post', | ||||
|     response: (): Service.MockServiceResult<ApiUserManagement.User[]> => { | ||||
|       const data = mock({ | ||||
|         'list|1000': [ | ||||
|           { | ||||
|             id: '@id', | ||||
|             userName: '@cname', | ||||
|             'age|18-56': 56, | ||||
|             'gender|1': ['0', '1', null], | ||||
|             phone: | ||||
|               /^[1](([3][0-9])|([4][01456789])|([5][012356789])|([6][2567])|([7][0-8])|([8][0-9])|([9][012356789]))[0-9]{8}$/, | ||||
|             'email|1': ['@email("qq.com")', null], | ||||
|             'userStatus|1': ['1', '2', '3', '4', null] | ||||
|           } | ||||
|         ] | ||||
|       }); | ||||
|  | ||||
|       return { | ||||
|         code: 200, | ||||
|         message: 'ok', | ||||
|         data: data.list | ||||
|       }; | ||||
|     } | ||||
|   } | ||||
| ]; | ||||
|  | ||||
| export default apis; | ||||
							
								
								
									
										29
									
								
								mock/api/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | ||||
| import type { MockMethod } from 'vite-plugin-mock'; | ||||
| import { routeModel, userModel } from '../model'; | ||||
|  | ||||
| const apis: MockMethod[] = [ | ||||
|   { | ||||
|     url: '/mock/getUserRoutes', | ||||
|     method: 'post', | ||||
|     response: (options: Service.MockOption): Service.MockServiceResult => { | ||||
|       const { userId = undefined } = options.body; | ||||
|  | ||||
|       const routeHomeName: AuthRoute.LastDegreeRouteKey = 'dashboard_analysis'; | ||||
|  | ||||
|       const role = userModel.find(item => item.userId === userId)?.userRole || 'user'; | ||||
|  | ||||
|       const filterRoutes = routeModel[role]; | ||||
|  | ||||
|       return { | ||||
|         code: 200, | ||||
|         message: 'ok', | ||||
|         data: { | ||||
|           routes: filterRoutes, | ||||
|           home: routeHomeName | ||||
|         } | ||||
|       }; | ||||
|     } | ||||
|   } | ||||
| ]; | ||||
|  | ||||
| export default apis; | ||||
							
								
								
									
										6
									
								
								mock/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | ||||
| import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'; | ||||
| import api from './api'; | ||||
|  | ||||
| export function setupMockServer() { | ||||
|   createProdMockServer(api); | ||||
| } | ||||
							
								
								
									
										40
									
								
								mock/model/auth.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,40 @@ | ||||
| interface UserModel extends Auth.UserInfo { | ||||
|   token: string; | ||||
|   refreshToken: string; | ||||
|   password: string; | ||||
| } | ||||
|  | ||||
| export const userModel: UserModel[] = [ | ||||
|   { | ||||
|     token: '__TOKEN_SOYBEAN__', | ||||
|     refreshToken: '__REFRESH_TOKEN_SOYBEAN__', | ||||
|     userId: '0', | ||||
|     userName: 'Soybean', | ||||
|     userRole: 'super', | ||||
|     password: 'soybean123' | ||||
|   }, | ||||
|   { | ||||
|     token: '__TOKEN_SUPER__', | ||||
|     refreshToken: '__REFRESH_TOKEN_SUPER__', | ||||
|     userId: '1', | ||||
|     userName: 'Super', | ||||
|     userRole: 'super', | ||||
|     password: 'super123' | ||||
|   }, | ||||
|   { | ||||
|     token: '__TOKEN_ADMIN__', | ||||
|     refreshToken: '__REFRESH_TOKEN_ADMIN__', | ||||
|     userId: '2', | ||||
|     userName: 'Admin', | ||||
|     userRole: 'admin', | ||||
|     password: 'admin123' | ||||
|   }, | ||||
|   { | ||||
|     token: '__TOKEN_USER01__', | ||||
|     refreshToken: '__REFRESH_TOKEN_USER01__', | ||||
|     userId: '3', | ||||
|     userName: 'User01', | ||||
|     userRole: 'user', | ||||
|     password: 'user01123' | ||||
|   } | ||||
| ]; | ||||
							
								
								
									
										2
									
								
								mock/model/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,2 @@ | ||||
| export * from './auth'; | ||||
| export * from './route'; | ||||
							
								
								
									
										1263
									
								
								mock/model/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										213
									
								
								package.json
									
									
									
									
									
								
							
							
						
						| @@ -1,102 +1,135 @@ | ||||
| { | ||||
|   "name": "soybean-admin", | ||||
|   "version": "0.0.2", | ||||
|   "version": "0.10.4", | ||||
|   "description": "A fresh and elegant admin template, based on Vue3、Vite3、TypeScript、NaiveUI and UnoCSS. 一个基于Vue3、Vite3、TypeScript、NaiveUI and UnoCSS的清新优雅的中后台模版。", | ||||
|   "author": { | ||||
|     "name": "Soybean", | ||||
|     "email": "honghuangdc@gmail.com", | ||||
|     "url": "https://github.com/honghuangdc" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "release": "standard-version", | ||||
|     "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md", | ||||
|     "dev": "vite", | ||||
|     "dev:prod": "vite --mode production", | ||||
|     "dev:staging": "vite --mode staging", | ||||
|     "build": "vue-tsc --noEmit --skipLibCheck && vite build", | ||||
|     "build:dev": "vue-tsc --noEmit --skipLibCheck && vite build --mode development", | ||||
|     "build:staging": "vue-tsc --noEmit --skipLibCheck && vite build --mode staging", | ||||
|     "serve": "vite preview", | ||||
|     "lint": "eslint ./src --ext .vue,.js,jsx,.ts,tsx", | ||||
|     "lint:fix": "eslint --fix ./src --ext .vue,.js,jsx,.ts,tsx", | ||||
|     "prepare": "husky install", | ||||
|     "postinstall": "patch-package" | ||||
|   }, | ||||
|   "lint-staged": { | ||||
|     "*.{vue,js,jsx,ts,tsx}": "eslint --fix" | ||||
|   }, | ||||
|   "config": { | ||||
|     "commitizen": { | ||||
|       "path": "./node_modules/cz-customizable" | ||||
|     } | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antv/g2plot": "^2.3.40", | ||||
|     "@better-scroll/core": "^2.4.2", | ||||
|     "@vueuse/core": "^6.9.2", | ||||
|     "axios": "^0.24.0", | ||||
|     "chroma-js": "^2.1.2", | ||||
|     "clipboard": "^2.0.8", | ||||
|     "dayjs": "^1.10.7", | ||||
|     "form-data": "^4.0.0", | ||||
|     "naive-ui": "^2.20.3", | ||||
|     "pinia": "^2.0.4", | ||||
|     "print-js": "^1.6.0", | ||||
|     "qs": "^6.10.1", | ||||
|     "swiper": "^7.3.0", | ||||
|     "vditor": "^3.8.7", | ||||
|     "vue": "^3.2.22", | ||||
|     "vue-router": "^4.0.12", | ||||
|     "wangeditor": "^4.7.9", | ||||
|     "xgplayer": "^2.31.2" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@amap/amap-jsapi-types": "^0.0.8", | ||||
|     "@commitlint/cli": "^15.0.0", | ||||
|     "@commitlint/config-conventional": "^15.0.0", | ||||
|     "@iconify/json": "^1.1.431", | ||||
|     "@iconify/vue": "^3.1.1", | ||||
|     "@types/bmapgl": "^0.0.4", | ||||
|     "@types/chroma-js": "^2.1.3", | ||||
|     "@types/qs": "^6.9.7", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.4.0", | ||||
|     "@typescript-eslint/parser": "^5.4.0", | ||||
|     "@vitejs/plugin-vue": "^1.9.4", | ||||
|     "@vue/compiler-sfc": "^3.2.22", | ||||
|     "@vue/eslint-config-prettier": "^6.0.0", | ||||
|     "@vue/eslint-config-typescript": "^9.1.0", | ||||
|     "commitizen": "^4.2.4", | ||||
|     "cz-conventional-changelog": "^3.3.0", | ||||
|     "cz-customizable": "^6.3.0", | ||||
|     "dotenv": "^10.0.0", | ||||
|     "eslint": "^8.2.0", | ||||
|     "eslint-config-airbnb-base": "^15.0.0", | ||||
|     "eslint-config-prettier": "^8.3.0", | ||||
|     "eslint-plugin-import": "^2.25.3", | ||||
|     "eslint-plugin-prettier": "^4.0.0", | ||||
|     "eslint-plugin-vue": "^8.1.1", | ||||
|     "husky": "^7.0.4", | ||||
|     "lint-staged": "^12.0.3", | ||||
|     "patch-package": "^6.4.7", | ||||
|     "postinstall-postinstall": "^2.1.0", | ||||
|     "prettier": "^2.4.1", | ||||
|     "rollup-plugin-visualizer": "^5.5.2", | ||||
|     "sass": "^1.43.4", | ||||
|     "typescript": "^4.5.2", | ||||
|     "unplugin-icons": "^0.12.18", | ||||
|     "unplugin-vue-components": "^0.17.2", | ||||
|     "vite": "~2.5.10", | ||||
|     "vite-plugin-html": "^2.1.1", | ||||
|     "vite-plugin-windicss": "^1.5.1", | ||||
|     "vue-tsc": "~0.28.10", | ||||
|     "vueuc": "^0.4.15", | ||||
|     "windicss": "^3.2.1" | ||||
|     "email": "soybeanjs@outlook.com", | ||||
|     "url": "https://github.com/soybeanjs" | ||||
|   }, | ||||
|   "license": "MIT", | ||||
|   "homepage": "https://github.com/honghuangdc/soybean-admin", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git+https://github.com/honghuangdc/soybean-admin.git" | ||||
|     "url": "https://github.com/honghuangdc/soybean-admin.git" | ||||
|   }, | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/honghuangdc/soybean-admin/issues" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "Vue", | ||||
|     "Vue3", | ||||
|     "admin", | ||||
|     "admin-template", | ||||
|     "vue-admin", | ||||
|     "vue-admin-template", | ||||
|     "Vite3", | ||||
|     "Vite", | ||||
|     "vite-admin", | ||||
|     "TypeScript", | ||||
|     "TS", | ||||
|     "NaiveUI", | ||||
|     "naive-ui", | ||||
|     "naive-admin", | ||||
|     "NaiveUI-Admin", | ||||
|     "naive-ui-admin", | ||||
|     "UnoCSS" | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "dev": "cross-env VITE_SERVICE_ENV=dev vite", | ||||
|     "dev:test": "cross-env VITE_SERVICE_ENV=test vite", | ||||
|     "dev:prod": "cross-env VITE_SERVICE_ENV=prod vite", | ||||
|     "build": "npm run typecheck && cross-env VITE_SERVICE_ENV=prod vite build", | ||||
|     "build:dev": "npm run typecheck && cross-env VITE_SERVICE_ENV=dev vite build", | ||||
|     "build:test": "npm run typecheck && cross-env VITE_SERVICE_ENV=test vite build", | ||||
|     "build:vercel": "cross-env VITE_HASH_ROUTE=Y VITE_VERCEL=Y vite build", | ||||
|     "preview": "vite preview", | ||||
|     "typecheck": "vue-tsc --noEmit --skipLibCheck", | ||||
|     "lint": "eslint . --fix", | ||||
|     "format": "soy prettier-write", | ||||
|     "commit": "soy git-commit", | ||||
|     "cleanup": "soy cleanup", | ||||
|     "update-pkg": "soy ncu", | ||||
|     "release": "soy release", | ||||
|     "tsx": "tsx", | ||||
|     "logo": "tsx ./scripts/logo.ts", | ||||
|     "prepare": "soy init-simple-git-hooks" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antv/data-set": "0.11.8", | ||||
|     "@antv/g2": "4.2.10", | ||||
|     "@better-scroll/core": "2.5.1", | ||||
|     "@soybeanjs/vue-materials": "0.2.0", | ||||
|     "@vueuse/core": "10.4.1", | ||||
|     "axios": "1.5.0", | ||||
|     "clipboard": "2.0.11", | ||||
|     "colord": "2.9.3", | ||||
|     "crypto-js": "4.1.1", | ||||
|     "dayjs": "1.11.10", | ||||
|     "echarts": "5.4.3", | ||||
|     "form-data": "4.0.0", | ||||
|     "lodash-es": "4.17.21", | ||||
|     "naive-ui": "2.34.4", | ||||
|     "pinia": "2.1.6", | ||||
|     "print-js": "1.6.0", | ||||
|     "qs": "6.11.2", | ||||
|     "socket.io-client": "4.7.2", | ||||
|     "swiper": "10.2.0", | ||||
|     "ua-parser-js": "1.0.36", | ||||
|     "vditor": "3.9.5", | ||||
|     "vue": "3.3.4", | ||||
|     "vue-i18n": "9.4.1", | ||||
|     "vue-router": "4.2.4", | ||||
|     "vuedraggable": "4.1.0", | ||||
|     "wangeditor": "4.7.15", | ||||
|     "xgplayer": "3.0.9" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@amap/amap-jsapi-types": "0.0.13", | ||||
|     "@iconify/json": "2.2.118", | ||||
|     "@iconify/vue": "4.1.1", | ||||
|     "@plugin-web-update-notification/vite": "^1.6.5", | ||||
|     "@soybeanjs/cli": "0.7.1", | ||||
|     "@soybeanjs/vite-plugin-vue-page-route": "0.0.10", | ||||
|     "@types/bmapgl": "0.0.7", | ||||
|     "@types/crypto-js": "4.1.2", | ||||
|     "@types/node": "20.6.3", | ||||
|     "@types/qs": "6.9.8", | ||||
|     "@types/ua-parser-js": "0.7.37", | ||||
|     "@unocss/preset-uno": "0.56.0", | ||||
|     "@unocss/transformer-directives": "0.56.0", | ||||
|     "@unocss/vite": "0.56.0", | ||||
|     "@vitejs/plugin-vue": "4.3.4", | ||||
|     "@vitejs/plugin-vue-jsx": "3.0.2", | ||||
|     "cross-env": "7.0.3", | ||||
|     "eslint": "8.49.0", | ||||
|     "eslint-config-soybeanjs": "0.5.6", | ||||
|     "mockjs": "1.1.0", | ||||
|     "rollup-plugin-visualizer": "5.9.2", | ||||
|     "sass": "1.67.0", | ||||
|     "simple-git-hooks": "2.9.0", | ||||
|     "tsx": "3.12.10", | ||||
|     "typescript": "5.2.2", | ||||
|     "unplugin-icons": "0.17.0", | ||||
|     "unplugin-vue-components": "0.25.2", | ||||
|     "vite": "4.4.9", | ||||
|     "vite-plugin-compression": "0.5.1", | ||||
|     "vite-plugin-mock": "2.9.8", | ||||
|     "vite-plugin-progress": "0.0.7", | ||||
|     "vite-plugin-pwa": "0.16.5", | ||||
|     "vite-plugin-svg-icons": "2.0.1", | ||||
|     "vite-plugin-vue-devtools": "1.0.0-rc.4", | ||||
|     "vue-tsc": "1.8.13" | ||||
|   }, | ||||
|   "pnpm": { | ||||
|     "patchedDependencies": { | ||||
|       "mockjs@1.1.0": "patches/mockjs@1.1.0.patch" | ||||
|     } | ||||
|   }, | ||||
|   "simple-git-hooks": { | ||||
|     "commit-msg": "pnpm soy git-commit-verify", | ||||
|     "pre-commit": "pnpm typecheck && pnpm soy lint-staged" | ||||
|   }, | ||||
|   "soybean": { | ||||
|     "useSoybeanToken": true | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										732
									
								
								patches/mockjs@1.1.0.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,732 @@ | ||||
| diff --git a/dist/mock.js b/dist/mock.js | ||||
| index 35d5b9af3eff34324656879705dcb81470fc9697..3e6a52e0fbfdd39d3aaf1592ffd19ecde33320f3 100644 | ||||
| --- a/dist/mock.js | ||||
| +++ b/dist/mock.js | ||||
| @@ -126,17 +126,17 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  /* 1 */ | ||||
|  /***/ (function(module, exports, __webpack_require__) { | ||||
|  | ||||
| -	/* | ||||
| +	/* | ||||
|  	    ## Handler | ||||
|  | ||||
|  	    处理数据模板。 | ||||
| - | ||||
| + | ||||
|  	    * Handler.gen( template, name?, context? ) | ||||
|  | ||||
|  	        入口方法。 | ||||
|  | ||||
|  	    * Data Template Definition, DTD | ||||
| - | ||||
| + | ||||
|  	        处理数据模板定义。 | ||||
|  | ||||
|  	        * Handler.array( options ) | ||||
| @@ -146,7 +146,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        * Handler.string( options ) | ||||
|  	        * Handler.function( options ) | ||||
|  	        * Handler.regexp( options ) | ||||
| - | ||||
| + | ||||
|  	        处理路径(相对和绝对)。 | ||||
|  | ||||
|  	        * Handler.getValueByKeyPath( key, options ) | ||||
| @@ -177,7 +177,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  | ||||
|  	    Handle.gen(template, name, options) | ||||
|  	    context | ||||
| -	        currentContext, templateCurrentContext, | ||||
| +	        currentContext, templateCurrentContext, | ||||
|  	        path, templatePath | ||||
|  	        root, templateRoot | ||||
|  	*/ | ||||
| @@ -456,7 +456,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	                phed = Handler.placeholder(ph, options.context.currentContext, options.context.templateCurrentContext, options) | ||||
|  | ||||
|  	                // 只有一个占位符,并且没有其他字符 | ||||
| -	                if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { // | ||||
| +	                if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { // | ||||
|  	                    result = phed | ||||
|  	                    break | ||||
|  | ||||
| @@ -627,7 +627,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	            } | ||||
|  	            // 引用的值已经计算好 | ||||
|  	            if (currentContext && (key in currentContext)) return currentContext[key] | ||||
| - | ||||
| + | ||||
|  	            // 尚未计算,递归引用数据模板中的属性 | ||||
|  	            if (templateCurrentContext && | ||||
|  	                (typeof templateCurrentContext === 'object') && | ||||
| @@ -816,13 +816,13 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        var tpl = Mock.heredoc(function() { | ||||
|  	            /*! | ||||
|  	        {{email}}{{age}} | ||||
| -	        <!-- Mock { | ||||
| +	        <!-- Mock { | ||||
|  	            email: '@EMAIL', | ||||
|  	            age: '@INT(1,100)' | ||||
|  	        } --> | ||||
|  	            *\/ | ||||
|  	        }) | ||||
| - | ||||
| + | ||||
|  	    **相关阅读** | ||||
|  	    * [Creating multiline strings in JavaScript](http://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript)、 | ||||
|  	*/ | ||||
| @@ -850,7 +850,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  		解析数据模板(属性名部分)。 | ||||
|  | ||||
|  		* Parser.parse( name ) | ||||
| - | ||||
| + | ||||
|  			```json | ||||
|  			{ | ||||
|  				parameters: [ name, inc, range, decimal ], | ||||
| @@ -922,7 +922,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  | ||||
|  	/* | ||||
|  	    ## Mock.Random | ||||
| - | ||||
| + | ||||
|  	    工具类,用于生成各种随机数据。 | ||||
|  	*/ | ||||
|  | ||||
| @@ -1251,7 +1251,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  | ||||
|  	        替代图片源 | ||||
|  	            http://fpoimg.com/ | ||||
| -	        参考自 | ||||
| +	        参考自 | ||||
|  	            http://rensanning.iteye.com/blog/1933310 | ||||
|  	            http://code.tutsplus.com/articles/the-top-8-placeholders-for-web-designers--net-19485 | ||||
|  	    */ | ||||
| @@ -1541,7 +1541,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        var bg_colour = Math.floor(Math.random() * 16777215).toString(16); | ||||
|  	        bg_colour = "#" + ("000000" + bg_colour).slice(-6); | ||||
|  	        document.bgColor = bg_colour; | ||||
| - | ||||
| + | ||||
|  	    http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/ | ||||
|  	        Creating random colors is actually more difficult than it seems. The randomness itself is easy, but aesthetically pleasing randomness is more difficult. | ||||
|  	        https://github.com/devongovett/color-generator | ||||
| @@ -1561,7 +1561,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  | ||||
|  	    http://tool.c7sky.com/webcolor | ||||
|  	        网页设计常用色彩搭配表 | ||||
| - | ||||
| + | ||||
|  	    https://github.com/One-com/one-color | ||||
|  	        An OO-based JavaScript color parser/computation toolkit with support for RGB, HSV, HSL, CMYK, and alpha channels. | ||||
|  	        API 很赞 | ||||
| @@ -1593,7 +1593,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	            color += letters[Math.floor(Math.random() * 16)] | ||||
|  	        } | ||||
|  	        return color | ||||
| - | ||||
| + | ||||
|  	        // 随机生成一个无脑的颜色,格式为 '#RRGGBB'。 | ||||
|  	        // _brainlessColor() | ||||
|  	        var color = Math.floor( | ||||
| @@ -1959,7 +1959,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        } | ||||
|  	        return result.join(' ') | ||||
|  	    }, | ||||
| -	    // | ||||
| +	    // | ||||
|  	    cparagraph: function(min, max) { | ||||
|  	        var len = range(3, 7, min, max) | ||||
|  	        var result = [] | ||||
| @@ -2282,17 +2282,17 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        随机生成一个 URL。 | ||||
|  | ||||
|  	        [URL 规范](http://www.w3.org/Addressing/URL/url-spec.txt) | ||||
| -	            http                    Hypertext Transfer Protocol | ||||
| -	            ftp                     File Transfer protocol | ||||
| -	            gopher                  The Gopher protocol | ||||
| -	            mailto                  Electronic mail address | ||||
| -	            mid                     Message identifiers for electronic mail | ||||
| -	            cid                     Content identifiers for MIME body part | ||||
| -	            news                    Usenet news | ||||
| -	            nntp                    Usenet news for local NNTP access only | ||||
| -	            prospero                Access using the prospero protocols | ||||
| +	            http                    Hypertext Transfer Protocol | ||||
| +	            ftp                     File Transfer protocol | ||||
| +	            gopher                  The Gopher protocol | ||||
| +	            mailto                  Electronic mail address | ||||
| +	            mid                     Message identifiers for electronic mail | ||||
| +	            cid                     Content identifiers for MIME body part | ||||
| +	            news                    Usenet news | ||||
| +	            nntp                    Usenet news for local NNTP access only | ||||
| +	            prospero                Access using the prospero protocols | ||||
|  	            telnet rlogin tn3270    Reference to interactive sessions | ||||
| -	            wais                    Wide Area Information Servers | ||||
| +	            wais                    Wide Area Information Servers | ||||
|  	    */ | ||||
|  	    url: function(protocol, host) { | ||||
|  	        return (protocol || this.protocol()) + '://' + // protocol? | ||||
| @@ -2422,9 +2422,9 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	    西南   重庆市 四川省 贵州省 云南省 西藏自治区 | ||||
|  	    西北   陕西省 甘肃省 青海省 宁夏回族自治区 新疆维吾尔自治区 | ||||
|  	    港澳台 香港特别行政区 澳门特别行政区 台湾省 | ||||
| - | ||||
| + | ||||
|  	    **排序** | ||||
| - | ||||
| + | ||||
|  	    ```js | ||||
|  	    var map = {} | ||||
|  	    _.each(_.keys(REGIONS),function(id){ | ||||
| @@ -6527,7 +6527,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  		                "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / | ||||
|  		                "a" / "b" / "c" / "d" / "e" / "f" / | ||||
|  		                "A" / "B" / "C" / "D" / "E" / "F" | ||||
| - | ||||
| + | ||||
|  		    https://github.com/victorquinn/chancejs/blob/develop/chance.js#L1349 | ||||
|  		*/ | ||||
|  		guid: function() { | ||||
| @@ -6629,7 +6629,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	} | ||||
|  | ||||
|  	function CaptureGroup(n) { | ||||
| -	    Group.call(this, "capture-group"), this.index = cgs[this.offset] || (cgs[this.offset] = index++), | ||||
| +	    Group.call(this, "capture-group"), this.index = cgs[this.offset] || (cgs[this.offset] = index++), | ||||
|  	    this.body = n; | ||||
|  	} | ||||
|  | ||||
| @@ -6711,7 +6711,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	            } | ||||
|  	            return r = l ? '"' + u(l) + '"' : "end of input", "Expected " + t + " but " + r + " found."; | ||||
|  	        } | ||||
| -	        this.expected = n, this.found = l, this.offset = u, this.line = t, this.column = r, | ||||
| +	        this.expected = n, this.found = l, this.offset = u, this.line = t, this.column = r, | ||||
|  	        this.name = "SyntaxError", this.message = e(n, l); | ||||
|  	    } | ||||
|  	    function u(n) { | ||||
| @@ -6724,8 +6724,8 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        function r(l) { | ||||
|  	            function u(l, u, t) { | ||||
|  	                var r, e; | ||||
| -	                for (r = u; t > r; r++) e = n.charAt(r), "\n" === e ? (l.seenCR || l.line++, l.column = 1, | ||||
| -	                l.seenCR = !1) : "\r" === e || "\u2028" === e || "\u2029" === e ? (l.line++, l.column = 1, | ||||
| +	                for (r = u; t > r; r++) e = n.charAt(r), "\n" === e ? (l.seenCR || l.line++, l.column = 1, | ||||
| +	                l.seenCR = !1) : "\r" === e || "\u2028" === e || "\u2029" === e ? (l.line++, l.column = 1, | ||||
|  	                l.seenCR = !0) : (l.column++, l.seenCR = !1); | ||||
|  	            } | ||||
|  	            return Mt !== l && (Mt > l && (Mt = 0, Dt = { | ||||
| @@ -6743,19 +6743,19 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        } | ||||
|  	        function c() { | ||||
|  	            var l, u, t, r, o; | ||||
| -	            return l = qt, u = i(), null !== u ? (t = qt, 124 === n.charCodeAt(qt) ? (r = fl, | ||||
| -	            qt++) : (r = null, 0 === Wt && e(sl)), null !== r ? (o = c(), null !== o ? (r = [ r, o ], | ||||
| -	            t = r) : (qt = t, t = il)) : (qt = t, t = il), null === t && (t = al), null !== t ? (Lt = l, | ||||
| -	            u = hl(u, t), null === u ? (qt = l, l = u) : l = u) : (qt = l, l = il)) : (qt = l, | ||||
| +	            return l = qt, u = i(), null !== u ? (t = qt, 124 === n.charCodeAt(qt) ? (r = fl, | ||||
| +	            qt++) : (r = null, 0 === Wt && e(sl)), null !== r ? (o = c(), null !== o ? (r = [ r, o ], | ||||
| +	            t = r) : (qt = t, t = il)) : (qt = t, t = il), null === t && (t = al), null !== t ? (Lt = l, | ||||
| +	            u = hl(u, t), null === u ? (qt = l, l = u) : l = u) : (qt = l, l = il)) : (qt = l, | ||||
|  	            l = il), l; | ||||
|  	        } | ||||
|  	        function i() { | ||||
|  	            var n, l, u, t, r; | ||||
| -	            if (n = qt, l = f(), null === l && (l = al), null !== l) if (u = qt, Wt++, t = d(), | ||||
| +	            if (n = qt, l = f(), null === l && (l = al), null !== l) if (u = qt, Wt++, t = d(), | ||||
|  	            Wt--, null === t ? u = al : (qt = u, u = il), null !== u) { | ||||
| -	                for (t = [], r = h(), null === r && (r = a()); null !== r; ) t.push(r), r = h(), | ||||
| +	                for (t = [], r = h(), null === r && (r = a()); null !== r; ) t.push(r), r = h(), | ||||
|  	                null === r && (r = a()); | ||||
| -	                null !== t ? (r = s(), null === r && (r = al), null !== r ? (Lt = n, l = dl(l, t, r), | ||||
| +	                null !== t ? (r = s(), null === r && (r = al), null !== r ? (Lt = n, l = dl(l, t, r), | ||||
|  	                null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il); | ||||
|  	            } else qt = n, n = il; else qt = n, n = il; | ||||
|  	            return n; | ||||
| @@ -6766,148 +6766,148 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        } | ||||
|  	        function f() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, 94 === n.charCodeAt(qt) ? (u = pl, qt++) : (u = null, 0 === Wt && e(vl)), | ||||
| +	            return l = qt, 94 === n.charCodeAt(qt) ? (u = pl, qt++) : (u = null, 0 === Wt && e(vl)), | ||||
|  	            null !== u && (Lt = l, u = wl()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function s() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, 36 === n.charCodeAt(qt) ? (u = Al, qt++) : (u = null, 0 === Wt && e(Cl)), | ||||
| +	            return l = qt, 36 === n.charCodeAt(qt) ? (u = Al, qt++) : (u = null, 0 === Wt && e(Cl)), | ||||
|  	            null !== u && (Lt = l, u = gl()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function h() { | ||||
|  	            var n, l, u; | ||||
| -	            return n = qt, l = a(), null !== l ? (u = d(), null !== u ? (Lt = n, l = bl(l, u), | ||||
| +	            return n = qt, l = a(), null !== l ? (u = d(), null !== u ? (Lt = n, l = bl(l, u), | ||||
|  	            null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il), n; | ||||
|  	        } | ||||
|  	        function d() { | ||||
|  	            var n, l, u; | ||||
| -	            return Wt++, n = qt, l = p(), null !== l ? (u = k(), null === u && (u = al), null !== u ? (Lt = n, | ||||
| -	            l = Tl(l, u), null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, | ||||
| +	            return Wt++, n = qt, l = p(), null !== l ? (u = k(), null === u && (u = al), null !== u ? (Lt = n, | ||||
| +	            l = Tl(l, u), null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, | ||||
|  	            n = il), Wt--, null === n && (l = null, 0 === Wt && e(kl)), n; | ||||
|  	        } | ||||
|  	        function p() { | ||||
|  	            var n; | ||||
| -	            return n = v(), null === n && (n = w(), null === n && (n = A(), null === n && (n = C(), | ||||
| +	            return n = v(), null === n && (n = w(), null === n && (n = A(), null === n && (n = C(), | ||||
|  	            null === n && (n = g(), null === n && (n = b()))))), n; | ||||
|  	        } | ||||
|  	        function v() { | ||||
|  	            var l, u, t, r, o, c; | ||||
| -	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), | ||||
| -	            null !== u ? (t = T(), null !== t ? (44 === n.charCodeAt(qt) ? (r = ml, qt++) : (r = null, | ||||
| -	            0 === Wt && e(Rl)), null !== r ? (o = T(), null !== o ? (125 === n.charCodeAt(qt) ? (c = Fl, | ||||
| -	            qt++) : (c = null, 0 === Wt && e(Ql)), null !== c ? (Lt = l, u = Sl(t, o), null === u ? (qt = l, | ||||
| -	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, | ||||
| +	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), | ||||
| +	            null !== u ? (t = T(), null !== t ? (44 === n.charCodeAt(qt) ? (r = ml, qt++) : (r = null, | ||||
| +	            0 === Wt && e(Rl)), null !== r ? (o = T(), null !== o ? (125 === n.charCodeAt(qt) ? (c = Fl, | ||||
| +	            qt++) : (c = null, 0 === Wt && e(Ql)), null !== c ? (Lt = l, u = Sl(t, o), null === u ? (qt = l, | ||||
| +	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function w() { | ||||
|  	            var l, u, t, r; | ||||
| -	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), | ||||
| -	            null !== u ? (t = T(), null !== t ? (n.substr(qt, 2) === Ul ? (r = Ul, qt += 2) : (r = null, | ||||
| -	            0 === Wt && e(El)), null !== r ? (Lt = l, u = Gl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), | ||||
| +	            null !== u ? (t = T(), null !== t ? (n.substr(qt, 2) === Ul ? (r = Ul, qt += 2) : (r = null, | ||||
| +	            0 === Wt && e(El)), null !== r ? (Lt = l, u = Gl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function A() { | ||||
|  	            var l, u, t, r; | ||||
| -	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), | ||||
| -	            null !== u ? (t = T(), null !== t ? (125 === n.charCodeAt(qt) ? (r = Fl, qt++) : (r = null, | ||||
| -	            0 === Wt && e(Ql)), null !== r ? (Lt = l, u = Bl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)), | ||||
| +	            null !== u ? (t = T(), null !== t ? (125 === n.charCodeAt(qt) ? (r = Fl, qt++) : (r = null, | ||||
| +	            0 === Wt && e(Ql)), null !== r ? (Lt = l, u = Bl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function C() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, 43 === n.charCodeAt(qt) ? (u = jl, qt++) : (u = null, 0 === Wt && e($l)), | ||||
| +	            return l = qt, 43 === n.charCodeAt(qt) ? (u = jl, qt++) : (u = null, 0 === Wt && e($l)), | ||||
|  	            null !== u && (Lt = l, u = ql()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function g() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, 42 === n.charCodeAt(qt) ? (u = Ll, qt++) : (u = null, 0 === Wt && e(Ml)), | ||||
| +	            return l = qt, 42 === n.charCodeAt(qt) ? (u = Ll, qt++) : (u = null, 0 === Wt && e(Ml)), | ||||
|  	            null !== u && (Lt = l, u = Dl()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function b() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, 63 === n.charCodeAt(qt) ? (u = Hl, qt++) : (u = null, 0 === Wt && e(Ol)), | ||||
| +	            return l = qt, 63 === n.charCodeAt(qt) ? (u = Hl, qt++) : (u = null, 0 === Wt && e(Ol)), | ||||
|  	            null !== u && (Lt = l, u = Wl()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function k() { | ||||
|  	            var l; | ||||
| -	            return 63 === n.charCodeAt(qt) ? (l = Hl, qt++) : (l = null, 0 === Wt && e(Ol)), | ||||
| +	            return 63 === n.charCodeAt(qt) ? (l = Hl, qt++) : (l = null, 0 === Wt && e(Ol)), | ||||
|  	            l; | ||||
|  	        } | ||||
|  	        function T() { | ||||
|  	            var l, u, t; | ||||
| -	            if (l = qt, u = [], zl.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, | ||||
| -	            0 === Wt && e(Il)), null !== t) for (;null !== t; ) u.push(t), zl.test(n.charAt(qt)) ? (t = n.charAt(qt), | ||||
| +	            if (l = qt, u = [], zl.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, | ||||
| +	            0 === Wt && e(Il)), null !== t) for (;null !== t; ) u.push(t), zl.test(n.charAt(qt)) ? (t = n.charAt(qt), | ||||
|  	            qt++) : (t = null, 0 === Wt && e(Il)); else u = il; | ||||
| -	            return null !== u && (Lt = l, u = Jl(u)), null === u ? (qt = l, l = u) : l = u, | ||||
| +	            return null !== u && (Lt = l, u = Jl(u)), null === u ? (qt = l, l = u) : l = u, | ||||
|  	            l; | ||||
|  	        } | ||||
|  	        function x() { | ||||
|  	            var l, u, t, r; | ||||
| -	            return l = qt, 40 === n.charCodeAt(qt) ? (u = Kl, qt++) : (u = null, 0 === Wt && e(Nl)), | ||||
| -	            null !== u ? (t = R(), null === t && (t = F(), null === t && (t = m(), null === t && (t = y()))), | ||||
| -	            null !== t ? (41 === n.charCodeAt(qt) ? (r = Pl, qt++) : (r = null, 0 === Wt && e(Vl)), | ||||
| -	            null !== r ? (Lt = l, u = Xl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, 40 === n.charCodeAt(qt) ? (u = Kl, qt++) : (u = null, 0 === Wt && e(Nl)), | ||||
| +	            null !== u ? (t = R(), null === t && (t = F(), null === t && (t = m(), null === t && (t = y()))), | ||||
| +	            null !== t ? (41 === n.charCodeAt(qt) ? (r = Pl, qt++) : (r = null, 0 === Wt && e(Vl)), | ||||
| +	            null !== r ? (Lt = l, u = Xl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function y() { | ||||
|  	            var n, l; | ||||
| -	            return n = qt, l = c(), null !== l && (Lt = n, l = Yl(l)), null === l ? (qt = n, | ||||
| +	            return n = qt, l = c(), null !== l && (Lt = n, l = Yl(l)), null === l ? (qt = n, | ||||
|  	            n = l) : n = l, n; | ||||
|  	        } | ||||
|  	        function m() { | ||||
|  	            var l, u, t; | ||||
| -	            return l = qt, n.substr(qt, 2) === Zl ? (u = Zl, qt += 2) : (u = null, 0 === Wt && e(_l)), | ||||
| -	            null !== u ? (t = c(), null !== t ? (Lt = l, u = nu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, n.substr(qt, 2) === Zl ? (u = Zl, qt += 2) : (u = null, 0 === Wt && e(_l)), | ||||
| +	            null !== u ? (t = c(), null !== t ? (Lt = l, u = nu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function R() { | ||||
|  	            var l, u, t; | ||||
| -	            return l = qt, n.substr(qt, 2) === lu ? (u = lu, qt += 2) : (u = null, 0 === Wt && e(uu)), | ||||
| -	            null !== u ? (t = c(), null !== t ? (Lt = l, u = tu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, n.substr(qt, 2) === lu ? (u = lu, qt += 2) : (u = null, 0 === Wt && e(uu)), | ||||
| +	            null !== u ? (t = c(), null !== t ? (Lt = l, u = tu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function F() { | ||||
|  	            var l, u, t; | ||||
| -	            return l = qt, n.substr(qt, 2) === ru ? (u = ru, qt += 2) : (u = null, 0 === Wt && e(eu)), | ||||
| -	            null !== u ? (t = c(), null !== t ? (Lt = l, u = ou(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, n.substr(qt, 2) === ru ? (u = ru, qt += 2) : (u = null, 0 === Wt && e(eu)), | ||||
| +	            null !== u ? (t = c(), null !== t ? (Lt = l, u = ou(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function Q() { | ||||
|  	            var l, u, t, r, o; | ||||
| -	            if (Wt++, l = qt, 91 === n.charCodeAt(qt) ? (u = iu, qt++) : (u = null, 0 === Wt && e(au)), | ||||
| -	            null !== u) if (94 === n.charCodeAt(qt) ? (t = pl, qt++) : (t = null, 0 === Wt && e(vl)), | ||||
| +	            if (Wt++, l = qt, 91 === n.charCodeAt(qt) ? (u = iu, qt++) : (u = null, 0 === Wt && e(au)), | ||||
| +	            null !== u) if (94 === n.charCodeAt(qt) ? (t = pl, qt++) : (t = null, 0 === Wt && e(vl)), | ||||
|  	            null === t && (t = al), null !== t) { | ||||
| -	                for (r = [], o = S(), null === o && (o = U()); null !== o; ) r.push(o), o = S(), | ||||
| +	                for (r = [], o = S(), null === o && (o = U()); null !== o; ) r.push(o), o = S(), | ||||
|  	                null === o && (o = U()); | ||||
| -	                null !== r ? (93 === n.charCodeAt(qt) ? (o = fu, qt++) : (o = null, 0 === Wt && e(su)), | ||||
| -	                null !== o ? (Lt = l, u = hu(t, r), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	                null !== r ? (93 === n.charCodeAt(qt) ? (o = fu, qt++) : (o = null, 0 === Wt && e(su)), | ||||
| +	                null !== o ? (Lt = l, u = hu(t, r), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	                l = il)) : (qt = l, l = il); | ||||
|  	            } else qt = l, l = il; else qt = l, l = il; | ||||
|  	            return Wt--, null === l && (u = null, 0 === Wt && e(cu)), l; | ||||
|  	        } | ||||
|  	        function S() { | ||||
|  	            var l, u, t, r; | ||||
| -	            return Wt++, l = qt, u = U(), null !== u ? (45 === n.charCodeAt(qt) ? (t = pu, qt++) : (t = null, | ||||
| -	            0 === Wt && e(vu)), null !== t ? (r = U(), null !== r ? (Lt = l, u = wu(u, r), null === u ? (qt = l, | ||||
| -	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il), Wt--, | ||||
| +	            return Wt++, l = qt, u = U(), null !== u ? (45 === n.charCodeAt(qt) ? (t = pu, qt++) : (t = null, | ||||
| +	            0 === Wt && e(vu)), null !== t ? (r = U(), null !== r ? (Lt = l, u = wu(u, r), null === u ? (qt = l, | ||||
| +	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il), Wt--, | ||||
|  	            null === l && (u = null, 0 === Wt && e(du)), l; | ||||
|  	        } | ||||
|  	        function U() { | ||||
|  	            var n, l; | ||||
| -	            return Wt++, n = G(), null === n && (n = E()), Wt--, null === n && (l = null, 0 === Wt && e(Au)), | ||||
| +	            return Wt++, n = G(), null === n && (n = E()), Wt--, null === n && (l = null, 0 === Wt && e(Au)), | ||||
|  	            n; | ||||
|  	        } | ||||
|  	        function E() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, Cu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, 0 === Wt && e(gu)), | ||||
| +	            return l = qt, Cu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, 0 === Wt && e(gu)), | ||||
|  	            null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function G() { | ||||
|  	            var n; | ||||
| -	            return n = L(), null === n && (n = Y(), null === n && (n = H(), null === n && (n = O(), | ||||
| -	            null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), null === n && (n = J(), | ||||
| -	            null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), null === n && (n = V(), | ||||
| -	            null === n && (n = X(), null === n && (n = _(), null === n && (n = nl(), null === n && (n = ll(), | ||||
| +	            return n = L(), null === n && (n = Y(), null === n && (n = H(), null === n && (n = O(), | ||||
| +	            null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), null === n && (n = J(), | ||||
| +	            null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), null === n && (n = V(), | ||||
| +	            null === n && (n = X(), null === n && (n = _(), null === n && (n = nl(), null === n && (n = ll(), | ||||
|  	            null === n && (n = ul(), null === n && (n = tl()))))))))))))))))), n; | ||||
|  	        } | ||||
|  	        function B() { | ||||
| @@ -6916,154 +6916,154 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        } | ||||
|  	        function j() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, 46 === n.charCodeAt(qt) ? (u = ku, qt++) : (u = null, 0 === Wt && e(Tu)), | ||||
| +	            return l = qt, 46 === n.charCodeAt(qt) ? (u = ku, qt++) : (u = null, 0 === Wt && e(Tu)), | ||||
|  	            null !== u && (Lt = l, u = xu()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function $() { | ||||
|  	            var l, u; | ||||
| -	            return Wt++, l = qt, mu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, | ||||
| -	            0 === Wt && e(Ru)), null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, | ||||
| +	            return Wt++, l = qt, mu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, | ||||
| +	            0 === Wt && e(Ru)), null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, | ||||
|  	            Wt--, null === l && (u = null, 0 === Wt && e(yu)), l; | ||||
|  	        } | ||||
|  	        function q() { | ||||
|  	            var n; | ||||
| -	            return n = M(), null === n && (n = D(), null === n && (n = Y(), null === n && (n = H(), | ||||
| -	            null === n && (n = O(), null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), | ||||
| -	            null === n && (n = J(), null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), | ||||
| -	            null === n && (n = V(), null === n && (n = X(), null === n && (n = Z(), null === n && (n = _(), | ||||
| -	            null === n && (n = nl(), null === n && (n = ll(), null === n && (n = ul(), null === n && (n = tl()))))))))))))))))))), | ||||
| +	            return n = M(), null === n && (n = D(), null === n && (n = Y(), null === n && (n = H(), | ||||
| +	            null === n && (n = O(), null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), | ||||
| +	            null === n && (n = J(), null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), | ||||
| +	            null === n && (n = V(), null === n && (n = X(), null === n && (n = Z(), null === n && (n = _(), | ||||
| +	            null === n && (n = nl(), null === n && (n = ll(), null === n && (n = ul(), null === n && (n = tl()))))))))))))))))))), | ||||
|  	            n; | ||||
|  	        } | ||||
|  	        function L() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), | ||||
|  	            null !== u && (Lt = l, u = Su()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function M() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)), | ||||
|  	            null !== u && (Lt = l, u = Uu()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function D() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Eu ? (u = Eu, qt += 2) : (u = null, 0 === Wt && e(Gu)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Eu ? (u = Eu, qt += 2) : (u = null, 0 === Wt && e(Gu)), | ||||
|  	            null !== u && (Lt = l, u = Bu()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function H() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === ju ? (u = ju, qt += 2) : (u = null, 0 === Wt && e($u)), | ||||
| +	            return l = qt, n.substr(qt, 2) === ju ? (u = ju, qt += 2) : (u = null, 0 === Wt && e($u)), | ||||
|  	            null !== u && (Lt = l, u = qu()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function O() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Lu ? (u = Lu, qt += 2) : (u = null, 0 === Wt && e(Mu)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Lu ? (u = Lu, qt += 2) : (u = null, 0 === Wt && e(Mu)), | ||||
|  	            null !== u && (Lt = l, u = Du()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function W() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Hu ? (u = Hu, qt += 2) : (u = null, 0 === Wt && e(Ou)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Hu ? (u = Hu, qt += 2) : (u = null, 0 === Wt && e(Ou)), | ||||
|  	            null !== u && (Lt = l, u = Wu()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function z() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === zu ? (u = zu, qt += 2) : (u = null, 0 === Wt && e(Iu)), | ||||
| +	            return l = qt, n.substr(qt, 2) === zu ? (u = zu, qt += 2) : (u = null, 0 === Wt && e(Iu)), | ||||
|  	            null !== u && (Lt = l, u = Ju()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function I() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Ku ? (u = Ku, qt += 2) : (u = null, 0 === Wt && e(Nu)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Ku ? (u = Ku, qt += 2) : (u = null, 0 === Wt && e(Nu)), | ||||
|  	            null !== u && (Lt = l, u = Pu()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function J() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Vu ? (u = Vu, qt += 2) : (u = null, 0 === Wt && e(Xu)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Vu ? (u = Vu, qt += 2) : (u = null, 0 === Wt && e(Xu)), | ||||
|  	            null !== u && (Lt = l, u = Yu()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function K() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Zu ? (u = Zu, qt += 2) : (u = null, 0 === Wt && e(_u)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Zu ? (u = Zu, qt += 2) : (u = null, 0 === Wt && e(_u)), | ||||
|  	            null !== u && (Lt = l, u = nt()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function N() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === lt ? (u = lt, qt += 2) : (u = null, 0 === Wt && e(ut)), | ||||
| +	            return l = qt, n.substr(qt, 2) === lt ? (u = lt, qt += 2) : (u = null, 0 === Wt && e(ut)), | ||||
|  	            null !== u && (Lt = l, u = tt()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function P() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === rt ? (u = rt, qt += 2) : (u = null, 0 === Wt && e(et)), | ||||
| +	            return l = qt, n.substr(qt, 2) === rt ? (u = rt, qt += 2) : (u = null, 0 === Wt && e(et)), | ||||
|  	            null !== u && (Lt = l, u = ot()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function V() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === ct ? (u = ct, qt += 2) : (u = null, 0 === Wt && e(it)), | ||||
| +	            return l = qt, n.substr(qt, 2) === ct ? (u = ct, qt += 2) : (u = null, 0 === Wt && e(it)), | ||||
|  	            null !== u && (Lt = l, u = at()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function X() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === ft ? (u = ft, qt += 2) : (u = null, 0 === Wt && e(st)), | ||||
| +	            return l = qt, n.substr(qt, 2) === ft ? (u = ft, qt += 2) : (u = null, 0 === Wt && e(st)), | ||||
|  	            null !== u && (Lt = l, u = ht()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function Y() { | ||||
|  	            var l, u, t; | ||||
| -	            return l = qt, n.substr(qt, 2) === dt ? (u = dt, qt += 2) : (u = null, 0 === Wt && e(pt)), | ||||
| -	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), | ||||
| -	            null !== t ? (Lt = l, u = wt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, n.substr(qt, 2) === dt ? (u = dt, qt += 2) : (u = null, 0 === Wt && e(pt)), | ||||
| +	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), | ||||
| +	            null !== t ? (Lt = l, u = wt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function Z() { | ||||
|  	            var l, u, t; | ||||
| -	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), | ||||
| -	            null !== u ? (gt.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(bt)), | ||||
| -	            null !== t ? (Lt = l, u = kt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), | ||||
| +	            null !== u ? (gt.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(bt)), | ||||
| +	            null !== t ? (Lt = l, u = kt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        function _() { | ||||
|  	            var l, u, t, r; | ||||
| -	            if (l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), | ||||
| +	            if (l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), | ||||
|  	            null !== u) { | ||||
| -	                if (t = [], yt.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(mt)), | ||||
| -	                null !== r) for (;null !== r; ) t.push(r), yt.test(n.charAt(qt)) ? (r = n.charAt(qt), | ||||
| +	                if (t = [], yt.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(mt)), | ||||
| +	                null !== r) for (;null !== r; ) t.push(r), yt.test(n.charAt(qt)) ? (r = n.charAt(qt), | ||||
|  	                qt++) : (r = null, 0 === Wt && e(mt)); else t = il; | ||||
| -	                null !== t ? (Lt = l, u = Rt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	                null !== t ? (Lt = l, u = Rt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	                l = il); | ||||
|  	            } else qt = l, l = il; | ||||
|  	            return l; | ||||
|  	        } | ||||
|  	        function nl() { | ||||
|  	            var l, u, t, r; | ||||
| -	            if (l = qt, n.substr(qt, 2) === Ft ? (u = Ft, qt += 2) : (u = null, 0 === Wt && e(Qt)), | ||||
| +	            if (l = qt, n.substr(qt, 2) === Ft ? (u = Ft, qt += 2) : (u = null, 0 === Wt && e(Qt)), | ||||
|  	            null !== u) { | ||||
| -	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), | ||||
| -	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), | ||||
| +	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), | ||||
| +	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), | ||||
|  	                qt++) : (r = null, 0 === Wt && e(Ut)); else t = il; | ||||
| -	                null !== t ? (Lt = l, u = Et(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	                null !== t ? (Lt = l, u = Et(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	                l = il); | ||||
|  	            } else qt = l, l = il; | ||||
|  	            return l; | ||||
|  	        } | ||||
|  	        function ll() { | ||||
|  	            var l, u, t, r; | ||||
| -	            if (l = qt, n.substr(qt, 2) === Gt ? (u = Gt, qt += 2) : (u = null, 0 === Wt && e(Bt)), | ||||
| +	            if (l = qt, n.substr(qt, 2) === Gt ? (u = Gt, qt += 2) : (u = null, 0 === Wt && e(Bt)), | ||||
|  	            null !== u) { | ||||
| -	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), | ||||
| -	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), | ||||
| +	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)), | ||||
| +	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt), | ||||
|  	                qt++) : (r = null, 0 === Wt && e(Ut)); else t = il; | ||||
| -	                null !== t ? (Lt = l, u = jt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	                null !== t ? (Lt = l, u = jt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	                l = il); | ||||
|  	            } else qt = l, l = il; | ||||
|  	            return l; | ||||
|  	        } | ||||
|  	        function ul() { | ||||
|  	            var l, u; | ||||
| -	            return l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), | ||||
| +	            return l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)), | ||||
|  	            null !== u && (Lt = l, u = $t()), null === u ? (qt = l, l = u) : l = u, l; | ||||
|  	        } | ||||
|  	        function tl() { | ||||
|  	            var l, u, t; | ||||
| -	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), | ||||
| -	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), | ||||
| -	            null !== t ? (Lt = l, u = bu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
| +	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)), | ||||
| +	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)), | ||||
| +	            null !== t ? (Lt = l, u = bu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l, | ||||
|  	            l = il)) : (qt = l, l = il), l; | ||||
|  	        } | ||||
|  	        var rl, el = arguments.length > 1 ? arguments[1] : {}, ol = { | ||||
| @@ -7234,7 +7234,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	var Util = __webpack_require__(3) | ||||
|  	var Random = __webpack_require__(5) | ||||
|  	    /* | ||||
| - | ||||
| + | ||||
|  	    */ | ||||
|  	var Handler = { | ||||
|  	    extend: Util.extend | ||||
| @@ -7481,7 +7481,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	        return Random.integer(min, max) | ||||
|  	    }, | ||||
|  	    /* | ||||
| - | ||||
| + | ||||
|  	    */ | ||||
|  	    charset: function(node, result, cache) { | ||||
|  	        // node.invert | ||||
| @@ -7642,11 +7642,11 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	    ## valid(template, data) | ||||
|  | ||||
|  	    校验真实数据 data 是否与数据模板 template 匹配。 | ||||
| - | ||||
| + | ||||
|  	    实现思路: | ||||
|  	    1. 解析规则。 | ||||
|  	        先把数据模板 template 解析为更方便机器解析的 JSON-Schame | ||||
| -	        name               属性名 | ||||
| +	        name               属性名 | ||||
|  	        type               属性值类型 | ||||
|  	        template           属性值模板 | ||||
|  	        properties         对象属性数组 | ||||
| @@ -7655,7 +7655,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	    2. 递归验证规则。 | ||||
|  	        然后用 JSON-Schema 校验真实数据,校验项包括属性名、值类型、值、值生成规则。 | ||||
|  | ||||
| -	    提示信息 | ||||
| +	    提示信息 | ||||
|  	    https://github.com/fge/json-schema-validator/blob/master/src/main/resources/com/github/fge/jsonschema/validator/validation.properties | ||||
|  	    [JSON-Schama validator](http://json-schema-validator.herokuapp.com/) | ||||
|  	    [Regexp Demo](http://demos.forbeslindesay.co.uk/regexp/) | ||||
| @@ -7693,8 +7693,8 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	                    +step | ||||
|  	                    整数部分 | ||||
|  	                    小数部分 | ||||
| -	                boolean | ||||
| -	                string | ||||
| +	                boolean | ||||
| +	                string | ||||
|  	                    min-max | ||||
|  	                    count | ||||
|  	    ## properties | ||||
| @@ -7949,9 +7949,9 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  | ||||
|  	/* | ||||
|  	    完善、友好的提示信息 | ||||
| - | ||||
| + | ||||
|  	    Equal, not equal to, greater than, less than, greater than or equal to, less than or equal to | ||||
| -	    路径 验证类型 描述 | ||||
| +	    路径 验证类型 描述 | ||||
|  | ||||
|  	    Expect path.name is less than or equal to expected, but path.name is actual. | ||||
|  | ||||
| @@ -8264,7 +8264,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	Util.extend(MockXMLHttpRequest.prototype, { | ||||
|  	    // https://xhr.spec.whatwg.org/#the-open()-method | ||||
|  	    // Sets the request method, request URL, and synchronous flag. | ||||
| -	    open: function(method, url, async, username, password) { | ||||
| +	    open: function(method, url, async = true, username, password) { | ||||
|  	        var that = this | ||||
|  | ||||
|  	        Util.extend(this.custom, { | ||||
| @@ -8310,6 +8310,8 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  	            var xhr = createNativeXMLHttpRequest() | ||||
|  	            this.custom.xhr = xhr | ||||
|  | ||||
| +                MockXMLHttpRequest.prototype.upload = xhr.upload | ||||
| + | ||||
|  	            // 初始化所有事件,用于监听原生 XHR 对象的事件 | ||||
|  	            for (var i = 0; i < XHR_EVENTS.length; i++) { | ||||
|  	                xhr.addEventListener(XHR_EVENTS[i], handle) | ||||
| @@ -8360,6 +8362,7 @@ return /******/ (function(modules) { // webpackBootstrap | ||||
|  | ||||
|  	        // 原生 XHR | ||||
|  	        if (!this.match) { | ||||
| +                this.custom.xhr.responseType = this.responseType || '' | ||||
|  	            this.custom.xhr.send(data) | ||||
|  	            return | ||||
|  	        } | ||||
							
								
								
									
										16978
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 17 KiB | 
							
								
								
									
										1
									
								
								public/favicon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg viewBox="0 0 160 160" xmlns="http://www.w3.org/2000/svg"><path d="M81.28 55.9c-.1-11.67-2.93-22.55-9.37-32.38-1-1.5-2.14-2.86-2.5-4.71a8.1 8.1 0 014-8.61 7.89 7.89 0 019.3 1.23 35.999 35.999 0 015.9 8.83 75.18 75.18 0 018.44 28.58 83.211 83.211 0 01-5.23 36.74 102.983 102.983 0 01-3 7.28 1.2 1.2 0 000 1.41c9.58 13.3 21.76 23 37.85 27.24a54.37 54.37 0 0019.68 1.57 7.72 7.72 0 018.36 6.9 7.903 7.903 0 01-6.7 9 64.744 64.744 0 01-23-1.33 77.68 77.68 0 01-36.93-19.88 93.628 93.628 0 01-11.91-13.71 2.18 2.18 0 00-2.3-1.06 72.744 72.744 0 00-27.38 7.55c-11.6 6-20.67 14.58-26.4 26.45a10.134 10.134 0 01-3.7 4.7 8 8 0 01-9.19-.7 7.86 7.86 0 01-2.36-9.28 60.324 60.324 0 018.72-14.52c12.2-15.43 28.21-24.59 47.32-28.57A85.085 85.085 0 0173.07 87c.524.015 1-.307 1.18-.8a76.06 76.06 0 006.53-22.3c.351-2.652.518-5.325.5-8z" fill="#646cff"/><path d="M136.26 108.34a44.742 44.742 0 01-11.13-2.87 46.108 46.108 0 01-19.66-13.76 8 8 0 015.72-13.22 7.93 7.93 0 016.54 2.93 33.27 33.27 0 0018.87 10.75c1.546.155 3.058.553 4.48 1.18a8.08 8.08 0 013.84 9.21c-.92 3.52-4.13 5.81-8.66 5.78zm-80.6-75.02a7.61 7.61 0 016.64 5 49.139 49.139 0 013.64 17 46.33 46.33 0 01-2.46 17.28c-2 5.77-8.24 7.79-12.89 4.15a8.1 8.1 0 01-2.39-9 31.679 31.679 0 001.68-12.36 35.77 35.77 0 00-2.43-11c-2.1-5.45 1.75-11.07 8.21-11.07zm22.26 93.25a8 8 0 01-6.68 7.86 32.88 32.88 0 00-19.7 12.19 8.13 8.13 0 01-11.21 1.62 8 8 0 01-1.41-11.58A51.043 51.043 0 0154 123.81a45.842 45.842 0 0114-5.1c5.35-1.04 9.91 2.56 9.92 7.86z" fill="#646cff"/></svg> | ||||
| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								public/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 23 KiB | 
| @@ -1,91 +0,0 @@ | ||||
| .app-loading { | ||||
|   position: fixed; | ||||
|   left: 0; | ||||
|   top: 0; | ||||
|   z-index: -1; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   justify-content: center; | ||||
|   align-items: center; | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
| 	background-color:#f5f7f9; | ||||
| } | ||||
| .app-loading_logo { | ||||
|   width: 128px; | ||||
|   height: 128px; | ||||
| } | ||||
| .app-loading__dot-wrapper { | ||||
|   width: 56px; | ||||
|   height: 56px; | ||||
|   margin: 36px 0; | ||||
| } | ||||
| .app-loading__dot { | ||||
|   position: relative; | ||||
|   height: 100%; | ||||
|   transform: rotate(45deg); | ||||
|   animation-name: loadingRotate; | ||||
|   animation-duration: 1.2s; | ||||
|   animation-iteration-count: infinite; | ||||
|   animation-timing-function: linear; | ||||
| } | ||||
| @keyframes loadingRotate { | ||||
|   to { | ||||
|     -webkit-transform: rotate(405deg); | ||||
|     transform: rotate(405deg); | ||||
|   } | ||||
| } | ||||
| @-webkit-keyframes loadingRotate { | ||||
|   to { | ||||
|     -webkit-transform: rotate(405deg); | ||||
|     transform: rotate(405deg); | ||||
|   } | ||||
| } | ||||
| .app-loading__dot > i { | ||||
|   position: absolute; | ||||
|   display: block; | ||||
|   width: 18px; | ||||
|   height: 18px; | ||||
|   background: #1890ff; | ||||
|   border-radius: 50%; | ||||
|   -webkit-transform: scale(0.75); | ||||
|   transform: scale(0.75); | ||||
|   transform-origin: 50% 50%; | ||||
|   opacity: 0.3; | ||||
|   animation: spinOpacity 1s infinite linear alternate; | ||||
| } | ||||
| @keyframes spinOpacity { | ||||
|   to { | ||||
|     opacity: 1; | ||||
|   } | ||||
| } | ||||
| @-webkit-keyframes spinOpacity { | ||||
|   to { | ||||
|     opacity: 1; | ||||
|   } | ||||
| } | ||||
| .delay-400 { | ||||
|   animation-delay: 0.4s !important; | ||||
| } | ||||
| .delay-800 { | ||||
|   animation-delay: 0.8s !important; | ||||
| } | ||||
| .delay-1200 { | ||||
|   animation-delay: 1.2s !important; | ||||
| } | ||||
| .left { | ||||
|   left: 0; | ||||
| } | ||||
| .right { | ||||
|   right: 0; | ||||
| } | ||||
| .top { | ||||
|   top: 0; | ||||
| } | ||||
| .bottom { | ||||
|   bottom: 0; | ||||
| } | ||||
| .app-loading_title { | ||||
|   font-size: 28px; | ||||
|   color: #646464; | ||||
| } | ||||
| Before Width: | Height: | Size: 11 KiB | 
							
								
								
									
										12
									
								
								scripts/logo.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | ||||
| import { readFile, writeFile } from 'fs/promises'; | ||||
| import themeSettings from '../src/settings/theme.json'; | ||||
|  | ||||
| async function updateFavicon(svgPath: string, color: string) { | ||||
|   const svgStr = await readFile(svgPath, 'utf-8'); | ||||
|  | ||||
|   const svgStrWithColor = svgStr.replace(/currentColor/g, color); | ||||
|  | ||||
|   await writeFile('./public/favicon.svg', svgStrWithColor); | ||||
| } | ||||
|  | ||||
| updateFavicon('./src/assets/svg-icon/logo.svg', themeSettings.themeColor); | ||||
							
								
								
									
										28
									
								
								src/App.vue
									
									
									
									
									
								
							
							
						
						| @@ -1,10 +1,26 @@ | ||||
| <template> | ||||
|   <app-provider> | ||||
|     <router-view /> | ||||
|   </app-provider> | ||||
|   <n-config-provider | ||||
|     :theme="theme.naiveTheme" | ||||
|     :theme-overrides="theme.naiveThemeOverrides" | ||||
|     :locale="zhCN" | ||||
|     :date-locale="dateZhCN" | ||||
|     class="h-full" | ||||
|   > | ||||
|     <naive-provider> | ||||
|       <router-view /> | ||||
|     </naive-provider> | ||||
|   </n-config-provider> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts" setup> | ||||
| import AppProvider from './AppProvider.vue'; | ||||
| <script setup lang="ts"> | ||||
| import { dateZhCN, zhCN } from 'naive-ui'; | ||||
| import { subscribeStore, useThemeStore } from '@/store'; | ||||
| import { useGlobalEvents } from '@/composables'; | ||||
|  | ||||
| const theme = useThemeStore(); | ||||
|  | ||||
| subscribeStore(); | ||||
| useGlobalEvents(); | ||||
| </script> | ||||
| <style></style> | ||||
|  | ||||
| <style scoped></style> | ||||
|   | ||||
| @@ -1,26 +0,0 @@ | ||||
| <template> | ||||
|   <n-config-provider | ||||
|     class="h-full" | ||||
|     :locale="zhCN" | ||||
|     :date-locale="dateZhCN" | ||||
|     :theme="naiveTheme" | ||||
|     :theme-overrides="theme.themeOverrids" | ||||
|   > | ||||
|     <n-element class="h-full"> | ||||
|       <naive-provider> | ||||
|         <slot></slot> | ||||
|       </naive-provider> | ||||
|     </n-element> | ||||
|   </n-config-provider> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts" setup> | ||||
| import { NConfigProvider, NElement, zhCN, dateZhCN } from 'naive-ui'; | ||||
| import { NaiveProvider } from '@/components'; | ||||
| import { useThemeStore } from '@/store'; | ||||
| import { useDarkMode } from '@/composables'; | ||||
|  | ||||
| const theme = useThemeStore(); | ||||
| const { naiveTheme } = useDarkMode(); | ||||
| </script> | ||||
| <style></style> | ||||
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/aguazyuan-bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/aguazyuan-light.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								src/assets/fonts/aguazyuan-regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 7.8 KiB | 
| Before Width: | Height: | Size: 11 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/activity.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12h-4l-3 9L9 3l-3 9H2"/></svg> | ||||
| After Width: | Height: | Size: 202 B | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/at-sign.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="prefix__prefix__feather prefix__prefix__feather-at-sign"><circle cx="12" cy="12" r="4"/><path d="M16 8v5a3 3 0 006 0v-1a10 10 0 10-3.92 7.94"/></svg> | ||||
| After Width: | Height: | Size: 315 B | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/avatar.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 6.3 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/banner.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 19 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/cast.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="prefix__prefix__feather prefix__prefix__feather-cast"><path d="M2 16.1A5 5 0 015.9 20M2 12.05A9 9 0 019.95 20M2 8V6a2 2 0 012-2h16a2 2 0 012 2v12a2 2 0 01-2 2h-6M2 20h.01"/></svg> | ||||
| After Width: | Height: | Size: 345 B | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/chrome.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="4"/><path d="M21.17 8H12M3.95 6.06L8.54 14m2.34 7.94L15.46 14"/></svg> | ||||
| After Width: | Height: | Size: 288 B | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/copy.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg> | ||||
| After Width: | Height: | Size: 283 B | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/custom-icon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 24 24"><path fill="currentColor" d="M19 10c0 1.38-2.12 2.5-3.5 2.5s-2.75-1.12-2.75-2.5h-1.5c0 1.38-1.37 2.5-2.75 2.5S5 11.38 5 10h-.75c-.16.64-.25 1.31-.25 2a8 8 0 008 8 8 8 0 008-8c0-.69-.09-1.36-.25-2H19m-7-6C9.04 4 6.45 5.61 5.07 8h13.86C17.55 5.61 14.96 4 12 4m10 8a10 10 0 01-10 10A10 10 0 012 12 10 10 0 0112 2a10 10 0 0110 10m-10 5.23c-1.75 0-3.29-.73-4.19-1.81L9.23 14c.45.72 1.52 1.23 2.77 1.23s2.32-.51 2.77-1.23l1.42 1.42c-.9 1.08-2.44 1.81-4.19 1.81z"/></svg> | ||||
| After Width: | Height: | Size: 544 B | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/empty-data.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 77 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/heart.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z"/></svg> | ||||
| After Width: | Height: | Size: 309 B | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/logo-fill.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg"><path d="M0 0h160v160H0V0z" fill="currentColor"/><path d="M94.322 51.888A69.12 69.12 0 0187.806 80.9a1.732 1.732 0 00.191 2.014c6.124 8.338 13.677 14.894 23.356 18.821a46.564 46.564 0 0017.273 3.414 29.101 29.101 0 003.364-.252 6.245 6.245 0 017.051 5.156 6.112 6.112 0 01-5.187 7.19 50.758 50.758 0 01-18.19-1.007c-15.964-3.686-28.2-12.84-37.709-25.88a2.165 2.165 0 00-2.246-1.098c-14.1 1.38-26.357 6.475-35.754 17.331a38.721 38.721 0 00-6.275 9.808 6.255 6.255 0 01-8.229 3.444 6.184 6.184 0 01-3.293-8.258 49.662 49.662 0 019.699-14.722c10.636-11.52 23.97-17.663 39.37-19.677a14.06 14.06 0 012.86-.342c1.622.14 2.197-.735 2.75-2.014a54.752 54.752 0 004.865-23.463 44.302 44.302 0 00-8.057-25.175 6.152 6.152 0 01-.655-6.506 6.043 6.043 0 015.318-3.564 6.386 6.386 0 015.7 3.02 53.98 53.98 0 017.222 14.38 59.734 59.734 0 013.092 18.368z" fill="#fff"/><path d="M47.257 119.468a6.04 6.04 0 011.36-3.907 38.165 38.165 0 0122.66-14.098 6.124 6.124 0 016.699 2.487 6.223 6.223 0 01-3.868 9.698 26.276 26.276 0 00-15.823 9.838 6.245 6.245 0 01-11.028-4.028v.01zm77.935-26.01a34.908 34.908 0 01-9.89-2.498 35.717 35.717 0 01-14.756-10.523 6.233 6.233 0 012.861-10 5.832 5.832 0 016.486 1.742 26.986 26.986 0 0016.628 8.912 6.042 6.042 0 015.036 5.58 6.253 6.253 0 01-4.32 6.504 6.588 6.588 0 01-2.045.282zM69.817 53.65a33.69 33.69 0 01-2.286 12.607 6.255 6.255 0 01-11.018 1.007 6.132 6.132 0 01-.655-5.438 26.178 26.178 0 00-.534-18.377 6.256 6.256 0 0111.572-4.753 40.515 40.515 0 012.921 14.954z" fill="#fff"/></svg> | ||||
| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/logo.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg viewBox="0 0 160 160" xmlns="http://www.w3.org/2000/svg"><path d="M81.28 55.9c-.1-11.67-2.93-22.55-9.37-32.38-1-1.5-2.14-2.86-2.5-4.71a8.1 8.1 0 014-8.61 7.89 7.89 0 019.3 1.23 35.999 35.999 0 015.9 8.83 75.18 75.18 0 018.44 28.58 83.211 83.211 0 01-5.23 36.74 102.983 102.983 0 01-3 7.28 1.2 1.2 0 000 1.41c9.58 13.3 21.76 23 37.85 27.24a54.37 54.37 0 0019.68 1.57 7.72 7.72 0 018.36 6.9 7.903 7.903 0 01-6.7 9 64.744 64.744 0 01-23-1.33 77.68 77.68 0 01-36.93-19.88 93.628 93.628 0 01-11.91-13.71 2.18 2.18 0 00-2.3-1.06 72.744 72.744 0 00-27.38 7.55c-11.6 6-20.67 14.58-26.4 26.45a10.134 10.134 0 01-3.7 4.7 8 8 0 01-9.19-.7 7.86 7.86 0 01-2.36-9.28 60.324 60.324 0 018.72-14.52c12.2-15.43 28.21-24.59 47.32-28.57A85.085 85.085 0 0173.07 87c.524.015 1-.307 1.18-.8a76.06 76.06 0 006.53-22.3c.351-2.652.518-5.325.5-8z" fill="currentColor"/><path d="M136.26 108.34a44.742 44.742 0 01-11.13-2.87 46.108 46.108 0 01-19.66-13.76 8 8 0 015.72-13.22 7.93 7.93 0 016.54 2.93 33.27 33.27 0 0018.87 10.75c1.546.155 3.058.553 4.48 1.18a8.08 8.08 0 013.84 9.21c-.92 3.52-4.13 5.81-8.66 5.78zm-80.6-75.02a7.61 7.61 0 016.64 5 49.139 49.139 0 013.64 17 46.33 46.33 0 01-2.46 17.28c-2 5.77-8.24 7.79-12.89 4.15a8.1 8.1 0 01-2.39-9 31.679 31.679 0 001.68-12.36 35.77 35.77 0 00-2.43-11c-2.1-5.45 1.75-11.07 8.21-11.07zm22.26 93.25a8 8 0 01-6.68 7.86 32.88 32.88 0 00-19.7 12.19 8.13 8.13 0 01-11.21 1.62 8 8 0 01-1.41-11.58A51.043 51.043 0 0154 123.81a45.842 45.842 0 0114-5.1c5.35-1.04 9.91 2.56 9.92 7.86z" fill="currentColor"/></svg> | ||||
| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/network-error.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 19 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/no-icon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.1 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/no-permission.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 50 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/not-found.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 33 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/service-error.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 74 KiB | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/wind.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="feather feather-wind"><path d="M9.59 4.59A2 2 0 1 1 11 8H2m10.59 11.41A2 2 0 1 0 14 16H2m15.73-8.27A2.5 2.5 0 1 1 19.5 12H2"></path></svg> | ||||
| After Width: | Height: | Size: 327 B | 
| Before Width: | Height: | Size: 8.6 KiB | 
							
								
								
									
										97
									
								
								src/components/business/loading-empty-wrapper.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,97 @@ | ||||
| <template> | ||||
|   <div v-if="reloadFlag" class="relative"> | ||||
|     <slot></slot> | ||||
|     <div v-show="showPlaceholder" class="absolute-lt w-full h-full" :class="placeholderClass"> | ||||
|       <div v-show="loading" class="absolute-center"> | ||||
|         <n-spin :show="true" :size="loadingSize" /> | ||||
|       </div> | ||||
|       <div v-show="isEmpty" class="absolute-center"> | ||||
|         <div class="relative"> | ||||
|           <icon-local-empty-data :class="iconClass" /> | ||||
|           <p class="absolute-lb w-full text-center" :class="descClass">{{ emptyDesc }}</p> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div v-show="!network" class="absolute-center"> | ||||
|         <div class="relative" :class="{ 'cursor-pointer': showNetworkReload }" @click="handleReload"> | ||||
|           <icon-local-network-error :class="iconClass" /> | ||||
|           <p class="absolute-lb w-full text-center" :class="descClass">{{ networkErrorDesc }}</p> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { computed, nextTick, onUnmounted, watch } from 'vue'; | ||||
| import { NETWORK_ERROR_MSG } from '@/config'; | ||||
| import { useBoolean } from '@/hooks'; | ||||
|  | ||||
| defineOptions({ name: 'LoadingEmptyWrapper' }); | ||||
|  | ||||
| interface Props { | ||||
|   /** 是否加载 */ | ||||
|   loading: boolean; | ||||
|   /** 是否为空 */ | ||||
|   empty?: boolean; | ||||
|   /** 加载图标的大小 */ | ||||
|   loadingSize?: 'small' | 'medium' | 'large'; | ||||
|   /** 中间占位符的class */ | ||||
|   placeholderClass?: string; | ||||
|   /** 空数据描述文本 */ | ||||
|   emptyDesc?: string; | ||||
|   /** 图标的class */ | ||||
|   iconClass?: string; | ||||
|   /** 描述文本的class */ | ||||
|   descClass?: string; | ||||
|   /** 显示网络异常的重试点击按钮 */ | ||||
|   showNetworkReload?: boolean; | ||||
| } | ||||
|  | ||||
| const props = withDefaults(defineProps<Props>(), { | ||||
|   loading: false, | ||||
|   empty: false, | ||||
|   loadingSize: 'medium', | ||||
|   placeholderClass: 'bg-white dark:bg-dark transition-background-color duration-300 ease-in-out', | ||||
|   emptyDesc: '暂无数据', | ||||
|   iconClass: 'text-320px text-primary', | ||||
|   descClass: 'text-16px text-#666', | ||||
|   showNetworkReload: false | ||||
| }); | ||||
|  | ||||
| // 网络状态 | ||||
| const { bool: network, setBool: setNetwork } = useBoolean(window.navigator.onLine); | ||||
| const { bool: reloadFlag, setBool: setReload } = useBoolean(true); | ||||
|  | ||||
| // 数据是否为空 | ||||
| const isEmpty = computed(() => props.empty && !props.loading && network.value); | ||||
|  | ||||
| const showPlaceholder = computed(() => props.loading || isEmpty.value || !network.value); | ||||
|  | ||||
| const networkErrorDesc = computed(() => | ||||
|   props.showNetworkReload ? `${NETWORK_ERROR_MSG}, 点击重试` : NETWORK_ERROR_MSG | ||||
| ); | ||||
|  | ||||
| function handleReload() { | ||||
|   if (!props.showNetworkReload) return; | ||||
|   setReload(false); | ||||
|   nextTick(() => { | ||||
|     setReload(true); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| const stopHandle = watch( | ||||
|   () => props.loading, | ||||
|   newValue => { | ||||
|     // 结束加载判断一下网络状态 | ||||
|     if (!newValue) { | ||||
|       setNetwork(window.navigator.onLine); | ||||
|     } | ||||
|   } | ||||
| ); | ||||
|  | ||||
| onUnmounted(() => { | ||||
|   stopHandle(); | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style scoped></style> | ||||
							
								
								
									
										50
									
								
								src/components/business/login-agreement.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,50 @@ | ||||
| <template> | ||||
|   <div class="w-full text-14px"> | ||||
|     <n-checkbox v-model:checked="checked">我已经仔细阅读并接受</n-checkbox> | ||||
|     <n-button :text="true" type="primary" @click="handleClickProtocol">《用户协议》</n-button> | ||||
|     <n-button :text="true" type="primary" @click="handleClickPolicy">《隐私权政策》</n-button> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { computed } from 'vue'; | ||||
|  | ||||
| defineOptions({ name: 'LoginAgreement' }); | ||||
|  | ||||
| interface Props { | ||||
|   /** 是否勾选 */ | ||||
|   value?: boolean; | ||||
| } | ||||
|  | ||||
| const props = withDefaults(defineProps<Props>(), { | ||||
|   value: true | ||||
| }); | ||||
|  | ||||
| interface Emits { | ||||
|   (e: 'update:value', value: boolean): void; | ||||
|   /** 点击协议 */ | ||||
|   (e: 'click-protocol'): void; | ||||
|   /** 点击隐私政策 */ | ||||
|   (e: 'click-policy'): void; | ||||
| } | ||||
|  | ||||
| const emit = defineEmits<Emits>(); | ||||
|  | ||||
| const checked = computed({ | ||||
|   get() { | ||||
|     return props.value; | ||||
|   }, | ||||
|   set(newValue: boolean) { | ||||
|     emit('update:value', newValue); | ||||
|   } | ||||
| }); | ||||
|  | ||||
| function handleClickProtocol() { | ||||
|   emit('click-protocol'); | ||||
| } | ||||
| function handleClickPolicy() { | ||||
|   emit('click-policy'); | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped></style> | ||||
| @@ -1,611 +0,0 @@ | ||||
| <template> | ||||
|   <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"> | ||||
|     <g id="freepik--background-complete--inject-83"> | ||||
|       <rect y="382.4" width="500" height="0.25" style="fill: #ebebeb"></rect> | ||||
|       <rect x="416.78" y="398.49" width="33.12" height="0.25" style="fill: #ebebeb"></rect> | ||||
|       <rect x="322.53" y="401.21" width="8.69" height="0.25" style="fill: #ebebeb"></rect> | ||||
|       <rect x="396.59" y="389.21" width="19.19" height="0.25" style="fill: #ebebeb"></rect> | ||||
|       <rect x="52.46" y="390.89" width="43.19" height="0.25" style="fill: #ebebeb"></rect> | ||||
|       <rect x="104.56" y="390.89" width="6.33" height="0.25" style="fill: #ebebeb"></rect> | ||||
|       <rect x="131.47" y="395.11" width="93.68" height="0.25" style="fill: #ebebeb"></rect> | ||||
|       <path | ||||
|         d="M237,337.8H43.91a5.71,5.71,0,0,1-5.7-5.71V60.66A5.71,5.71,0,0,1,43.91,55H237a5.71,5.71,0,0,1,5.71,5.71V332.09A5.71,5.71,0,0,1,237,337.8ZM43.91,55.2a5.46,5.46,0,0,0-5.45,5.46V332.09a5.46,5.46,0,0,0,5.45,5.46H237a5.47,5.47,0,0,0,5.46-5.46V60.66A5.47,5.47,0,0,0,237,55.2Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M453.31,337.8H260.21a5.72,5.72,0,0,1-5.71-5.71V60.66A5.72,5.72,0,0,1,260.21,55h193.1A5.71,5.71,0,0,1,459,60.66V332.09A5.71,5.71,0,0,1,453.31,337.8ZM260.21,55.2a5.47,5.47,0,0,0-5.46,5.46V332.09a5.47,5.47,0,0,0,5.46,5.46h193.1a5.47,5.47,0,0,0,5.46-5.46V60.66a5.47,5.47,0,0,0-5.46-5.46Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <rect | ||||
|         x="301.09" | ||||
|         y="78.79" | ||||
|         width="108.81" | ||||
|         height="196.62" | ||||
|         transform="translate(710.99 354.2) rotate(180)" | ||||
|         style="fill: #e6e6e6" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="296.07" | ||||
|         y="78.79" | ||||
|         width="111.48" | ||||
|         height="196.62" | ||||
|         transform="translate(703.63 354.2) rotate(180)" | ||||
|         style="fill: #f0f0f0" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="301.09" | ||||
|         y="275.41" | ||||
|         width="108.81" | ||||
|         height="4.66" | ||||
|         transform="translate(710.99 555.48) rotate(180)" | ||||
|         style="fill: #e6e6e6" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="294.26" | ||||
|         y="275.41" | ||||
|         width="111.48" | ||||
|         height="4.66" | ||||
|         transform="translate(700.01 555.48) rotate(180)" | ||||
|         style="fill: #f0f0f0" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="260.53" | ||||
|         y="128.39" | ||||
|         width="182.56" | ||||
|         height="97.42" | ||||
|         transform="translate(528.91 -174.71) rotate(90)" | ||||
|         style="fill: #fafafa" | ||||
|       ></rect> | ||||
|       <polygon | ||||
|         points="330.66 268.38 358.08 85.82 377.56 85.82 350.13 268.38 330.66 268.38" | ||||
|         style="fill: #fff" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="333.75 268.38 361.18 85.82 380.65 85.82 353.22 268.38 333.75 268.38" | ||||
|         style="fill: #fff" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="354.31 268.38 381.74 85.82 389.33 85.82 361.91 268.38 354.31 268.38" | ||||
|         style="fill: #fff" | ||||
|       ></polygon> | ||||
|       <rect | ||||
|         x="212.27" | ||||
|         y="176.65" | ||||
|         width="182.56" | ||||
|         height="0.89" | ||||
|         transform="translate(480.65 -126.45) rotate(90)" | ||||
|         style="fill: #e6e6e6" | ||||
|       ></rect> | ||||
|       <polygon | ||||
|         points="294.41 91.12 403.22 91.12 403.86 88.55 295.06 88.55 294.41 91.12" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="294.41 95.32 403.22 95.32 403.86 92.76 295.06 92.76 294.41 95.32" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="294.41 99.53 403.22 99.53 403.86 96.97 295.06 96.97 294.41 99.53" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="294.41 103.74 403.22 103.74 403.86 101.17 295.06 101.17 294.41 103.74" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="294.41 107.95 403.22 107.95 403.86 105.38 295.06 105.38 294.41 107.95" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="294.41 112.15 403.22 112.15 403.86 109.59 295.06 109.59 294.41 112.15" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <rect x="274.53" y="67" width="156.92" height="3.79" style="fill: #f0f0f0"></rect> | ||||
|       <rect x="420.36" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="420.36" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="412.11" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="412.11" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="403.86" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="292.84" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="292.84" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="284.6" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="284.6" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="276.35" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect | ||||
|         x="85.34" | ||||
|         y="78.79" | ||||
|         width="108.81" | ||||
|         height="196.62" | ||||
|         transform="translate(279.49 354.2) rotate(180)" | ||||
|         style="fill: #e6e6e6" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="80.32" | ||||
|         y="78.79" | ||||
|         width="111.48" | ||||
|         height="196.62" | ||||
|         transform="translate(272.12 354.2) rotate(180)" | ||||
|         style="fill: #f0f0f0" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="85.34" | ||||
|         y="275.41" | ||||
|         width="108.81" | ||||
|         height="4.66" | ||||
|         transform="translate(279.49 555.48) rotate(180)" | ||||
|         style="fill: #e6e6e6" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="78.51" | ||||
|         y="275.41" | ||||
|         width="111.48" | ||||
|         height="4.66" | ||||
|         transform="translate(268.5 555.48) rotate(180)" | ||||
|         style="fill: #f0f0f0" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="44.78" | ||||
|         y="128.39" | ||||
|         width="182.56" | ||||
|         height="97.42" | ||||
|         transform="translate(313.16 41.04) rotate(90)" | ||||
|         style="fill: #fafafa" | ||||
|       ></rect> | ||||
|       <polygon | ||||
|         points="114.91 268.38 142.33 85.82 161.81 85.82 134.38 268.38 114.91 268.38" | ||||
|         style="fill: #fff" | ||||
|       ></polygon> | ||||
|       <polygon points="118 268.38 145.42 85.82 164.9 85.82 137.47 268.38 118 268.38" style="fill: #fff"></polygon> | ||||
|       <polygon | ||||
|         points="138.56 268.38 165.99 85.82 173.58 85.82 146.16 268.38 138.56 268.38" | ||||
|         style="fill: #fff" | ||||
|       ></polygon> | ||||
|       <rect | ||||
|         x="-3.49" | ||||
|         y="176.65" | ||||
|         width="182.56" | ||||
|         height="0.89" | ||||
|         transform="translate(264.9 89.3) rotate(90)" | ||||
|         style="fill: #e6e6e6" | ||||
|       ></rect> | ||||
|       <polygon | ||||
|         points="78.66 91.12 187.47 91.12 188.11 88.55 79.31 88.55 78.66 91.12" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="78.66 95.32 187.47 95.32 188.11 92.76 79.31 92.76 78.66 95.32" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="78.66 99.53 187.47 99.53 188.11 96.97 79.31 96.97 78.66 99.53" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="78.66 103.74 187.47 103.74 188.11 101.17 79.31 101.17 78.66 103.74" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="78.66 107.95 187.47 107.95 188.11 105.38 79.31 105.38 78.66 107.95" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <polygon | ||||
|         points="78.66 112.15 187.47 112.15 188.11 109.59 79.31 109.59 78.66 112.15" | ||||
|         style="fill: #ebebeb; opacity: 0.6000000000000001" | ||||
|       ></polygon> | ||||
|       <rect x="58.78" y="67" width="156.92" height="3.79" style="fill: #f0f0f0"></rect> | ||||
|       <rect x="204.61" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="204.61" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="196.36" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="196.36" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="188.11" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="77.09" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="77.09" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="68.84" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect x="68.84" y="63.81" width="2.14" height="242.84" style="fill: #f0f0f0; opacity: 0.8"></rect> | ||||
|       <rect x="60.59" y="63.81" width="8.25" height="242.84" style="fill: #fafafa; opacity: 0.8"></rect> | ||||
|       <rect | ||||
|         x="375.76" | ||||
|         y="291.61" | ||||
|         width="16.81" | ||||
|         height="84" | ||||
|         transform="translate(768.34 667.22) rotate(180)" | ||||
|         style="fill: #f0f0f0" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="243.98" | ||||
|         y="375.61" | ||||
|         width="142.46" | ||||
|         height="6.79" | ||||
|         transform="translate(630.42 758.01) rotate(180)" | ||||
|         style="fill: #f0f0f0" | ||||
|       ></rect> | ||||
|       <rect x="237.85" y="291.61" width="137.92" height="84" style="fill: #f5f5f5"></rect> | ||||
|       <rect x="250.41" y="300.51" width="112.79" height="27.94" style="fill: #f0f0f0"></rect> | ||||
|       <rect x="250.41" y="334.85" width="112.79" height="27.94" style="fill: #f0f0f0"></rect> | ||||
|       <path | ||||
|         d="M293.44,304.36h26.73a2.41,2.41,0,0,0,2.41-2.41h0a2.42,2.42,0,0,0-2.41-2.41H293.44A2.42,2.42,0,0,0,291,302h0A2.41,2.41,0,0,0,293.44,304.36Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M293.44,338.71h26.73a2.42,2.42,0,0,0,2.41-2.41h0a2.41,2.41,0,0,0-2.41-2.41H293.44A2.41,2.41,0,0,0,291,336.3h0A2.42,2.42,0,0,0,293.44,338.71Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <rect | ||||
|         x="233.59" | ||||
|         y="288.33" | ||||
|         width="142.18" | ||||
|         height="3.28" | ||||
|         transform="translate(609.35 579.95) rotate(180)" | ||||
|         style="fill: #f0f0f0" | ||||
|       ></rect> | ||||
|       <rect x="375.76" y="288.33" width="21.28" height="3.28" style="fill: #e6e6e6"></rect> | ||||
|       <path | ||||
|         d="M108.34,376.83h0a7.25,7.25,0,0,1-7.23-7.23V298.84a7.25,7.25,0,0,1,7.23-7.23h0a7.24,7.24,0,0,1,7.22,7.23V369.6A7.24,7.24,0,0,1,108.34,376.83Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M112.47,374h0a4.9,4.9,0,0,1-4.88-4.88V299.34a4.9,4.9,0,0,1,4.88-4.88h0a4.9,4.9,0,0,1,4.89,4.88V369.1A4.9,4.9,0,0,1,112.47,374Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M118.83,376.83h0a7.24,7.24,0,0,1-7.22-7.23V298.84a7.24,7.24,0,0,1,7.22-7.23h0a7.25,7.25,0,0,1,7.23,7.23V369.6A7.25,7.25,0,0,1,118.83,376.83Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M123,374h0a4.89,4.89,0,0,1-4.88-4.88V299.34a4.89,4.89,0,0,1,4.88-4.88h0a4.89,4.89,0,0,1,4.88,4.88V369.1A4.89,4.89,0,0,1,123,374Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <rect x="122.1" y="291.61" width="14.45" height="85.22" rx="7.23" style="fill: #f5f5f5"></rect> | ||||
|       <path | ||||
|         d="M133.47,374h0a4.89,4.89,0,0,1-4.88-4.88V299.34a4.89,4.89,0,0,1,4.88-4.88h0a4.89,4.89,0,0,1,4.88,4.88V369.1A4.89,4.89,0,0,1,133.47,374Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M139.83,376.83h0a7.25,7.25,0,0,1-7.23-7.23V298.84a7.25,7.25,0,0,1,7.23-7.23h0a7.25,7.25,0,0,1,7.23,7.23V369.6A7.25,7.25,0,0,1,139.83,376.83Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M144,374h0a4.9,4.9,0,0,1-4.89-4.88V299.34a4.9,4.9,0,0,1,4.89-4.88h0a4.9,4.9,0,0,1,4.88,4.88V369.1A4.9,4.9,0,0,1,144,374Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M150.33,376.83h0a7.25,7.25,0,0,1-7.23-7.23V298.84a7.25,7.25,0,0,1,7.23-7.23h0a7.25,7.25,0,0,1,7.23,7.23V369.6A7.25,7.25,0,0,1,150.33,376.83Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M154.47,374h0a4.9,4.9,0,0,1-4.89-4.88V299.34a4.9,4.9,0,0,1,4.89-4.88h0a4.9,4.9,0,0,1,4.88,4.88V369.1A4.9,4.9,0,0,1,154.47,374Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M160.83,376.83h0a7.25,7.25,0,0,1-7.23-7.23V298.84a7.25,7.25,0,0,1,7.23-7.23h0a7.24,7.24,0,0,1,7.22,7.23V369.6A7.24,7.24,0,0,1,160.83,376.83Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M165,374h0a4.9,4.9,0,0,1-4.88-4.88V299.34a4.9,4.9,0,0,1,4.88-4.88h0a4.9,4.9,0,0,1,4.89,4.88V369.1A4.9,4.9,0,0,1,165,374Z" | ||||
|         style="fill: #ebebeb" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M171.33,376.83h0a7.25,7.25,0,0,1-7.23-7.23V298.84a7.25,7.25,0,0,1,7.23-7.23h0a7.24,7.24,0,0,1,7.22,7.23V369.6A7.24,7.24,0,0,1,171.33,376.83Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|       <rect x="157.39" y="364.15" width="24.4" height="3.2" rx="1.6" style="fill: #f5f5f5"></rect> | ||||
|       <path | ||||
|         d="M180.19,306.38H159a1.6,1.6,0,0,1-1.6-1.6h0a1.6,1.6,0,0,1,1.6-1.6h21.2a1.6,1.6,0,0,1,1.6,1.6h0A1.6,1.6,0,0,1,180.19,306.38Z" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></path> | ||||
|     </g> | ||||
|     <g id="freepik--Shadow--inject-83"> | ||||
|       <ellipse | ||||
|         id="freepik--path--inject-83" | ||||
|         cx="250" | ||||
|         cy="416.24" | ||||
|         rx="193.89" | ||||
|         ry="11.32" | ||||
|         style="fill: #f5f5f5" | ||||
|       ></ellipse> | ||||
|     </g> | ||||
|     <g id="freepik--information-tab--inject-83"> | ||||
|       <path | ||||
|         d="M409.83,248.66h-239a9.25,9.25,0,0,1-9.32-9.93l8.76-141.08a10.75,10.75,0,0,1,10.55-9.94h239a9.26,9.26,0,0,1,9.32,9.94l-8.76,141.08A10.75,10.75,0,0,1,409.83,248.66Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M409.83,248.66h-239a9.25,9.25,0,0,1-9.32-9.93l8.76-141.08a10.75,10.75,0,0,1,10.55-9.94h239a9.26,9.26,0,0,1,9.32,9.94l-8.76,141.08A10.75,10.75,0,0,1,409.83,248.66Z" | ||||
|         style="fill: #fff; opacity: 0.8" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M201.46,128.36H173a2.61,2.61,0,0,1-2.64-2.81l.81-13a3,3,0,0,1,3-2.82h28.46Z" | ||||
|         style="fill: #fff; opacity: 0.4" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M419.67,90.2H211.28a8,8,0,0,0-7.91,7.45l-2,32.37H172.9a3,3,0,0,0-3,2.82l-.75,12.2a2.61,2.61,0,0,0,2.64,2.82h28.46l-5.64,90.87a6.92,6.92,0,0,0,7,7.45H410a8,8,0,0,0,7.91-7.45l8.76-141.08A6.91,6.91,0,0,0,419.67,90.2Z" | ||||
|         style="fill: #fff" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M199,167.36H170.58a2.62,2.62,0,0,1-2.65-2.82l.76-12.2a3,3,0,0,1,3-2.82h28.46Z" | ||||
|         style="fill: #fff; opacity: 0.4" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M197.83,186.86H169.37a2.62,2.62,0,0,1-2.65-2.82l.76-12.21a3,3,0,0,1,3-2.81h28.46Z" | ||||
|         style="fill: #fff; opacity: 0.4" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M196.62,206.36H168.16a2.63,2.63,0,0,1-2.65-2.82l.76-12.21a3.05,3.05,0,0,1,3-2.82h28.46Z" | ||||
|         style="fill: #fff; opacity: 0.4" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M195.41,225.85H167A2.62,2.62,0,0,1,164.3,223l.76-12.2a3,3,0,0,1,3-2.82h28.47Z" | ||||
|         style="fill: #fff; opacity: 0.4" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M172.63,145.59a1.13,1.13,0,0,1-1.15-1.23l.66-10.71a1.48,1.48,0,0,1,1.44-1.36H197.7a1.13,1.13,0,0,1,1.15,1.23l-.66,10.72a1.48,1.48,0,0,1-1.44,1.35Z" | ||||
|         style="fill: currentColor; opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M253,107H218.57a4.47,4.47,0,0,1-4.49-4.79h0a5.17,5.17,0,0,1,5.08-4.78h34.41a4.46,4.46,0,0,1,4.49,4.78h0A5.19,5.19,0,0,1,253,107Z" | ||||
|         style="fill: currentColor; opacity: 0.30000000000000004" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M417,102.22a5.17,5.17,0,0,1-5.08,4.79,4.46,4.46,0,0,1-4.49-4.79,5.16,5.16,0,0,1,5.08-4.78A4.45,4.45,0,0,1,417,102.22Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M319.53,188.84H218a8.83,8.83,0,0,1-8.9-9.49L212.15,130a10.23,10.23,0,0,1,10.07-9.48H323.78a8.81,8.81,0,0,1,8.89,9.48l-3.06,49.34A10.26,10.26,0,0,1,319.53,188.84Zm-97.34-67.9a9.79,9.79,0,0,0-9.63,9.07l-3.06,49.34a8.43,8.43,0,0,0,8.51,9.07H319.56a9.79,9.79,0,0,0,9.63-9.07L332.26,130a8.44,8.44,0,0,0-8.51-9.07Z" | ||||
|         style="fill: currentColor; opacity: 0.4" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M230.33,153.34l14.57,9.43a33,33,0,0,1,11.33-10.27L248.4,137A52.81,52.81,0,0,0,230.33,153.34Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M230.33,153.34l14.57,9.43a33,33,0,0,1,11.33-10.27L248.4,137A52.81,52.81,0,0,0,230.33,153.34Z" | ||||
|         style="fill: #fff; opacity: 0.8" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M221.55,178.6h17.84a31.51,31.51,0,0,1,5.51-15.83l-14.57-9.43A50.28,50.28,0,0,0,221.55,178.6Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M272.36,130.76a49.82,49.82,0,0,0-24,6.22l7.83,15.52a31.31,31.31,0,0,1,15-3.89,27.86,27.86,0,0,1,28.13,30h17.84C318.88,152.18,298.79,130.76,272.36,130.76Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path d="M260.78,207h-52.3a.85.85,0,0,1-.85-.91l.23-3.68a1,1,0,0,1,1-.91h52.3Z" style="fill: currentColor"></path> | ||||
|       <path | ||||
|         d="M260.78,207h66a1,1,0,0,0,1-.91l.23-3.68a.85.85,0,0,0-.85-.91h-66Z" | ||||
|         style="fill: currentColor; opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M296.3,221.51H207.58a.84.84,0,0,1-.85-.91l.23-3.67a1,1,0,0,1,1-.91h88.72Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M296.3,221.51h29.58a1,1,0,0,0,1-.91l.23-3.67a.84.84,0,0,0-.85-.91H296.64Z" | ||||
|         style="fill: currentColor; opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M217.1,236H206.68a.85.85,0,0,1-.85-.91l.23-3.68a1,1,0,0,1,1-.91h10.42Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M217.1,236H325a1,1,0,0,0,1-.91l.23-3.68a.85.85,0,0,0-.86-.91H217.44Z" | ||||
|         style="fill: currentColor; opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M348.77,236.45a.38.38,0,0,1-.39-.41l7.16-115.31a.44.44,0,0,1,.44-.41.38.38,0,0,1,.38.41L349.2,236A.44.44,0,0,1,348.77,236.45Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M356.83,150.94a3,3,0,0,1-2.93,2.76,2.57,2.57,0,0,1-2.59-2.76,3,3,0,0,1,2.94-2.76A2.55,2.55,0,0,1,356.83,150.94Z" | ||||
|         style="fill: #fff" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M353.88,154.11a3,3,0,0,1-3-3.17,3.43,3.43,0,0,1,3.37-3.18,3,3,0,0,1,3,3.18A3.42,3.42,0,0,1,353.88,154.11Zm.34-5.52a2.53,2.53,0,0,0-2.49,2.35,2.18,2.18,0,0,0,2.2,2.34,2.53,2.53,0,0,0,2.49-2.34A2.18,2.18,0,0,0,354.22,148.59Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M355.29,175.78a3,3,0,0,1-2.93,2.76,2.57,2.57,0,0,1-2.59-2.76A3,3,0,0,1,352.7,173,2.56,2.56,0,0,1,355.29,175.78Z" | ||||
|         style="fill: #fff" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M352.34,179a3,3,0,0,1-3-3.17,3.43,3.43,0,0,1,3.37-3.18,3,3,0,0,1,3,3.18A3.42,3.42,0,0,1,352.34,179Zm.34-5.52a2.53,2.53,0,0,0-2.49,2.35,2.17,2.17,0,0,0,2.2,2.34,2.53,2.53,0,0,0,2.49-2.34A2.18,2.18,0,0,0,352.68,173.43Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <polygon points="351.78 187.86 348.13 193.57 354.73 193.57 351.78 187.86" style="fill: #fff"></polygon> | ||||
|       <path | ||||
|         d="M354.7,194h-6.6a.39.39,0,0,1-.34-.2.42.42,0,0,1,0-.42l3.66-5.71a.42.42,0,0,1,.71,0l3,5.71a.44.44,0,0,1-.4.62Zm-5.83-.82H354l-2.3-4.48Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M398.45,236.45a.38.38,0,0,1-.39-.41l7.16-115.31a.44.44,0,0,1,.44-.41.38.38,0,0,1,.39.41L398.89,236A.45.45,0,0,1,398.45,236.45Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M403.67,196.71a2.56,2.56,0,0,0-2.58-2.76,3,3,0,0,0-2.94,2.76,2.57,2.57,0,0,0,2.59,2.76A3,3,0,0,0,403.67,196.71Z" | ||||
|         style="fill: #fff" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M400.72,199.88a3,3,0,0,1-3-3.17,3.42,3.42,0,0,1,3.37-3.17,3,3,0,0,1,3,3.17A3.42,3.42,0,0,1,400.72,199.88Zm.34-5.52a2.54,2.54,0,0,0-2.49,2.35,2.19,2.19,0,0,0,2.2,2.35,2.54,2.54,0,0,0,2.49-2.35A2.19,2.19,0,0,0,401.06,194.36Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M407.53,134.6a2.56,2.56,0,0,0-2.59-2.76A3,3,0,0,0,402,134.6a2.57,2.57,0,0,0,2.59,2.76A3,3,0,0,0,407.53,134.6Z" | ||||
|         style="fill: #fff" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M404.57,137.77a2.94,2.94,0,0,1-3-3.17,3.43,3.43,0,0,1,3.37-3.18,3,3,0,0,1,3,3.18A3.43,3.43,0,0,1,404.57,137.77Zm.35-5.52a2.53,2.53,0,0,0-2.49,2.35,2.17,2.17,0,0,0,2.2,2.34,2.53,2.53,0,0,0,2.49-2.34A2.18,2.18,0,0,0,404.92,132.25Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <polygon points="402.64 168.92 399.7 163.2 406.29 163.2 402.64 168.92" style="fill: #fff"></polygon> | ||||
|       <path | ||||
|         d="M402.61,169.33a.38.38,0,0,1-.34-.21l-2.95-5.71a.43.43,0,0,1,0-.41.44.44,0,0,1,.37-.21h6.6a.39.39,0,0,1,.35.21.43.43,0,0,1,0,.41L403,169.12A.47.47,0,0,1,402.61,169.33Zm-2.22-5.71,2.3,4.47,2.86-4.47Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M373.61,236.45a.38.38,0,0,1-.39-.41l7.16-115.31a.44.44,0,0,1,.44-.41.37.37,0,0,1,.38.41L374.05,236A.45.45,0,0,1,373.61,236.45Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M381.24,158a3,3,0,0,1-2.94,2.76,2.55,2.55,0,0,1-2.58-2.76,3,3,0,0,1,2.93-2.76A2.57,2.57,0,0,1,381.24,158Z" | ||||
|         style="fill: #fff" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M378.28,161.2a3,3,0,0,1-3-3.18,3.42,3.42,0,0,1,3.37-3.17,3,3,0,0,1,3,3.17A3.43,3.43,0,0,1,378.28,161.2Zm.34-5.53a2.54,2.54,0,0,0-2.49,2.35,2.19,2.19,0,0,0,2.2,2.35,2.54,2.54,0,0,0,2.49-2.35A2.18,2.18,0,0,0,378.62,155.67Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M377.81,213.26a3,3,0,0,1-2.93,2.76,2.56,2.56,0,0,1-2.59-2.76,3,3,0,0,1,2.93-2.76A2.57,2.57,0,0,1,377.81,213.26Z" | ||||
|         style="fill: #fff" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M374.85,216.43a3,3,0,0,1-3-3.17,3.43,3.43,0,0,1,3.37-3.18,3,3,0,0,1,3,3.18A3.42,3.42,0,0,1,374.85,216.43Zm.34-5.52a2.53,2.53,0,0,0-2.49,2.35,2.18,2.18,0,0,0,2.2,2.34,2.53,2.53,0,0,0,2.49-2.34A2.18,2.18,0,0,0,375.19,210.91Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <polygon points="380.46 126.12 376.8 131.84 383.4 131.84 380.46 126.12" style="fill: #fff"></polygon> | ||||
|       <path | ||||
|         d="M383.37,132.25h-6.59a.39.39,0,0,1-.35-.21.43.43,0,0,1,0-.41l3.65-5.71a.43.43,0,0,1,.72,0l2.94,5.71a.4.4,0,0,1,0,.41A.47.47,0,0,1,383.37,132.25Zm-5.82-.83h5.16L380.4,127Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|     </g> | ||||
|     <g id="freepik--Character--inject-83"> | ||||
|       <path | ||||
|         d="M111.54,155.81l-1,4.87-1,5c-.66,3.32-1.22,6.64-1.73,9.9-.26,1.63-.46,3.24-.63,4.83s-.32,3.13-.4,4.62a40,40,0,0,0,0,4.08c0,1.17.26,2.17.21,2.28l-.67-1.15c-.3-.3-.85-.58-.94-.45s.26.36.9.53a13.51,13.51,0,0,0,2.51.35,29.74,29.74,0,0,0,3.22-.08,65.84,65.84,0,0,0,7.23-1c1.25-.24,2.52-.49,3.78-.77l3.74-.81.5-.11a5.25,5.25,0,0,1,4.24,9.34l-1.87,1.38-1.84,1.26c-1.26.8-2.53,1.58-3.85,2.3a55.3,55.3,0,0,1-8.46,3.78,41.08,41.08,0,0,1-4.87,1.31,26.44,26.44,0,0,1-5.69.54,20.16,20.16,0,0,1-7-1.34,16.42,16.42,0,0,1-7.2-5.61,7.56,7.56,0,0,1-.52-.86l-.15-.29a28,28,0,0,1-2.55-8,47.2,47.2,0,0,1-.64-6.62q-.11-3.13,0-6.1t.41-5.85c.34-3.84.91-7.58,1.56-11.29.34-1.85.68-3.69,1.1-5.52.2-.92.4-1.84.63-2.76l.74-2.83a10.47,10.47,0,0,1,20.39,4.73Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M111.54,155.81l-1,4.87-1,5c-.66,3.32-1.22,6.64-1.73,9.9-.26,1.63-.46,3.24-.63,4.83s-.32,3.13-.4,4.62a40,40,0,0,0,0,4.08c0,1.17.26,2.17.21,2.28l-.67-1.15c-.3-.3-.85-.58-.94-.45s.26.36.9.53a13.51,13.51,0,0,0,2.51.35,29.74,29.74,0,0,0,3.22-.08,65.84,65.84,0,0,0,7.23-1c1.25-.24,2.52-.49,3.78-.77l3.74-.81.5-.11a5.25,5.25,0,0,1,4.24,9.34l-1.87,1.38-1.84,1.26c-1.26.8-2.53,1.58-3.85,2.3a55.3,55.3,0,0,1-8.46,3.78,41.08,41.08,0,0,1-4.87,1.31,26.44,26.44,0,0,1-5.69.54,20.16,20.16,0,0,1-7-1.34,16.42,16.42,0,0,1-7.2-5.61,7.56,7.56,0,0,1-.52-.86l-.15-.29a28,28,0,0,1-2.55-8,47.2,47.2,0,0,1-.64-6.62q-.11-3.13,0-6.1t.41-5.85c.34-3.84.91-7.58,1.56-11.29.34-1.85.68-3.69,1.1-5.52.2-.92.4-1.84.63-2.76l.74-2.83a10.47,10.47,0,0,1,20.39,4.73Z" | ||||
|         style="opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M86.23,411.58S76.77,403,77,400.28l-7.86-4-4.68,8.08,4.34,2.43L70,406.4l.79,1.37c3.92,2,12.48,5.91,15.47,5.8A1.92,1.92,0,0,0,86.23,411.58Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M86.91,310.62c5.72-41,3.85-65.87,9.86-86.06l37.2-3s-16.49,65-24,92.06-31.23,88.42-31.23,88.42l-10.35-5.3S76.84,342.32,86.91,310.62Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M117.25,251.87c-2.53,5.85-7.47,43.42-7.45,62.18,0-.13.08-.28.12-.42,2.65-9.51,6.42-23.72,10.18-38.13Z" | ||||
|         style="opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M146,412.92s-15.43-3.5-16.14-6h-9.79l-.81,9.33h5.44l1-.86,1.22.86c4.4,0,17.12,0,19.86-1.6C146.8,413.23,146,412.92,146,412.92Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M119.87,311.77c-8.17-55.51-8.17-89.88-8.17-89.88l36.4-.59s-4.37,66.2-5.89,93.93c-1.57,28.83-10.57,92.29-10.57,92.29H119S116,347.42,119.87,311.77Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M115.92,117.67c-1.73,10.89-4.87,16.73-7,22.14,3.67,3.42,11.53,7.65,19.46,7.54s6.49-5.48,4.36-8.25c-5.69-2.87-5.91-5.77-4.52-8.31Z" | ||||
|         style="fill: #7f3e3b" | ||||
|       ></path> | ||||
|       <path d="M102.32,141.35s5.06-5.95,7.06-6.95,17.13,1,20.7,1.72,7.92,6,7.92,6Z" style="fill: #263238"></path> | ||||
|       <path | ||||
|         d="M141,116.76c-.16.72.09,1.38.56,1.48s1-.4,1.14-1.12-.09-1.38-.56-1.48S141.14,116,141,116.76Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path d="M140.71,117.75a26.08,26.08,0,0,0,2.06,6.87c-1.54.91-3.58-.1-3.58-.1Z" style="fill: #630f0f"></path> | ||||
|       <path | ||||
|         d="M143.46,112.63a.41.41,0,0,1-.4,0,3.39,3.39,0,0,0-3.11.1.42.42,0,0,1-.59-.12.43.43,0,0,1,.12-.6,4.23,4.23,0,0,1,3.92-.18.43.43,0,0,1,.22.57A.38.38,0,0,1,143.46,112.63Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M117.18,109.46c-1.43,8.92-2.73,14.07.72,19.55,5.18,8.24,17,6.56,21.07-1.78,3.68-7.5,5.41-20.83-2.45-26.19A12.46,12.46,0,0,0,117.18,109.46Z" | ||||
|         style="fill: #7f3e3b" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M133.39,118c7.22,1.56,5.12-7.36,3.39-8.25,4.34,2.6,7.22-.42,7-3.14,3.32-.55,3.15-6,.87-6.17-1.44-3.77-8.17-6.94-9.42-4.61-3.63-4.22-13.35-3.5-11.94-.44-3.69-.72-11.55-.39-8.92,5.17-5.61.72-5.34,10.32-1.68,11.32-3.83,2.12-.12,9.36,1.53,13.9S132.31,126.28,133.39,118Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M129.28,117.09a7.61,7.61,0,0,0,1.18,5.45c1.41,2,3.59.75,4.44-1.66.76-2.16.94-5.8-1.07-6.89S129.65,114.65,129.28,117.09Z" | ||||
|         style="fill: #7f3e3b" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M102.83,140.35c12.3-1.51,29.75-1.38,41.33.64A13.17,13.17,0,0,1,155,152.91c1.44,17.67-2.47,48.55-5.85,79.64-27.25,9.14-54.91-.13-54.91-.13-.61-6.27,2.77-26.82,4.88-37.79-1.55-11.32-5.48-24.29-7.69-39.34A13.15,13.15,0,0,1,102.83,140.35Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M139.84,165.09c1.86,10.64,7.75,23.32,13.14,31.71.74-7.35,1.36-14.35,1.75-20.81Z" | ||||
|         style="opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M229.93,140.44a17.77,17.77,0,0,0-19.06,30c-1.78,2.4-7,9.45-8.59,12.17-2,3.29-3,6.25-1.62,7.07s3.48-1.51,5.43-4.8c1.62-2.71,5.34-10.65,6.59-13.37a17.77,17.77,0,0,0,17.25-31.06Zm4.27,23.23a15.54,15.54,0,1,1-5.41-21.31A15.53,15.53,0,0,1,234.2,163.67Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M234.93,164.1a16.39,16.39,0,1,1-5.71-22.46A16.38,16.38,0,0,1,234.93,164.1Z" | ||||
|         style="fill: currentColor; opacity: 0.2" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M209.43,179.66l-2.17-1.92a3.36,3.36,0,0,0-3-.76l-5,1.14a6.28,6.28,0,0,0-4.4,3.72l-.48,1.16c3.37,3.43,9.54,4.66,9.54,4.66l1.73.54a2.79,2.79,0,0,0,3.57-1.76l1.13-3.39A3.27,3.27,0,0,0,209.43,179.66Z" | ||||
|         style="fill: #7f3e3b" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M154.47,149.29l2,4.39,2.11,4.48c1.41,3,2.9,5.89,4.39,8.72q1.13,2.12,2.32,4.11c.77,1.33,1.56,2.61,2.36,3.79A38.85,38.85,0,0,0,170,177.9c.7.86,1.42,1.48,1.44,1.58l-1.24-.51a12,12,0,0,0,4.36,1.1,43.06,43.06,0,0,0,6.37.08c2.28-.1,4.63-.34,7-.62,1.19-.15,2.4-.29,3.61-.47l3.58-.48.49-.07a5.26,5.26,0,0,1,3.6,9.6l-1.82,1.2-1.79,1.08c-1.21.69-2.43,1.36-3.69,2s-2.53,1.21-3.84,1.75-2.66,1-4,1.49a46,46,0,0,1-8.9,2,28.27,28.27,0,0,1-10.86-.66,4.81,4.81,0,0,1-.75-.28l-.48-.23a26.69,26.69,0,0,1-6.86-4.74,46.93,46.93,0,0,1-4.48-4.82,83.07,83.07,0,0,1-6.74-9.64c-2-3.23-3.74-6.51-5.39-9.8-.81-1.66-1.62-3.31-2.36-5-.37-.84-.75-1.69-1.1-2.54l-1.08-2.67a10.47,10.47,0,0,1,19.22-8.3Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|     </g> | ||||
|     <g id="freepik--Plant--inject-83"> | ||||
|       <path | ||||
|         d="M362.85,378.84c-1.54-12.09,5.2-21.84,11.72-31.28,7.67-11.1,15.6-22.57,10.91-38.32a33,33,0,0,0-6.31-11.77,40.88,40.88,0,0,1-13.75,18c-8.7,6.48-19,8.52-26.17,5.21-4.05-1.86-9-6.25-9.75-16.53-.74-10.52,5.37-18,16.33-20s24.27,2,33,11.41a43.49,43.49,0,0,0,1.84-20.25l1-.14a44.23,44.23,0,0,1-2.07,21.24A33.94,33.94,0,0,1,386.44,309c4.83,16.2-3.24,27.88-11.05,39.17-6.71,9.71-13,18.88-11.55,30.58Zm-11.33-94.2a31.2,31.2,0,0,0-5.51.48c-10.41,1.89-16.21,9-15.52,18.93.54,7.75,3.71,13.18,9.18,15.69,6.87,3.16,16.75,1.16,25.16-5.1a39.92,39.92,0,0,0,13.6-18A36.79,36.79,0,0,0,351.52,284.64Z" | ||||
|         style="fill: #263238" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M381.57,278.67c-7.92-7.07-8.83-16.4-4.19-18.37C383.81,257.57,386.21,268.93,381.57,278.67Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M375.56,347c-5.66-9-6-20.22.91-21C382.76,325.26,384.14,335.92,375.56,347Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M381.75,281.64c-1.09-6.71,2.21-11.71,5.31-10.82C391.35,272.05,388,278.66,381.75,281.64Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M366.18,314.07c-3.47-7.48-1.25-14.41,2.67-14.39C374.27,299.72,372.48,308.55,366.18,314.07Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M352.86,284.24c-7.14,1.21-12.5-2.28-11.57-5.59C342.58,274.06,349.65,277.62,352.86,284.24Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M352.86,284.24c-4.38-2.34-5-5.82-2.76-6.75C353.25,276.2,354.75,280.39,352.86,284.24Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M387.28,314c-1.73-4.67.1-7.7,2.41-6.89C392.9,308.24,391.25,312.36,387.28,314Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <path | ||||
|         d="M331.11,310.73c-4.95.54-7.44-2-6.09-4C326.9,303.87,330.5,306.48,331.11,310.73Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|       <rect | ||||
|         x="385.12" | ||||
|         y="386.95" | ||||
|         width="17.52" | ||||
|         height="1" | ||||
|         transform="translate(-43.09 725.57) rotate(-82.26)" | ||||
|         style="fill: currentColor" | ||||
|       ></rect> | ||||
|       <rect | ||||
|         x="387.27" | ||||
|         y="404.29" | ||||
|         width="8.47" | ||||
|         height="1" | ||||
|         transform="translate(-62.35 738.17) rotate(-82.26)" | ||||
|         style="fill: currentColor" | ||||
|       ></rect> | ||||
|       <path | ||||
|         d="M344,371.23l5.79,42.34a3.09,3.09,0,0,0,3.06,2.67h31.26a3.09,3.09,0,0,0,3.06-2.67l5.79-42.34a3.09,3.09,0,0,0-3.06-3.5H347A3.09,3.09,0,0,0,344,371.23Z" | ||||
|         style="fill: currentColor" | ||||
|       ></path> | ||||
|     </g> | ||||
|   </svg> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts" setup></script> | ||||
| <style scoped></style> | ||||