Compare commits
	
		
			427 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					032dbc6815 | ||
| 
						 | 
					3c33f89ec1 | ||
| 
						 | 
					f7090d3dbc | ||
| 
						 | 
					40f8587fd6 | ||
| 
						 | 
					9f5638f16d | ||
| 
						 | 
					9b19f96ff6 | ||
| 
						 | 
					15da557892 | ||
| 
						 | 
					2d23c9a2e6 | ||
| 
						 | 
					ab49afd3db | ||
| 
						 | 
					86a370fd69 | ||
| 
						 | 
					59af204a4c | ||
| 
						 | 
					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 | 
@@ -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
 | 
					# Editor configuration, see http://editorconfig.org
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 表示是最顶层的 EditorConfig 配置文件
 | 
					 | 
				
			||||||
root = true
 | 
					root = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[*] # 表示所有文件适用
 | 
					[*]
 | 
				
			||||||
charset = utf-8 # 设置文件字符集为 utf-8
 | 
					charset = utf-8
 | 
				
			||||||
indent_style = tab # 缩进风格(tab | space)
 | 
					indent_style = tab
 | 
				
			||||||
indent_size = 2 # 缩进大小
 | 
					indent_size = 2
 | 
				
			||||||
end_of_line = lf # 控制换行类型(lf | cr | crlf)
 | 
					end_of_line = lf
 | 
				
			||||||
trim_trailing_whitespace = true # 去除行首的任意空白字符
 | 
					trim_trailing_whitespace = true
 | 
				
			||||||
insert_final_newline = true # 始终在文件末尾插入一个新行
 | 
					insert_final_newline = true
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								.env
									
									
									
									
									
								
							
							
						
						@@ -1,7 +1,20 @@
 | 
				
			|||||||
BASE_URL=/
 | 
					VITE_BASE_URL=/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VITE_APP_NAME=SoybeanAdmin
 | 
					VITE_APP_NAME=SoybeanAdmin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VITE_APP_TITLE=Soybean管理系统
 | 
					VITE_APP_TITLE=Soybean管理系统
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VITE_APP_DESC=SoybeanAdmin是一个中后台管理系统模版
 | 
					VITE_APP_DESC=SoybeanAdmin是一个中后台管理系统模版
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 权限路由模式: static | dynamic
 | 
				
			||||||
 | 
					VITE_AUTH_ROUTE_MODE=static
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 路由首页(根路由重定向), 用于static模式的权限路由,dynamic模式取决于后端返回的路由首页
 | 
				
			||||||
 | 
					VITE_ROUTE_HOME_PATH=/dashboard/analysis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# iconify图标作为组件的前缀
 | 
				
			||||||
 | 
					VITE_ICON_PREFFIX=icon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 本地SVG图标作为组件的前缀, 请注意一定要包含 VITE_ICON_PREFFIX
 | 
				
			||||||
 | 
					# 格式 {VITE_ICON_PREFFIX}-{本地图标集合名称}
 | 
				
			||||||
 | 
					VITE_ICON_LOCAL_PREFFIX=icon-local
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,30 @@
 | 
				
			|||||||
/** 请求环境配置 */
 | 
					/** 请求服务的环境配置 */
 | 
				
			||||||
type ServiceEnv = Record<
 | 
					type ServiceEnv = Record<ServiceEnvType, ServiceEnvConfig>;
 | 
				
			||||||
  Service.HttpEnv,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    /** 请求环境 */
 | 
					 | 
				
			||||||
    env: Service.HttpEnv;
 | 
					 | 
				
			||||||
    /** 请求地址 */
 | 
					 | 
				
			||||||
    url: string;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
>;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 请求的环境 */
 | 
					/** 不同请求服务的环境配置 */
 | 
				
			||||||
export const serviceEnv: ServiceEnv = {
 | 
					const serviceEnv: ServiceEnv = {
 | 
				
			||||||
 | 
					  dev: {
 | 
				
			||||||
 | 
					    url: 'http://localhost:8080'
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  test: {
 | 
					  test: {
 | 
				
			||||||
    env: 'test',
 | 
					    url: 'http://localhost:8080'
 | 
				
			||||||
    url: 'http://120.76.42.91:18888'
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  prod: {
 | 
					  prod: {
 | 
				
			||||||
    env: 'prod',
 | 
					    url: 'http://localhost:8080'
 | 
				
			||||||
    url: 'http://120.76.42.91:18888'
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 获取当前环境模式下的请求服务的配置
 | 
				
			||||||
 | 
					 * @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
									
								
								.env.development
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					VITE_HTTP_PROXY=Y
 | 
				
			||||||
							
								
								
									
										10
									
								
								.env.production
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					VITE_VISUALIZER=N
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VITE_COMPRESS=N
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# gzip | brotliCompress | deflate | deflateRaw
 | 
				
			||||||
 | 
					VITE_COMPRESS_TYPE=gzip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VITE_PWA=N
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VITE_PROD_MOCK=Y
 | 
				
			||||||
@@ -1,14 +1,4 @@
 | 
				
			|||||||
*.sh
 | 
					 | 
				
			||||||
node_modules
 | 
					 | 
				
			||||||
lib
 | 
					 | 
				
			||||||
*.md
 | 
					 | 
				
			||||||
*.woff
 | 
					 | 
				
			||||||
*.ttf
 | 
					 | 
				
			||||||
.vscode
 | 
					 | 
				
			||||||
.idea
 | 
					 | 
				
			||||||
/dist/
 | 
					 | 
				
			||||||
/public
 | 
					 | 
				
			||||||
/docs
 | 
					 | 
				
			||||||
.vscode
 | 
					 | 
				
			||||||
.local
 | 
					 | 
				
			||||||
!.env-config.ts
 | 
					!.env-config.ts
 | 
				
			||||||
 | 
					components.d.ts
 | 
				
			||||||
 | 
					router-page.d.ts
 | 
				
			||||||
 | 
					*.svg
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										98
									
								
								.eslintrc.js
									
									
									
									
									
								
							
							
						
						@@ -1,30 +1,23 @@
 | 
				
			|||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
  env: {
 | 
					  extends: ['soybeanjs/vue'],
 | 
				
			||||||
    browser: true,
 | 
					  overrides: [
 | 
				
			||||||
    es2021: true
 | 
					    {
 | 
				
			||||||
  },
 | 
					      files: ['./scripts/*.ts'],
 | 
				
			||||||
  globals: {
 | 
					      rules: {
 | 
				
			||||||
    defineProps: 'readonly',
 | 
					        'no-unused-expressions': 'off'
 | 
				
			||||||
    defineEmits: 'readonly',
 | 
					      }
 | 
				
			||||||
    defineExpose: 'readonly',
 | 
					    },
 | 
				
			||||||
    withDefaults: 'readonly',
 | 
					    {
 | 
				
			||||||
    PROJECT_BUILD_TIME: 'readonly',
 | 
					      files: ['*.vue'],
 | 
				
			||||||
    AMap: 'readonly',
 | 
					      rules: {
 | 
				
			||||||
    BMap: 'readonly',
 | 
					        'no-undef': 'off' // use tsc to check the ts code of the vue
 | 
				
			||||||
    TMap: 'readonly'
 | 
					      }
 | 
				
			||||||
  },
 | 
					    }
 | 
				
			||||||
  parser: 'vue-eslint-parser',
 | 
					  ],
 | 
				
			||||||
  parserOptions: {
 | 
					  settings: {
 | 
				
			||||||
    ecmaVersion: 12,
 | 
					    'import/core-modules': ['uno.css', '~icons/*', 'virtual:svg-icons-register']
 | 
				
			||||||
    parser: '@typescript-eslint/parser',
 | 
					  },
 | 
				
			||||||
    sourceType: 'module'
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  plugins: ['vue', '@typescript-eslint'],
 | 
					 | 
				
			||||||
  extends: ['plugin:vue/vue3-recommended', 'airbnb-base', '@vue/typescript/recommended', 'plugin:prettier/recommended'],
 | 
					 | 
				
			||||||
  rules: {
 | 
					  rules: {
 | 
				
			||||||
    'import/extensions': 'off',
 | 
					 | 
				
			||||||
    'import/no-extraneous-dependencies': 'off',
 | 
					 | 
				
			||||||
    'import/no-unresolved': 0,
 | 
					 | 
				
			||||||
    'import/order': [
 | 
					    'import/order': [
 | 
				
			||||||
      'error',
 | 
					      'error',
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@@ -51,6 +44,11 @@ module.exports = {
 | 
				
			|||||||
            group: 'external',
 | 
					            group: 'external',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            pattern: '@/constants',
 | 
				
			||||||
 | 
					            group: 'internal',
 | 
				
			||||||
 | 
					            position: 'before'
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            pattern: '@/config',
 | 
					            pattern: '@/config',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
@@ -61,11 +59,6 @@ module.exports = {
 | 
				
			|||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            pattern: '@/enum',
 | 
					 | 
				
			||||||
            group: 'internal',
 | 
					 | 
				
			||||||
            position: 'before'
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            pattern: '@/plugins',
 | 
					            pattern: '@/plugins',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
@@ -76,11 +69,6 @@ module.exports = {
 | 
				
			|||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            pattern: '@/layouts',
 | 
					 | 
				
			||||||
            group: 'internal',
 | 
					 | 
				
			||||||
            position: 'before'
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            pattern: '@/views',
 | 
					            pattern: '@/views',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
@@ -96,11 +84,21 @@ module.exports = {
 | 
				
			|||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            pattern: '@/service',
 | 
				
			||||||
 | 
					            group: 'internal',
 | 
				
			||||||
 | 
					            position: 'before'
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            pattern: '@/store',
 | 
					            pattern: '@/store',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            pattern: '@/context',
 | 
				
			||||||
 | 
					            group: 'internal',
 | 
				
			||||||
 | 
					            position: 'before'
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            pattern: '@/composables',
 | 
					            pattern: '@/composables',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
@@ -111,11 +109,6 @@ module.exports = {
 | 
				
			|||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            pattern: '@/service',
 | 
					 | 
				
			||||||
            group: 'internal',
 | 
					 | 
				
			||||||
            position: 'before'
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            pattern: '@/utils',
 | 
					            pattern: '@/utils',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
@@ -130,33 +123,10 @@ module.exports = {
 | 
				
			|||||||
            pattern: '@/**',
 | 
					            pattern: '@/**',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            pattern: '@/interface',
 | 
					 | 
				
			||||||
            group: 'internal',
 | 
					 | 
				
			||||||
            position: 'before'
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        pathGroupsExcludedImportTypes: ['vue', 'vue-router', 'pinia', 'naive-ui']
 | 
					        pathGroupsExcludedImportTypes: ['vue', 'vue-router', 'pinia', 'naive-ui']
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ],
 | 
					    ]
 | 
				
			||||||
    'import/prefer-default-export': 0,
 | 
					 | 
				
			||||||
    'max-classes-per-file': 0,
 | 
					 | 
				
			||||||
    'no-shadow': 0,
 | 
					 | 
				
			||||||
    'no-unused-vars': 'off',
 | 
					 | 
				
			||||||
    'no-use-before-define': 'off',
 | 
					 | 
				
			||||||
    'vue/comment-directive': 0,
 | 
					 | 
				
			||||||
    'vue/multi-word-component-names': 0,
 | 
					 | 
				
			||||||
    '@typescript-eslint/ban-types': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/ban-ts-ignore': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/explicit-function-return-type': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/explicit-module-boundary-types': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-empty-function': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-explicit-any': 0,
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-inferrable-types': 0,
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-non-null-assertion': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-unused-vars': ['warn', { ignoreRestSiblings: true, varsIgnorePattern: 'Ignored' }],
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-use-before-define': ['error', { classes: true, functions: false, typedefs: false }],
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-var-requires': 'off'
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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
 | 
				
			||||||
							
								
								
									
										27
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					name: Release
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - "v*.**"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: write
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  release:
 | 
				
			||||||
 | 
					    name: Build
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          fetch-depth: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Setup Node.js
 | 
				
			||||||
 | 
					        uses: actions/setup-node@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          node-version: 16.x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Create github releases
 | 
				
			||||||
 | 
					        run: npx changelogithub
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
 | 
				
			||||||
							
								
								
									
										11
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -11,12 +11,19 @@ node_modules
 | 
				
			|||||||
.DS_Store
 | 
					.DS_Store
 | 
				
			||||||
dist
 | 
					dist
 | 
				
			||||||
dist-ssr
 | 
					dist-ssr
 | 
				
			||||||
 | 
					dist.zip
 | 
				
			||||||
 | 
					coverage
 | 
				
			||||||
*.local
 | 
					*.local
 | 
				
			||||||
 | 
					stats.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/cypress/videos/
 | 
					/cypress/videos/
 | 
				
			||||||
/cypress/screenshots/
 | 
					/cypress/screenshots/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Editor directories and files
 | 
					# Editor directories and files
 | 
				
			||||||
 | 
					.vscode/*
 | 
				
			||||||
 | 
					!.vscode/extensions.json
 | 
				
			||||||
 | 
					!.vscode/launch.json
 | 
				
			||||||
 | 
					!.vscode/settings.json
 | 
				
			||||||
.idea
 | 
					.idea
 | 
				
			||||||
*.suo
 | 
					*.suo
 | 
				
			||||||
*.ntvs*
 | 
					*.ntvs*
 | 
				
			||||||
@@ -24,4 +31,6 @@ dist-ssr
 | 
				
			|||||||
*.sln
 | 
					*.sln
 | 
				
			||||||
*.sw?
 | 
					*.sw?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stats.html
 | 
					/src/typings/components.d.ts
 | 
				
			||||||
 | 
					package-lock.json
 | 
				
			||||||
 | 
					yarn.lock
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 && pnpm typecheck
 | 
					 | 
				
			||||||
							
								
								
									
										4
									
								
								.npmrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					registry=https://registry.npmmirror.com/
 | 
				
			||||||
 | 
					shamefully-hoist=true
 | 
				
			||||||
 | 
					strict-peer-dependencies=false
 | 
				
			||||||
 | 
					auto-install-peers=true
 | 
				
			||||||
@@ -1,27 +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的代码格式进行校验
 | 
					 | 
				
			||||||
  overrides: [
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      files: '*.html',
 | 
					 | 
				
			||||||
      options: {
 | 
					 | 
				
			||||||
        parser: 'html'
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										46
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,35 +1,27 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "recommendations": [
 | 
					  "recommendations": [
 | 
				
			||||||
		"formulahendry.auto-close-tag",
 | 
					 | 
				
			||||||
		"formulahendry.auto-complete-tag",
 | 
					 | 
				
			||||||
		"steoates.autoimport",
 | 
					 | 
				
			||||||
		"formulahendry.auto-rename-tag",
 | 
					 | 
				
			||||||
		"coenraads.bracket-pair-colorizer-2",
 | 
					 | 
				
			||||||
		"naumovs.color-highlight",
 | 
					 | 
				
			||||||
		"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",
 | 
					    "afzalsayed96.icones",
 | 
				
			||||||
    "antfu.iconify",
 | 
					    "antfu.iconify",
 | 
				
			||||||
		"kisstkondoros.vscode-gutter-preview",
 | 
					    "antfu.unocss",
 | 
				
			||||||
		"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",
 | 
					    "christian-kohler.path-intellisense",
 | 
				
			||||||
 | 
					    "dbaeumer.vscode-eslint",
 | 
				
			||||||
 | 
					    "eamodio.gitlens",
 | 
				
			||||||
 | 
					    "editorconfig.editorconfig",
 | 
				
			||||||
    "esbenp.prettier-vscode",
 | 
					    "esbenp.prettier-vscode",
 | 
				
			||||||
		"johnsoncodehk.volar",
 | 
					    "formulahendry.auto-close-tag",
 | 
				
			||||||
		"johnsoncodehk.vscode-typescript-vue-plugin",
 | 
					    "formulahendry.auto-complete-tag",
 | 
				
			||||||
		"dariofuzinato.vue-peek",
 | 
					    "formulahendry.auto-rename-tag",
 | 
				
			||||||
		"wscats.vue",
 | 
					    "kisstkondoros.vscode-gutter-preview",
 | 
				
			||||||
		"voorjaar.windicss-intellisense"
 | 
					    "lokalise.i18n-ally",
 | 
				
			||||||
 | 
					    "mariusalchimavicius.json-to-ts",
 | 
				
			||||||
 | 
					    "mhutchie.git-graph",
 | 
				
			||||||
 | 
					    "mikestead.dotenv",
 | 
				
			||||||
 | 
					    "naumovs.color-highlight",
 | 
				
			||||||
 | 
					    "pkief.material-icon-theme",
 | 
				
			||||||
 | 
					    "sdras.vue-vscode-snippets",
 | 
				
			||||||
 | 
					    "vue.volar",
 | 
				
			||||||
 | 
					    "vue.vscode-typescript-vue-plugin",
 | 
				
			||||||
 | 
					    "whtouche.vscode-js-console-utils",
 | 
				
			||||||
 | 
					    "zhuangtongfa.material-theme"
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "version": "0.2.0",
 | 
				
			||||||
 | 
					  "configurations": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "chrome",
 | 
				
			||||||
 | 
					      "request": "launch",
 | 
				
			||||||
 | 
					      "name": "Vue debugger",
 | 
				
			||||||
 | 
					      "url": "http://localhost:3200",
 | 
				
			||||||
 | 
					      "webRoot": "${workspaceFolder}"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										105
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,66 +1,28 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	"editor.quickSuggestions": {
 | 
					 | 
				
			||||||
		"strings": true
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	"workbench.iconTheme": "material-icon-theme",
 | 
					 | 
				
			||||||
	"workbench.colorTheme": "One Dark Pro",
 | 
					 | 
				
			||||||
	"editor.tabSize": 2,
 | 
					 | 
				
			||||||
	"editor.fontLigatures": true,
 | 
					 | 
				
			||||||
  "editor.codeActionsOnSave": {
 | 
					  "editor.codeActionsOnSave": {
 | 
				
			||||||
    "source.fixAll.eslint": true
 | 
					    "source.fixAll.eslint": true
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
	"editor.bracketPairColorization.enabled": true,
 | 
					  "editor.fontLigatures": true,
 | 
				
			||||||
 | 
					  "editor.formatOnSave": false,
 | 
				
			||||||
  "editor.guides.bracketPairs": "active",
 | 
					  "editor.guides.bracketPairs": "active",
 | 
				
			||||||
	"git.enableSmartCommit": true,
 | 
					  "editor.quickSuggestions": {
 | 
				
			||||||
	"path-intellisense.mappings": {
 | 
					    "strings": true
 | 
				
			||||||
		"@": "${workspaceFolder}/src",
 | 
					 | 
				
			||||||
		"~@": "${workspaceFolder}/src",
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  "editor.tabSize": 2,
 | 
				
			||||||
 | 
					  "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact", "vue", "json"],
 | 
				
			||||||
 | 
					  "files.associations": {
 | 
				
			||||||
 | 
					    "*.env.*": "dotenv"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "files.eol": "\n",
 | 
				
			||||||
 | 
					  "git.enableSmartCommit": true,
 | 
				
			||||||
  "gutterpreview.paths": {
 | 
					  "gutterpreview.paths": {
 | 
				
			||||||
    "@": "/src",
 | 
					    "@": "/src",
 | 
				
			||||||
    "~@": "/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"
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	"vue3snippets.enable-compile-vue-file-on-did-save-code": false,
 | 
					 | 
				
			||||||
	"editor.formatOnSave": false,
 | 
					 | 
				
			||||||
  "material-icon-theme.activeIconPack": "angular",
 | 
					  "material-icon-theme.activeIconPack": "angular",
 | 
				
			||||||
  "material-icon-theme.files.associations": {},
 | 
					  "material-icon-theme.files.associations": {},
 | 
				
			||||||
  "material-icon-theme.folders.associations": {
 | 
					  "material-icon-theme.folders.associations": {
 | 
				
			||||||
 | 
					    "src-tauri": "src",
 | 
				
			||||||
    "enum": "typescript",
 | 
					    "enum": "typescript",
 | 
				
			||||||
    "enums": "typescript",
 | 
					    "enums": "typescript",
 | 
				
			||||||
    "store": "context",
 | 
					    "store": "context",
 | 
				
			||||||
@@ -69,6 +31,45 @@
 | 
				
			|||||||
    "composables": "hook",
 | 
					    "composables": "hook",
 | 
				
			||||||
    "directive": "tools",
 | 
					    "directive": "tools",
 | 
				
			||||||
    "directives": "tools",
 | 
					    "directives": "tools",
 | 
				
			||||||
		"business": "core"
 | 
					    "business": "core",
 | 
				
			||||||
	}
 | 
					    "request": "api",
 | 
				
			||||||
 | 
					    "adapter": "middleware"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "path-intellisense.mappings": {
 | 
				
			||||||
 | 
					    "@": "${workspaceFolder}/src",
 | 
				
			||||||
 | 
					    "~@": "${workspaceFolder}/src"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "terminal.integrated.fontSize": 14,
 | 
				
			||||||
 | 
					  "terminal.integrated.fontWeight": 500,
 | 
				
			||||||
 | 
					  "terminal.integrated.tabs.enabled": true,
 | 
				
			||||||
 | 
					  "workbench.iconTheme": "material-icon-theme",
 | 
				
			||||||
 | 
					  "workbench.colorTheme": "One Dark Pro",
 | 
				
			||||||
 | 
					  "[html]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[json]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[jsonc]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[javascript]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[javascriptreact]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[markdown]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "yzhang.markdown-all-in-one"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[typescript]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[typescriptreact]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[vue]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "Vue.volar"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "i18n-ally.localesPaths": ["src/locales", "src/locales/lang"]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										199
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						@@ -2,6 +2,205 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
 | 
					All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.9](https://github.com/honghuangdc/soybean-admin/compare/v0.9.8...v0.9.9) (2023-03-13)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **hooks:** add useNaiveTable ([cc13fcc](https://github.com/honghuangdc/soybean-admin/commit/cc13fcc8aaaf667902d69350ad0de3cc16c261ab))
 | 
				
			||||||
 | 
					* **projects:** custom unocss colors support opacity ([488e6e3](https://github.com/honghuangdc/soybean-admin/commit/488e6e32045d995361b898ef3d384dafcb069008))
 | 
				
			||||||
 | 
					* **projects:** new layout,tab and add update theme settings ([912c353](https://github.com/honghuangdc/soybean-admin/commit/912c3531c5d7a3ab30e15d39bed98ca9b20131ab))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **components:** 修复iconSelect选择器点击事件失效 ([7e505f9](https://github.com/honghuangdc/soybean-admin/commit/7e505f9b96f5380b6c27b4c2ee2ab0698c4eedc4))
 | 
				
			||||||
 | 
					* **components:** 页面跳转被拦截, 则会出现 tab 页签与页面不一致的问题 ([bd5dd2c](https://github.com/honghuangdc/soybean-admin/commit/bd5dd2cf28a0943721c397d70c53fe3988a4f81a))
 | 
				
			||||||
 | 
					* **components:** refresh cached routes ([b0f98e4](https://github.com/honghuangdc/soybean-admin/commit/b0f98e4bfac31751dd39a7dec203277db813694b))
 | 
				
			||||||
 | 
					* **projects:** fix eslint svg cause incorrect icon render ([0b5afda](https://github.com/honghuangdc/soybean-admin/commit/0b5afda287a0eea57daa8d35409297e2cbf6d578))
 | 
				
			||||||
 | 
					* **projects:** fix github bug-report ([f73e3f6](https://github.com/honghuangdc/soybean-admin/commit/f73e3f648decf5632fe5193e825b1f912c5f6153))
 | 
				
			||||||
 | 
					* **projects:** fix pwa logo ([bf2f617](https://github.com/honghuangdc/soybean-admin/commit/bf2f6172554337450c4a300b8bdb580d3e25ad45))
 | 
				
			||||||
 | 
					* **projects:** not only `/login` claim dynamic path scenario , but also others , eg:/user/1 ([6059891](https://github.com/honghuangdc/soybean-admin/commit/60598915561f1bad6ffba0dc102f0a776be52f0d))
 | 
				
			||||||
 | 
					* **projects:** sortRoutes recursively ([9188941](https://github.com/honghuangdc/soybean-admin/commit/918894147ab739b4592e8c76378246e28c46491a))
 | 
				
			||||||
 | 
					* **projects:** the length of routes children list should greater than 0 ([e1afc10](https://github.com/honghuangdc/soybean-admin/commit/e1afc10b80243a5d8d270a351a37a0a2d159f167))
 | 
				
			||||||
 | 
					* **utils:** make AxiosRequestConfig optional for request.handleDelete() ([4a6fec8](https://github.com/honghuangdc/soybean-admin/commit/4a6fec8af0b44b546f81ec41d7a5947371e189b2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.8](https://github.com/honghuangdc/soybean-admin/compare/v0.9.7...v0.9.8) (2023-01-15)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* 新增 affix 属性,用于将其固定在tab卡 ([e772ff0](https://github.com/honghuangdc/soybean-admin/commit/e772ff05fb6ef513bd37cd9b1e245ea72f0ad6d2))
 | 
				
			||||||
 | 
					* **projects:** add compress script [添加压缩命令] ([be6d431](https://github.com/honghuangdc/soybean-admin/commit/be6d431485a5688bd1ed567e11c1ca35ab9259b0))
 | 
				
			||||||
 | 
					* **projects:** add generate logo script ([25daa23](https://github.com/honghuangdc/soybean-admin/commit/25daa236064c9a76677dbf16bc6d9717b1e0040f))
 | 
				
			||||||
 | 
					* **projects:** add new route plugin @soybeanjs/vite-plugin-vue-page-route [集成新的路由插件] ([3131e00](https://github.com/honghuangdc/soybean-admin/commit/3131e00f0f4a66756f547892a8d312cde3aaf868))
 | 
				
			||||||
 | 
					* **projects:** add script about generating png logo from [添加根据svg生成png图标的命令] ([70aeefe](https://github.com/honghuangdc/soybean-admin/commit/70aeefea02fcc13c152ee9d7a1197381bac724b9))
 | 
				
			||||||
 | 
					* setting 页面新增 是否显示footer的开关 ([d064f62](https://github.com/honghuangdc/soybean-admin/commit/d064f6285a6d1616d7606f1390d5f01819b258bb))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **components:** 修复路由在path中包含重复路单词径菜单时,被激活会错误展开 ([264da00](https://github.com/honghuangdc/soybean-admin/commit/264da00e5d2cd8139907c2ac11a046649d942f4b))
 | 
				
			||||||
 | 
					* count can't display when endValue is 0. ([0282feb](https://github.com/honghuangdc/soybean-admin/commit/0282feb1730724ba66c2e57ab354099afa074e81))
 | 
				
			||||||
 | 
					* **projects:** 修复动态路由模式下路由不排序的问题 ([58b27c9](https://github.com/honghuangdc/soybean-admin/commit/58b27c96932ba89b362138a6056a82c25a7be282))
 | 
				
			||||||
 | 
					* **projects:** 修复tabs在static路由模式下可以关闭首页 ([7211a17](https://github.com/honghuangdc/soybean-admin/commit/7211a17a8158b01a1f6dd6c83591f86d76633de0))
 | 
				
			||||||
 | 
					* **projects:** add router-page.d.ts to git [将router-page.d.ts添加git提交] ([7a58035](https://github.com/honghuangdc/soybean-admin/commit/7a5803551419f65ca55ba797b49273b3a0dc6067))
 | 
				
			||||||
 | 
					* **projects:** fix login success message [修复登录成功的消息提示] ([810398a](https://github.com/honghuangdc/soybean-admin/commit/810398abb882613f82ba385e8a7666cf8b86d92d))
 | 
				
			||||||
 | 
					* **projects:** fix router when the dynamic routes api was failed [修复当动态路由接口失败后路由异常问题] ([f2b580f](https://github.com/honghuangdc/soybean-admin/commit/f2b580fc067e81202238bf8079a13ff014b0b329))
 | 
				
			||||||
 | 
					* **projects:** fix vite-pwa plugin config ([94098d0](https://github.com/honghuangdc/soybean-admin/commit/94098d02e8cec12e3c9f9331ece154b65d1c9150))
 | 
				
			||||||
 | 
					* remove height limit h-360px ([b5c570a](https://github.com/honghuangdc/soybean-admin/commit/b5c570adf55fd235dcec49bc20837623b1d5d3c4))
 | 
				
			||||||
 | 
					* set password attributes ([a9a3703](https://github.com/honghuangdc/soybean-admin/commit/a9a37036d58274385a779e6460f7be281dafdcaf))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.7](https://github.com/honghuangdc/soybean-admin/compare/v0.9.6...v0.9.7) (2022-11-07)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **projects:** 全局搜索菜单及消息通知适配移动端 ([97e2ffd](https://github.com/honghuangdc/soybean-admin/commit/97e2ffddf4ac047133dc016a91ac07556e562d29))
 | 
				
			||||||
 | 
					* **projects:** 实现用户管理页面 ([472f93b](https://github.com/honghuangdc/soybean-admin/commit/472f93bfc111e8ca94adef823b8cc12e4f8cd2c6))
 | 
				
			||||||
 | 
					* **projects:** 适配移动端,修复Tab关闭图标的bug ([296b154](https://github.com/honghuangdc/soybean-admin/commit/296b154be5dfe410b3cfca9afaeeaf9c47de3e0c)), closes [#87](https://github.com/honghuangdc/soybean-admin/issues/87) [#106](https://github.com/honghuangdc/soybean-admin/issues/106) [#109](https://github.com/honghuangdc/soybean-admin/issues/109) [#111](https://github.com/honghuangdc/soybean-admin/issues/111)
 | 
				
			||||||
 | 
					* **projects:** 添加请求适配adapter层应用的示例页面 ([8d11a6a](https://github.com/honghuangdc/soybean-admin/commit/8d11a6affcfa37344011a6aaf3d6e005546f0e61))
 | 
				
			||||||
 | 
					* **projects:** 添加生产的主题配置缓存 ([718c362](https://github.com/honghuangdc/soybean-admin/commit/718c36263e451a39bca6da6c33657a09515ffbcc))
 | 
				
			||||||
 | 
					* **projects:** 添加系统管理的页面 ([c33b5eb](https://github.com/honghuangdc/soybean-admin/commit/c33b5ebfefbb3ae507141bd2e9414231fd1512d4))
 | 
				
			||||||
 | 
					* **projects:** 添加组件名称,调整vue文件里面的类型声明位置 ([f64bc91](https://github.com/honghuangdc/soybean-admin/commit/f64bc91ce285c7a9806ed0f6ae970d9b598fd0cb))
 | 
				
			||||||
 | 
					* **projects:** 添加provide、inject上下文示例 ([a444731](https://github.com/honghuangdc/soybean-admin/commit/a444731e9eef43022930c3550dcfc058e70a2941))
 | 
				
			||||||
 | 
					* **projects:** 系统消息组件代码优化 ([9518372](https://github.com/honghuangdc/soybean-admin/commit/9518372fe0431d4e08a5f40d1b2982691fbb4107))
 | 
				
			||||||
 | 
					* **projects:** 增加返回顶部功能 ([894b0f1](https://github.com/honghuangdc/soybean-admin/commit/894b0f1c182a36ad1774a8144bf50dd4e0b62a46))
 | 
				
			||||||
 | 
					* **projects:** 增加系统消息组件 ([afa0134](https://github.com/honghuangdc/soybean-admin/commit/afa0134fdd63c253e102bc129e275d16ca25508e))
 | 
				
			||||||
 | 
					* **projects:** add constant route page without login status[添加未登录可访问的固定路由示例页面] ([78efd77](https://github.com/honghuangdc/soybean-admin/commit/78efd7793a241811065caf56edf7e68aea58bc8c))
 | 
				
			||||||
 | 
					* **projects:** add pinia setup syntax example: setup-store[添加setup syntax的pinia示例setup-store] ([82c4b09](https://github.com/honghuangdc/soybean-admin/commit/82c4b09b9411390f97c2d10bb211c66ed9656b63))
 | 
				
			||||||
 | 
					* **projects:** import i18n [引入i18n] ([b632b7f](https://github.com/honghuangdc/soybean-admin/commit/b632b7ffed5c6d6ec15c23c8cce030bf669c554f))
 | 
				
			||||||
 | 
					* **projects:** new router system [新的路由系统] ([c7b6a3f](https://github.com/honghuangdc/soybean-admin/commit/c7b6a3fbecd1ba051833e4e47b75a06935f212c8))
 | 
				
			||||||
 | 
					* **projects:** refactor icon system, unify icon usage [重构图标系统,统一图标用法] ([811f820](https://github.com/honghuangdc/soybean-admin/commit/811f820644053606e50624c2f184f9669f3eff7e))
 | 
				
			||||||
 | 
					* **projects:** support constant route without login status[支持未登录状态下访问自定义的固定路由] ([a539112](https://github.com/honghuangdc/soybean-admin/commit/a539112a0f53183ee073d4eb9034ef48209fe30c))
 | 
				
			||||||
 | 
					* **projects:** useNaiveTable函数:类型部分 ([02992dc](https://github.com/honghuangdc/soybean-admin/commit/02992dc02d105cbfcebbea397438c68db1fa8177))
 | 
				
			||||||
 | 
					* **tabs:** 多页签增加关闭所有 ([8237adb](https://github.com/honghuangdc/soybean-admin/commit/8237adb9c0b187911df37d6d99fd84718bc3ea8f))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **deps:** decrease @types/node version to fix TS type error [降低@types/node版本修复TS的类型错误] ([149d22a](https://github.com/honghuangdc/soybean-admin/commit/149d22a4a491ca5fc6c52375046e9f1cb86ee76d))
 | 
				
			||||||
 | 
					* **projects:** 修复多个后端服务时的本地代理 ([2aba58c](https://github.com/honghuangdc/soybean-admin/commit/2aba58c973e5d0ea975443a8b22c9d94283d4fb9))
 | 
				
			||||||
 | 
					* **projects:** 修复构建后mockjs对xhr的影响问题 ([7757285](https://github.com/honghuangdc/soybean-admin/commit/77572855c3f7161697f42e6da36771c15707f0ab))
 | 
				
			||||||
 | 
					* **projects:** 修复图标的TS类型 ([dbd6760](https://github.com/honghuangdc/soybean-admin/commit/dbd676095b42aaebc783d5c89478306a453195a5))
 | 
				
			||||||
 | 
					* **projects:** 修复eslint规则 ([d7f5bf3](https://github.com/honghuangdc/soybean-admin/commit/d7f5bf3373e7884b8dc2c696a2c36e9cf27ad64b))
 | 
				
			||||||
 | 
					* **projects:** 修复import.meta.env的TS类型 ([1994262](https://github.com/honghuangdc/soybean-admin/commit/19942625d58e673126db5249488555de71d18457))
 | 
				
			||||||
 | 
					* **projects:** 修复tab不显示路由首页的问题 ([a792bb5](https://github.com/honghuangdc/soybean-admin/commit/a792bb5cb3c388ba3b93e17bab8f42d23cd5df4a))
 | 
				
			||||||
 | 
					* **projects:** 修复TS类型问题 ([16dce9a](https://github.com/honghuangdc/soybean-admin/commit/16dce9a4ce4d3aa822d70f6e5199eb9c86e33ad9))
 | 
				
			||||||
 | 
					* **projects:** add iconify json ([8a1ec93](https://github.com/honghuangdc/soybean-admin/commit/8a1ec938e7a26728919024e9f5b7b0af2b270aba))
 | 
				
			||||||
 | 
					* **svg-icon:** 自定义图标在Dropdown组件下hover状态无法显示图标 ([0523f08](https://github.com/honghuangdc/soybean-admin/commit/0523f0838246041bfc09130e21369bd777f63682))
 | 
				
			||||||
 | 
					* **utils:** 修复iconifyRender ([c37d0ac](https://github.com/honghuangdc/soybean-admin/commit/c37d0ac7887a3451b8558fc4aa6c05ed3b0ef74f))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.6](https://github.com/honghuangdc/soybean-admin/compare/v0.9.5...v0.9.6) (2022-06-15)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **projects:** 本地svg动态渲染图标 ([c3c975e](https://github.com/honghuangdc/soybean-admin/commit/c3c975ee1142987b7ded0107bf91d0080d5651fe)), closes [#61](https://github.com/honghuangdc/soybean-admin/issues/61)
 | 
				
			||||||
 | 
					* **projects:** 上下结构,菜单支持横向滚动 ([808051b](https://github.com/honghuangdc/soybean-admin/commit/808051b29dd682e1cbcf0e211774efb9cc12713a))
 | 
				
			||||||
 | 
					* **projects:** 新增Antv G2图表示例 ([2d64a2e](https://github.com/honghuangdc/soybean-admin/commit/2d64a2e57c8d83c8d06f210eeefef8f31b3abeb9))
 | 
				
			||||||
 | 
					* **projects:** 增加设置当前Tab页签名称功能 ([487213b](https://github.com/honghuangdc/soybean-admin/commit/487213b64853765e2bd186474e4607572624a33e))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **projects:** 设置tab标题导致meta属性丢失 ([efcfa57](https://github.com/honghuangdc/soybean-admin/commit/efcfa576d52a7eab644f3b4c65af153442887fab))
 | 
				
			||||||
 | 
					* **projects:** 修复顶部菜单的位置失效问题 ([4ee0d94](https://github.com/honghuangdc/soybean-admin/commit/4ee0d94f1bde83c788fc0dcb084402359c04fb1b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.5](https://github.com/honghuangdc/soybean-admin/compare/v0.9.4...v0.9.5) (2022-06-06)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **projects:** 支持同一路由根据不同query和hash同时显示不同Tab ([4122685](https://github.com/honghuangdc/soybean-admin/commit/4122685803f8a0a485682d16cec74e27945adc47)), closes [#64](https://github.com/honghuangdc/soybean-admin/issues/64)
 | 
				
			||||||
 | 
					* **projects:** 动态路由根路由重定向只需取决于后端返回的路由首页 ([434ab1c](https://github.com/honghuangdc/soybean-admin/commit/434ab1c560b260f8a19895405eb1d3c3313052d7))
 | 
				
			||||||
 | 
					* **projects:** 补充更多的ECharts示例 ([c776249](https://github.com/honghuangdc/soybean-admin/commit/c7762490def77695bedf179ffc63e3e95d15e14d))
 | 
				
			||||||
 | 
					* **projects:** 添加百度地图、升级依赖 ([39854a4](https://github.com/honghuangdc/soybean-admin/commit/39854a492b9cce71e0c7ed52af9985cb4abd6a97))
 | 
				
			||||||
 | 
					* **projects:** 添加插件页面:图表 ([0a46ea0](https://github.com/honghuangdc/soybean-admin/commit/0a46ea08443f6b879434e925d440cf07e9494fcb))
 | 
				
			||||||
 | 
					* **projects:** 添加自动跟随系统主题设置 ([ba07b69](https://github.com/honghuangdc/soybean-admin/commit/ba07b695dd9dc5d3f8ebf57d0f2e69d624994962))
 | 
				
			||||||
 | 
					* **projects:** 添加antv g2图表示例 ([44b022a](https://github.com/honghuangdc/soybean-admin/commit/44b022aefd7dbb4c34886814cf04767450dec026))
 | 
				
			||||||
 | 
					* **projects:** 引入echarts替换antvG2plot ([e7ad086](https://github.com/honghuangdc/soybean-admin/commit/e7ad08685e8ac52a8906fc94e656192275f9764c))
 | 
				
			||||||
 | 
					* **route:** 路由meta新增activeMenu属性 ([ebd16a4](https://github.com/honghuangdc/soybean-admin/commit/ebd16a4d1ab1a95a27838a2d4f20cc1d1e7309ae))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **projects:** 修复@antv/g2生产环境报错 ([4558c24](https://github.com/honghuangdc/soybean-admin/commit/4558c24d1c1e1faa3326650fc16e6baf384509ac))
 | 
				
			||||||
 | 
					* **projects:** 修复插件不存在的错误提示 ([7165282](https://github.com/honghuangdc/soybean-admin/commit/716528206e9f63e873607d0afd59d83f6984e3fe))
 | 
				
			||||||
 | 
					* **projects:** 修复权限切换路由数据未更新的问题 ([60f9125](https://github.com/honghuangdc/soybean-admin/commit/60f912508b0e685957fb22ef0ed1f83272847263))
 | 
				
			||||||
 | 
					* **projects:** 修复页面切换时导致的溢出滚动条 ([e023306](https://github.com/honghuangdc/soybean-admin/commit/e0233061d3bca236b4c4bb462ce00f7ca186b9fa))
 | 
				
			||||||
 | 
					* **route:** 当为左侧混合菜单时activeMenu无效情况 ([3e4f9e2](https://github.com/honghuangdc/soybean-admin/commit/3e4f9e282442073447c5c24c33d65bc6130978ee))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.4](https://github.com/honghuangdc/soybean-admin/compare/v0.9.3...v0.9.4) (2022-04-28)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **layouts:** 添加侧边栏/头部的反转模式来增加对比度 ([861c8b9](https://github.com/honghuangdc/soybean-admin/commit/861c8b9852e0097a1f6b79ac2c10d19add123bde))
 | 
				
			||||||
 | 
					* **layouts:** 添加侧边栏/头部的反转模式来增加对比度 ([3c8dd77](https://github.com/honghuangdc/soybean-admin/commit/3c8dd772f89d2b656a42c4f7164e581acdb2b1a5))
 | 
				
			||||||
 | 
					* **projects:** 插件方式按需引入naiveUI ([6bed9ea](https://github.com/honghuangdc/soybean-admin/commit/6bed9ead38af6d58f6cd9e520db848ae5cbfa4db))
 | 
				
			||||||
 | 
					* **projects:** 登录页背景图片位置适配移动端 ([24010d0](https://github.com/honghuangdc/soybean-admin/commit/24010d05fb1ff51cb5e5d94ffe310206a9638711))
 | 
				
			||||||
 | 
					* **projects:** 登录页面适配移动端 ([ec0776e](https://github.com/honghuangdc/soybean-admin/commit/ec0776e268cd3d1031e9ecd794abce271a675793))
 | 
				
			||||||
 | 
					* **projects:** 权限完善及权限示例页面 ([807448a](https://github.com/honghuangdc/soybean-admin/commit/807448aec5b041535fe4fbac90eca1138b2f439c))
 | 
				
			||||||
 | 
					* **projects:** 添加请求适配器的请求示例 ([bed4292](https://github.com/honghuangdc/soybean-admin/commit/bed4292ed380e77ac428ab057abc42eceb72af53))
 | 
				
			||||||
 | 
					* **projects:** 新增静态路由 ([ca2dfa6](https://github.com/honghuangdc/soybean-admin/commit/ca2dfa6185aa7a4e58184bcfef2a1246a52f88fd))
 | 
				
			||||||
 | 
					* **projects:** 引入unocss替换windicss ([c9d3e5a](https://github.com/honghuangdc/soybean-admin/commit/c9d3e5a3fdf59179dcfc122ab8369c492ea7832e))
 | 
				
			||||||
 | 
					* **projects:** HTML lang 修改为 zh-cmn-Hans ([b9c5c34](https://github.com/honghuangdc/soybean-admin/commit/b9c5c349790b1e83a7acd1f2c53a86c9221944ff))
 | 
				
			||||||
 | 
					* **projects:** HTML lang 修改为 zh-cmn-Hans ([dbeb595](https://github.com/honghuangdc/soybean-admin/commit/dbeb595c0b9fc11e7d166a7684af37cc971f1a11))
 | 
				
			||||||
 | 
					* **projects:** mock添加权限过滤 ([7f4350a](https://github.com/honghuangdc/soybean-admin/commit/7f4350aeb673dab59192584177a897aacebe4b28))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **projects:** 去除从环境文件引入端口号导致的错误 ([2d6d179](https://github.com/honghuangdc/soybean-admin/commit/2d6d179d669ea71cca3fe97ac840e4856bff4051))
 | 
				
			||||||
 | 
					* **projects:** 全局搜索弹窗弹出时动画闪屏问题 ([bb1bbf2](https://github.com/honghuangdc/soybean-admin/commit/bb1bbf272438f4ed440735118c6a9ec04c7d109f))
 | 
				
			||||||
 | 
					* **projects:** 添加.npmrc修复无法获取自动引入的全局组件声明类型 ([e8488e4](https://github.com/honghuangdc/soybean-admin/commit/e8488e4d5237e5e03ec07ff07d03115389d5b1ef))
 | 
				
			||||||
 | 
					* **projects:** 添加获取路由组件文件未找到时的错误提示 ([219f87f](https://github.com/honghuangdc/soybean-admin/commit/219f87f46758f328f26697f66d8583f49c0d41de))
 | 
				
			||||||
 | 
					* **projects:** 修复获取vite环境变量的方式 ([46e1ae7](https://github.com/honghuangdc/soybean-admin/commit/46e1ae7825b2b204ce3cdd63b3c64f39bff096d0))
 | 
				
			||||||
 | 
					* **projects:** 修复路由守卫的动态路由逻辑 ([e6c26fc](https://github.com/honghuangdc/soybean-admin/commit/e6c26fcb4ae085f9fd7d7eb9183ddba020d0b5da))
 | 
				
			||||||
 | 
					* **projects:** 修复样式 ([e899914](https://github.com/honghuangdc/soybean-admin/commit/e8999144266761b3b701442975c3c00251240d53))
 | 
				
			||||||
 | 
					* **projects:** 修复在新版vite下环境变量获取不到的问题 ([3fb13ca](https://github.com/honghuangdc/soybean-admin/commit/3fb13ca9e710549d2ddeb774fe08fabd27d5ae11))
 | 
				
			||||||
 | 
					* **projects:** 修复vite alias ([cd7ca8f](https://github.com/honghuangdc/soybean-admin/commit/cd7ca8f4c77ac8c753b753ba698a9573d6c37bf9))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.3](https://github.com/honghuangdc/soybean-admin/compare/v0.9.2...v0.9.3) (2022-03-12)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **components:** svgIcon,添加type,调整size方案 ([ce4e039](https://github.com/honghuangdc/soybean-admin/commit/ce4e039f48001b47a2933e807f5410a9573781b9))
 | 
				
			||||||
 | 
					* **projects:** 引入soybean-admin-tab、去除vite-plugin-svg-icons,用unplugin-icons实现自定义svg的iconify写法、代码优化 ([a1a57a1](https://github.com/honghuangdc/soybean-admin/commit/a1a57a185ce5004888ca4e1611973665ee46980b))
 | 
				
			||||||
 | 
					* **projects:** 新增子菜单图标和多页签图标 ([f5c56c3](https://github.com/honghuangdc/soybean-admin/commit/f5c56c355ce41157b20ed0a10272a28e6d8b2b49))
 | 
				
			||||||
 | 
					* **projects:** 新增自定义svg图标动态渲染 ([f83c7b5](https://github.com/honghuangdc/soybean-admin/commit/f83c7b59b893ab6e210188e92c4177b3d01392ce))
 | 
				
			||||||
 | 
					* **projects:** 添加naiveUI按需引入 ([a810ef8](https://github.com/honghuangdc/soybean-admin/commit/a810ef85b19e4b74f3ddb3c69d17c050e556ee90))
 | 
				
			||||||
 | 
					* **projects:** 添加SvgIcon,配置vite plugin ([378d55a](https://github.com/honghuangdc/soybean-admin/commit/378d55ac0e11cdf115ce3cb8e281d60f7fc4ff7a))
 | 
				
			||||||
 | 
					* **projects:** 添加全局组件自动引入注册 ([f5a043b](https://github.com/honghuangdc/soybean-admin/commit/f5a043b11a403927828ae922bdae411a4e5ae3c6))
 | 
				
			||||||
 | 
					* **projects:** 添加网络代理 ([094dca9](https://github.com/honghuangdc/soybean-admin/commit/094dca961f608404352ac360f44496423d88dae8))
 | 
				
			||||||
 | 
					* **projects:** 重构项目的TS类型架构,去除interface文件夹 ([8191490](https://github.com/honghuangdc/soybean-admin/commit/8191490f39fc011096edd77c3156eb4fe33d4e1c))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **components:** 修复组件LoadingEmptyWrapper适应暗黑模式 ([811b15e](https://github.com/honghuangdc/soybean-admin/commit/811b15e672c9d69e9c5789eb11ab2db7bd729f37))
 | 
				
			||||||
 | 
					* **components:** 组件LoadingEmptyWrapper添加背景颜色动画过渡 ([7add5c2](https://github.com/honghuangdc/soybean-admin/commit/7add5c2edfcabadb77084179d464b849d880d5e6))
 | 
				
			||||||
 | 
					* **projects:** 修复 BASE_URL 没有生效的问题 ([72d7dcf](https://github.com/honghuangdc/soybean-admin/commit/72d7dcfa5ee8dc6f3601f4d65c6aca9ad2cc5d5c))
 | 
				
			||||||
 | 
					* **projects:** 修复页面切换动画开关不生效 ([9d4ed61](https://github.com/honghuangdc/soybean-admin/commit/9d4ed617fb80095e521d8063718283459711118f))
 | 
				
			||||||
 | 
					* **projects:** 修复页面切换动画无变化 ([c4546bd](https://github.com/honghuangdc/soybean-admin/commit/c4546bdfa303f1e89c0d7ddd46b54e4ec5170096))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### [0.9.2](https://github.com/honghuangdc/soybean-admin/compare/v0.9.1...v0.9.2) (2022-02-11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **projects:** 迁移全局搜索菜单功能 ([554d7fd](https://github.com/honghuangdc/soybean-admin/commit/554d7fd6114b9cf6df571c3cb02f4cb0cc6dcfd4))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **components:** 修复Tab在移动端设备无法点击的问题 ([2c9660f](https://github.com/honghuangdc/soybean-admin/commit/2c9660fdbf9a84e980db0aff5cd0aed0f75963ca))
 | 
				
			||||||
 | 
					* **projects:** 修复分析页和工作台的布局问题 ([e93b94c](https://github.com/honghuangdc/soybean-admin/commit/e93b94cb2435a130bb1d94a703328af342cd24c9))
 | 
				
			||||||
 | 
					* **projects:** 修复项目配置拷贝功能 ([a7a269d](https://github.com/honghuangdc/soybean-admin/commit/a7a269d6a61ccd25883e6bb69639d39e0260587d))
 | 
				
			||||||
 | 
					* **projects:** vite配置修复 ([facc00e](https://github.com/honghuangdc/soybean-admin/commit/facc00e8b4998dc8bd338e3b63a652b4bfe2ed3e))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### [0.9.1](https://github.com/honghuangdc/soybean-admin/compare/v0.1.3...v0.9.1) (2022-01-23)
 | 
					### [0.9.1](https://github.com/honghuangdc/soybean-admin/compare/v0.1.3...v0.9.1) (2022-01-23)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					MIT License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2021 Soybean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above copyright notice and this permission notice shall be included in all
 | 
				
			||||||
 | 
					copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||||
 | 
					SOFTWARE.
 | 
				
			||||||
							
								
								
									
										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
 | 
				
			||||||
							
								
								
									
										112
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,56 +1,78 @@
 | 
				
			|||||||
<div align="center">
 | 
					<div align="center">
 | 
				
			||||||
	<img src="https://i.loli.net/2021/11/24/x5lLfuSnEawBAgi.png"/>
 | 
						<img src="https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybean.svg" style="width: 160px;"/>
 | 
				
			||||||
	<h1>Soybean Admin</h1>
 | 
						<h1>Soybean Admin</h1>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](./LICENSE)
 | 
					[](./LICENSE)  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 简介
 | 
					## 简介
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Soybean Admin  是一个基于 Vue3、Vite、TypeScript、Naive UI 的免费中后台模版,它使用了最新的前端技术栈,内置丰富的主题配置,有着极高的代码规范,基于mock实现的动态权限路由,开箱即用的中后台前端解决方案,也可用于学习参考。
 | 
					[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 的语言
 | 
					- **TypeScript**: 应用程序级 JavaScript 的语言
 | 
				
			||||||
- **主题**:丰富可配置的主题、暗黑模式,基于windicss的动态主题颜色
 | 
					- **主题**:丰富可配置的主题、暗黑模式,基于原子 css 框架 - UnoCss 的动态主题颜色
 | 
				
			||||||
- **代码规范**:丰富的规范插件及极高的代码规范
 | 
					- **代码规范**:丰富的规范插件及极高的代码规范
 | 
				
			||||||
- **权限路由**:简易的路由配置、基于mock的动态路由能快速实现后端动态路由
 | 
					- **文件路由系统**:基于文件的路由系统,根据页面文件自动生成路由声明、路由导入和路由模块
 | 
				
			||||||
- **请求函数**:完善的请求函数封装,提供Promise和hooks两种请求函数
 | 
					- **权限路由**:提供前端静态和后端动态两种路由模式,基于 mock 的动态路由能快速实现后端动态路由
 | 
				
			||||||
 | 
					- **请求函数**:基于 axios 的完善的请求函数封装,提供 Promise 和 hooks 两种请求函数,加入请求结果数据转换的适配器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 预览
 | 
					## 在线预览
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [soybean-admin](https://soybean.pro/)
 | 
					- [Soybean Admin 预览地址](https://soybean.pro/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 文档
 | 
					## 文档
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [项目文档](https://docs.soybean.pro)
 | 
					- [项目文档预览地址](https://docs.soybean.pro)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 代码仓库
 | 
					## 代码仓库
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [github](https://github.com/honghuangdc/soybean-admin)
 | 
					- [github](https://github.com/honghuangdc/soybean-admin)
 | 
				
			||||||
 | 
					- [tauri 版](https://github.com/honghuangdc/soybean-admin/tree/tauri)
 | 
				
			||||||
 | 
					- [精简版](https://github.com/honghuangdc/soybean-admin/tree/thin)
 | 
				
			||||||
- [gitee](https://gitee.com/honghuangdc/soybean-admin)
 | 
					- [gitee](https://gitee.com/honghuangdc/soybean-admin)
 | 
				
			||||||
 | 
					- [tauri 版](https://gitee.com/honghuangdc/soybean-admin/tree/tauri)
 | 
				
			||||||
 | 
					- [精简版](https://gitee.com/honghuangdc/soybean-admin/tree/thin)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 更新日志
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[CHANGELOG](./CHANGELOG.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 后端服务
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [soybean-admin-java](https://github.com/honghuangdc/soybean-admin-java)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 项目示例图
 | 
					## 项目示例图
 | 
				
			||||||

 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 使用 Gitpod
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
在 Gitpod(适用于 GitHub 的免费在线开发环境)中打开项目,并立即开始编码.
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://gitpod.io/#https://github.com/honghuangdc/soybean-admin)
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 安装使用
 | 
					## 安装使用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 环境配置
 | 
				
			||||||
 | 
					  **本地环境需要安装 pnpm 7.x 、Node.js 14.18+ 和 Git**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- 克隆代码
 | 
					- 克隆代码
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
@@ -75,19 +97,31 @@ pnpm dev
 | 
				
			|||||||
pnpm build
 | 
					pnpm build
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Docker 部署
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Docker 部署 Soybean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					docker run --name soybean -p 80:80 -d soybeanjs/soybean-admin:v0.9.6
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 访问 SoybeanAdmin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					打开本地浏览器访问`http://localhost`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 如何贡献
 | 
					## 如何贡献
 | 
				
			||||||
 | 
					
 | 
				
			||||||
非常欢迎您的加入 或者提交一个 Pull Request。
 | 
					非常欢迎您的加入 或者提交一个 Pull Request。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Git 贡献提交规范
 | 
					## Git 贡献提交规范
 | 
				
			||||||
 | 
					
 | 
				
			||||||
项目已经内置angular提交规范,通过git cz 代替git commit 命令即可。
 | 
					项目已经内置 Angular 提交规范,直接执行 commit 命令即可生成符合 Angular 提交规范的 commit。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
git cz命令需要全局安装 commitizen
 | 
					项目已用 simple-git-hooks 代替了 husky, 旧版本用了 husky,执行 pnpm soy init-git-hooks 进行初始化配置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					## 基于 SoybeanAdmin 二次开发的项目
 | 
				
			||||||
pnpm i -g commitizen
 | 
					[electron-mock-admin](https://github.com/lixin59/electron-mock-api): 一个 Mock Api 管理系统,帮助前端开发伙伴快速实现接口的mock。
 | 
				
			||||||
```
 | 
					[T-Shell](https://github.com/TheBlindM/T-Shell): 是一个可配置命令提示的终端模拟器和 SSH客户端。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 浏览器支持
 | 
					## 浏览器支持
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -96,7 +130,7 @@ pnpm i -g commitizen
 | 
				
			|||||||
支持现代浏览器, 不支持 IE
 | 
					支持现代浏览器, 不支持 IE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| [<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 |
 | 
					| [<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                                                                                              |
 | 
					|                                                                                                                not support                                                                                                                |                                                                                          last 2 versions                                                                                          |                                                                                               last 2 versions                                                                                                |                                                                                             last 2 versions                                                                                              |                                                                                             last 2 versions                                                                                              |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 开源作者
 | 
					## 开源作者
 | 
				
			||||||
@@ -105,20 +139,28 @@ pnpm i -g commitizen
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 交流
 | 
					## 交流
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`Soybean Admin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供 QQ 交流群使用问题欢迎在群内提问。
 | 
					`Soybean Admin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供微信和 QQ 交流群,使用问题欢迎在群内提问。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- 微信交流群:
 | 
					  <div style="display:flex;">
 | 
				
			||||||
  <div style="text-align:left">
 | 
					  	<!-- <div style="padding-right:24px;">
 | 
				
			||||||
    <img src="https://s2.loli.net/2022/01/24/uX8KaGt7W2jbw6V.jpg" style="width:200px" />
 | 
					  		<p>微信交流群</p>
 | 
				
			||||||
 | 
					      <img src="https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybeanjs-wechat0503.jpeg" style="width:200px" />
 | 
				
			||||||
 | 
					  	</div> -->
 | 
				
			||||||
 | 
					  	<div style="padding-right:24px;">
 | 
				
			||||||
 | 
					  		<p>QQ交流群</p>
 | 
				
			||||||
 | 
					      <img src="https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/qq-soybean-admin.jpg" style="width:200px" />
 | 
				
			||||||
 | 
					  	</div>
 | 
				
			||||||
 | 
							<div>
 | 
				
			||||||
 | 
								<p>添加本人微信,欢迎来技术交流,业务咨询</p>
 | 
				
			||||||
 | 
								<img src="https://soybeanjs-1300612522.cos.ap-guangzhou.myqcloud.com/uPic/soybeanjs.jpeg" style="width:180px" />
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- QQ 群 `711301266`
 | 
					## 捐赠
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <div style="text-align:left">
 | 
					如果你觉得这个项目对你有帮助,可以请 Soybean 喝杯饮料表示支持,Soybean 开源的动力离不开各位的支持和鼓励。
 | 
				
			||||||
    <img src="https://i.loli.net/2021/11/24/1J6REWXiHomU2kM.jpg" style="width:200px" />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
- 本人微信号:honghuangdc,欢迎来技术交流,业务咨询。
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,6 @@ import dayjs from 'dayjs';
 | 
				
			|||||||
/** 项目构建时间 */
 | 
					/** 项目构建时间 */
 | 
				
			||||||
const PROJECT_BUILD_TIME = JSON.stringify(dayjs().format('YYYY-MM-DD HH:mm:ss'));
 | 
					const PROJECT_BUILD_TIME = JSON.stringify(dayjs().format('YYYY-MM-DD HH:mm:ss'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const define = {
 | 
					export const viteDefine = {
 | 
				
			||||||
  PROJECT_BUILD_TIME
 | 
					  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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,2 +1,3 @@
 | 
				
			|||||||
export * from './plugins';
 | 
					export * from './plugins';
 | 
				
			||||||
export * from './define';
 | 
					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,17 +0,0 @@
 | 
				
			|||||||
import { loadEnv } from 'vite';
 | 
					 | 
				
			||||||
import type { ConfigEnv, PluginOption } from 'vite';
 | 
					 | 
				
			||||||
import { minifyHtml, injectHtml } from 'vite-plugin-html'; // html插件(使用变量、压缩)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default (config: ConfigEnv): PluginOption[] => {
 | 
					 | 
				
			||||||
  const viteEnv = loadEnv(config.mode, `.env.${config.mode}`);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return [
 | 
					 | 
				
			||||||
    minifyHtml(),
 | 
					 | 
				
			||||||
    injectHtml({
 | 
					 | 
				
			||||||
      injectData: {
 | 
					 | 
				
			||||||
        appName: viteEnv.VITE_APP_NAME,
 | 
					 | 
				
			||||||
        appTitle: viteEnv.VITE_APP_TITLE
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  ];
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,11 +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({
 | 
					 | 
				
			||||||
    dts: false,
 | 
					 | 
				
			||||||
    resolvers: [IconsResolver({ componentPrefix: 'icon' })]
 | 
					 | 
				
			||||||
  }),
 | 
					 | 
				
			||||||
  Icons({ scale: 1, defaultClass: 'inline-block' })
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
@@ -1,16 +1,42 @@
 | 
				
			|||||||
import type { ConfigEnv, PluginOption } from 'vite';
 | 
					import type { PluginOption } from 'vite';
 | 
				
			||||||
import vue from './vue';
 | 
					import vue from '@vitejs/plugin-vue';
 | 
				
			||||||
import html from './html';
 | 
					import vueJsx from '@vitejs/plugin-vue-jsx';
 | 
				
			||||||
import iconify from './iconify';
 | 
					import unocss from '@unocss/vite';
 | 
				
			||||||
import windicss from './windicss';
 | 
					import progress from 'vite-plugin-progress';
 | 
				
			||||||
 | 
					import pageRoute from '@soybeanjs/vite-plugin-vue-page-route';
 | 
				
			||||||
 | 
					import unplugin from './unplugin';
 | 
				
			||||||
import mock from './mock';
 | 
					import mock from './mock';
 | 
				
			||||||
import visualizer from './visualizer';
 | 
					import visualizer from './visualizer';
 | 
				
			||||||
 | 
					import compress from './compress';
 | 
				
			||||||
 | 
					import pwa from './pwa';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function setupVitePlugins(configEnv: ConfigEnv): (PluginOption | PluginOption[])[] {
 | 
					/**
 | 
				
			||||||
  const plugins = [vue, ...html(configEnv), ...iconify, windicss, mock];
 | 
					 * vite插件
 | 
				
			||||||
 | 
					 * @param viteEnv - 环境变量配置
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function setupVitePlugins(viteEnv: ImportMetaEnv): (PluginOption | PluginOption[])[] {
 | 
				
			||||||
 | 
					  const plugins = [
 | 
				
			||||||
 | 
					    vue({
 | 
				
			||||||
 | 
					      script: {
 | 
				
			||||||
 | 
					        defineModel: true
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }),
 | 
				
			||||||
 | 
					    vueJsx(),
 | 
				
			||||||
 | 
					    ...unplugin(viteEnv),
 | 
				
			||||||
 | 
					    unocss(),
 | 
				
			||||||
 | 
					    mock(viteEnv),
 | 
				
			||||||
 | 
					    progress(),
 | 
				
			||||||
 | 
					    pageRoute()
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (configEnv.command === 'build') {
 | 
					  if (viteEnv.VITE_VISUALIZER === 'Y') {
 | 
				
			||||||
    plugins.push(visualizer);
 | 
					    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());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return plugins;
 | 
					  return plugins;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,14 @@
 | 
				
			|||||||
import { viteMockServe } from 'vite-plugin-mock';
 | 
					import { viteMockServe } from 'vite-plugin-mock';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default viteMockServe({
 | 
					export default (viteEnv: ImportMetaEnv) => {
 | 
				
			||||||
 | 
					  const prodMock = viteEnv.VITE_PROD_MOCK === 'Y';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return viteMockServe({
 | 
				
			||||||
    mockPath: 'mock',
 | 
					    mockPath: 'mock',
 | 
				
			||||||
 | 
					    prodEnabled: prodMock,
 | 
				
			||||||
    injectCode: `
 | 
					    injectCode: `
 | 
				
			||||||
			import { setupMockServer } from '../mock';
 | 
								import { setupMockServer } from '../mock';
 | 
				
			||||||
			setupMockServer();
 | 
								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_PREFFIX, VITE_ICON_LOCAL_PREFFIX } = viteEnv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const srcPath = getSrcPath();
 | 
				
			||||||
 | 
					  const localIconPath = `${srcPath}/assets/svg-icon`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** 本地svg图标集合名称 */
 | 
				
			||||||
 | 
					  const collectionName = VITE_ICON_LOCAL_PREFFIX.replace(`${VITE_ICON_PREFFIX}-`, '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  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_PREFFIX })
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }),
 | 
				
			||||||
 | 
					    createSvgIconsPlugin({
 | 
				
			||||||
 | 
					      iconDirs: [localIconPath],
 | 
				
			||||||
 | 
					      symbolId: `${VITE_ICON_LOCAL_PREFFIX}-[dir]-[name]`,
 | 
				
			||||||
 | 
					      inject: 'body-last',
 | 
				
			||||||
 | 
					      customDomId: '__SVG_ICON_LOCAL__'
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,5 +2,6 @@ import { visualizer } from 'rollup-plugin-visualizer';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export default visualizer({
 | 
					export default visualizer({
 | 
				
			||||||
  gzipSize: 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}`;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								changelogithub.config.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "types": {
 | 
				
			||||||
 | 
					    "feat": { "title": "🚀 Features" },
 | 
				
			||||||
 | 
					    "perf": { "title": "🔥 Performance" },
 | 
				
			||||||
 | 
					    "fix": { "title": "🩹 Fixes" },
 | 
				
			||||||
 | 
					    "refactor": { "title": "💅 Refactors" },
 | 
				
			||||||
 | 
					    "docs": { "title": "📖 Documentation" },
 | 
				
			||||||
 | 
					    "types": { "title": "🌊 Types" },
 | 
				
			||||||
 | 
					    "chore": { "title": "🏡 Chore" },
 | 
				
			||||||
 | 
					    "test": { "title": "🧪 Tests" },
 | 
				
			||||||
 | 
					    "style": { "title": "🎨 Styles" },
 | 
				
			||||||
 | 
					    "ci": { "title": "🤖 CI" }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "scopeMap": {},
 | 
				
			||||||
 | 
					  "titles": {
 | 
				
			||||||
 | 
					    "breakingChanges": "🚨 Breaking Changes"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "contributors": true,
 | 
				
			||||||
 | 
					  "capitalize": true,
 | 
				
			||||||
 | 
					  "group": true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
module.exports = { extends: ['@commitlint/config-conventional'] };
 | 
					 | 
				
			||||||
							
								
								
									
										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;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										23
									
								
								index.html
									
									
									
									
									
								
							
							
						
						@@ -1,29 +1,14 @@
 | 
				
			|||||||
<!DOCTYPE html>
 | 
					<!DOCTYPE html>
 | 
				
			||||||
<html lang="en">
 | 
					<html lang="zh-cmn-Hans">
 | 
				
			||||||
	<head>
 | 
						<head>
 | 
				
			||||||
		<meta charset="UTF-8" />
 | 
							<meta charset="UTF-8" />
 | 
				
			||||||
    <link rel="icon" href="/favicon.ico" />
 | 
							<link rel="icon" href="/favicon.svg" />
 | 
				
			||||||
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
							<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
				
			||||||
    <title><%= appName %></title>
 | 
							<title>%VITE_APP_NAME%</title>
 | 
				
			||||||
	</head>
 | 
						</head>
 | 
				
			||||||
	<body>
 | 
						<body>
 | 
				
			||||||
		<div id="app">
 | 
							<div id="app">
 | 
				
			||||||
      <div class="loading-container">
 | 
								<div id="appLoading"></div>
 | 
				
			||||||
        <div id="loadingLogo" class="loading-svg"></div>
 | 
					 | 
				
			||||||
        <div class="loading-spin__container">
 | 
					 | 
				
			||||||
          <div class="loading-spin">
 | 
					 | 
				
			||||||
            <div class="left-0 top-0 loading-spin-item"></div>
 | 
					 | 
				
			||||||
            <div class="left-0 bottom-0 loading-spin-item loading-delay-500"></div>
 | 
					 | 
				
			||||||
            <div class="right-0 top-0 loading-spin-item loading-delay-1000"></div>
 | 
					 | 
				
			||||||
            <div class="right-0 bottom-0 loading-spin-item loading-delay-1500"></div>
 | 
					 | 
				
			||||||
          </div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
        <h2 class="loading-title"><%= appTitle %></h2>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
      <style>
 | 
					 | 
				
			||||||
        @import '/resource/loading.css';
 | 
					 | 
				
			||||||
      </style>
 | 
					 | 
				
			||||||
      <script src="/resource/loading.js"></script>
 | 
					 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
		<script type="module" src="/src/main.ts"></script>
 | 
							<script type="module" src="/src/main.ts"></script>
 | 
				
			||||||
	</body>
 | 
						</body>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										121
									
								
								mock/api/auth.ts
									
									
									
									
									
								
							
							
						
						@@ -1,9 +1,10 @@
 | 
				
			|||||||
import type { MockMethod } from 'vite-plugin-mock';
 | 
					import type { MockMethod } from 'vite-plugin-mock';
 | 
				
			||||||
 | 
					import { userModel } from '../model';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const token: ApiAuth.Token = {
 | 
					/** 参数错误的状态码 */
 | 
				
			||||||
  token: '__TEMP_TOKEN__',
 | 
					const ERROR_PARAM_CODE = 10000;
 | 
				
			||||||
  refreshToken: '__TEMP_REFRESH_TOKEN__'
 | 
					
 | 
				
			||||||
};
 | 
					const ERROR_PARAM_MSG = '参数校验失败!';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const apis: MockMethod[] = [
 | 
					const apis: MockMethod[] = [
 | 
				
			||||||
  // 获取验证码
 | 
					  // 获取验证码
 | 
				
			||||||
@@ -18,73 +19,107 @@ const apis: MockMethod[] = [
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  // 密码登录
 | 
					  // 用户+密码 登录
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    url: '/mock/loginByPwd',
 | 
					    url: '/mock/login',
 | 
				
			||||||
    method: 'post',
 | 
					    method: 'post',
 | 
				
			||||||
    response: (): Service.MockServiceResult<ApiAuth.Token> => {
 | 
					    response: (options: Service.MockOption): Service.MockServiceResult<ApiAuth.Token | null> => {
 | 
				
			||||||
 | 
					      const { userName = undefined, password = undefined } = options.body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!userName || !password) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
        code: 200,
 | 
					          code: ERROR_PARAM_CODE,
 | 
				
			||||||
        message: 'ok',
 | 
					          message: ERROR_PARAM_MSG,
 | 
				
			||||||
        data: token
 | 
					          data: null
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
  },
 | 
					
 | 
				
			||||||
  // 验证码登录
 | 
					      const findItem = userModel.find(item => item.userName === userName && item.password === password);
 | 
				
			||||||
  {
 | 
					
 | 
				
			||||||
    url: '/mock/loginByCode',
 | 
					      if (findItem) {
 | 
				
			||||||
    method: 'post',
 | 
					 | 
				
			||||||
    response: (): Service.MockServiceResult<ApiAuth.Token> => {
 | 
					 | 
				
			||||||
      return {
 | 
					 | 
				
			||||||
        code: 200,
 | 
					 | 
				
			||||||
        message: 'ok',
 | 
					 | 
				
			||||||
        data: token
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  // 获取用户信息(请求头携带token)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    url: '/mock/getUserInfo',
 | 
					 | 
				
			||||||
    method: 'get',
 | 
					 | 
				
			||||||
    response: (): Service.MockServiceResult<ApiAuth.UserInfo> => {
 | 
					 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
          code: 200,
 | 
					          code: 200,
 | 
				
			||||||
          message: 'ok',
 | 
					          message: 'ok',
 | 
				
			||||||
          data: {
 | 
					          data: {
 | 
				
			||||||
          userId: '0',
 | 
					            token: findItem.token,
 | 
				
			||||||
          userName: 'Soybean',
 | 
					            refreshToken: findItem.refreshToken
 | 
				
			||||||
          userPhone: '15170283876',
 | 
					 | 
				
			||||||
          userRole: 'super'
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    url: '/mock/testToken',
 | 
					 | 
				
			||||||
    method: 'post',
 | 
					 | 
				
			||||||
    response: (option: any): Service.MockServiceResult<true | null> => {
 | 
					 | 
				
			||||||
      if (option.headers?.authorization !== token.token) {
 | 
					 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
          code: 66666,
 | 
					        code: 1000,
 | 
				
			||||||
          message: 'token 失效',
 | 
					        message: '用户名或密码错误!',
 | 
				
			||||||
        data: null
 | 
					        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 {
 | 
					        return {
 | 
				
			||||||
          code: 200,
 | 
					          code: 200,
 | 
				
			||||||
          message: 'ok',
 | 
					          message: 'ok',
 | 
				
			||||||
        data: true
 | 
					          data: userInfo
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        code: REFRESH_TOKEN_CODE,
 | 
				
			||||||
 | 
					        message: '用户信息异常!',
 | 
				
			||||||
 | 
					        data: null
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    url: '/mock/updateToken',
 | 
					    url: '/mock/updateToken',
 | 
				
			||||||
    method: 'post',
 | 
					    method: 'post',
 | 
				
			||||||
    response: (): Service.MockServiceResult<string> => {
 | 
					    response: (options: Service.MockOption): Service.MockServiceResult<ApiAuth.Token | null> => {
 | 
				
			||||||
 | 
					      const { refreshToken = '' } = options.body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const findItem = userModel.find(item => item.refreshToken === refreshToken);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (findItem) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
          code: 200,
 | 
					          code: 200,
 | 
				
			||||||
          message: 'ok',
 | 
					          message: 'ok',
 | 
				
			||||||
        data: token.token
 | 
					          data: {
 | 
				
			||||||
 | 
					            token: findItem.token,
 | 
				
			||||||
 | 
					            refreshToken: findItem.refreshToken
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        code: 3000,
 | 
				
			||||||
 | 
					        message: '用户已失效或不存在!',
 | 
				
			||||||
 | 
					        data: null
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										295
									
								
								mock/api/crud/base.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,295 @@
 | 
				
			|||||||
 | 
					export type ListItem = {
 | 
				
			||||||
 | 
					  id?: number;
 | 
				
			||||||
 | 
					  children?: ListItem[];
 | 
				
			||||||
 | 
					  [key: string]: any;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export type BaseMockOptions = { name: string; copyTimes?: number; list: ListItem[]; idGenerator: number };
 | 
				
			||||||
 | 
					type CopyListParams = { originList: ListItem[]; newList: ListItem[]; options: BaseMockOptions; parentId?: number };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function copyList(props: CopyListParams) {
 | 
				
			||||||
 | 
					  const { originList, newList, options, parentId } = props;
 | 
				
			||||||
 | 
					  for (const item of originList) {
 | 
				
			||||||
 | 
					    const newItem: ListItem = { ...item, parentId };
 | 
				
			||||||
 | 
					    newItem.id = options.idGenerator;
 | 
				
			||||||
 | 
					    options.idGenerator += 1;
 | 
				
			||||||
 | 
					    newList.push(newItem);
 | 
				
			||||||
 | 
					    if (item.children) {
 | 
				
			||||||
 | 
					      newItem.children = [];
 | 
				
			||||||
 | 
					      copyList({
 | 
				
			||||||
 | 
					        originList: item.children,
 | 
				
			||||||
 | 
					        newList: newItem.children,
 | 
				
			||||||
 | 
					        options,
 | 
				
			||||||
 | 
					        parentId: newItem.id
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function delById(req: Service.MockOption, list: any[]) {
 | 
				
			||||||
 | 
					  for (let i = 0; i < list.length; i += 1) {
 | 
				
			||||||
 | 
					    const item = list[i];
 | 
				
			||||||
 | 
					    if (item.id === parseInt(req.query.id, 10)) {
 | 
				
			||||||
 | 
					      list.splice(i, 1);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (item.children && item.children.length > 0) {
 | 
				
			||||||
 | 
					      delById(req, item.children);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function findById(id: number, list: ListItem[]): any {
 | 
				
			||||||
 | 
					  for (const item of list) {
 | 
				
			||||||
 | 
					    if (item.id === id) {
 | 
				
			||||||
 | 
					      return item;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (item.children && item.children.length > 0) {
 | 
				
			||||||
 | 
					      const sub = findById(id, item.children);
 | 
				
			||||||
 | 
					      if (sub !== null && sub !== undefined) {
 | 
				
			||||||
 | 
					        return sub;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return null;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function matchWithArrayCondition(value: any[], item: ListItem, key: string) {
 | 
				
			||||||
 | 
					  if (value.length === 0) {
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  let matched = false;
 | 
				
			||||||
 | 
					  for (const i of value) {
 | 
				
			||||||
 | 
					    if (item[key] instanceof Array) {
 | 
				
			||||||
 | 
					      for (const j of item[key]) {
 | 
				
			||||||
 | 
					        if (i === j) {
 | 
				
			||||||
 | 
					          matched = true;
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (matched) {
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } else if (item[key] === i || (typeof item[key] === 'string' && item[key].indexOf(`${i}`) >= 0)) {
 | 
				
			||||||
 | 
					      matched = true;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (matched) {
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return matched;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function matchWithObjectCondition(value: any, item: ListItem, key: string) {
 | 
				
			||||||
 | 
					  let matched = true;
 | 
				
			||||||
 | 
					  for (const key2 of Object.keys(value)) {
 | 
				
			||||||
 | 
					    const v = value[key2];
 | 
				
			||||||
 | 
					    if (v && item[key] && v !== item[key][key2]) {
 | 
				
			||||||
 | 
					      matched = false;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return matched;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function searchFromList(list: ListItem[], query: any) {
 | 
				
			||||||
 | 
					  const filter = (item: ListItem) => {
 | 
				
			||||||
 | 
					    let allFound = true; // 是否所有条件都符合
 | 
				
			||||||
 | 
					    for (const key of Object.keys(query)) {
 | 
				
			||||||
 | 
					      const value = query[key];
 | 
				
			||||||
 | 
					      if (value === undefined || value === null || value === '') {
 | 
				
			||||||
 | 
					        // no nothing
 | 
				
			||||||
 | 
					      } else if (value instanceof Array) {
 | 
				
			||||||
 | 
					        // 如果条件中的value是数组的话,只要查到一个就行
 | 
				
			||||||
 | 
					        const matched = matchWithArrayCondition(value, item, key);
 | 
				
			||||||
 | 
					        if (!matched) {
 | 
				
			||||||
 | 
					          allFound = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else if (value instanceof Object) {
 | 
				
			||||||
 | 
					        // 如果条件中的value是对象的话,需要每个key都匹配
 | 
				
			||||||
 | 
					        const matched = matchWithObjectCondition(value, item, key);
 | 
				
			||||||
 | 
					        if (!matched) {
 | 
				
			||||||
 | 
					          allFound = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else if (item[key] !== value) {
 | 
				
			||||||
 | 
					        allFound = false;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return allFound;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  return list.filter(filter);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  buildMock(options: BaseMockOptions) {
 | 
				
			||||||
 | 
					    const name = options.name;
 | 
				
			||||||
 | 
					    if (!options.copyTimes) {
 | 
				
			||||||
 | 
					      options.copyTimes = 29;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const list: any[] = [];
 | 
				
			||||||
 | 
					    for (let i = 0; i < options.copyTimes; i += 1) {
 | 
				
			||||||
 | 
					      copyList({
 | 
				
			||||||
 | 
					        originList: options.list,
 | 
				
			||||||
 | 
					        newList: list,
 | 
				
			||||||
 | 
					        options
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    options.list = list;
 | 
				
			||||||
 | 
					    return [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        path: `/mock/${name}/page`,
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        handle(req: Service.MockOption) {
 | 
				
			||||||
 | 
					          let data = [...list];
 | 
				
			||||||
 | 
					          let limit = 20;
 | 
				
			||||||
 | 
					          let offset = 0;
 | 
				
			||||||
 | 
					          for (const item of list) {
 | 
				
			||||||
 | 
					            if (item.children && item.children.length === 0) {
 | 
				
			||||||
 | 
					              item.hasChildren = false;
 | 
				
			||||||
 | 
					              item.lazy = false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          let orderAsc: any;
 | 
				
			||||||
 | 
					          let orderProp: any;
 | 
				
			||||||
 | 
					          if (req && req.body) {
 | 
				
			||||||
 | 
					            const { page, query } = req.body;
 | 
				
			||||||
 | 
					            if (page.limit) {
 | 
				
			||||||
 | 
					              limit = parseInt(page.limit, 10);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (page.offset) {
 | 
				
			||||||
 | 
					              offset = parseInt(page.offset, 10);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (Object.keys(query).length > 0) {
 | 
				
			||||||
 | 
					              data = searchFromList(list, query);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          const start = offset;
 | 
				
			||||||
 | 
					          let end = offset + limit;
 | 
				
			||||||
 | 
					          if (data.length < end) {
 | 
				
			||||||
 | 
					            end = data.length;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (orderProp) {
 | 
				
			||||||
 | 
					            // 排序
 | 
				
			||||||
 | 
					            data.sort((a, b) => {
 | 
				
			||||||
 | 
					              let ret = 0;
 | 
				
			||||||
 | 
					              if (a[orderProp] > b[orderProp]) {
 | 
				
			||||||
 | 
					                ret = 1;
 | 
				
			||||||
 | 
					              } else if (a[orderProp] < b[orderProp]) {
 | 
				
			||||||
 | 
					                ret = -1;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              return orderAsc ? ret : -ret;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          const records = data.slice(start, end);
 | 
				
			||||||
 | 
					          const lastOffset = data.length - (data.length % limit);
 | 
				
			||||||
 | 
					          if (offset > lastOffset) {
 | 
				
			||||||
 | 
					            offset = lastOffset;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            code: 200,
 | 
				
			||||||
 | 
					            message: 'success',
 | 
				
			||||||
 | 
					            data: {
 | 
				
			||||||
 | 
					              records,
 | 
				
			||||||
 | 
					              total: data.length,
 | 
				
			||||||
 | 
					              limit,
 | 
				
			||||||
 | 
					              offset
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        path: `/mock/${name}/get`,
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        handle(req: Service.MockOption) {
 | 
				
			||||||
 | 
					          let id = req.query.id;
 | 
				
			||||||
 | 
					          id = parseInt(id, 10);
 | 
				
			||||||
 | 
					          let current = null;
 | 
				
			||||||
 | 
					          for (const item of list) {
 | 
				
			||||||
 | 
					            if (item.id === id) {
 | 
				
			||||||
 | 
					              current = item;
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            code: 200,
 | 
				
			||||||
 | 
					            message: 'success',
 | 
				
			||||||
 | 
					            data: current
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        path: `/mock/${name}/add`,
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        handle(req: Service.MockOption) {
 | 
				
			||||||
 | 
					          req.body.id = options.idGenerator;
 | 
				
			||||||
 | 
					          options.idGenerator += 1;
 | 
				
			||||||
 | 
					          list.unshift(req.body);
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            code: 200,
 | 
				
			||||||
 | 
					            message: 'success',
 | 
				
			||||||
 | 
					            data: req.body.id
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        path: `/mock/${name}/update`,
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        handle(req: Service.MockOption) {
 | 
				
			||||||
 | 
					          const item = findById(req.body.id, list);
 | 
				
			||||||
 | 
					          if (item) {
 | 
				
			||||||
 | 
					            Object.assign(item, req.body);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            code: 200,
 | 
				
			||||||
 | 
					            message: 'success',
 | 
				
			||||||
 | 
					            data: null
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        path: `/mock/${name}/delete`,
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        handle(req: Service.MockOption) {
 | 
				
			||||||
 | 
					          delById(req, list);
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            code: 200,
 | 
				
			||||||
 | 
					            message: 'success',
 | 
				
			||||||
 | 
					            data: null
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        path: `/mock/${name}/batchDelete`,
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        handle(req: Service.MockOption) {
 | 
				
			||||||
 | 
					          const ids = req.body.ids;
 | 
				
			||||||
 | 
					          for (let i = list.length - 1; i >= 0; i -= 1) {
 | 
				
			||||||
 | 
					            const item = list[i];
 | 
				
			||||||
 | 
					            if (ids.indexOf(item.id) >= 0) {
 | 
				
			||||||
 | 
					              list.splice(i, 1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            code: 200,
 | 
				
			||||||
 | 
					            message: 'success',
 | 
				
			||||||
 | 
					            data: null
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        path: `/mock/${name}/all`,
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        handle() {
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            code: 200,
 | 
				
			||||||
 | 
					            message: 'success',
 | 
				
			||||||
 | 
					            data: list
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										5
									
								
								mock/api/crud/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					import demo from './modules/demo';
 | 
				
			||||||
 | 
					import headerGroup from './modules/header-group';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const crudApis = [...demo, ...headerGroup];
 | 
				
			||||||
 | 
					export default crudApis;
 | 
				
			||||||
							
								
								
									
										56
									
								
								mock/api/crud/modules/demo.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,56 @@
 | 
				
			|||||||
 | 
					import type { MethodType, MockMethod } from 'vite-plugin-mock';
 | 
				
			||||||
 | 
					import type { BaseMockOptions } from '../base';
 | 
				
			||||||
 | 
					import mockBase from '../base';
 | 
				
			||||||
 | 
					import MockOption = Service.MockOption;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const options: BaseMockOptions = {
 | 
				
			||||||
 | 
					  name: 'crud/demo',
 | 
				
			||||||
 | 
					  idGenerator: 0,
 | 
				
			||||||
 | 
					  list: [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      select: '1',
 | 
				
			||||||
 | 
					      text: '文本测试',
 | 
				
			||||||
 | 
					      copyable: '文本可复制',
 | 
				
			||||||
 | 
					      avatar: 'http://greper.handsfree.work/extends/avatar.jpg',
 | 
				
			||||||
 | 
					      richtext: '富文本',
 | 
				
			||||||
 | 
					      datetime: '2023-01-30 11:11:11'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      select: '2'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      select: '0'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					const mockedApis = mockBase.buildMock(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const apis: MockMethod[] = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    url: `/mock/${options.name}/dict`,
 | 
				
			||||||
 | 
					    method: 'get',
 | 
				
			||||||
 | 
					    response: () => {
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        code: 200,
 | 
				
			||||||
 | 
					        message: '',
 | 
				
			||||||
 | 
					        data: [
 | 
				
			||||||
 | 
					          { value: '0', label: '关', color: 'warning' },
 | 
				
			||||||
 | 
					          { value: '1', label: '开', color: 'success' },
 | 
				
			||||||
 | 
					          { value: '2', label: '停' }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for (const mockedApi of mockedApis) {
 | 
				
			||||||
 | 
					  apis.push({
 | 
				
			||||||
 | 
					    url: mockedApi.path,
 | 
				
			||||||
 | 
					    method: mockedApi.method as MethodType,
 | 
				
			||||||
 | 
					    response: (request: MockOption) => {
 | 
				
			||||||
 | 
					      return mockedApi.handle(request);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default apis;
 | 
				
			||||||
							
								
								
									
										46
									
								
								mock/api/crud/modules/header-group.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					import type { MethodType, MockMethod } from 'vite-plugin-mock';
 | 
				
			||||||
 | 
					import type { BaseMockOptions } from '../base';
 | 
				
			||||||
 | 
					import mockBase from '../base';
 | 
				
			||||||
 | 
					import MockOption = Service.MockOption;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const options: BaseMockOptions = {
 | 
				
			||||||
 | 
					  name: 'crud/header-group',
 | 
				
			||||||
 | 
					  idGenerator: 0,
 | 
				
			||||||
 | 
					  list: [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      name: '张三',
 | 
				
			||||||
 | 
					      age: 18,
 | 
				
			||||||
 | 
					      province: '广东省',
 | 
				
			||||||
 | 
					      city: '深圳市',
 | 
				
			||||||
 | 
					      county: '南山区',
 | 
				
			||||||
 | 
					      street: '粤海街道'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      name: '李四',
 | 
				
			||||||
 | 
					      age: 26,
 | 
				
			||||||
 | 
					      province: '浙江省',
 | 
				
			||||||
 | 
					      city: '杭州市',
 | 
				
			||||||
 | 
					      county: '西湖区',
 | 
				
			||||||
 | 
					      street: '西湖街道'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      name: '王五',
 | 
				
			||||||
 | 
					      age: 24
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					const mockedApis = mockBase.buildMock(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const apis: MockMethod[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for (const mockedApi of mockedApis) {
 | 
				
			||||||
 | 
					  apis.push({
 | 
				
			||||||
 | 
					    url: mockedApi.path,
 | 
				
			||||||
 | 
					    method: mockedApi.method as MethodType,
 | 
				
			||||||
 | 
					    response: (request: MockOption) => {
 | 
				
			||||||
 | 
					      return mockedApi.handle(request);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default apis;
 | 
				
			||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
import auth from './auth';
 | 
					import auth from './auth';
 | 
				
			||||||
import route from './route';
 | 
					import route from './route';
 | 
				
			||||||
 | 
					import management from './management';
 | 
				
			||||||
 | 
					import crud from './crud';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default [...auth, ...route];
 | 
					export default [...auth, ...route, ...management, ...crud];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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;
 | 
				
			||||||
@@ -1,352 +1,26 @@
 | 
				
			|||||||
import type { MockMethod } from 'vite-plugin-mock';
 | 
					import type { MockMethod } from 'vite-plugin-mock';
 | 
				
			||||||
 | 
					import { routeModel, userModel } from '../model';
 | 
				
			||||||
const routes: AuthRoute.Route[] = [
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    name: 'dashboard',
 | 
					 | 
				
			||||||
    path: '/dashboard',
 | 
					 | 
				
			||||||
    component: 'basic',
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'dashboard_analysis',
 | 
					 | 
				
			||||||
        path: '/dashboard/analysis',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '分析页',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'dashboard_workbench',
 | 
					 | 
				
			||||||
        path: '/dashboard/workbench',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '工作台',
 | 
					 | 
				
			||||||
          requiresAuth: true,
 | 
					 | 
				
			||||||
          permissions: ['super', 'admin']
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      title: '仪表盘',
 | 
					 | 
				
			||||||
      icon: 'carbon:dashboard',
 | 
					 | 
				
			||||||
      order: 1
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    name: 'document',
 | 
					 | 
				
			||||||
    path: '/document',
 | 
					 | 
				
			||||||
    component: 'basic',
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'document_vue',
 | 
					 | 
				
			||||||
        path: '/document/vue',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: 'vue文档',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'document_vue-new',
 | 
					 | 
				
			||||||
        path: '/document/vue-new',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: 'vue文档(新版)',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'document_vite',
 | 
					 | 
				
			||||||
        path: '/document/vite',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: 'vite文档',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'document_naive',
 | 
					 | 
				
			||||||
        path: '/document/naive',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: 'naive文档',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'document_project',
 | 
					 | 
				
			||||||
        path: '/document/project',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '项目文档(外链)',
 | 
					 | 
				
			||||||
          requiresAuth: true,
 | 
					 | 
				
			||||||
          href: 'https://docs.soybean.pro/'
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      title: '文档',
 | 
					 | 
				
			||||||
      icon: 'carbon:document',
 | 
					 | 
				
			||||||
      order: 2
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    name: 'component',
 | 
					 | 
				
			||||||
    path: '/component',
 | 
					 | 
				
			||||||
    component: 'basic',
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'component_button',
 | 
					 | 
				
			||||||
        path: '/component/button',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '按钮',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'component_card',
 | 
					 | 
				
			||||||
        path: '/component/card',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '卡片',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'component_table',
 | 
					 | 
				
			||||||
        path: '/component/table',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '表格',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      title: '组件示例',
 | 
					 | 
				
			||||||
      icon: 'fluent:app-store-24-regular',
 | 
					 | 
				
			||||||
      order: 3
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    name: 'plugin',
 | 
					 | 
				
			||||||
    path: '/plugin',
 | 
					 | 
				
			||||||
    component: 'basic',
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'plugin_map',
 | 
					 | 
				
			||||||
        path: '/plugin/map',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '地图',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'plugin_video',
 | 
					 | 
				
			||||||
        path: '/plugin/video',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '视频',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'plugin_editor',
 | 
					 | 
				
			||||||
        path: '/plugin/editor',
 | 
					 | 
				
			||||||
        component: 'multi',
 | 
					 | 
				
			||||||
        children: [
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: 'plugin_editor_quill',
 | 
					 | 
				
			||||||
            path: '/plugin/editor/quill',
 | 
					 | 
				
			||||||
            component: 'self',
 | 
					 | 
				
			||||||
            meta: {
 | 
					 | 
				
			||||||
              title: '富文本编辑器'
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: 'plugin_editor_markdown',
 | 
					 | 
				
			||||||
            path: '/plugin/editor/markdown',
 | 
					 | 
				
			||||||
            component: 'self',
 | 
					 | 
				
			||||||
            meta: {
 | 
					 | 
				
			||||||
              title: 'markdown编辑器'
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '编辑器',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'plugin_swiper',
 | 
					 | 
				
			||||||
        path: '/plugin/swiper',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: 'Swiper插件',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'plugin_copy',
 | 
					 | 
				
			||||||
        path: '/plugin/copy',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '剪贴板',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'plugin_icon',
 | 
					 | 
				
			||||||
        path: '/plugin/icon',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '图标',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'plugin_print',
 | 
					 | 
				
			||||||
        path: '/plugin/print',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '打印',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      title: '插件示例',
 | 
					 | 
				
			||||||
      icon: 'clarity:plugin-line',
 | 
					 | 
				
			||||||
      order: 4
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    name: 'exception',
 | 
					 | 
				
			||||||
    path: '/exception',
 | 
					 | 
				
			||||||
    component: 'basic',
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'exception_403',
 | 
					 | 
				
			||||||
        path: '/exception/403',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '异常页403',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'exception_404',
 | 
					 | 
				
			||||||
        path: '/exception/404',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '异常页404',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'exception_500',
 | 
					 | 
				
			||||||
        path: '/exception/500',
 | 
					 | 
				
			||||||
        component: 'self',
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '异常页500',
 | 
					 | 
				
			||||||
          requiresAuth: true
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      title: '异常页',
 | 
					 | 
				
			||||||
      icon: 'ant-design:exception-outlined',
 | 
					 | 
				
			||||||
      order: 5
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    name: 'multi-menu',
 | 
					 | 
				
			||||||
    path: '/multi-menu',
 | 
					 | 
				
			||||||
    component: 'basic',
 | 
					 | 
				
			||||||
    children: [
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        name: 'multi-menu_first',
 | 
					 | 
				
			||||||
        path: '/multi-menu/first',
 | 
					 | 
				
			||||||
        component: 'multi',
 | 
					 | 
				
			||||||
        children: [
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: 'multi-menu_first_second',
 | 
					 | 
				
			||||||
            path: '/multi-menu/first/second',
 | 
					 | 
				
			||||||
            component: 'self',
 | 
					 | 
				
			||||||
            meta: {
 | 
					 | 
				
			||||||
              title: '二级菜单',
 | 
					 | 
				
			||||||
              requiresAuth: true
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name: 'multi-menu_first_second-new',
 | 
					 | 
				
			||||||
            path: '/multi-menu/first/second-new',
 | 
					 | 
				
			||||||
            component: 'multi',
 | 
					 | 
				
			||||||
            children: [
 | 
					 | 
				
			||||||
              {
 | 
					 | 
				
			||||||
                name: 'multi-menu_first_second-new_third',
 | 
					 | 
				
			||||||
                path: '/multi-menu/first/second-new/third',
 | 
					 | 
				
			||||||
                component: 'self',
 | 
					 | 
				
			||||||
                meta: {
 | 
					 | 
				
			||||||
                  title: '三级菜单',
 | 
					 | 
				
			||||||
                  requiresAuth: true
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
            meta: {
 | 
					 | 
				
			||||||
              title: '二级菜单(有子菜单)'
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
        meta: {
 | 
					 | 
				
			||||||
          title: '一级菜单'
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      title: '多级菜单',
 | 
					 | 
				
			||||||
      icon: 'carbon:menu',
 | 
					 | 
				
			||||||
      order: 6
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    name: 'about',
 | 
					 | 
				
			||||||
    path: '/about',
 | 
					 | 
				
			||||||
    component: 'self',
 | 
					 | 
				
			||||||
    meta: {
 | 
					 | 
				
			||||||
      title: '关于',
 | 
					 | 
				
			||||||
      requiresAuth: true,
 | 
					 | 
				
			||||||
      singleLayout: 'basic',
 | 
					 | 
				
			||||||
      permissions: ['super', 'admin', 'test'],
 | 
					 | 
				
			||||||
      icon: 'fluent:book-information-24-regular',
 | 
					 | 
				
			||||||
      order: 7
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function dataMiddleware(data: AuthRoute.Route[]): ApiRoute.Route {
 | 
					 | 
				
			||||||
  const routeHomeName: AuthRoute.RouteKey = 'dashboard_analysis';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  function sortRoutes(sorts: AuthRoute.Route[]) {
 | 
					 | 
				
			||||||
    return sorts.sort((next, pre) => Number(next.meta?.order) - Number(pre.meta?.order));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return {
 | 
					 | 
				
			||||||
    routes: sortRoutes(data),
 | 
					 | 
				
			||||||
    home: routeHomeName
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const apis: MockMethod[] = [
 | 
					const apis: MockMethod[] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    url: '/mock/getUserRoutes',
 | 
					    url: '/mock/getUserRoutes',
 | 
				
			||||||
    method: 'post',
 | 
					    method: 'post',
 | 
				
			||||||
    response: (): Service.MockServiceResult => {
 | 
					    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 {
 | 
					      return {
 | 
				
			||||||
        code: 200,
 | 
					        code: 200,
 | 
				
			||||||
        message: 'ok',
 | 
					        message: 'ok',
 | 
				
			||||||
        data: dataMiddleware(routes)
 | 
					        data: {
 | 
				
			||||||
 | 
					          routes: filterRoutes,
 | 
				
			||||||
 | 
					          home: routeHomeName
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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';
 | 
				
			||||||
							
								
								
									
										1126
									
								
								mock/model/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										199
									
								
								package.json
									
									
									
									
									
								
							
							
						
						@@ -1,92 +1,141 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "soybean-admin",
 | 
					  "name": "soybean-admin",
 | 
				
			||||||
  "version": "0.9.1",
 | 
					  "version": "0.9.9",
 | 
				
			||||||
 | 
					  "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"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "license": "MIT",
 | 
				
			||||||
 | 
					  "homepage": "https://github.com/honghuangdc/soybean-admin",
 | 
				
			||||||
 | 
					  "repository": {
 | 
				
			||||||
 | 
					    "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": {
 | 
					  "scripts": {
 | 
				
			||||||
    "dev": "cross-env VITE_HTTP_ENV=test vite",
 | 
					    "dev": "cross-env VITE_SERVICE_ENV=dev vite",
 | 
				
			||||||
    "dev:prod": "cross-env VITE_HTTP_ENV=prod vite",
 | 
					    "dev:test": "cross-env VITE_SERVICE_ENV=test vite",
 | 
				
			||||||
    "typecheck": "vue-tsc",
 | 
					    "dev:prod": "cross-env VITE_SERVICE_ENV=prod vite",
 | 
				
			||||||
    "build": "npm run typecheck && cross-env VITE_HTTP_ENV=prod vite build",
 | 
					    "build": "npm run typecheck && cross-env VITE_SERVICE_ENV=prod vite build",
 | 
				
			||||||
    "build:test": "npm run typecheck && cross-env VITE_HTTP_ENV=test vite build",
 | 
					    "build:dev": "npm run typecheck && cross-env VITE_SERVICE_ENV=dev vite build",
 | 
				
			||||||
    "build:vercel": "npm run typecheck && cross-env VITE_HTTP_ENV=prod VITE_IS_VERCEL=1 vite build",
 | 
					    "build:test": "npm run typecheck && cross-env VITE_SERVICE_ENV=test vite build",
 | 
				
			||||||
    "preview": "vite preview --port 5050",
 | 
					    "build:vercel": "cross-env VITE_HASH_ROUTE=Y VITE_VERCEL=Y vite build",
 | 
				
			||||||
 | 
					    "preview": "vite preview",
 | 
				
			||||||
 | 
					    "typecheck": "vue-tsc --noEmit --skipLibCheck",
 | 
				
			||||||
 | 
					    "lint": "eslint . --fix --ext .js,.jsx,.mjs,.json,.ts,.tsx,.vue",
 | 
				
			||||||
 | 
					    "format": "soy prettier-format",
 | 
				
			||||||
 | 
					    "commit": "soy git-commit",
 | 
				
			||||||
 | 
					    "cleanup": "soy cleanup",
 | 
				
			||||||
 | 
					    "update-pkg": "soy update-pkg",
 | 
				
			||||||
 | 
					    "tsx": "tsx",
 | 
				
			||||||
 | 
					    "logo": "tsx ./scripts/logo.ts",
 | 
				
			||||||
 | 
					    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
 | 
				
			||||||
    "release": "standard-version",
 | 
					    "release": "standard-version",
 | 
				
			||||||
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md",
 | 
					    "prepare": "soy init-git-hooks"
 | 
				
			||||||
    "lint": "eslint --fix ./ --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": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@antv/g2plot": "^2.4.7",
 | 
					    "@ant-design/icons-vue": "^6.1.0",
 | 
				
			||||||
    "@better-scroll/core": "^2.4.2",
 | 
					    "@fast-crud/fast-crud": "^1.13.6",
 | 
				
			||||||
    "@vueuse/core": "^7.5.4",
 | 
					    "@fast-crud/fast-extends": "^1.13.6",
 | 
				
			||||||
    "axios": "^0.25.0",
 | 
					    "@fast-crud/ui-naive": "^1.13.6",
 | 
				
			||||||
    "clipboard": "^2.0.8",
 | 
					    "@fast-crud/ui-interface": "^1.13.6",
 | 
				
			||||||
    "colord": "^2.9.2",
 | 
					    "@antv/data-set": "^0.11.8",
 | 
				
			||||||
 | 
					    "@antv/g2": "^4.2.10",
 | 
				
			||||||
 | 
					    "@better-scroll/core": "^2.5.1",
 | 
				
			||||||
 | 
					    "@soybeanjs/vue-materials": "^0.1.9",
 | 
				
			||||||
 | 
					    "@vueuse/core": "^10.1.2",
 | 
				
			||||||
 | 
					    "axios": "1.4.0",
 | 
				
			||||||
 | 
					    "clipboard": "^2.0.11",
 | 
				
			||||||
 | 
					    "colord": "^2.9.3",
 | 
				
			||||||
    "crypto-js": "^4.1.1",
 | 
					    "crypto-js": "^4.1.1",
 | 
				
			||||||
    "dayjs": "^1.10.7",
 | 
					    "dayjs": "^1.11.7",
 | 
				
			||||||
 | 
					    "echarts": "^5.4.2",
 | 
				
			||||||
    "form-data": "^4.0.0",
 | 
					    "form-data": "^4.0.0",
 | 
				
			||||||
    "lodash-es": "^4.17.21",
 | 
					    "lodash-es": "^4.17.21",
 | 
				
			||||||
    "naive-ui": "^2.24.1",
 | 
					    "naive-ui": "2.34.4",
 | 
				
			||||||
    "pinia": "^2.0.9",
 | 
					    "pinia": "^2.1.3",
 | 
				
			||||||
    "print-js": "^1.6.0",
 | 
					    "print-js": "^1.6.0",
 | 
				
			||||||
    "qs": "^6.10.3",
 | 
					    "qs": "^6.11.2",
 | 
				
			||||||
    "swiper": "^7.4.1",
 | 
					    "swiper": "^9.3.2",
 | 
				
			||||||
    "vditor": "^3.8.11",
 | 
					    "ua-parser-js": "^1.0.35",
 | 
				
			||||||
    "vue": "^3.2.26",
 | 
					    "vditor": "^3.9.2",
 | 
				
			||||||
    "vue-router": "^4.0.12",
 | 
					    "vue": "3.3.4",
 | 
				
			||||||
    "wangeditor": "^4.7.11",
 | 
					    "vue-i18n": "^9.2.2",
 | 
				
			||||||
    "xgplayer": "^2.31.4"
 | 
					    "vue-router": "^4.2.1",
 | 
				
			||||||
 | 
					    "vuedraggable": "^4.1.0",
 | 
				
			||||||
 | 
					    "wangeditor": "^4.7.15",
 | 
				
			||||||
 | 
					    "xgplayer": "^3.0.2"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@amap/amap-jsapi-types": "^0.0.8",
 | 
					    "@amap/amap-jsapi-types": "^0.0.13",
 | 
				
			||||||
    "@commitlint/cli": "^16.1.0",
 | 
					    "@iconify/json": "^2.2.67",
 | 
				
			||||||
    "@commitlint/config-conventional": "^16.0.0",
 | 
					    "@iconify/vue": "^4.1.1",
 | 
				
			||||||
    "@iconify/json": "^1.1.459",
 | 
					    "@soybeanjs/cli": "^0.1.9",
 | 
				
			||||||
    "@iconify/vue": "^3.1.2",
 | 
					    "@soybeanjs/vite-plugin-vue-page-route": "^0.0.5",
 | 
				
			||||||
    "@types/bmapgl": "^0.0.5",
 | 
					    "@types/bmapgl": "^0.0.7",
 | 
				
			||||||
    "@types/crypto-js": "^4.1.0",
 | 
					    "@types/crypto-js": "^4.1.1",
 | 
				
			||||||
    "@types/node": "^17.0.10",
 | 
					    "@types/node": "20.2.1",
 | 
				
			||||||
    "@types/qs": "^6.9.7",
 | 
					    "@types/qs": "^6.9.7",
 | 
				
			||||||
    "@typescript-eslint/eslint-plugin": "^5.10.0",
 | 
					    "@types/ua-parser-js": "^0.7.36",
 | 
				
			||||||
    "@typescript-eslint/parser": "^5.10.0",
 | 
					    "@unocss/preset-uno": "^0.52.0",
 | 
				
			||||||
    "@vitejs/plugin-vue": "^2.1.0",
 | 
					    "@unocss/transformer-directives": "^0.52.0",
 | 
				
			||||||
    "@vue/eslint-config-prettier": "^7.0.0",
 | 
					    "@unocss/vite": "^0.52.0",
 | 
				
			||||||
    "@vue/eslint-config-typescript": "^10.0.0",
 | 
					    "@vitejs/plugin-vue": "^4.2.3",
 | 
				
			||||||
    "commitizen": "^4.2.4",
 | 
					    "@vitejs/plugin-vue-jsx": "^3.0.1",
 | 
				
			||||||
 | 
					    "conventional-changelog": "^3.1.25",
 | 
				
			||||||
    "cross-env": "^7.0.3",
 | 
					    "cross-env": "^7.0.3",
 | 
				
			||||||
    "cz-conventional-changelog": "^3.3.0",
 | 
					    "eslint": "^8.41.0",
 | 
				
			||||||
    "cz-customizable": "^6.3.0",
 | 
					    "eslint-config-soybeanjs": "^0.3.7",
 | 
				
			||||||
    "eslint": "^8.7.0",
 | 
					    "lint-staged": "13.2.2",
 | 
				
			||||||
    "eslint-config-airbnb-base": "^15.0.0",
 | 
					 | 
				
			||||||
    "eslint-config-prettier": "^8.3.0",
 | 
					 | 
				
			||||||
    "eslint-plugin-import": "^2.25.4",
 | 
					 | 
				
			||||||
    "eslint-plugin-prettier": "^4.0.0",
 | 
					 | 
				
			||||||
    "eslint-plugin-vue": "^8.3.0",
 | 
					 | 
				
			||||||
    "husky": "^7.0.4",
 | 
					 | 
				
			||||||
    "lint-staged": "^12.3.1",
 | 
					 | 
				
			||||||
    "mockjs": "^1.1.0",
 | 
					    "mockjs": "^1.1.0",
 | 
				
			||||||
    "patch-package": "^6.4.7",
 | 
					    "rollup-plugin-visualizer": "^5.9.0",
 | 
				
			||||||
    "postinstall-postinstall": "^2.1.0",
 | 
					    "sass": "^1.62.1",
 | 
				
			||||||
    "prettier": "^2.5.1",
 | 
					    "simple-git-hooks": "^2.8.1",
 | 
				
			||||||
    "rollup-plugin-visualizer": "^5.5.4",
 | 
					    "standard-version": "^9.5.0",
 | 
				
			||||||
    "sass": "^1.49.0",
 | 
					    "tsx": "^3.12.7",
 | 
				
			||||||
    "typescript": "^4.5.5",
 | 
					    "typescript": "5.0.4",
 | 
				
			||||||
    "unplugin-icons": "^0.13.0",
 | 
					    "unplugin-icons": "^0.16.1",
 | 
				
			||||||
    "unplugin-vue-components": "^0.17.14",
 | 
					    "unplugin-vue-components": "0.24.1",
 | 
				
			||||||
    "vite": "^2.7.13",
 | 
					    "vite": "^4.3.8",
 | 
				
			||||||
    "vite-plugin-html": "^2.1.2",
 | 
					    "vite-plugin-compression": "^0.5.1",
 | 
				
			||||||
    "vite-plugin-mock": "^2.9.6",
 | 
					    "vite-plugin-mock": "2.9.8",
 | 
				
			||||||
    "vite-plugin-windicss": "^1.6.3",
 | 
					    "vite-plugin-progress": "^0.0.7",
 | 
				
			||||||
    "vue-tsc": "^0.31.1",
 | 
					    "vite-plugin-pwa": "^0.15.0",
 | 
				
			||||||
    "vueuc": "^0.4.23",
 | 
					    "vite-plugin-svg-icons": "^2.0.1",
 | 
				
			||||||
    "windicss": "^3.4.3"
 | 
					    "vue-tsc": "1.6.5"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "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 lint-staged"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "lint-staged": {
 | 
				
			||||||
 | 
					    "*.{js,jsx,mjs,json,ts,tsx,vue}": "eslint . --fix"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
							
								
								
									
										18507
									
								
								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="#1890ff"/><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="#1890ff"/></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 1.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 23 KiB  | 
@@ -1,91 +0,0 @@
 | 
				
			|||||||
.loading-container {
 | 
					 | 
				
			||||||
	position: fixed;
 | 
					 | 
				
			||||||
	left: 0;
 | 
					 | 
				
			||||||
	top: 0;
 | 
					 | 
				
			||||||
	display: flex;
 | 
					 | 
				
			||||||
	flex-direction: column;
 | 
					 | 
				
			||||||
	justify-content: center;
 | 
					 | 
				
			||||||
	align-items: center;
 | 
					 | 
				
			||||||
	width: 100%;
 | 
					 | 
				
			||||||
	height: 100%;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.loading-svg {
 | 
					 | 
				
			||||||
	width: 128px;
 | 
					 | 
				
			||||||
	height: 128px;
 | 
					 | 
				
			||||||
	color: var(--primary-color);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.loading-spin__container {
 | 
					 | 
				
			||||||
	width: 56px;
 | 
					 | 
				
			||||||
	height: 56px;
 | 
					 | 
				
			||||||
	margin: 36px 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.loading-spin {
 | 
					 | 
				
			||||||
	position: relative;
 | 
					 | 
				
			||||||
	height: 100%;
 | 
					 | 
				
			||||||
	animation: loadingSpin 1s linear infinite;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.left-0 {
 | 
					 | 
				
			||||||
  left: 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.right-0 {
 | 
					 | 
				
			||||||
  right: 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.top-0 {
 | 
					 | 
				
			||||||
  top: 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.bottom-0 {
 | 
					 | 
				
			||||||
  bottom: 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.loading-spin-item {
 | 
					 | 
				
			||||||
	position: absolute;
 | 
					 | 
				
			||||||
  height: 16px;
 | 
					 | 
				
			||||||
  width: 16px;
 | 
					 | 
				
			||||||
	background-color: var(--primary-color);
 | 
					 | 
				
			||||||
  border-radius: 8px;
 | 
					 | 
				
			||||||
  -webkit-animation: loadingPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
 | 
					 | 
				
			||||||
  animation: loadingPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@keyframes loadingSpin {
 | 
					 | 
				
			||||||
  from {
 | 
					 | 
				
			||||||
    -webkit-transform: rotate(0deg);
 | 
					 | 
				
			||||||
    transform: rotate(0deg);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  to {
 | 
					 | 
				
			||||||
    -webkit-transform: rotate(360deg);
 | 
					 | 
				
			||||||
    transform: rotate(360deg);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@keyframes loadingPulse {
 | 
					 | 
				
			||||||
  0%, 100% {
 | 
					 | 
				
			||||||
    opacity: 1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  50% {
 | 
					 | 
				
			||||||
    opacity: .5;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.loading-delay-500 {
 | 
					 | 
				
			||||||
  -webkit-animation-delay: 500ms;
 | 
					 | 
				
			||||||
  animation-delay: 500ms;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.loading-delay-1000 {
 | 
					 | 
				
			||||||
  -webkit-animation-delay: 1000ms;
 | 
					 | 
				
			||||||
  animation-delay: 1000ms;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.loading-delay-1500 {
 | 
					 | 
				
			||||||
  -webkit-animation-delay: 1500ms;
 | 
					 | 
				
			||||||
  animation-delay: 1500ms;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.loading-title {
 | 
					 | 
				
			||||||
  font-size: 28px;
 | 
					 | 
				
			||||||
	font-weight: 500;
 | 
					 | 
				
			||||||
  color: #646464;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,44 +0,0 @@
 | 
				
			|||||||
/**
 | 
					 | 
				
			||||||
 * 初始化加载效果的svg格式logo
 | 
					 | 
				
			||||||
 * @param { string }id - 元素id
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
function initSvgLogo(id) {
 | 
					 | 
				
			||||||
  const svgStr = `<svg width="128px" height="128px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
 | 
					 | 
				
			||||||
	y="0px" viewBox="0 0 158.9 158.9" style="enable-background:new 0 0 158.9 158.9;" xml:space="preserve">
 | 
					 | 
				
			||||||
	<path style="fill:none" d="M0,158.9C0,106.3,0,53.7,0,1.1C0,0.2,0.2,0,1.1,0c52.2,0,104.5,0,156.7,0c0.9,0,1.1,0.2,1.1,1.1
 | 
					 | 
				
			||||||
	c0,52.2,0,104.5,0,156.7c0,0.9-0.2,1.1-1.1,1.1C105.2,158.8,52.6,158.8,0,158.9z" />
 | 
					 | 
				
			||||||
	<path style="fill:currentColor" d="M81.3,55.9c-0.1-11.7-2.9-22.5-9.4-32.4c-1-1.5-2.1-2.9-2.5-4.7c-0.7-3.4,0.9-6.9,4-8.6c3-1.7,6.8-1.2,9.3,1.2
 | 
					 | 
				
			||||||
	c2.4,2.6,4.4,5.6,5.9,8.8c4.7,8.9,7.6,18.6,8.4,28.6c1,12.5-0.7,25-5.2,36.7c-0.9,2.5-1.9,4.9-3,7.3c-0.3,0.4-0.3,1,0,1.4
 | 
					 | 
				
			||||||
	c9.6,13.3,21.8,23,37.8,27.2c6.4,1.7,13.1,2.3,19.7,1.6c4.2-0.4,7.9,2.7,8.4,6.9c0.7,4.3-2.3,8.3-6.6,9c0,0,0,0-0.1,0
 | 
					 | 
				
			||||||
	c-7.7,0.9-15.5,0.5-23-1.3c-13.9-3.1-26.7-10-36.9-19.9c-4.4-4.2-8.4-8.8-11.9-13.7c-0.5-0.8-1.4-1.2-2.3-1.1
 | 
					 | 
				
			||||||
	c-9.5,0.7-18.8,3.3-27.4,7.6c-11.6,6-20.7,14.6-26.4,26.4c-0.7,1.9-2,3.5-3.7,4.7c-2.9,1.7-6.6,1.5-9.2-0.7c-2.8-2.2-3.8-6-2.4-9.3
 | 
					 | 
				
			||||||
	c2.2-5.2,5.1-10.1,8.7-14.5c12.2-15.4,28.2-24.6,47.3-28.6c4-0.8,8.1-1.4,12.2-1.6c0.5,0,1-0.3,1.2-0.8c3.3-7.1,5.5-14.6,6.5-22.3
 | 
					 | 
				
			||||||
	C81.1,61.2,81.3,58.6,81.3,55.9z" />
 | 
					 | 
				
			||||||
	<path style="fill:currentColor" d="M136.3,108.3c-3.8-0.5-7.6-1.4-11.1-2.9c-7.7-2.8-14.4-7.5-19.7-13.8c-2.9-3.3-2.5-8.4,0.8-11.3
 | 
					 | 
				
			||||||
	c1.4-1.2,3.1-1.9,4.9-1.9c2.5-0.1,5,1,6.5,2.9c4.9,5.6,11.6,9.4,18.9,10.8c1.5,0.2,3.1,0.6,4.5,1.2c3.2,1.8,4.8,5.6,3.8,9.2
 | 
					 | 
				
			||||||
	C144,106.1,140.8,108.4,136.3,108.3z" />
 | 
					 | 
				
			||||||
	<path style="fill:currentColor" d="M55.7,33.3c3,0.2,5.6,2.2,6.6,5c2.2,5.4,3.4,11.2,3.6,17c0.3,5.9-0.6,11.7-2.5,17.3c-2,5.8-8.2,7.8-12.9,4.2
 | 
					 | 
				
			||||||
	c-2.6-2.2-3.6-5.8-2.4-9c1.4-4,1.9-8.2,1.7-12.4c-0.2-3.8-1-7.5-2.4-11C45.3,38.9,49.2,33.3,55.7,33.3z" />
 | 
					 | 
				
			||||||
	<path style="fill:currentColor" d="M77.9,126.6c0,3.9-2.8,7.2-6.7,7.9c-7.8,1.5-14.8,5.9-19.7,12.2c-2.7,3.5-7.6,4.2-11.2,1.6
 | 
					 | 
				
			||||||
	c-3.6-2.6-4.3-7.6-1.7-11.2c0.1-0.1,0.2-0.3,0.3-0.4c4.1-5.2,9.3-9.6,15.1-12.8c4.4-2.5,9.1-4.2,14-5.1
 | 
					 | 
				
			||||||
	C73.3,117.7,77.9,121.3,77.9,126.6z" />
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
`;
 | 
					 | 
				
			||||||
  const appEl = document.querySelector(id);
 | 
					 | 
				
			||||||
  const div = document.createElement('div');
 | 
					 | 
				
			||||||
  div.innerHTML = svgStr;
 | 
					 | 
				
			||||||
  if (appEl) {
 | 
					 | 
				
			||||||
    appEl.appendChild(div);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function addThemeColorCssVars() {
 | 
					 | 
				
			||||||
  const key = '__THEME_COLOR__';
 | 
					 | 
				
			||||||
  const themeColor = window.localStorage.getItem(key) || '#1890ff';
 | 
					 | 
				
			||||||
  const cssVars = `--primary-color: ${themeColor}`;
 | 
					 | 
				
			||||||
  document.documentElement.style.cssText = cssVars;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
initSvgLogo('#loadingLogo');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
addThemeColorCssVars();
 | 
					 | 
				
			||||||
							
								
								
									
										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);
 | 
				
			||||||
							
								
								
									
										22
									
								
								src/App.vue
									
									
									
									
									
								
							
							
						
						@@ -7,18 +7,34 @@
 | 
				
			|||||||
    class="h-full"
 | 
					    class="h-full"
 | 
				
			||||||
  >
 | 
					  >
 | 
				
			||||||
    <naive-provider>
 | 
					    <naive-provider>
 | 
				
			||||||
 | 
					      <fs-ui-context>
 | 
				
			||||||
        <router-view />
 | 
					        <router-view />
 | 
				
			||||||
 | 
					      </fs-ui-context>
 | 
				
			||||||
    </naive-provider>
 | 
					    </naive-provider>
 | 
				
			||||||
  </n-config-provider>
 | 
					  </n-config-provider>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { NConfigProvider, zhCN, dateZhCN } from 'naive-ui';
 | 
					import { watch } from 'vue';
 | 
				
			||||||
import { NaiveProvider } from '@/components';
 | 
					import { useRoute } from 'vue-router';
 | 
				
			||||||
import { useThemeStore, subscribeStore } from '@/store';
 | 
					import { dateZhCN, zhCN } from 'naive-ui';
 | 
				
			||||||
 | 
					import { useI18n } from 'vue-i18n';
 | 
				
			||||||
 | 
					import { subscribeStore, useThemeStore } from '@/store';
 | 
				
			||||||
 | 
					import { useGlobalEvents } from '@/composables';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const theme = useThemeStore();
 | 
					const theme = useThemeStore();
 | 
				
			||||||
 | 
					const { locale, t } = useI18n();
 | 
				
			||||||
 | 
					const route = useRoute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
subscribeStore();
 | 
					subscribeStore();
 | 
				
			||||||
 | 
					useGlobalEvents();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					watch(
 | 
				
			||||||
 | 
					  () => locale.value,
 | 
				
			||||||
 | 
					  () => {
 | 
				
			||||||
 | 
					    document.title = route.meta.i18nTitle ? t(route.meta.i18nTitle) : route.meta.title;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped></style>
 | 
					<style scoped></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
									
								
							
							
						
						
							
								
								
									
										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  | 
@@ -1,4 +0,0 @@
 | 
				
			|||||||
import LoadingEmptyWrapper from './LoadingEmptyWrapper/index.vue';
 | 
					 | 
				
			||||||
import LoginAgreement from './LoginAgreement/index.vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export { LoadingEmptyWrapper, LoginAgreement };
 | 
					 | 
				
			||||||
@@ -6,19 +6,15 @@
 | 
				
			|||||||
        <n-spin :show="true" :size="loadingSize" />
 | 
					        <n-spin :show="true" :size="loadingSize" />
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div v-show="isEmpty" class="absolute-center">
 | 
					      <div v-show="isEmpty" class="absolute-center">
 | 
				
			||||||
        <div class="relative" :class="emptyNetworkClass">
 | 
					        <div class="relative">
 | 
				
			||||||
          <svg-empty-data class="text-primary" />
 | 
					          <icon-local-empty-data :class="iconClass" />
 | 
				
			||||||
          <p class="absolute-lb w-full text-center">{{ emptyDesc }}</p>
 | 
					          <p class="absolute-lb w-full text-center" :class="descClass">{{ emptyDesc }}</p>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div v-show="!network" class="absolute-center">
 | 
					      <div v-show="!network" class="absolute-center">
 | 
				
			||||||
        <div
 | 
					        <div class="relative" :class="{ 'cursor-pointer': showNetworkReload }" @click="handleReload">
 | 
				
			||||||
          class="relative"
 | 
					          <icon-local-network-error :class="iconClass" />
 | 
				
			||||||
          :class="[{ 'cursor-pointer': showNetworkReload }, emptyNetworkClass]"
 | 
					          <p class="absolute-lb w-full text-center" :class="descClass">{{ networkErrorDesc }}</p>
 | 
				
			||||||
          @click="handleReload"
 | 
					 | 
				
			||||||
        >
 | 
					 | 
				
			||||||
          <svg-network-error class="text-primary" />
 | 
					 | 
				
			||||||
          <p class="absolute-lb w-full text-center">{{ networkErrorDesc }}</p>
 | 
					 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@@ -26,12 +22,12 @@
 | 
				
			|||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { computed, watch, nextTick, onUnmounted } from 'vue';
 | 
					import { computed, nextTick, onUnmounted, watch } from 'vue';
 | 
				
			||||||
import { NSpin } from 'naive-ui';
 | 
					 | 
				
			||||||
import { NETWORK_ERROR_MSG } from '@/config';
 | 
					import { NETWORK_ERROR_MSG } from '@/config';
 | 
				
			||||||
import { SvgEmptyData, SvgNetworkError } from '@/components';
 | 
					 | 
				
			||||||
import { useBoolean } from '@/hooks';
 | 
					import { useBoolean } from '@/hooks';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defineOptions({ name: 'LoadingEmptyWrapper' });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface Props {
 | 
					interface Props {
 | 
				
			||||||
  /** 是否加载 */
 | 
					  /** 是否加载 */
 | 
				
			||||||
  loading: boolean;
 | 
					  loading: boolean;
 | 
				
			||||||
@@ -43,8 +39,10 @@ interface Props {
 | 
				
			|||||||
  placeholderClass?: string;
 | 
					  placeholderClass?: string;
 | 
				
			||||||
  /** 空数据描述文本 */
 | 
					  /** 空数据描述文本 */
 | 
				
			||||||
  emptyDesc?: string;
 | 
					  emptyDesc?: string;
 | 
				
			||||||
  /** 空数据和网络异常占位class */
 | 
					  /** 图标的class */
 | 
				
			||||||
  emptyNetworkClass?: string;
 | 
					  iconClass?: string;
 | 
				
			||||||
 | 
					  /** 描述文本的class */
 | 
				
			||||||
 | 
					  descClass?: string;
 | 
				
			||||||
  /** 显示网络异常的重试点击按钮 */
 | 
					  /** 显示网络异常的重试点击按钮 */
 | 
				
			||||||
  showNetworkReload?: boolean;
 | 
					  showNetworkReload?: boolean;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -53,9 +51,10 @@ const props = withDefaults(defineProps<Props>(), {
 | 
				
			|||||||
  loading: false,
 | 
					  loading: false,
 | 
				
			||||||
  empty: false,
 | 
					  empty: false,
 | 
				
			||||||
  loadingSize: 'medium',
 | 
					  loadingSize: 'medium',
 | 
				
			||||||
  placeholderClass: 'bg-white',
 | 
					  placeholderClass: 'bg-white dark:bg-dark transition-background-color duration-300 ease-in-out',
 | 
				
			||||||
  emptyDesc: '暂无数据',
 | 
					  emptyDesc: '暂无数据',
 | 
				
			||||||
  emptyNetworkClass: 'w-320px h-320px text-16px text-[#666]',
 | 
					  iconClass: 'text-320px text-primary',
 | 
				
			||||||
 | 
					  descClass: 'text-16px text-#666',
 | 
				
			||||||
  showNetworkReload: false
 | 
					  showNetworkReload: false
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -94,4 +93,5 @@ onUnmounted(() => {
 | 
				
			|||||||
  stopHandle();
 | 
					  stopHandle();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped></style>
 | 
					<style scoped></style>
 | 
				
			||||||
@@ -8,13 +8,18 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { computed } from 'vue';
 | 
					import { computed } from 'vue';
 | 
				
			||||||
import { NCheckbox, NButton } from 'naive-ui';
 | 
					
 | 
				
			||||||
 | 
					defineOptions({ name: 'LoginAgreement' });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface Props {
 | 
					interface Props {
 | 
				
			||||||
  /** 是否勾选 */
 | 
					  /** 是否勾选 */
 | 
				
			||||||
  value?: boolean;
 | 
					  value?: boolean;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const props = withDefaults(defineProps<Props>(), {
 | 
				
			||||||
 | 
					  value: true
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface Emits {
 | 
					interface Emits {
 | 
				
			||||||
  (e: 'update:value', value: boolean): void;
 | 
					  (e: 'update:value', value: boolean): void;
 | 
				
			||||||
  /** 点击协议 */
 | 
					  /** 点击协议 */
 | 
				
			||||||
@@ -23,10 +28,6 @@ interface Emits {
 | 
				
			|||||||
  (e: 'click-policy'): void;
 | 
					  (e: 'click-policy'): void;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = withDefaults(defineProps<Props>(), {
 | 
					 | 
				
			||||||
  value: true
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const emit = defineEmits<Emits>();
 | 
					const emit = defineEmits<Emits>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const checked = computed({
 | 
					const checked = computed({
 | 
				
			||||||
@@ -45,4 +46,5 @@ function handleClickPolicy() {
 | 
				
			|||||||
  emit('click-policy');
 | 
					  emit('click-policy');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped></style>
 | 
					<style scoped></style>
 | 
				
			||||||
@@ -1,10 +0,0 @@
 | 
				
			|||||||
<template>
 | 
					 | 
				
			||||||
  <div
 | 
					 | 
				
			||||||
    class="bg-white text-[#333639] dark:(bg-[#18181c] text-white text-opacity-82) transition-all duration-300 ease-in-out"
 | 
					 | 
				
			||||||
  >
 | 
					 | 
				
			||||||
    <slot></slot>
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script setup lang="ts"></script>
 | 
					 | 
				
			||||||
<style scoped></style>
 | 
					 | 
				
			||||||
@@ -1,39 +0,0 @@
 | 
				
			|||||||
<template>
 | 
					 | 
				
			||||||
  <div class="flex-center text-18px hover:text-primary cursor-pointer" @click="handleSwitch">
 | 
					 | 
				
			||||||
    <icon-mdi-moon-waning-crescent v-if="darkMode" />
 | 
					 | 
				
			||||||
    <icon-mdi-white-balance-sunny v-else />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script setup lang="ts">
 | 
					 | 
				
			||||||
import { computed } from 'vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface Props {
 | 
					 | 
				
			||||||
  /** 暗黑模式 */
 | 
					 | 
				
			||||||
  dark?: boolean;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface Emits {
 | 
					 | 
				
			||||||
  (e: 'update:dark', darkMode: boolean): void;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const props = withDefaults(defineProps<Props>(), {
 | 
					 | 
				
			||||||
  dark: false
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const emit = defineEmits<Emits>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const darkMode = computed({
 | 
					 | 
				
			||||||
  get() {
 | 
					 | 
				
			||||||
    return props.dark;
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  set(newValue: boolean) {
 | 
					 | 
				
			||||||
    emit('update:dark', newValue);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function handleSwitch() {
 | 
					 | 
				
			||||||
  darkMode.value = !darkMode.value;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
<style scoped></style>
 | 
					 | 
				
			||||||
@@ -1,18 +0,0 @@
 | 
				
			|||||||
<template>
 | 
					 | 
				
			||||||
  <div></div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script lang="ts" setup>
 | 
					 | 
				
			||||||
import { useLoadingBar, useDialog, useMessage, useNotification } from 'naive-ui';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 挂载naive组件的方法至window, 以便在路由钩子函数和请求函数里面调用
 | 
					 | 
				
			||||||
function registerNaiveTools() {
 | 
					 | 
				
			||||||
  window.$loadingBar = useLoadingBar();
 | 
					 | 
				
			||||||
  window.$dialog = useDialog();
 | 
					 | 
				
			||||||
  window.$message = useMessage();
 | 
					 | 
				
			||||||
  window.$notification = useNotification();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
registerNaiveTools();
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
<style scoped></style>
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
import NaiveProviderContent from './NaiveProviderContent.vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export { NaiveProviderContent };
 | 
					 | 
				
			||||||
@@ -1,18 +0,0 @@
 | 
				
			|||||||
<template>
 | 
					 | 
				
			||||||
  <n-loading-bar-provider>
 | 
					 | 
				
			||||||
    <n-dialog-provider>
 | 
					 | 
				
			||||||
      <n-notification-provider>
 | 
					 | 
				
			||||||
        <n-message-provider>
 | 
					 | 
				
			||||||
          <slot></slot>
 | 
					 | 
				
			||||||
          <naive-provider-content />
 | 
					 | 
				
			||||||
        </n-message-provider>
 | 
					 | 
				
			||||||
      </n-notification-provider>
 | 
					 | 
				
			||||||
    </n-dialog-provider>
 | 
					 | 
				
			||||||
  </n-loading-bar-provider>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script setup lang="ts">
 | 
					 | 
				
			||||||
import { NLoadingBarProvider, NDialogProvider, NNotificationProvider, NMessageProvider } from 'naive-ui';
 | 
					 | 
				
			||||||
import { NaiveProviderContent } from './components';
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
<style scoped></style>
 | 
					 | 
				
			||||||
@@ -1,31 +0,0 @@
 | 
				
			|||||||
<template>
 | 
					 | 
				
			||||||
  <svg viewBox="0 0 158.88 158.88">
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M158.86.3q0,78.74,0,157.48c0,.9-.2,1.1-1.1,1.1q-78.77,0-157.52,0a2.61,2.61,0,0,1-.11-1.3q0-78,0-155.91C.14,0,0,.18,1.61.18h156A2.62,2.62,0,0,1,158.86.3Z"
 | 
					 | 
				
			||||||
      style="fill: currentColor"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M158.86.3H2C0,.31.27,0,.27,2q0,78.42,0,156.85c-.07-.05-.25.12-.24-.12s0-.64,0-1Q0,79.46,0,1.14C0,.24.2,0,1.1,0l156.68,0C158.13.08,158.59-.2,158.86.3Z"
 | 
					 | 
				
			||||||
      style="fill: #ffffff"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M93.65,51.52a68.65,68.65,0,0,1-6.47,28.81,1.72,1.72,0,0,0,.19,2c6.08,8.28,13.58,14.79,23.19,18.69a46.22,46.22,0,0,0,17.15,3.39,28.87,28.87,0,0,0,3.34-.25,6.2,6.2,0,0,1,7,5.12,6.07,6.07,0,0,1-5.15,7.14,50.39,50.39,0,0,1-18.06-1c-15.85-3.66-28-12.75-37.44-25.7a2.15,2.15,0,0,0-2.23-1.09C61.17,90,49,95.06,39.67,105.84a38.47,38.47,0,0,0-6.23,9.74A6.21,6.21,0,0,1,25.27,119,6.14,6.14,0,0,1,22,110.8a49.31,49.31,0,0,1,9.63-14.62c10.56-11.44,23.8-17.54,39.09-19.54a13.93,13.93,0,0,1,2.84-.34c1.61.14,2.18-.73,2.73-2A54.38,54.38,0,0,0,81.12,51a44,44,0,0,0-8-25,6.11,6.11,0,0,1-.65-6.46A6,6,0,0,1,77.75,16a6.34,6.34,0,0,1,5.66,3,53.61,53.61,0,0,1,7.17,14.28A59.33,59.33,0,0,1,93.65,51.52Z"
 | 
					 | 
				
			||||||
      style="fill: #ffffff"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M46.92,118.63a6,6,0,0,1,1.35-3.88,37.89,37.89,0,0,1,22.5-14,6.08,6.08,0,0,1,6.65,2.47,6.18,6.18,0,0,1-3.84,9.63,26.09,26.09,0,0,0-15.71,9.77,6.2,6.2,0,0,1-10.95-4Z"
 | 
					 | 
				
			||||||
      style="fill: #ffffff"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M124.3,92.8a34.66,34.66,0,0,1-9.82-2.48A35.46,35.46,0,0,1,99.83,79.87a6.19,6.19,0,0,1,2.84-9.93,5.79,5.79,0,0,1,6.44,1.73,26.79,26.79,0,0,0,16.51,8.85,6,6,0,0,1,5,5.54,6.21,6.21,0,0,1-4.29,6.46A6.55,6.55,0,0,1,124.3,92.8Z"
 | 
					 | 
				
			||||||
      style="fill: #ffffff"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M69.32,53.27a33.46,33.46,0,0,1-2.27,12.52,6.21,6.21,0,0,1-10.94,1,6.09,6.09,0,0,1-.65-5.4,26,26,0,0,0-.53-18.25,6.21,6.21,0,0,1,11.49-4.72A40.24,40.24,0,0,1,69.32,53.27Z"
 | 
					 | 
				
			||||||
      style="fill: #ffffff"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
  </svg>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script setup lang="ts"></script>
 | 
					 | 
				
			||||||
<style scoped></style>
 | 
					 | 
				
			||||||
@@ -1,32 +0,0 @@
 | 
				
			|||||||
<template>
 | 
					 | 
				
			||||||
  <svg viewBox="0 0 158.88 158.88">
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M0,158.86Q0,80,0,1.1C0,.2.2,0,1.1,0Q79.44,0,157.78,0c.9,0,1.1.2,1.1,1.1q0,78.35,0,156.68c0,.9-.2,1.1-1.1,1.1Q78.9,158.83,0,158.86Z"
 | 
					 | 
				
			||||||
      transform="translate(0)"
 | 
					 | 
				
			||||||
      style="fill: #ffffff00"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <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,0,1,4-8.61,7.89,7.89,0,0,1,9.3,1.23,36,36,0,0,1,5.9,8.83,75.18,75.18,0,0,1,8.44,28.58,83.21,83.21,0,0,1-5.23,36.74c-.91,2.47-1.91,4.9-3,7.28a1.2,1.2,0,0,0,0,1.41c9.58,13.3,21.76,23,37.85,27.24a54.35,54.35,0,0,0,19.68,1.57,7.72,7.72,0,0,1,8.36,6.9,7.9,7.9,0,0,1-6.7,9,64.74,64.74,0,0,1-23-1.33,77.68,77.68,0,0,1-36.93-19.88,93.64,93.64,0,0,1-11.91-13.71A2.18,2.18,0,0,0,73.87,103a72.75,72.75,0,0,0-27.38,7.55c-11.6,6-20.67,14.58-26.4,26.45a10.13,10.13,0,0,1-3.7,4.7A8,8,0,0,1,7.2,141a7.86,7.86,0,0,1-2.36-9.28,60.32,60.32,0,0,1,8.72-14.52c12.2-15.43,28.21-24.59,47.32-28.57A85.08,85.08,0,0,1,73.07,87a1.22,1.22,0,0,0,1.18-.8A76.06,76.06,0,0,0,80.78,63.9,57.87,57.87,0,0,0,81.28,55.9Z"
 | 
					 | 
				
			||||||
      transform="translate(0)"
 | 
					 | 
				
			||||||
      style="fill: currentColor"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M136.26,108.34a44.72,44.72,0,0,1-11.13-2.87,46.11,46.11,0,0,1-19.66-13.76,8,8,0,0,1,5.72-13.22,7.93,7.93,0,0,1,6.54,2.93A33.27,33.27,0,0,0,136.6,92.17a14.76,14.76,0,0,1,4.48,1.18,8.08,8.08,0,0,1,3.84,9.21C144,106.08,140.79,108.37,136.26,108.34Z"
 | 
					 | 
				
			||||||
      transform="translate(0)"
 | 
					 | 
				
			||||||
      style="fill: currentColor"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M55.66,33.32a7.61,7.61,0,0,1,6.64,5,49.14,49.14,0,0,1,3.64,17,46.33,46.33,0,0,1-2.46,17.28c-2,5.77-8.24,7.79-12.89,4.15a8.1,8.1,0,0,1-2.39-9,31.68,31.68,0,0,0,1.68-12.36,35.77,35.77,0,0,0-2.43-11C45.35,38.94,49.2,33.32,55.66,33.32Z"
 | 
					 | 
				
			||||||
      transform="translate(0)"
 | 
					 | 
				
			||||||
      style="fill: currentColor"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <path
 | 
					 | 
				
			||||||
      d="M77.92,126.57a8,8,0,0,1-6.68,7.86,32.88,32.88,0,0,0-19.7,12.19,8.13,8.13,0,0,1-11.21,1.62,8,8,0,0,1-1.41-11.58A51.05,51.05,0,0,1,54,123.81a45.85,45.85,0,0,1,14-5.1C73.35,117.67,77.91,121.27,77.92,126.57Z"
 | 
					 | 
				
			||||||
      transform="translate(0)"
 | 
					 | 
				
			||||||
      style="fill: currentColor"
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
  </svg>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script setup lang="ts"></script>
 | 
					 | 
				
			||||||
<style scoped></style>
 | 
					 | 
				
			||||||
@@ -1,4 +0,0 @@
 | 
				
			|||||||
import SvgLogo from './SvgLogo.vue';
 | 
					 | 
				
			||||||
import SvgFillLogo from './SvgFillLogo.vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export { SvgLogo, SvgFillLogo };
 | 
					 | 
				
			||||||