Compare commits
	
		
			310 Commits
		
	
	
		
			v0.9.6
			...
			tauri-v0.1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					92cabdb5d4 | ||
| 
						 | 
					de2829fde7 | ||
| 
						 | 
					c1bee4046c | ||
| 
						 | 
					473095b01b | ||
| 
						 | 
					e6abf93457 | ||
| 
						 | 
					882f281482 | ||
| 
						 | 
					0b2f68ac04 | ||
| 
						 | 
					2ca2b766f8 | ||
| 
						 | 
					da611fb10b | ||
| 
						 | 
					eb8e49e23c | ||
| 
						 | 
					0907d38c06 | ||
| 
						 | 
					2a9b725c6a | ||
| 
						 | 
					8f24a94ed3 | ||
| 
						 | 
					4eefc95baa | ||
| 
						 | 
					1681c34a52 | ||
| 
						 | 
					47ab0184b7 | ||
| 
						 | 
					58591f660a | ||
| 
						 | 
					3c7e1cf442 | ||
| 
						 | 
					055d4cce33 | ||
| 
						 | 
					a3dfe61a7b | ||
| 
						 | 
					f9d47c081f | ||
| 
						 | 
					ff5bf62989 | ||
| 
						 | 
					1f6d079644 | ||
| 
						 | 
					5c085a1986 | ||
| 
						 | 
					9a23817473 | ||
| 
						 | 
					56ea8937f6 | ||
| 
						 | 
					4f51263501 | ||
| 
						 | 
					bb2eab60f4 | ||
| 
						 | 
					44e4c04811 | ||
| 
						 | 
					b5839eab26 | ||
| 
						 | 
					780ac75bf6 | ||
| 
						 | 
					a252138594 | ||
| 
						 | 
					270a055072 | ||
| 
						 | 
					08e194efe9 | ||
| 
						 | 
					5f6caab338 | ||
| 
						 | 
					5aaa318142 | ||
| 
						 | 
					cebbef680f | ||
| 
						 | 
					0abde46ef4 | ||
| 
						 | 
					f2b518ed26 | ||
| 
						 | 
					c6207f35e1 | ||
| 
						 | 
					ee8fa04814 | ||
| 
						 | 
					7b746fa053 | ||
| 
						 | 
					b7fea53107 | ||
| 
						 | 
					f89f3e6a38 | ||
| 
						 | 
					a0da2f6e16 | ||
| 
						 | 
					3b5380e0d1 | ||
| 
						 | 
					35276bfe41 | ||
| 
						 | 
					215c1ecbd9 | ||
| 
						 | 
					1698b21d7a | ||
| 
						 | 
					ca1e66be47 | ||
| 
						 | 
					22bf2823e8 | ||
| 
						 | 
					32e98f1b3a | ||
| 
						 | 
					c1c4335ce7 | ||
| 
						 | 
					6c50662280 | ||
| 
						 | 
					f3a1707b94 | ||
| 
						 | 
					6ea755f2a8 | ||
| 
						 | 
					a989b44a15 | ||
| 
						 | 
					40f8587fd6 | ||
| 
						 | 
					9f5638f16d | ||
| 
						 | 
					9b19f96ff6 | ||
| 
						 | 
					15da557892 | ||
| 
						 | 
					2d23c9a2e6 | ||
| 
						 | 
					ab49afd3db | ||
| 
						 | 
					86a370fd69 | ||
| 
						 | 
					36fc74ce07 | ||
| 
						 | 
					8da8843fd0 | ||
| 
						 | 
					f68285fbe5 | ||
| 
						 | 
					85b8ef8f88 | ||
| 
						 | 
					3d48aa8bbe | ||
| 
						 | 
					a765da6e28 | ||
| 
						 | 
					c57640acd0 | ||
| 
						 | 
					c264216053 | ||
| 
						 | 
					9d3c732993 | ||
| 
						 | 
					34f023c4b1 | ||
| 
						 | 
					5a4f842774 | ||
| 
						 | 
					bae1767141 | ||
| 
						 | 
					5957833a4f | ||
| 
						 | 
					397092c21f | ||
| 
						 | 
					f309003e67 | ||
| 
						 | 
					eaf3678758 | ||
| 
						 | 
					f2e82da7c8 | ||
| 
						 | 
					211ae1f905 | ||
| 
						 | 
					db629593c6 | ||
| 
						 | 
					80d58cce2b | ||
| 
						 | 
					a0f55aca69 | ||
| 
						 | 
					d203a3586c | ||
| 
						 | 
					f74a6424d0 | ||
| 
						 | 
					209ef3d890 | ||
| 
						 | 
					b549b32cbb | ||
| 
						 | 
					54e2cb51cf | ||
| 
						 | 
					42e6de395f | ||
| 
						 | 
					c0066b22b0 | ||
| 
						 | 
					aaef0bec27 | ||
| 
						 | 
					912c3531c5 | ||
| 
						 | 
					488e6e3204 | ||
| 
						 | 
					f73e3f648d | ||
| 
						 | 
					36e5feac98 | ||
| 
						 | 
					cc13fcc8aa | ||
| 
						 | 
					7f748f2a61 | ||
| 
						 | 
					4a6fec8af0 | ||
| 
						 | 
					e2b320ad27 | ||
| 
						 | 
					21d5214247 | ||
| 
						 | 
					44b544745d | ||
| 
						 | 
					5499a559c8 | ||
| 
						 | 
					ebe2c56348 | ||
| 
						 | 
					8debfe7e95 | ||
| 
						 | 
					1ef1b6bda9 | ||
| 
						 | 
					fb46d7ec7c | ||
| 
						 | 
					cea600f12c | ||
| 
						 | 
					bf2f617255 | ||
| 
						 | 
					cf8c7cb258 | ||
| 
						 | 
					4e87f0b665 | ||
| 
						 | 
					d8baba586b | ||
| 
						 | 
					3cff2eb4ce | ||
| 
						 | 
					f355a698ad | ||
| 
						 | 
					c3d0b74c75 | ||
| 
						 | 
					b0f98e4bfa | ||
| 
						 | 
					506ffb8adf | ||
| 
						 | 
					e1afc10b80 | ||
| 
						 | 
					960b436c79 | ||
| 
						 | 
					6059891556 | ||
| 
						 | 
					3503dff663 | ||
| 
						 | 
					61998886ac | ||
| 
						 | 
					608d7fb34d | ||
| 
						 | 
					6bb6d9f71e | ||
| 
						 | 
					918894147a | ||
| 
						 | 
					0b5afda287 | ||
| 
						 | 
					a8a6ed97b9 | ||
| 
						 | 
					919376b77c | ||
| 
						 | 
					7e505f9b96 | ||
| 
						 | 
					de517be613 | ||
| 
						 | 
					bd5dd2cf28 | ||
| 
						 | 
					da521b35e6 | ||
| 
						 | 
					34ffd9c1f3 | ||
| 
						 | 
					3131e00f0f | ||
| 
						 | 
					f71812d622 | ||
| 
						 | 
					0c12665fda | ||
| 
						 | 
					458b7adb29 | ||
| 
						 | 
					264da00e5d | ||
| 
						 | 
					0882c25034 | ||
| 
						 | 
					a3562d9212 | ||
| 
						 | 
					b08c389e4a | ||
| 
						 | 
					91bc1519f1 | ||
| 
						 | 
					58b27c9693 | ||
| 
						 | 
					25daa23606 | ||
| 
						 | 
					9110d87580 | ||
| 
						 | 
					c097b5681d | ||
| 
						 | 
					beb705f8a9 | ||
| 
						 | 
					fd9488673c | ||
| 
						 | 
					70aeefea02 | ||
| 
						 | 
					1b3d2a6168 | ||
| 
						 | 
					fcb7ad965d | ||
| 
						 | 
					828a2f5b60 | ||
| 
						 | 
					be6d431485 | ||
| 
						 | 
					61a43b8efd | ||
| 
						 | 
					e3a9c77fd1 | ||
| 
						 | 
					e772ff05fb | ||
| 
						 | 
					d064f6285a | ||
| 
						 | 
					091ca1a4fe | ||
| 
						 | 
					9cec6a31a5 | ||
| 
						 | 
					bb8af263e1 | ||
| 
						 | 
					7211a17a81 | ||
| 
						 | 
					810398abb8 | ||
| 
						 | 
					f2b580fc06 | ||
| 
						 | 
					3bd8858121 | ||
| 
						 | 
					5efd1dbec4 | ||
| 
						 | 
					971915948b | ||
| 
						 | 
					a9a37036d5 | ||
| 
						 | 
					7a58035514 | ||
| 
						 | 
					57bfe27819 | ||
| 
						 | 
					fcc65c3751 | ||
| 
						 | 
					f2d8dfc3ef | ||
| 
						 | 
					b5c570adf5 | ||
| 
						 | 
					94098d02e8 | ||
| 
						 | 
					436b15f010 | ||
| 
						 | 
					0282feb173 | ||
| 
						 | 
					8456750901 | ||
| 
						 | 
					1a02cab97c | ||
| 
						 | 
					1bdd81a1d8 | ||
| 
						 | 
					a9d58f88aa | ||
| 
						 | 
					6a344ff2c7 | ||
| 
						 | 
					cc00c8f03a | ||
| 
						 | 
					c7b6a3fbec | ||
| 
						 | 
					40c1e13b50 | ||
| 
						 | 
					288d586dbc | ||
| 
						 | 
					7d69992694 | ||
| 
						 | 
					6c14bfe6a9 | ||
| 
						 | 
					6773659e89 | ||
| 
						 | 
					9455ad9a4f | ||
| 
						 | 
					428d41b485 | ||
| 
						 | 
					74772a1f03 | ||
| 
						 | 
					1f3e6e4fac | ||
| 
						 | 
					41b3bcb445 | ||
| 
						 | 
					8e801dd790 | ||
| 
						 | 
					d6b1530720 | ||
| 
						 | 
					b632b7ffed | ||
| 
						 | 
					1b45b71f20 | ||
| 
						 | 
					149d22a4a4 | ||
| 
						 | 
					83a2e01070 | ||
| 
						 | 
					11d615f807 | ||
| 
						 | 
					853745587d | ||
| 
						 | 
					f29108aa14 | ||
| 
						 | 
					abd02d1990 | ||
| 
						 | 
					65ac69ef71 | ||
| 
						 | 
					8998581b99 | ||
| 
						 | 
					468b4bb0e1 | ||
| 
						 | 
					88e535f63c | ||
| 
						 | 
					13d0c4153a | ||
| 
						 | 
					331b14e74d | ||
| 
						 | 
					c29b887eb2 | ||
| 
						 | 
					8a1ec938e7 | ||
| 
						 | 
					c045e3fe4e | ||
| 
						 | 
					811f820644 | ||
| 
						 | 
					fe8cab3d1c | ||
| 
						 | 
					78efd7793a | ||
| 
						 | 
					82c4b09b94 | ||
| 
						 | 
					a539112a0f | ||
| 
						 | 
					22c05674f8 | ||
| 
						 | 
					7dd7c71d01 | ||
| 
						 | 
					22c90257de | ||
| 
						 | 
					3d03d6ddb5 | ||
| 
						 | 
					6fbde1eb57 | ||
| 
						 | 
					0ee16e0228 | ||
| 
						 | 
					af74046124 | ||
| 
						 | 
					d823ee5684 | ||
| 
						 | 
					f7ca2782b0 | ||
| 
						 | 
					af8c133914 | ||
| 
						 | 
					21b6fb697e | ||
| 
						 | 
					3e0cc8c2c1 | ||
| 
						 | 
					3540b75557 | ||
| 
						 | 
					73ce53a388 | ||
| 
						 | 
					f408ea017c | ||
| 
						 | 
					c5ba63182e | ||
| 
						 | 
					07325a4236 | ||
| 
						 | 
					7240be8495 | ||
| 
						 | 
					71a753f323 | ||
| 
						 | 
					639c4458be | ||
| 
						 | 
					1ad92a2d1b | ||
| 
						 | 
					49f95c4e45 | ||
| 
						 | 
					44ab07779e | ||
| 
						 | 
					40ecc320a5 | ||
| 
						 | 
					695ec7e50d | ||
| 
						 | 
					85901d2d5e | ||
| 
						 | 
					97e2ffddf4 | ||
| 
						 | 
					907cf44cc1 | ||
| 
						 | 
					d9324f07b5 | ||
| 
						 | 
					d7f5bf3373 | ||
| 
						 | 
					36f06bc899 | ||
| 
						 | 
					182dac0d2e | ||
| 
						 | 
					f4d37cf7f0 | ||
| 
						 | 
					16dce9a4ce | ||
| 
						 | 
					0f0cd0b759 | ||
| 
						 | 
					472f93bfc1 | ||
| 
						 | 
					77572855c3 | ||
| 
						 | 
					19942625d5 | ||
| 
						 | 
					dbd676095b | ||
| 
						 | 
					ed9cd6ce39 | ||
| 
						 | 
					ee434b465a | ||
| 
						 | 
					2aba58c973 | ||
| 
						 | 
					2c56233155 | ||
| 
						 | 
					8d11a6affc | ||
| 
						 | 
					f6b61418e5 | ||
| 
						 | 
					7f9c98ab8d | ||
| 
						 | 
					02992dc02d | ||
| 
						 | 
					b32bca4984 | ||
| 
						 | 
					c37d0ac788 | ||
| 
						 | 
					35aeedf320 | ||
| 
						 | 
					94ff787053 | ||
| 
						 | 
					d0823b030b | ||
| 
						 | 
					2d722db243 | ||
| 
						 | 
					6143605297 | ||
| 
						 | 
					e2d6554313 | ||
| 
						 | 
					872bb84502 | ||
| 
						 | 
					ee7eb3ac0d | ||
| 
						 | 
					dd1132482e | ||
| 
						 | 
					c33b5ebfef | ||
| 
						 | 
					711a4ae34f | ||
| 
						 | 
					d9cfeabb47 | ||
| 
						 | 
					296b154be5 | ||
| 
						 | 
					cec0f25c6b | ||
| 
						 | 
					b18c49e9d2 | ||
| 
						 | 
					f64bc91ce2 | ||
| 
						 | 
					b60db89801 | ||
| 
						 | 
					da407b6653 | ||
| 
						 | 
					6a9a362caa | ||
| 
						 | 
					aa2f78a86f | ||
| 
						 | 
					a444731e9e | ||
| 
						 | 
					1523c7b075 | ||
| 
						 | 
					896e6f2eac | ||
| 
						 | 
					8dcfbb29f9 | ||
| 
						 | 
					750000ec66 | ||
| 
						 | 
					a792bb5cb3 | ||
| 
						 | 
					973ab14442 | ||
| 
						 | 
					3fe4e92f4a | ||
| 
						 | 
					9ce58073dd | ||
| 
						 | 
					e2727e6fa1 | ||
| 
						 | 
					73fa3d14c5 | ||
| 
						 | 
					ea1a336535 | ||
| 
						 | 
					69e39c142e | ||
| 
						 | 
					718c36263e | ||
| 
						 | 
					5c1b086cb4 | ||
| 
						 | 
					414ccbe360 | ||
| 
						 | 
					41147b34fa | ||
| 
						 | 
					894b0f1c18 | ||
| 
						 | 
					d214bb2f2a | ||
| 
						 | 
					9518372fe0 | ||
| 
						 | 
					afa0134fdd | ||
| 
						 | 
					c6ed9b1558 | ||
| 
						 | 
					0523f08382 | ||
| 
						 | 
					8237adb9c0 | 
@@ -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: '|'
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										9
									
								
								.env
									
									
									
									
									
								
							
							
						
						@@ -7,7 +7,14 @@ VITE_APP_TITLE=Soybean管理系统
 | 
				
			|||||||
VITE_APP_DESC=SoybeanAdmin是一个中后台管理系统模版
 | 
					VITE_APP_DESC=SoybeanAdmin是一个中后台管理系统模版
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 权限路由模式: static | dynamic
 | 
					# 权限路由模式: static | dynamic
 | 
				
			||||||
VITE_AUTH_ROUTE_MODE=dynamic
 | 
					VITE_AUTH_ROUTE_MODE=static
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 路由首页(根路由重定向), 用于static模式的权限路由,dynamic模式取决于后端返回的路由首页
 | 
					# 路由首页(根路由重定向), 用于static模式的权限路由,dynamic模式取决于后端返回的路由首页
 | 
				
			||||||
VITE_ROUTE_HOME_PATH=/dashboard/analysis
 | 
					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,30 +1,30 @@
 | 
				
			|||||||
/** 请求环境配置 */
 | 
					/** 请求服务的环境配置 */
 | 
				
			||||||
type ServiceEnv = Record<EnvType, EnvConfig>;
 | 
					type ServiceEnv = Record<ServiceEnvType, ServiceEnvConfig>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 环境配置 */
 | 
					/** 不同请求服务的环境配置 */
 | 
				
			||||||
const serviceEnvConfig: ServiceEnv = {
 | 
					const serviceEnv: ServiceEnv = {
 | 
				
			||||||
  dev: {
 | 
					  dev: {
 | 
				
			||||||
    url: 'http://localhost:8080',
 | 
					    url: 'http://localhost:8080'
 | 
				
			||||||
    proxy: '/api'
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  test: {
 | 
					  test: {
 | 
				
			||||||
    url: 'http://localhost:8080',
 | 
					    url: 'http://localhost:8080'
 | 
				
			||||||
    proxy: '/api'
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  prod: {
 | 
					  prod: {
 | 
				
			||||||
    url: 'http://localhost:8080',
 | 
					    url: 'http://localhost:8080'
 | 
				
			||||||
    proxy: '/api'
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 获取环境配置
 | 
					 * 获取当前环境模式下的请求服务的配置
 | 
				
			||||||
 * @param env 环境描述
 | 
					 * @param env 环境
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export function getEnvConfig(env: ImportMetaEnv) {
 | 
					export function getServiceEnvConfig(env: ImportMetaEnv): ServiceEnvConfigWithProxyPattern {
 | 
				
			||||||
  const { VITE_ENV_TYPE = 'dev' } = env;
 | 
					  const { VITE_SERVICE_ENV = 'dev' } = env;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const envConfig = serviceEnvConfig[VITE_ENV_TYPE];
 | 
					  const config = serviceEnv[VITE_SERVICE_ENV];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return envConfig;
 | 
					  return {
 | 
				
			||||||
 | 
					    ...config,
 | 
				
			||||||
 | 
					    proxyPattern: '/proxy-pattern'
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1,2 @@
 | 
				
			|||||||
VITE_HTTP_PROXY=true
 | 
					VITE_HTTP_PROXY=Y
 | 
				
			||||||
 | 
					VITE_SOYBEAN_ROUTE_PLUGIN=Y
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,10 @@
 | 
				
			|||||||
VITE_VISUALIZER=false
 | 
					VITE_VISUALIZER=N
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VITE_COMPRESS=false
 | 
					VITE_COMPRESS=N
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# gzip | brotliCompress | deflate | deflateRaw
 | 
					# gzip | brotliCompress | deflate | deflateRaw
 | 
				
			||||||
VITE_COMPRESS_TYPE=gzip
 | 
					VITE_COMPRESS_TYPE=gzip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VITE_PWA=N
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VITE_PROD_MOCK=Y
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,16 +1,5 @@
 | 
				
			|||||||
*.sh
 | 
					 | 
				
			||||||
node_modules
 | 
					 | 
				
			||||||
lib
 | 
					 | 
				
			||||||
*.md
 | 
					 | 
				
			||||||
*.woff
 | 
					 | 
				
			||||||
*.ttf
 | 
					 | 
				
			||||||
.vscode
 | 
					 | 
				
			||||||
.idea
 | 
					 | 
				
			||||||
/dist/
 | 
					 | 
				
			||||||
/public
 | 
					 | 
				
			||||||
/docs
 | 
					 | 
				
			||||||
.vscode
 | 
					 | 
				
			||||||
.local
 | 
					 | 
				
			||||||
package.json
 | 
					 | 
				
			||||||
!.env-config.ts
 | 
					!.env-config.ts
 | 
				
			||||||
components.d.ts
 | 
					components.d.ts
 | 
				
			||||||
 | 
					router-page.d.ts
 | 
				
			||||||
 | 
					*.svg
 | 
				
			||||||
 | 
					src-tauri/target
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										130
									
								
								.eslintrc.js
									
									
									
									
									
								
							
							
						
						@@ -1,72 +1,23 @@
 | 
				
			|||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
  env: {
 | 
					  extends: ['soybeanjs/vue'],
 | 
				
			||||||
    browser: true,
 | 
					 | 
				
			||||||
    es2021: true,
 | 
					 | 
				
			||||||
    'vue/setup-compiler-macros': true
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  globals: {
 | 
					 | 
				
			||||||
    PROJECT_BUILD_TIME: 'readonly',
 | 
					 | 
				
			||||||
    AMap: 'readonly',
 | 
					 | 
				
			||||||
    BMap: 'readonly',
 | 
					 | 
				
			||||||
    TMap: 'readonly'
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  parser: 'vue-eslint-parser',
 | 
					 | 
				
			||||||
  parserOptions: {
 | 
					 | 
				
			||||||
    ecmaVersion: 12,
 | 
					 | 
				
			||||||
    parser: '@typescript-eslint/parser',
 | 
					 | 
				
			||||||
    sourceType: 'module'
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  plugins: ['vue', '@typescript-eslint'],
 | 
					 | 
				
			||||||
  extends: [
 | 
					 | 
				
			||||||
    'airbnb-base',
 | 
					 | 
				
			||||||
    'eslint:recommended',
 | 
					 | 
				
			||||||
    'plugin:vue/vue3-recommended',
 | 
					 | 
				
			||||||
    'plugin:prettier/recommended',
 | 
					 | 
				
			||||||
    '@vue/eslint-config-typescript/recommended',
 | 
					 | 
				
			||||||
    '@vue/eslint-config-prettier',
 | 
					 | 
				
			||||||
    '@vue/typescript/recommended'
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
  overrides: [
 | 
					  overrides: [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      files: ['*.vue'],
 | 
					      files: ['./scripts/*.ts'],
 | 
				
			||||||
      rules: {
 | 
					      rules: {
 | 
				
			||||||
        'no-undef': 'off'
 | 
					        'no-unused-expressions': 'off'
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      files: ['*.html'],
 | 
					      files: ['*.vue'],
 | 
				
			||||||
      rules: {
 | 
					      rules: {
 | 
				
			||||||
        'vue/comment-directive': 'off'
 | 
					        'no-undef': 'off' // use tsc to check the ts code of the vue
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  settings: {
 | 
					  settings: {
 | 
				
			||||||
    'import/resolver': {
 | 
					    'import/core-modules': ['uno.css', '~icons/*', 'virtual:svg-icons-register']
 | 
				
			||||||
      alias: {
 | 
					 | 
				
			||||||
        map: [
 | 
					 | 
				
			||||||
          ['~', '.'],
 | 
					 | 
				
			||||||
          ['@', './src']
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
        extensions: ['.js', '.jsx', '.mjs', '.ts', '.tsx', '.d.ts']
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      node: {
 | 
					 | 
				
			||||||
        extensions: ['.js', '.jsx', '.mjs', '.ts', '.tsx', '.d.ts']
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  rules: {
 | 
					  rules: {
 | 
				
			||||||
    'import/extensions': [
 | 
					 | 
				
			||||||
      'warn',
 | 
					 | 
				
			||||||
      'ignorePackages',
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        js: 'never',
 | 
					 | 
				
			||||||
        jsx: 'never',
 | 
					 | 
				
			||||||
        mjs: 'never',
 | 
					 | 
				
			||||||
        ts: 'never',
 | 
					 | 
				
			||||||
        tsx: 'never'
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    'import/no-extraneous-dependencies': ['error', { devDependencies: true, peerDependencies: true }],
 | 
					 | 
				
			||||||
    'import/order': [
 | 
					    'import/order': [
 | 
				
			||||||
      'error',
 | 
					      'error',
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@@ -83,11 +34,6 @@ module.exports = {
 | 
				
			|||||||
            group: 'external',
 | 
					            group: 'external',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            pattern: 'vuex',
 | 
					 | 
				
			||||||
            group: 'external',
 | 
					 | 
				
			||||||
            position: 'before'
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            pattern: 'pinia',
 | 
					            pattern: 'pinia',
 | 
				
			||||||
            group: 'external',
 | 
					            group: 'external',
 | 
				
			||||||
@@ -98,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',
 | 
				
			||||||
@@ -108,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',
 | 
				
			||||||
@@ -138,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',
 | 
				
			||||||
@@ -153,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',
 | 
				
			||||||
@@ -172,45 +123,10 @@ module.exports = {
 | 
				
			|||||||
            pattern: '@/**',
 | 
					            pattern: '@/**',
 | 
				
			||||||
            group: 'internal',
 | 
					            group: 'internal',
 | 
				
			||||||
            position: 'before'
 | 
					            position: 'before'
 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            pattern: '@/interface',
 | 
					 | 
				
			||||||
            group: 'internal',
 | 
					 | 
				
			||||||
            position: 'before'
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
        pathGroupsExcludedImportTypes: ['vue', 'vue-router', 'vuex', 'pinia', 'naive-ui']
 | 
					        pathGroupsExcludedImportTypes: ['vue', 'vue-router', 'pinia', 'naive-ui']
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ],
 | 
					    ]
 | 
				
			||||||
    'import/no-unresolved': ['error', { ignore: ['uno.css', '~icons/*', 'virtual:svg-icons-register'] }],
 | 
					 | 
				
			||||||
    'import/prefer-default-export': 'off',
 | 
					 | 
				
			||||||
    'max-classes-per-file': 'off',
 | 
					 | 
				
			||||||
    'no-param-reassign': [
 | 
					 | 
				
			||||||
      'error',
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        props: true,
 | 
					 | 
				
			||||||
        ignorePropertyModificationsFor: ['state', 'acc', 'e']
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    'no-shadow': 'off',
 | 
					 | 
				
			||||||
    'no-unused-vars': 'off',
 | 
					 | 
				
			||||||
    'no-use-before-define': 'off',
 | 
					 | 
				
			||||||
    'vue/multi-word-component-names': [
 | 
					 | 
				
			||||||
      'error',
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        ignores: ['index']
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-empty-interface': [
 | 
					 | 
				
			||||||
      'error',
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        allowSingleExtends: true
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-explicit-any': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-non-null-assertion': 'off',
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-shadow': 'error',
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-unused-vars': ['warn', { ignoreRestSiblings: true, varsIgnorePattern: '^_' }],
 | 
					 | 
				
			||||||
    '@typescript-eslint/no-use-before-define': ['error', { classes: true, functions: false, typedefs: false }]
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					"*.vue"    eol=lf
 | 
				
			||||||
 | 
					"*.js"     eol=lf
 | 
				
			||||||
 | 
					"*.ts"     eol=lf
 | 
				
			||||||
 | 
					"*.jsx"    eol=lf
 | 
				
			||||||
 | 
					"*.tsx"    eol=lf
 | 
				
			||||||
 | 
					"*.cjs"    eol=lf
 | 
				
			||||||
 | 
					"*.cts"    eol=lf
 | 
				
			||||||
 | 
					"*.mjs"    eol=lf
 | 
				
			||||||
 | 
					"*.mts"    eol=lf
 | 
				
			||||||
 | 
					"*.json"   eol=lf
 | 
				
			||||||
 | 
					"*.html"   eol=lf
 | 
				
			||||||
 | 
					"*.css"    eol=lf
 | 
				
			||||||
 | 
					"*.less"   eol=lf
 | 
				
			||||||
 | 
					"*.scss"   eol=lf
 | 
				
			||||||
 | 
					"*.sass"   eol=lf
 | 
				
			||||||
 | 
					"*.styl"   eol=lf
 | 
				
			||||||
 | 
					"*.md"   eol=lf
 | 
				
			||||||
							
								
								
									
										90
									
								
								.github/ISSUE_TEMPLATE/bug-report.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					name: Bug提交
 | 
				
			||||||
 | 
					description: 在使用软件或功能的过程中遇到了错误
 | 
				
			||||||
 | 
					title: '[Bug]: '
 | 
				
			||||||
 | 
					labels: [ "bug?" ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body:
 | 
				
			||||||
 | 
					  - type: markdown
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      value: |
 | 
				
			||||||
 | 
					        ## 请按照以下要求进行提交
 | 
				
			||||||
 | 
					        ### 1. 提交后需要指定标签和截止时间。
 | 
				
			||||||
 | 
					        ---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: markdown
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      value: |
 | 
				
			||||||
 | 
					        ## 环境信息
 | 
				
			||||||
 | 
					        请根据实际使用环境修改以下信息。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: input
 | 
				
			||||||
 | 
					    id: env-program-ver
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 软件版本
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: dropdown
 | 
				
			||||||
 | 
					    id: env-vm-ver
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 运行环境
 | 
				
			||||||
 | 
					      description: 选择运行软件的系统版本
 | 
				
			||||||
 | 
					      options:
 | 
				
			||||||
 | 
					        - Windows (64)
 | 
				
			||||||
 | 
					        - Windows (32/x84)
 | 
				
			||||||
 | 
					        - MacOS
 | 
				
			||||||
 | 
					        - Linux
 | 
				
			||||||
 | 
					        - Ubuntu
 | 
				
			||||||
 | 
					        - CentOS
 | 
				
			||||||
 | 
					        - ArchLinux
 | 
				
			||||||
 | 
					        - UNIX (Android)
 | 
				
			||||||
 | 
					        - 其它(请在下方说明)
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: dropdown
 | 
				
			||||||
 | 
					    id: env-vm-arch
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 运行架构
 | 
				
			||||||
 | 
					      description: (可选) 选择运行软件的系统架构
 | 
				
			||||||
 | 
					      options:
 | 
				
			||||||
 | 
					        - AMD64
 | 
				
			||||||
 | 
					        - x86
 | 
				
			||||||
 | 
					        - ARM [32] (别名:AArch32 / ARMv7)
 | 
				
			||||||
 | 
					        - ARM [64] (别名:AArch64 / ARMv8)
 | 
				
			||||||
 | 
					        - 其它
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: reproduce-steps
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 重现步骤
 | 
				
			||||||
 | 
					      description: |
 | 
				
			||||||
 | 
					        我们需要执行哪些操作才能让 bug 出现?
 | 
				
			||||||
 | 
					        简洁清晰的重现步骤能够帮助我们更迅速地定位问题所在。
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: expected
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 期望的结果是什么?
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: actual
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 实际的结果是什么?
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: logging
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 日志记录(可选)
 | 
				
			||||||
 | 
					      render: golang
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: extra-desc
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 补充说明(可选)
 | 
				
			||||||
							
								
								
									
										11
									
								
								.github/PULL_REQUEST_TEMPLATE.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					## Pull Request 详情
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					请根据实际使用情况修改以下信息。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 版本信息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 解决了哪些问题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 是否关闭了某个 Issue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Closes #
 | 
				
			||||||
							
								
								
									
										30
									
								
								.github/workflows/linter.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					name: Lint Code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: write
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    branches: [main]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  lint:
 | 
				
			||||||
 | 
					    name: Lint All Code
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout Code
 | 
				
			||||||
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          fetch-depth: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Lint Code Base
 | 
				
			||||||
 | 
					        uses: github/super-linter@v4
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          VALIDATE_ALL_CODEBASE: false
 | 
				
			||||||
 | 
					          DEFAULT_BRANCH: main
 | 
				
			||||||
 | 
					          # To change branch master or main
 | 
				
			||||||
 | 
					          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					          FILTER_REGEX_EXCLUDE: (docs|.github)
 | 
				
			||||||
 | 
					          VALIDATE_MARKDOWN: false
 | 
				
			||||||
							
								
								
									
										25
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					name: Release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					  contents: write
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - "v*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  release:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          fetch-depth: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - uses: actions/setup-node@v3
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          node-version: 16.x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - run: npx githublogen
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
 | 
				
			||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -11,6 +11,7 @@ node_modules
 | 
				
			|||||||
.DS_Store
 | 
					.DS_Store
 | 
				
			||||||
dist
 | 
					dist
 | 
				
			||||||
dist-ssr
 | 
					dist-ssr
 | 
				
			||||||
 | 
					dist.zip
 | 
				
			||||||
coverage
 | 
					coverage
 | 
				
			||||||
*.local
 | 
					*.local
 | 
				
			||||||
stats.html
 | 
					stats.html
 | 
				
			||||||
@@ -21,6 +22,7 @@ stats.html
 | 
				
			|||||||
# Editor directories and files
 | 
					# Editor directories and files
 | 
				
			||||||
.vscode/*
 | 
					.vscode/*
 | 
				
			||||||
!.vscode/extensions.json
 | 
					!.vscode/extensions.json
 | 
				
			||||||
 | 
					!.vscode/launch.json
 | 
				
			||||||
!.vscode/settings.json
 | 
					!.vscode/settings.json
 | 
				
			||||||
.idea
 | 
					.idea
 | 
				
			||||||
*.suo
 | 
					*.suo
 | 
				
			||||||
@@ -30,3 +32,5 @@ stats.html
 | 
				
			|||||||
*.sw?
 | 
					*.sw?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/src/typings/components.d.ts
 | 
					/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"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
npm run lint && npm run typecheck
 | 
					 | 
				
			||||||
							
								
								
									
										1
									
								
								.npmrc
									
									
									
									
									
								
							
							
						
						@@ -1,3 +1,2 @@
 | 
				
			|||||||
registry=https://registry.npmmirror.com/
 | 
					registry=https://registry.npmmirror.com/
 | 
				
			||||||
shamefully-hoist=true
 | 
					shamefully-hoist=true
 | 
				
			||||||
strict-peer-dependencies=false
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,27 +0,0 @@
 | 
				
			|||||||
module.exports = { // https://prettier.io/docs/en/options.html
 | 
					 | 
				
			||||||
  arrowParens: 'avoid',
 | 
					 | 
				
			||||||
  bracketSameLine: false,
 | 
					 | 
				
			||||||
  bracketSpacing: true,
 | 
					 | 
				
			||||||
  embeddedLanguageFormatting: 'auto',
 | 
					 | 
				
			||||||
  htmlWhitespaceSensitivity: 'css',
 | 
					 | 
				
			||||||
  insertPragma: false,
 | 
					 | 
				
			||||||
  jsxSingleQuote: false,
 | 
					 | 
				
			||||||
  printWidth: 120,
 | 
					 | 
				
			||||||
  proseWrap: 'preserve',
 | 
					 | 
				
			||||||
  quoteProps: 'as-needed',
 | 
					 | 
				
			||||||
  requirePragma: false,
 | 
					 | 
				
			||||||
  semi: true,
 | 
					 | 
				
			||||||
  singleQuote: true,
 | 
					 | 
				
			||||||
  tabWidth: 2,
 | 
					 | 
				
			||||||
  trailingComma: 'none',
 | 
					 | 
				
			||||||
  useTabs: false,
 | 
					 | 
				
			||||||
  vueIndentScriptAndStyle: false,
 | 
					 | 
				
			||||||
  overrides: [
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      files: '*.html',
 | 
					 | 
				
			||||||
      options: {
 | 
					 | 
				
			||||||
        parser: 'html',
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										5
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -8,16 +8,17 @@
 | 
				
			|||||||
    "eamodio.gitlens",
 | 
					    "eamodio.gitlens",
 | 
				
			||||||
    "editorconfig.editorconfig",
 | 
					    "editorconfig.editorconfig",
 | 
				
			||||||
    "esbenp.prettier-vscode",
 | 
					    "esbenp.prettier-vscode",
 | 
				
			||||||
		"formulahendry.auto-complete-tag",
 | 
					 | 
				
			||||||
    "formulahendry.auto-close-tag",
 | 
					    "formulahendry.auto-close-tag",
 | 
				
			||||||
 | 
					    "formulahendry.auto-complete-tag",
 | 
				
			||||||
    "formulahendry.auto-rename-tag",
 | 
					    "formulahendry.auto-rename-tag",
 | 
				
			||||||
    "kisstkondoros.vscode-gutter-preview",
 | 
					    "kisstkondoros.vscode-gutter-preview",
 | 
				
			||||||
    "lokalise.i18n-ally",
 | 
					    "lokalise.i18n-ally",
 | 
				
			||||||
 | 
					    "mariusalchimavicius.json-to-ts",
 | 
				
			||||||
    "mhutchie.git-graph",
 | 
					    "mhutchie.git-graph",
 | 
				
			||||||
    "mikestead.dotenv",
 | 
					    "mikestead.dotenv",
 | 
				
			||||||
    "naumovs.color-highlight",
 | 
					    "naumovs.color-highlight",
 | 
				
			||||||
    "pkief.material-icon-theme",
 | 
					    "pkief.material-icon-theme",
 | 
				
			||||||
		"steoates.autoimport",
 | 
					    "sdras.vue-vscode-snippets",
 | 
				
			||||||
    "vue.volar",
 | 
					    "vue.volar",
 | 
				
			||||||
    "vue.vscode-typescript-vue-plugin",
 | 
					    "vue.vscode-typescript-vue-plugin",
 | 
				
			||||||
    "whtouche.vscode-js-console-utils",
 | 
					    "whtouche.vscode-js-console-utils",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "version": "0.2.0",
 | 
				
			||||||
 | 
					  "configurations": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "chrome",
 | 
				
			||||||
 | 
					      "request": "launch",
 | 
				
			||||||
 | 
					      "name": "Vue debugger",
 | 
				
			||||||
 | 
					      "url": "http://localhost:3200",
 | 
				
			||||||
 | 
					      "webRoot": "${workspaceFolder}"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "node",
 | 
				
			||||||
 | 
					      "request": "launch",
 | 
				
			||||||
 | 
					      "name": "TS debugger",
 | 
				
			||||||
 | 
					      "skipFiles": ["<node_internals>/**"],
 | 
				
			||||||
 | 
					      "runtimeArgs": ["--loader", "tsx"],
 | 
				
			||||||
 | 
					      "program": "${relativeFile}"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -9,9 +9,11 @@
 | 
				
			|||||||
    "strings": true
 | 
					    "strings": true
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "editor.tabSize": 2,
 | 
					  "editor.tabSize": 2,
 | 
				
			||||||
 | 
					  "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact", "vue", "json"],
 | 
				
			||||||
  "files.associations": {
 | 
					  "files.associations": {
 | 
				
			||||||
    "*.env.*": "dotenv"
 | 
					    "*.env.*": "dotenv"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  "files.eol": "\n",
 | 
				
			||||||
  "git.enableSmartCommit": true,
 | 
					  "git.enableSmartCommit": true,
 | 
				
			||||||
  "gutterpreview.paths": {
 | 
					  "gutterpreview.paths": {
 | 
				
			||||||
    "@": "/src",
 | 
					    "@": "/src",
 | 
				
			||||||
@@ -20,6 +22,7 @@
 | 
				
			|||||||
  "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",
 | 
				
			||||||
@@ -34,23 +37,21 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "path-intellisense.mappings": {
 | 
					  "path-intellisense.mappings": {
 | 
				
			||||||
    "@": "${workspaceFolder}/src",
 | 
					    "@": "${workspaceFolder}/src",
 | 
				
			||||||
		"~@": "${workspaceFolder}/src",
 | 
					    "~@": "${workspaceFolder}/src"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
	"terminal.integrated.cursorStyle": "line",
 | 
					 | 
				
			||||||
  "terminal.integrated.fontSize": 14,
 | 
					  "terminal.integrated.fontSize": 14,
 | 
				
			||||||
  "terminal.integrated.fontWeight": 500,
 | 
					  "terminal.integrated.fontWeight": 500,
 | 
				
			||||||
  "terminal.integrated.tabs.enabled": true,
 | 
					  "terminal.integrated.tabs.enabled": true,
 | 
				
			||||||
	"unocss.root": "src",
 | 
					 | 
				
			||||||
  "workbench.iconTheme": "material-icon-theme",
 | 
					  "workbench.iconTheme": "material-icon-theme",
 | 
				
			||||||
  "workbench.colorTheme": "One Dark Pro",
 | 
					  "workbench.colorTheme": "One Dark Pro",
 | 
				
			||||||
  "[html]": {
 | 
					  "[html]": {
 | 
				
			||||||
    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "[json]": {
 | 
					  "[json]": {
 | 
				
			||||||
		"editor.defaultFormatter": "vscode.json-language-features"
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "[jsonc]": {
 | 
					  "[jsonc]": {
 | 
				
			||||||
		"editor.defaultFormatter": "vscode.json-language-features"
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "[javascript]": {
 | 
					  "[javascript]": {
 | 
				
			||||||
    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
					    "editor.defaultFormatter": "esbenp.prettier-vscode"
 | 
				
			||||||
@@ -69,5 +70,6 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "[vue]": {
 | 
					  "[vue]": {
 | 
				
			||||||
    "editor.defaultFormatter": "Vue.volar"
 | 
					    "editor.defaultFormatter": "Vue.volar"
 | 
				
			||||||
	}
 | 
					  },
 | 
				
			||||||
 | 
					  "i18n-ally.localesPaths": ["src/locales", "src/locales/lang"]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1366
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
							
								
								
									
										16
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					ImageTag ?=v0.9.6
 | 
				
			||||||
 | 
					SoybeanAdminImg ?= soybeanjs/soybean-admin:$(ImageTag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VERSION=$(shell git rev-parse --short HEAD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					soybean-admin: soybean-admin-build soybean-admin-push
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					soybean-admin-build:
 | 
				
			||||||
 | 
						docker build --build-arg version=$(VERSION) -t ${SoybeanAdminImg} -f docker/Dockerfile .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					soybean-admin-push:
 | 
				
			||||||
 | 
						docker push ${SoybeanAdminImg}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# run tauri app:
 | 
				
			||||||
 | 
					run:
 | 
				
			||||||
 | 
						pnpm tauri dev
 | 
				
			||||||
							
								
								
									
										142
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,47 +1,61 @@
 | 
				
			|||||||
<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 的语言
 | 
				
			||||||
- **主题**:丰富可配置的主题、暗黑模式,基于原子css - unocss的动态主题颜色
 | 
					- **主题**:丰富可配置的主题、暗黑模式,基于原子 css 框架 - UnoCss 的动态主题颜色
 | 
				
			||||||
- **代码规范**:丰富的规范插件及极高的代码规范
 | 
					- **代码规范**:丰富的规范插件及极高的代码规范
 | 
				
			||||||
- **权限路由**:简易的路由配置、基于mock的动态路由能快速实现后端动态路由
 | 
					- **文件路由系统**:基于文件的路由系统,根据页面文件自动生成路由声明、路由导入和路由模块
 | 
				
			||||||
- **请求函数**:基于axios的完善的请求函数封装,提供Promise和hooks两种请求函数,加入请求结果数据转换的适配器
 | 
					- **权限路由**:提供前端静态和后端动态两种路由模式,基于 mock 的动态路由能快速实现后端动态路由
 | 
				
			||||||
 | 
					- **请求函数**:基于 axios 的完善的请求函数封装,提供 Promise 和 hooks 两种请求函数,加入请求结果数据转换的适配器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 预览
 | 
					## SoybeanJS 工具库
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [soybean-admin](https://soybean.pro/)
 | 
					- [@soybeanjs/cli](https://github.com/soybeanjs/cli): SoybeanJS 命令行工具,包含发布、git 和依赖等相关的实用命令
 | 
				
			||||||
 | 
					- [@soybeanjs/changelog](https://github.com/soybeanjs/changelog): 根据 git tags 和 commits 生成 changelog [示例](./CHANGELOG.md)
 | 
				
			||||||
 | 
					- [eslint-config-soybeanjs](https://github.com/soybeanjs/eslint-config): SoybeanJS 的 eslint 预设配置
 | 
				
			||||||
 | 
					- [@soybeanjs/materials](https://github.com/soybeanjs/materials): SoybeanJS 的物料仓库
 | 
				
			||||||
 | 
					- [@soybeanjs/vite-plugin-vue-page-route](https://github.com/soybeanjs/vite-plugin-vue-page-route): SoybeanAdmin 的路由插件
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 基于 SoybeanAdmin 二次开发的项目
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [electron-mock-admin](https://github.com/lixin59/electron-mock-api): 一个 Mock Api 管理系统,帮助前端开发伙伴快速实现接口的 mock。
 | 
				
			||||||
 | 
					- [T-Shell](https://github.com/TheBlindM/T-Shell): 是一个可配置命令提示的终端模拟器和 SSH 客户端。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 在线预览
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [Soybean Admin 预览地址](https://soybean.pro/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 文档
 | 
					## 文档
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [项目文档](https://docs.soybean.pro)
 | 
					- [项目文档预览地址](https://docs.soybean.pro)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 代码仓库
 | 
					## 代码仓库
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [github](https://github.com/honghuangdc/soybean-admin)
 | 
					| 仓库           | github 地址                                                                   | gitee 镜像                                                                   | 预览                                                      |
 | 
				
			||||||
 | 
					| -------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------- |
 | 
				
			||||||
- [gitee](https://gitee.com/honghuangdc/soybean-admin)
 | 
					| soybean-admin  | [github](https://github.com/honghuangdc/soybean-admin)                        | [gitee](https://gitee.com/honghuangdc/soybean-admin)                         | [预览](https://soybean.pro/)                              |
 | 
				
			||||||
 | 
					| tauri 版       | [tauri 版](https://github.com/honghuangdc/soybean-admin/tree/tauri)           | [tauri 版](https://gitee.com/honghuangdc/soybean-admin/tree/tauri)           |                                                           |
 | 
				
			||||||
 | 
					| 精简版         | [精简版](https://github.com/honghuangdc/soybean-admin/tree/thin)              | [精简版](https://gitee.com/honghuangdc/soybean-admin/tree/thin)              |                                                           |
 | 
				
			||||||
 | 
					| 集成 fast-crud | [集成 fast-crud](https://github.com/honghuangdc/soybean-admin/tree/fast-crud) | [集成 fast-crud](https://gitee.com/honghuangdc/soybean-admin/tree/fast-crud) | [预览](http://fast-crud.docmirror.cn/soybean/#/crud/demo) |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 更新日志
 | 
					## 更新日志
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[CHANGELOG](./CHANGELOG.md)
 | 
					[CHANGELOG](./CHANGELOG.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 后端服务
 | 
					## 后端服务
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [soybean-admin-java(开发中)](https://github.com/honghuangdc/soybean-admin-java)
 | 
					- [soybean-admin-java](https://github.com/honghuangdc/soybean-admin-java)
 | 
				
			||||||
 | 
					 | 
				
			||||||
- [soybean-admin-go(开发中)](https://github.com/honghuangdc/soybean-admin-go)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- [soybean-admin-nestjs(开发中)](https://github.com/honghuangdc/soybean-admin-nestjs)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 项目示例图
 | 
					## 项目示例图
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -53,13 +67,15 @@ Soybean Admin 是一个基于 Vue3、Vite、TypeScript、Naive UI 的免费中
 | 
				
			|||||||
 | 
					
 | 
				
			||||||

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

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

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

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

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

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -67,33 +83,17 @@ Soybean Admin 是一个基于 Vue3、Vite、TypeScript、Naive UI 的免费中
 | 
				
			|||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div align="center">
 | 
				
			||||||
 | 
						<img style="width:380px;margin-right:18px;border:1px solid #dedede;" src="https://s2.loli.net/2023/06/07/A5Nonc9vI6pB1lr.png" />
 | 
				
			||||||
 | 
						 
 | 
				
			||||||
 | 
						<img style="width:380px;border:1px solid #dedede;" src="https://s2.loli.net/2023/06/07/VwBjqEhTke3OxXF.png" />
 | 
				
			||||||
## 开发计划
 | 
					</div>
 | 
				
			||||||
 | 
					 | 
				
			||||||
- [x] 引入ECharts替换AntV G2Plot
 | 
					 | 
				
			||||||
- [x] 图表示例:ECharts、AntV G2
 | 
					 | 
				
			||||||
- [x] 多页签:支持query、hash等参数,同一页面支持多个Tab
 | 
					 | 
				
			||||||
- [ ] 缓存主题配置
 | 
					 | 
				
			||||||
- [ ] 添加锁屏组件、全局Iframe组件
 | 
					 | 
				
			||||||
- [ ] 示例页面完善
 | 
					 | 
				
			||||||
- [ ] 表单、表格示例
 | 
					 | 
				
			||||||
- [ ] 性能优化(优化递归函数)
 | 
					 | 
				
			||||||
- [ ] 精简版(新分支thin)
 | 
					 | 
				
			||||||
- [ ] 文档完善
 | 
					 | 
				
			||||||
- [ ] i18n国际化
 | 
					 | 
				
			||||||
- [ ] element-plus版本
 | 
					 | 
				
			||||||
- [ ] 其他UI版本
 | 
					 | 
				
			||||||
- [ ] soybean-admin cli工具(选择不同UI)
 | 
					 | 
				
			||||||
- [ ] soybean-admin 后台服务java版: [soybean-admin-java](https://github.com/honghuangdc/soybean-admin-java)
 | 
					 | 
				
			||||||
- [ ] soybean-admin 后台服务go版: [soybean-admin-go](https://github.com/honghuangdc/soybean-admin-go)
 | 
					 | 
				
			||||||
- [ ] soybean-admin 后台服务nodejs版: [soybean-admin-nestjs](https://github.com/honghuangdc/soybean-admin-nestjs)
 | 
					 | 
				
			||||||
- [ ] 前端可视化创建路由页面
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 安装使用
 | 
					## 安装使用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 环境配置
 | 
				
			||||||
 | 
					  **本地环境需要安装 pnpm 7.x 、Node.js 14.18+ 和 Git**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- 克隆代码
 | 
					- 克隆代码
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
@@ -118,8 +118,17 @@ pnpm dev
 | 
				
			|||||||
pnpm build
 | 
					pnpm build
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**本地环境需要安装 pnpm 6.x 、Node.js 14.x 和 Git**
 | 
					## Docker 部署
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Docker 部署 Soybean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					docker run --name soybean -p 80:80 -d soybeanjs/soybean-admin:v0.9.6
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 访问 SoybeanAdmin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					打开本地浏览器访问`http://localhost`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 如何贡献
 | 
					## 如何贡献
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -127,13 +136,9 @@ pnpm build
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 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
 | 
					 | 
				
			||||||
pnpm i -g commitizen
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 浏览器支持
 | 
					## 浏览器支持
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -142,33 +147,34 @@ 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                                                                                              |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 开源作者
 | 
					## 开源作者
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[@Soybean](https://github.com/honghuangdc)
 | 
					[@Soybean](https://github.com/honghuangdc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 捐赠
 | 
					 | 
				
			||||||
如果你觉得这个项目对你有帮助,可以请Soybean喝杯饮料表示支持,Soybean开源的动力离不开各位的支持和鼓励。
 | 
					 | 
				
			||||||

 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## 交流
 | 
					## 交流
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`Soybean Admin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供微信和QQ交流群,使用问题欢迎在群内提问。
 | 
					`Soybean Admin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供微信和 QQ 交流群,使用问题欢迎在群内提问。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- 微信交流群(添加本人微信拉进群),欢迎来技术交流,业务咨询。
 | 
					  <div style="display:flex;">
 | 
				
			||||||
 | 
					  	<div style="padding-right:24px;">
 | 
				
			||||||
  <div style="text-align:left">
 | 
					  		<p>QQ交流群</p>
 | 
				
			||||||
    <img src="https://s2.loli.net/2022/05/16/3YGBgXnVPJdslk8.jpg" style="width:200px" />
 | 
					 | 
				
			||||||
  </div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- QQ交流群 `711301266`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  <div style="text-align:left">
 | 
					 | 
				
			||||||
      <img src="https://i.loli.net/2021/11/24/1J6REWXiHomU2kM.jpg" style="width:200px" />
 | 
					      <img src="https://i.loli.net/2021/11/24/1J6REWXiHomU2kM.jpg" style="width:200px" />
 | 
				
			||||||
  	</div>
 | 
					  	</div>
 | 
				
			||||||
 | 
							<div>
 | 
				
			||||||
 | 
								<p>添加本人微信,欢迎来技术交流,业务咨询</p>
 | 
				
			||||||
 | 
								<img src="https://s2.loli.net/2023/06/07/sVyCUFBvzQ9f5b7.jpg" style="width:200px" />
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 捐赠
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					如果你觉得这个项目对你有帮助,可以请 Soybean 喝杯饮料表示支持,Soybean 开源的动力离不开各位的支持和鼓励。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[MIT © Soybean-2021](./LICENSE)
 | 
					本项目基于[MIT © Soybean-2021](./LICENSE) 协议,仅供参考学习,商用时请保留作者的版权信息,作者不对软件做担保和负责。
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,14 +5,14 @@ import type { ProxyOptions } from 'vite';
 | 
				
			|||||||
 * @param isOpenProxy - 是否开启代理
 | 
					 * @param isOpenProxy - 是否开启代理
 | 
				
			||||||
 * @param envConfig - env环境配置
 | 
					 * @param envConfig - env环境配置
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export function createViteProxy(isOpenProxy: boolean, envConfig: EnvConfig) {
 | 
					export function createViteProxy(isOpenProxy: boolean, envConfig: ServiceEnvConfigWithProxyPattern) {
 | 
				
			||||||
  if (!isOpenProxy) return undefined;
 | 
					  if (!isOpenProxy) return undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const proxy: Record<string, string | ProxyOptions> = {
 | 
					  const proxy: Record<string, string | ProxyOptions> = {
 | 
				
			||||||
    [envConfig.proxy]: {
 | 
					    [envConfig.proxyPattern]: {
 | 
				
			||||||
      target: envConfig.url,
 | 
					      target: envConfig.url,
 | 
				
			||||||
      changeOrigin: true,
 | 
					      changeOrigin: true,
 | 
				
			||||||
      rewrite: path => path.replace(new RegExp(`^${envConfig.proxy}`), '')
 | 
					      rewrite: path => path.replace(new RegExp(`^${envConfig.proxyPattern}`), '')
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
import type { PluginOption } from 'vite';
 | 
					 | 
				
			||||||
import { createHtmlPlugin } from 'vite-plugin-html';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default (viteEnv: ImportMetaEnv): PluginOption[] => {
 | 
					 | 
				
			||||||
  return createHtmlPlugin({
 | 
					 | 
				
			||||||
    minify: true,
 | 
					 | 
				
			||||||
    inject: {
 | 
					 | 
				
			||||||
      data: {
 | 
					 | 
				
			||||||
        appName: viteEnv.VITE_APP_NAME,
 | 
					 | 
				
			||||||
        appTitle: viteEnv.VITE_APP_TITLE
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,25 +1,47 @@
 | 
				
			|||||||
import type { 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 unocss from '@unocss/vite';
 | 
				
			||||||
 | 
					import progress from 'vite-plugin-progress';
 | 
				
			||||||
 | 
					import VueDevtools from 'vite-plugin-vue-devtools';
 | 
				
			||||||
 | 
					import pageRoute from '@soybeanjs/vite-plugin-vue-page-route';
 | 
				
			||||||
import unplugin from './unplugin';
 | 
					import unplugin from './unplugin';
 | 
				
			||||||
import unocss from './unocss';
 | 
					 | 
				
			||||||
import mock from './mock';
 | 
					import mock from './mock';
 | 
				
			||||||
import visualizer from './visualizer';
 | 
					import visualizer from './visualizer';
 | 
				
			||||||
import compress from './compress';
 | 
					import compress from './compress';
 | 
				
			||||||
 | 
					import pwa from './pwa';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * vite插件
 | 
					 * vite插件
 | 
				
			||||||
 * @param viteEnv - 环境变量配置
 | 
					 * @param viteEnv - 环境变量配置
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export function setupVitePlugins(viteEnv: ImportMetaEnv): (PluginOption | PluginOption[])[] {
 | 
					export function setupVitePlugins(viteEnv: ImportMetaEnv): (PluginOption | PluginOption[])[] {
 | 
				
			||||||
  const plugins = [...vue, html(viteEnv), ...unplugin, unocss, mock];
 | 
					  const plugins = [
 | 
				
			||||||
 | 
					    vue({
 | 
				
			||||||
  if (viteEnv.VITE_VISUALIZER === 'true') {
 | 
					      script: {
 | 
				
			||||||
    plugins.push(visualizer);
 | 
					        defineModel: true
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
  if (viteEnv.VITE_COMPRESS === 'true') {
 | 
					    }),
 | 
				
			||||||
 | 
					    vueJsx(),
 | 
				
			||||||
 | 
					    VueDevtools(),
 | 
				
			||||||
 | 
					    ...unplugin(viteEnv),
 | 
				
			||||||
 | 
					    unocss(),
 | 
				
			||||||
 | 
					    mock(viteEnv),
 | 
				
			||||||
 | 
					    progress()
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (viteEnv.VITE_VISUALIZER === 'Y') {
 | 
				
			||||||
 | 
					    plugins.push(visualizer as PluginOption);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (viteEnv.VITE_COMPRESS === 'Y') {
 | 
				
			||||||
    plugins.push(compress(viteEnv));
 | 
					    plugins.push(compress(viteEnv));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  if (viteEnv.VITE_PWA === 'Y' || viteEnv.VITE_VERCEL === 'Y') {
 | 
				
			||||||
 | 
					    plugins.push(pwa());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (viteEnv.VITE_SOYBEAN_ROUTE_PLUGIN === 'Y') {
 | 
				
			||||||
 | 
					    plugins.push(pageRoute());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return plugins;
 | 
					  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'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
import unocss from 'unocss/vite';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default unocss();
 | 
					 | 
				
			||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
import DefineOptions from 'unplugin-vue-define-options/vite';
 | 
					 | 
				
			||||||
import Icons from 'unplugin-icons/vite';
 | 
					import Icons from 'unplugin-icons/vite';
 | 
				
			||||||
import IconsResolver from 'unplugin-icons/resolver';
 | 
					import IconsResolver from 'unplugin-icons/resolver';
 | 
				
			||||||
import Components from 'unplugin-vue-components/vite';
 | 
					import Components from 'unplugin-vue-components/vite';
 | 
				
			||||||
@@ -7,16 +6,22 @@ import { FileSystemIconLoader } from 'unplugin-icons/loaders';
 | 
				
			|||||||
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
 | 
					import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
 | 
				
			||||||
import { getSrcPath } from '../utils';
 | 
					import { getSrcPath } from '../utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const srcPath = getSrcPath();
 | 
					export default function unplugin(viteEnv: ImportMetaEnv) {
 | 
				
			||||||
 | 
					  const { VITE_ICON_PREFFIX, VITE_ICON_LOCAL_PREFFIX } = viteEnv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const customIconPath = `${srcPath}/assets/svg`;
 | 
					  const srcPath = getSrcPath();
 | 
				
			||||||
 | 
					  const localIconPath = `${srcPath}/assets/svg-icon`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default [
 | 
					  /** 本地svg图标集合名称 */
 | 
				
			||||||
  DefineOptions(),
 | 
					  const collectionName = VITE_ICON_LOCAL_PREFFIX.replace(`${VITE_ICON_PREFFIX}-`, '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return [
 | 
				
			||||||
    Icons({
 | 
					    Icons({
 | 
				
			||||||
      compiler: 'vue3',
 | 
					      compiler: 'vue3',
 | 
				
			||||||
      customCollections: {
 | 
					      customCollections: {
 | 
				
			||||||
      custom: FileSystemIconLoader(customIconPath)
 | 
					        [collectionName]: FileSystemIconLoader(localIconPath, svg =>
 | 
				
			||||||
 | 
					          svg.replace(/^<svg\s/, '<svg width="1em" height="1em" ')
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      scale: 1,
 | 
					      scale: 1,
 | 
				
			||||||
      defaultClass: 'inline-block'
 | 
					      defaultClass: 'inline-block'
 | 
				
			||||||
@@ -24,12 +29,16 @@ export default [
 | 
				
			|||||||
    Components({
 | 
					    Components({
 | 
				
			||||||
      dts: 'src/typings/components.d.ts',
 | 
					      dts: 'src/typings/components.d.ts',
 | 
				
			||||||
      types: [{ from: 'vue-router', names: ['RouterLink', 'RouterView'] }],
 | 
					      types: [{ from: 'vue-router', names: ['RouterLink', 'RouterView'] }],
 | 
				
			||||||
    resolvers: [NaiveUiResolver(), IconsResolver({ customCollections: ['custom'], componentPrefix: 'icon' })]
 | 
					      resolvers: [
 | 
				
			||||||
 | 
					        NaiveUiResolver(),
 | 
				
			||||||
 | 
					        IconsResolver({ customCollections: [collectionName], componentPrefix: VITE_ICON_PREFFIX })
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
    }),
 | 
					    }),
 | 
				
			||||||
    createSvgIconsPlugin({
 | 
					    createSvgIconsPlugin({
 | 
				
			||||||
    iconDirs: [customIconPath],
 | 
					      iconDirs: [localIconPath],
 | 
				
			||||||
    symbolId: 'icon-custom-[dir]-[name]',
 | 
					      symbolId: `${VITE_ICON_LOCAL_PREFFIX}-[dir]-[name]`,
 | 
				
			||||||
      inject: 'body-last',
 | 
					      inject: 'body-last',
 | 
				
			||||||
    customDomId: '__CUSTOM_SVG_ICON__'
 | 
					      customDomId: '__SVG_ICON_LOCAL__'
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
];
 | 
					  ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +0,0 @@
 | 
				
			|||||||
import vue from '@vitejs/plugin-vue';
 | 
					 | 
				
			||||||
import vueJsx from '@vitejs/plugin-vue-jsx';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const plugins = [vue(), vueJsx()];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default plugins;
 | 
					 | 
				
			||||||
@@ -2,7 +2,7 @@ import path from 'path';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 获取项目根路径
 | 
					 * 获取项目根路径
 | 
				
			||||||
 * @descrition 结尾不带斜杠
 | 
					 * @descrition 末尾不带斜杠
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export function getRootPath() {
 | 
					export function getRootPath() {
 | 
				
			||||||
  return path.resolve(process.cwd());
 | 
					  return path.resolve(process.cwd());
 | 
				
			||||||
@@ -11,7 +11,7 @@ export function getRootPath() {
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * 获取项目src路径
 | 
					 * 获取项目src路径
 | 
				
			||||||
 * @param srcName - src目录名称(默认: "src")
 | 
					 * @param srcName - src目录名称(默认: "src")
 | 
				
			||||||
 * @descrition 结尾不带斜杠
 | 
					 * @descrition 末尾不带斜杠
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export function getSrcPath(srcName = 'src') {
 | 
					export function getSrcPath(srcName = 'src') {
 | 
				
			||||||
  const rootPath = getRootPath();
 | 
					  const rootPath = getRootPath();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								index.html
									
									
									
									
									
								
							
							
						
						@@ -2,26 +2,13 @@
 | 
				
			|||||||
<html lang="zh-cmn-Hans">
 | 
					<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" />
 | 
				
			||||||
    <link rel="stylesheet" href="/resource/loading.css" />
 | 
					 | 
				
			||||||
		<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>
 | 
					 | 
				
			||||||
        <div class="loading-title"><%= appTitle %></div>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
      <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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,20 +0,0 @@
 | 
				
			|||||||
import type { MockMethod } from 'vite-plugin-mock';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const apis: MockMethod[] = [
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    url: '/mock/apiDemoWithAdapter',
 | 
					 | 
				
			||||||
    method: 'post',
 | 
					 | 
				
			||||||
    response: (): Service.MockServiceResult<ApiDemo.DataWithAdapter> => {
 | 
					 | 
				
			||||||
      return {
 | 
					 | 
				
			||||||
        code: 200,
 | 
					 | 
				
			||||||
        message: 'ok',
 | 
					 | 
				
			||||||
        data: {
 | 
					 | 
				
			||||||
          dataId: '123',
 | 
					 | 
				
			||||||
          dataName: 'demoName'
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default apis;
 | 
					 | 
				
			||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
import auth from './auth';
 | 
					import auth from './auth';
 | 
				
			||||||
import route from './route';
 | 
					import route from './route';
 | 
				
			||||||
 | 
					import management from './management';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default [...auth, ...route];
 | 
					export default [...auth, ...route, ...management];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										33
									
								
								mock/api/management.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					import { mock } from 'mockjs';
 | 
				
			||||||
 | 
					import type { MockMethod } from 'vite-plugin-mock';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const apis: MockMethod[] = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    url: '/mock/getAllUserList',
 | 
				
			||||||
 | 
					    method: 'post',
 | 
				
			||||||
 | 
					    response: (): Service.MockServiceResult<ApiUserManagement.User[]> => {
 | 
				
			||||||
 | 
					      const data = mock({
 | 
				
			||||||
 | 
					        'list|1000': [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            id: '@id',
 | 
				
			||||||
 | 
					            userName: '@cname',
 | 
				
			||||||
 | 
					            'age|18-56': 56,
 | 
				
			||||||
 | 
					            'gender|1': ['0', '1', null],
 | 
				
			||||||
 | 
					            phone:
 | 
				
			||||||
 | 
					              /^[1](([3][0-9])|([4][01456789])|([5][012356789])|([6][2567])|([7][0-8])|([8][0-9])|([9][012356789]))[0-9]{8}$/,
 | 
				
			||||||
 | 
					            'email|1': ['@email("qq.com")', null],
 | 
				
			||||||
 | 
					            'userStatus|1': ['1', '2', '3', '4', null]
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        code: 200,
 | 
				
			||||||
 | 
					        message: 'ok',
 | 
				
			||||||
 | 
					        data: data.list
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default apis;
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import type { MockMethod } from 'vite-plugin-mock';
 | 
					import type { MockMethod } from 'vite-plugin-mock';
 | 
				
			||||||
import { userModel, routeModel } from '../model';
 | 
					import { routeModel, userModel } from '../model';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const apis: MockMethod[] = [
 | 
					const apis: MockMethod[] = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@@ -8,7 +8,7 @@ const apis: MockMethod[] = [
 | 
				
			|||||||
    response: (options: Service.MockOption): Service.MockServiceResult => {
 | 
					    response: (options: Service.MockOption): Service.MockServiceResult => {
 | 
				
			||||||
      const { userId = undefined } = options.body;
 | 
					      const { userId = undefined } = options.body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const routeHomeName: AuthRoute.RouteKey = 'dashboard_analysis';
 | 
					      const routeHomeName: AuthRoute.LastDegreeRouteKey = 'dashboard_analysis';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const role = userModel.find(item => item.userId === userId)?.userRole || 'user';
 | 
					      const role = userModel.find(item => item.userId === userId)?.userRole || 'user';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,8 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '分析页',
 | 
					            title: '分析页',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'icon-park-outline:analysis'
 | 
					            icon: 'icon-park-outline:analysis',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.dashboard.analysis'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -22,14 +23,16 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '工作台',
 | 
					            title: '工作台',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'icon-park-outline:workbench'
 | 
					            icon: 'icon-park-outline:workbench',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.dashboard.workbench'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '仪表盘',
 | 
					        title: '仪表盘',
 | 
				
			||||||
        icon: 'carbon:dashboard',
 | 
					        icon: 'mdi:monitor-dashboard',
 | 
				
			||||||
        order: 1
 | 
					        order: 1,
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.dashboard._value'
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -43,18 +46,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'vue文档',
 | 
					            title: 'vue文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.vue',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:vuejs'
 | 
					            icon: 'logos:vue'
 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          name: 'document_vue-new',
 | 
					 | 
				
			||||||
          path: '/document/vue-new',
 | 
					 | 
				
			||||||
          component: 'self',
 | 
					 | 
				
			||||||
          meta: {
 | 
					 | 
				
			||||||
            title: 'vue文档(新版)',
 | 
					 | 
				
			||||||
            requiresAuth: true,
 | 
					 | 
				
			||||||
            icon: 'mdi:vuejs'
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -63,24 +57,49 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'vite文档',
 | 
					            title: 'vite文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.vite',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'simple-icons:vite'
 | 
					            icon: 'logos:vitejs'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'document_naive',
 | 
				
			||||||
 | 
					          path: '/document/naive',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: 'naive文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.naive',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'logos:naiveui'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          name: 'document_project',
 | 
					          name: 'document_project',
 | 
				
			||||||
          path: '/document/project',
 | 
					          path: '/document/project',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '项目文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.project',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            localIcon: 'logo'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'document_project-link',
 | 
				
			||||||
 | 
					          path: '/document/project-link',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '项目文档(外链)',
 | 
					            title: '项目文档(外链)',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.project-link',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:file-link-outline',
 | 
					            localIcon: 'logo',
 | 
				
			||||||
            href: 'https://docs.soybean.pro/'
 | 
					            href: 'https://docs.soybean.pro/'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '文档',
 | 
					        title: '文档',
 | 
				
			||||||
        icon: 'carbon:document',
 | 
					        i18nTitle: 'message.routes.document._value',
 | 
				
			||||||
 | 
					        icon: 'mdi:file-document-multiple-outline',
 | 
				
			||||||
        order: 2
 | 
					        order: 2
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -95,8 +114,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '按钮',
 | 
					            title: '按钮',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.component.button',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-radio-button-checked'
 | 
					            icon: 'mdi:button-cursor'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -105,6 +125,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '卡片',
 | 
					            title: '卡片',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.component.card',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:card-outline'
 | 
					            icon: 'mdi:card-outline'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -115,6 +136,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '表格',
 | 
					            title: '表格',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.component.table',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:table-large'
 | 
					            icon: 'mdi:table-large'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -122,7 +144,8 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '组件示例',
 | 
					        title: '组件示例',
 | 
				
			||||||
        icon: 'fluent:app-store-24-regular',
 | 
					        i18nTitle: 'message.routes.component._value',
 | 
				
			||||||
 | 
					        icon: 'cib:app-store',
 | 
				
			||||||
        order: 3
 | 
					        order: 3
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -142,34 +165,27 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: 'ECharts',
 | 
					                title: 'ECharts',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.charts.echarts',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'simple-icons:apacheecharts'
 | 
					                icon: 'simple-icons:apacheecharts'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              name: 'plugin_charts_d3',
 | 
					 | 
				
			||||||
              path: '/plugin/charts/d3',
 | 
					 | 
				
			||||||
              component: 'self',
 | 
					 | 
				
			||||||
              meta: {
 | 
					 | 
				
			||||||
                title: 'D3',
 | 
					 | 
				
			||||||
                requiresAuth: true,
 | 
					 | 
				
			||||||
                icon: 'simple-icons:d3dotjs'
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
              name: 'plugin_charts_antv',
 | 
					              name: 'plugin_charts_antv',
 | 
				
			||||||
              path: '/plugin/charts/antv',
 | 
					              path: '/plugin/charts/antv',
 | 
				
			||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: 'AntV',
 | 
					                title: 'AntV',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.charts.antv',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'ant-design:bar-chart-outlined'
 | 
					                icon: 'simple-icons:antdesign'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '图表',
 | 
					            title: '图表',
 | 
				
			||||||
            icon: 'material-symbols:bar-chart-rounded'
 | 
					            i18nTitle: 'message.routes.plugin.charts._value',
 | 
				
			||||||
 | 
					            icon: 'mdi:chart-areaspline'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -178,6 +194,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '地图',
 | 
					            title: '地图',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.map',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:map'
 | 
					            icon: 'mdi:map'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -188,6 +205,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '视频',
 | 
					            title: '视频',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.video',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:video'
 | 
					            icon: 'mdi:video'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -203,6 +221,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '富文本编辑器',
 | 
					                title: '富文本编辑器',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.editor.quill',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'mdi:file-document-edit-outline'
 | 
					                icon: 'mdi:file-document-edit-outline'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
@@ -213,6 +232,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: 'markdown编辑器',
 | 
					                title: 'markdown编辑器',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.editor.markdown',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'ri:markdown-line'
 | 
					                icon: 'ri:markdown-line'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
@@ -220,6 +240,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          ],
 | 
					          ],
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '编辑器',
 | 
					            title: '编辑器',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.editor._value',
 | 
				
			||||||
            icon: 'icon-park-outline:editor'
 | 
					            icon: 'icon-park-outline:editor'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
@@ -229,6 +250,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'Swiper插件',
 | 
					            title: 'Swiper插件',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.swiper',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'simple-icons:swiper'
 | 
					            icon: 'simple-icons:swiper'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -239,6 +261,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '剪贴板',
 | 
					            title: '剪贴板',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.copy',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:clipboard-outline'
 | 
					            icon: 'mdi:clipboard-outline'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -249,8 +272,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '图标',
 | 
					            title: '图标',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.icon',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            customIcon: 'custom-icon'
 | 
					            localIcon: 'custom-icon'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -259,13 +283,15 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '打印',
 | 
					            title: '打印',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.print',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-local-printshop'
 | 
					            icon: 'mdi:printer'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '插件示例',
 | 
					        title: '插件示例',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.plugin._value',
 | 
				
			||||||
        icon: 'clarity:plugin-line',
 | 
					        icon: 'clarity:plugin-line',
 | 
				
			||||||
        order: 4
 | 
					        order: 4
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -281,6 +307,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '权限切换',
 | 
					            title: '权限切换',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.auth-demo.permission',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:round-construction'
 | 
					            icon: 'ic:round-construction'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -291,6 +318,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '超级管理员可见',
 | 
					            title: '超级管理员可见',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.auth-demo.super',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:round-supervisor-account'
 | 
					            icon: 'ic:round-supervisor-account'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -298,6 +326,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '权限示例',
 | 
					        title: '权限示例',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.auth-demo._value',
 | 
				
			||||||
        icon: 'ic:baseline-security',
 | 
					        icon: 'ic:baseline-security',
 | 
				
			||||||
        order: 5
 | 
					        order: 5
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -313,6 +342,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'Tab',
 | 
					            title: 'Tab',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.function.tab',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:round-tab'
 | 
					            icon: 'ic:round-tab'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -345,7 +375,8 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '功能',
 | 
					        title: '功能',
 | 
				
			||||||
        icon: 'ri:function-line',
 | 
					        i18nTitle: 'message.routes.function._value',
 | 
				
			||||||
 | 
					        icon: 'icon-park-outline:all-application',
 | 
				
			||||||
        order: 6
 | 
					        order: 6
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -360,6 +391,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '异常页403',
 | 
					            title: '异常页403',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.exception.403',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-block'
 | 
					            icon: 'ic:baseline-block'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -370,6 +402,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '异常页404',
 | 
					            title: '异常页404',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.exception.404',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-web-asset-off'
 | 
					            icon: 'ic:baseline-web-asset-off'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -380,12 +413,14 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '异常页500',
 | 
					            title: '异常页500',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.exception.500',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-wifi-off'
 | 
					            icon: 'ic:baseline-wifi-off'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.exception._value',
 | 
				
			||||||
        title: '异常页',
 | 
					        title: '异常页',
 | 
				
			||||||
        icon: 'ant-design:exception-outlined',
 | 
					        icon: 'ant-design:exception-outlined',
 | 
				
			||||||
        order: 7
 | 
					        order: 7
 | 
				
			||||||
@@ -407,8 +442,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '二级菜单',
 | 
					                title: '二级菜单',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.multi-menu.first.second',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'ic:outline-menu'
 | 
					                icon: 'mdi:menu'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -422,39 +458,102 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
                  component: 'self',
 | 
					                  component: 'self',
 | 
				
			||||||
                  meta: {
 | 
					                  meta: {
 | 
				
			||||||
                    title: '三级菜单',
 | 
					                    title: '三级菜单',
 | 
				
			||||||
 | 
					                    i18nTitle: 'message.routes.multi-menu.first.second-new.third',
 | 
				
			||||||
                    requiresAuth: true,
 | 
					                    requiresAuth: true,
 | 
				
			||||||
                    icon: 'ic:outline-menu'
 | 
					                    icon: 'mdi:menu'
 | 
				
			||||||
                  }
 | 
					                  }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
              ],
 | 
					              ],
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '二级菜单(有子菜单)',
 | 
					                title: '二级菜单(有子菜单)',
 | 
				
			||||||
                icon: 'ic:outline-menu'
 | 
					                i18nTitle: 'message.routes.multi-menu.first.second-new._value',
 | 
				
			||||||
 | 
					                icon: 'mdi:menu'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '一级菜单',
 | 
					            title: '一级菜单',
 | 
				
			||||||
            icon: 'ic:outline-menu'
 | 
					            i18nTitle: 'message.routes.multi-menu.first._value',
 | 
				
			||||||
 | 
					            icon: 'mdi:menu'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '多级菜单',
 | 
					        title: '多级菜单',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.multi-menu._value',
 | 
				
			||||||
        icon: 'carbon:menu',
 | 
					        icon: 'carbon:menu',
 | 
				
			||||||
        order: 8
 | 
					        order: 8
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      name: 'management',
 | 
				
			||||||
 | 
					      path: '/management',
 | 
				
			||||||
 | 
					      component: 'basic',
 | 
				
			||||||
 | 
					      children: [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_auth',
 | 
				
			||||||
 | 
					          path: '/management/auth',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '权限管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.auth',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'ic:baseline-security'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_role',
 | 
				
			||||||
 | 
					          path: '/management/role',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '角色管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.role',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'carbon:user-role'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_user',
 | 
				
			||||||
 | 
					          path: '/management/user',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '用户管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.user',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'ic:round-manage-accounts'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_route',
 | 
				
			||||||
 | 
					          path: '/management/route',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '路由管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.route',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'material-symbols:route'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      meta: {
 | 
				
			||||||
 | 
					        title: '系统管理',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.management._value',
 | 
				
			||||||
 | 
					        icon: 'carbon:cloud-service-management',
 | 
				
			||||||
 | 
					        order: 9
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      name: 'about',
 | 
					      name: 'about',
 | 
				
			||||||
      path: '/about',
 | 
					      path: '/about',
 | 
				
			||||||
      component: 'self',
 | 
					      component: 'self',
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '关于',
 | 
					        title: '关于',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.about',
 | 
				
			||||||
        requiresAuth: true,
 | 
					        requiresAuth: true,
 | 
				
			||||||
 | 
					        keepAlive: true,
 | 
				
			||||||
        singleLayout: 'basic',
 | 
					        singleLayout: 'basic',
 | 
				
			||||||
        icon: 'fluent:book-information-24-regular',
 | 
					        icon: 'fluent:book-information-24-regular',
 | 
				
			||||||
        order: 9
 | 
					        order: 10
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
@@ -471,7 +570,8 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '分析页',
 | 
					            title: '分析页',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'icon-park-outline:analysis'
 | 
					            icon: 'icon-park-outline:analysis',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.dashboard.analysis'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -481,14 +581,16 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '工作台',
 | 
					            title: '工作台',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'icon-park-outline:workbench'
 | 
					            icon: 'icon-park-outline:workbench',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.dashboard.workbench'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '仪表盘',
 | 
					        title: '仪表盘',
 | 
				
			||||||
        icon: 'carbon:dashboard',
 | 
					        icon: 'mdi:monitor-dashboard',
 | 
				
			||||||
        order: 1
 | 
					        order: 1,
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.dashboard._value'
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -502,18 +604,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'vue文档',
 | 
					            title: 'vue文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.vue',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:vuejs'
 | 
					            icon: 'logos:vue'
 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          name: 'document_vue-new',
 | 
					 | 
				
			||||||
          path: '/document/vue-new',
 | 
					 | 
				
			||||||
          component: 'self',
 | 
					 | 
				
			||||||
          meta: {
 | 
					 | 
				
			||||||
            title: 'vue文档(新版)',
 | 
					 | 
				
			||||||
            requiresAuth: true,
 | 
					 | 
				
			||||||
            icon: 'mdi:vuejs'
 | 
					 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -522,24 +615,49 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'vite文档',
 | 
					            title: 'vite文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.vite',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'simple-icons:vite'
 | 
					            icon: 'logos:vitejs'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'document_naive',
 | 
				
			||||||
 | 
					          path: '/document/naive',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: 'naive文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.naive',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'logos:naiveui'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          name: 'document_project',
 | 
					          name: 'document_project',
 | 
				
			||||||
          path: '/document/project',
 | 
					          path: '/document/project',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '项目文档',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.project',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            localIcon: 'logo'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'document_project-link',
 | 
				
			||||||
 | 
					          path: '/document/project-link',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '项目文档(外链)',
 | 
					            title: '项目文档(外链)',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.document.project-link',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:file-link-outline',
 | 
					            localIcon: 'logo',
 | 
				
			||||||
            href: 'https://docs.soybean.pro/'
 | 
					            href: 'https://docs.soybean.pro/'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '文档',
 | 
					        title: '文档',
 | 
				
			||||||
        icon: 'carbon:document',
 | 
					        i18nTitle: 'message.routes.document._value',
 | 
				
			||||||
 | 
					        icon: 'mdi:file-document-multiple-outline',
 | 
				
			||||||
        order: 2
 | 
					        order: 2
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -554,8 +672,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '按钮',
 | 
					            title: '按钮',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.component.button',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-radio-button-checked'
 | 
					            icon: 'mdi:button-cursor'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -564,6 +683,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '卡片',
 | 
					            title: '卡片',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.component.card',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:card-outline'
 | 
					            icon: 'mdi:card-outline'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -574,6 +694,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '表格',
 | 
					            title: '表格',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.component.table',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:table-large'
 | 
					            icon: 'mdi:table-large'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -581,7 +702,8 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '组件示例',
 | 
					        title: '组件示例',
 | 
				
			||||||
        icon: 'fluent:app-store-24-regular',
 | 
					        i18nTitle: 'message.routes.component._value',
 | 
				
			||||||
 | 
					        icon: 'cib:app-store',
 | 
				
			||||||
        order: 3
 | 
					        order: 3
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -601,34 +723,27 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: 'ECharts',
 | 
					                title: 'ECharts',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.charts.echarts',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'simple-icons:apacheecharts'
 | 
					                icon: 'simple-icons:apacheecharts'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
              name: 'plugin_charts_d3',
 | 
					 | 
				
			||||||
              path: '/plugin/charts/d3',
 | 
					 | 
				
			||||||
              component: 'self',
 | 
					 | 
				
			||||||
              meta: {
 | 
					 | 
				
			||||||
                title: 'D3',
 | 
					 | 
				
			||||||
                requiresAuth: true,
 | 
					 | 
				
			||||||
                icon: 'simple-icons:d3dotjs'
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
              name: 'plugin_charts_antv',
 | 
					              name: 'plugin_charts_antv',
 | 
				
			||||||
              path: '/plugin/charts/antv',
 | 
					              path: '/plugin/charts/antv',
 | 
				
			||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: 'AntV',
 | 
					                title: 'AntV',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.charts.antv',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'ant-design:bar-chart-outlined'
 | 
					                icon: 'simple-icons:antdesign'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '图表',
 | 
					            title: '图表',
 | 
				
			||||||
            icon: 'material-symbols:bar-chart-rounded'
 | 
					            i18nTitle: 'message.routes.plugin.charts._value',
 | 
				
			||||||
 | 
					            icon: 'mdi:chart-areaspline'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -637,6 +752,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '地图',
 | 
					            title: '地图',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.map',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:map'
 | 
					            icon: 'mdi:map'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -647,6 +763,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '视频',
 | 
					            title: '视频',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.video',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:video'
 | 
					            icon: 'mdi:video'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -662,6 +779,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '富文本编辑器',
 | 
					                title: '富文本编辑器',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.editor.quill',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'mdi:file-document-edit-outline'
 | 
					                icon: 'mdi:file-document-edit-outline'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
@@ -672,6 +790,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: 'markdown编辑器',
 | 
					                title: 'markdown编辑器',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.plugin.editor.markdown',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'ri:markdown-line'
 | 
					                icon: 'ri:markdown-line'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
@@ -679,6 +798,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          ],
 | 
					          ],
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '编辑器',
 | 
					            title: '编辑器',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.editor._value',
 | 
				
			||||||
            icon: 'icon-park-outline:editor'
 | 
					            icon: 'icon-park-outline:editor'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
@@ -688,6 +808,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'Swiper插件',
 | 
					            title: 'Swiper插件',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.swiper',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'simple-icons:swiper'
 | 
					            icon: 'simple-icons:swiper'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -698,6 +819,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '剪贴板',
 | 
					            title: '剪贴板',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.copy',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'mdi:clipboard-outline'
 | 
					            icon: 'mdi:clipboard-outline'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -708,8 +830,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '图标',
 | 
					            title: '图标',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.icon',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            customIcon: 'custom-icon'
 | 
					            localIcon: 'custom-icon'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -718,13 +841,15 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '打印',
 | 
					            title: '打印',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.plugin.print',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-local-printshop'
 | 
					            icon: 'mdi:printer'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '插件示例',
 | 
					        title: '插件示例',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.plugin._value',
 | 
				
			||||||
        icon: 'clarity:plugin-line',
 | 
					        icon: 'clarity:plugin-line',
 | 
				
			||||||
        order: 4
 | 
					        order: 4
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -740,13 +865,26 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '权限切换',
 | 
					            title: '权限切换',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.auth-demo.permission',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:round-construction'
 | 
					            icon: 'ic:round-construction'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'auth-demo_super',
 | 
				
			||||||
 | 
					          path: '/auth-demo/super',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '超级管理员可见',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.auth-demo.super',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'ic:round-supervisor-account'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '权限示例',
 | 
					        title: '权限示例',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.auth-demo._value',
 | 
				
			||||||
        icon: 'ic:baseline-security',
 | 
					        icon: 'ic:baseline-security',
 | 
				
			||||||
        order: 5
 | 
					        order: 5
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -762,6 +900,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: 'Tab',
 | 
					            title: 'Tab',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.function.tab',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:round-tab'
 | 
					            icon: 'ic:round-tab'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -794,7 +933,8 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '功能',
 | 
					        title: '功能',
 | 
				
			||||||
        icon: 'ri:function-line',
 | 
					        i18nTitle: 'message.routes.function._value',
 | 
				
			||||||
 | 
					        icon: 'icon-park-outline:all-application',
 | 
				
			||||||
        order: 6
 | 
					        order: 6
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -809,6 +949,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '异常页403',
 | 
					            title: '异常页403',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.exception.403',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-block'
 | 
					            icon: 'ic:baseline-block'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -819,6 +960,7 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '异常页404',
 | 
					            title: '异常页404',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.exception.404',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-web-asset-off'
 | 
					            icon: 'ic:baseline-web-asset-off'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -829,12 +971,14 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '异常页500',
 | 
					            title: '异常页500',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.exception.500',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:baseline-wifi-off'
 | 
					            icon: 'ic:baseline-wifi-off'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.exception._value',
 | 
				
			||||||
        title: '异常页',
 | 
					        title: '异常页',
 | 
				
			||||||
        icon: 'ant-design:exception-outlined',
 | 
					        icon: 'ant-design:exception-outlined',
 | 
				
			||||||
        order: 7
 | 
					        order: 7
 | 
				
			||||||
@@ -856,8 +1000,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '二级菜单',
 | 
					                title: '二级菜单',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.multi-menu.first.second',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'ic:outline-menu'
 | 
					                icon: 'mdi:menu'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -871,39 +1016,102 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
                  component: 'self',
 | 
					                  component: 'self',
 | 
				
			||||||
                  meta: {
 | 
					                  meta: {
 | 
				
			||||||
                    title: '三级菜单',
 | 
					                    title: '三级菜单',
 | 
				
			||||||
 | 
					                    i18nTitle: 'message.routes.multi-menu.first.second-new.third',
 | 
				
			||||||
                    requiresAuth: true,
 | 
					                    requiresAuth: true,
 | 
				
			||||||
                    icon: 'ic:outline-menu'
 | 
					                    icon: 'mdi:menu'
 | 
				
			||||||
                  }
 | 
					                  }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
              ],
 | 
					              ],
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '二级菜单(有子菜单)',
 | 
					                title: '二级菜单(有子菜单)',
 | 
				
			||||||
                icon: 'ic:outline-menu'
 | 
					                i18nTitle: 'message.routes.multi-menu.first.second-new._value',
 | 
				
			||||||
 | 
					                icon: 'mdi:menu'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '一级菜单',
 | 
					            title: '一级菜单',
 | 
				
			||||||
            icon: 'ic:outline-menu'
 | 
					            i18nTitle: 'message.routes.multi-menu.first._value',
 | 
				
			||||||
 | 
					            icon: 'mdi:menu'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '多级菜单',
 | 
					        title: '多级菜单',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.multi-menu._value',
 | 
				
			||||||
        icon: 'carbon:menu',
 | 
					        icon: 'carbon:menu',
 | 
				
			||||||
        order: 8
 | 
					        order: 8
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      name: 'management',
 | 
				
			||||||
 | 
					      path: '/management',
 | 
				
			||||||
 | 
					      component: 'basic',
 | 
				
			||||||
 | 
					      children: [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_auth',
 | 
				
			||||||
 | 
					          path: '/management/auth',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '权限管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.auth',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'ic:baseline-security'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_role',
 | 
				
			||||||
 | 
					          path: '/management/role',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '角色管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.role',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'carbon:user-role'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_user',
 | 
				
			||||||
 | 
					          path: '/management/user',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '用户管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.user',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'ic:round-manage-accounts'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'management_route',
 | 
				
			||||||
 | 
					          path: '/management/route',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '路由管理',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.management.route',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'material-symbols:route'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      meta: {
 | 
				
			||||||
 | 
					        title: '系统管理',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.management._value',
 | 
				
			||||||
 | 
					        icon: 'carbon:cloud-service-management',
 | 
				
			||||||
 | 
					        order: 9
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      name: 'about',
 | 
					      name: 'about',
 | 
				
			||||||
      path: '/about',
 | 
					      path: '/about',
 | 
				
			||||||
      component: 'self',
 | 
					      component: 'self',
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '关于',
 | 
					        title: '关于',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.about',
 | 
				
			||||||
        requiresAuth: true,
 | 
					        requiresAuth: true,
 | 
				
			||||||
 | 
					        keepAlive: true,
 | 
				
			||||||
        singleLayout: 'basic',
 | 
					        singleLayout: 'basic',
 | 
				
			||||||
        icon: 'fluent:book-information-24-regular',
 | 
					        icon: 'fluent:book-information-24-regular',
 | 
				
			||||||
        order: 9
 | 
					        order: 10
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
@@ -920,14 +1128,27 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '分析页',
 | 
					            title: '分析页',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'icon-park-outline:analysis'
 | 
					            icon: 'icon-park-outline:analysis',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.dashboard.analysis'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'dashboard_workbench',
 | 
				
			||||||
 | 
					          path: '/dashboard/workbench',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '工作台',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'icon-park-outline:workbench',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.dashboard.workbench'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '仪表盘',
 | 
					        title: '仪表盘',
 | 
				
			||||||
        icon: 'carbon:dashboard',
 | 
					        icon: 'mdi:monitor-dashboard',
 | 
				
			||||||
        order: 1
 | 
					        order: 1,
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.dashboard._value'
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -941,13 +1162,26 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
          component: 'self',
 | 
					          component: 'self',
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '权限切换',
 | 
					            title: '权限切换',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.auth-demo.permission',
 | 
				
			||||||
            requiresAuth: true,
 | 
					            requiresAuth: true,
 | 
				
			||||||
            icon: 'ic:round-construction'
 | 
					            icon: 'ic:round-construction'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: 'auth-demo_super',
 | 
				
			||||||
 | 
					          path: '/auth-demo/super',
 | 
				
			||||||
 | 
					          component: 'self',
 | 
				
			||||||
 | 
					          meta: {
 | 
				
			||||||
 | 
					            title: '超级管理员可见',
 | 
				
			||||||
 | 
					            i18nTitle: 'message.routes.auth-demo.super',
 | 
				
			||||||
 | 
					            requiresAuth: true,
 | 
				
			||||||
 | 
					            icon: 'ic:round-supervisor-account'
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '权限示例',
 | 
					        title: '权限示例',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.auth-demo._value',
 | 
				
			||||||
        icon: 'ic:baseline-security',
 | 
					        icon: 'ic:baseline-security',
 | 
				
			||||||
        order: 5
 | 
					        order: 5
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -968,8 +1202,9 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
              component: 'self',
 | 
					              component: 'self',
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '二级菜单',
 | 
					                title: '二级菜单',
 | 
				
			||||||
 | 
					                i18nTitle: 'message.routes.multi-menu.first.second',
 | 
				
			||||||
                requiresAuth: true,
 | 
					                requiresAuth: true,
 | 
				
			||||||
                icon: 'ic:outline-menu'
 | 
					                icon: 'mdi:menu'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -983,27 +1218,31 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
                  component: 'self',
 | 
					                  component: 'self',
 | 
				
			||||||
                  meta: {
 | 
					                  meta: {
 | 
				
			||||||
                    title: '三级菜单',
 | 
					                    title: '三级菜单',
 | 
				
			||||||
 | 
					                    i18nTitle: 'message.routes.multi-menu.first.second-new.third',
 | 
				
			||||||
                    requiresAuth: true,
 | 
					                    requiresAuth: true,
 | 
				
			||||||
                    icon: 'ic:outline-menu'
 | 
					                    icon: 'mdi:menu'
 | 
				
			||||||
                  }
 | 
					                  }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
              ],
 | 
					              ],
 | 
				
			||||||
              meta: {
 | 
					              meta: {
 | 
				
			||||||
                title: '二级菜单(有子菜单)',
 | 
					                title: '二级菜单(有子菜单)',
 | 
				
			||||||
                icon: 'ic:outline-menu'
 | 
					                i18nTitle: 'message.routes.multi-menu.first.second-new._value',
 | 
				
			||||||
 | 
					                icon: 'mdi:menu'
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          meta: {
 | 
					          meta: {
 | 
				
			||||||
            title: '一级菜单',
 | 
					            title: '一级菜单',
 | 
				
			||||||
            icon: 'ic:outline-menu'
 | 
					            i18nTitle: 'message.routes.multi-menu.first._value',
 | 
				
			||||||
 | 
					            icon: 'mdi:menu'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '多级菜单',
 | 
					        title: '多级菜单',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.multi-menu._value',
 | 
				
			||||||
        icon: 'carbon:menu',
 | 
					        icon: 'carbon:menu',
 | 
				
			||||||
        order: 7
 | 
					        order: 8
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -1012,10 +1251,12 @@ export const routeModel: Record<Auth.RoleType, AuthRoute.Route[]> = {
 | 
				
			|||||||
      component: 'self',
 | 
					      component: 'self',
 | 
				
			||||||
      meta: {
 | 
					      meta: {
 | 
				
			||||||
        title: '关于',
 | 
					        title: '关于',
 | 
				
			||||||
 | 
					        i18nTitle: 'message.routes.about',
 | 
				
			||||||
        requiresAuth: true,
 | 
					        requiresAuth: true,
 | 
				
			||||||
 | 
					        keepAlive: true,
 | 
				
			||||||
        singleLayout: 'basic',
 | 
					        singleLayout: 'basic',
 | 
				
			||||||
        icon: 'fluent:book-information-24-regular',
 | 
					        icon: 'fluent:book-information-24-regular',
 | 
				
			||||||
        order: 8
 | 
					        order: 10
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										225
									
								
								package.json
									
									
									
									
									
								
							
							
						
						@@ -1,112 +1,13 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "soybean-admin",
 | 
					  "name": "soybean-admin",
 | 
				
			||||||
  "version": "0.9.6",
 | 
					  "version": "0.10.3",
 | 
				
			||||||
 | 
					  "description": "A fresh and elegant admin template, based on Vue3、Vite3、TypeScript、NaiveUI and UnoCSS. 一个基于Vue3、Vite3、TypeScript、NaiveUI and UnoCSS的清新优雅的中后台模版。",
 | 
				
			||||||
  "author": {
 | 
					  "author": {
 | 
				
			||||||
    "name": "Soybean",
 | 
					    "name": "Soybean",
 | 
				
			||||||
    "email": "honghuangdc@gmail.com",
 | 
					    "email": "honghuangdc@gmail.com",
 | 
				
			||||||
    "url": "https://github.com/honghuangdc"
 | 
					    "url": "https://github.com/honghuangdc"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "scripts": {
 | 
					  "license": "MIT",
 | 
				
			||||||
    "dev": "cross-env VITE_ENV_TYPE=dev vite",
 | 
					 | 
				
			||||||
    "dev:test": "cross-env VITE_ENV_TYPE=test vite",
 | 
					 | 
				
			||||||
    "dev:prod": "cross-env VITE_ENV_TYPE=prod vite",
 | 
					 | 
				
			||||||
    "build": "npm run typecheck && cross-env VITE_ENV_TYPE=prod vite build",
 | 
					 | 
				
			||||||
    "build:dev": "npm run typecheck && cross-env VITE_ENV_TYPE=dev vite build",
 | 
					 | 
				
			||||||
    "build:test": "npm run typecheck && cross-env VITE_ENV_TYPE=test vite build",
 | 
					 | 
				
			||||||
    "build:vercel": "cross-env VITE_HASH_ROUTE=true vite build",
 | 
					 | 
				
			||||||
    "preview": "vite preview",
 | 
					 | 
				
			||||||
    "typecheck": "vue-tsc --noEmit",
 | 
					 | 
				
			||||||
    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix",
 | 
					 | 
				
			||||||
    "prepare": "husky install",
 | 
					 | 
				
			||||||
    "postinstall": "patch-package",
 | 
					 | 
				
			||||||
    "release": "standard-version",
 | 
					 | 
				
			||||||
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "lint-staged": {
 | 
					 | 
				
			||||||
    "*.{vue,js,jsx,ts,tsx}": "eslint --fix"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "config": {
 | 
					 | 
				
			||||||
    "commitizen": {
 | 
					 | 
				
			||||||
      "path": "./node_modules/cz-customizable"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "dependencies": {
 | 
					 | 
				
			||||||
    "@antv/data-set": "^0.11.8",
 | 
					 | 
				
			||||||
    "@antv/g2": "^4.2.3",
 | 
					 | 
				
			||||||
    "@better-scroll/core": "^2.4.2",
 | 
					 | 
				
			||||||
    "@soybeanjs/vue-admin-layout": "^1.0.4",
 | 
					 | 
				
			||||||
    "@soybeanjs/vue-admin-tab": "^1.0.2",
 | 
					 | 
				
			||||||
    "@vueuse/core": "^8.6.0",
 | 
					 | 
				
			||||||
    "axios": "^0.27.2",
 | 
					 | 
				
			||||||
    "clipboard": "^2.0.11",
 | 
					 | 
				
			||||||
    "colord": "^2.9.2",
 | 
					 | 
				
			||||||
    "crypto-js": "^4.1.1",
 | 
					 | 
				
			||||||
    "dayjs": "^1.11.3",
 | 
					 | 
				
			||||||
    "echarts": "^5.3.3",
 | 
					 | 
				
			||||||
    "form-data": "^4.0.0",
 | 
					 | 
				
			||||||
    "lodash-es": "^4.17.21",
 | 
					 | 
				
			||||||
    "naive-ui": "^2.30.4",
 | 
					 | 
				
			||||||
    "pinia": "^2.0.14",
 | 
					 | 
				
			||||||
    "print-js": "^1.6.0",
 | 
					 | 
				
			||||||
    "qs": "^6.10.5",
 | 
					 | 
				
			||||||
    "swiper": "^8.2.4",
 | 
					 | 
				
			||||||
    "ua-parser-js": "^1.0.2",
 | 
					 | 
				
			||||||
    "vditor": "^3.8.15",
 | 
					 | 
				
			||||||
    "vue": "3.2.37",
 | 
					 | 
				
			||||||
    "vue-router": "^4.0.16",
 | 
					 | 
				
			||||||
    "wangeditor": "^4.7.15",
 | 
					 | 
				
			||||||
    "xgplayer": "^2.31.6"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "devDependencies": {
 | 
					 | 
				
			||||||
    "@amap/amap-jsapi-types": "^0.0.8",
 | 
					 | 
				
			||||||
    "@commitlint/cli": "^17.0.2",
 | 
					 | 
				
			||||||
    "@commitlint/config-conventional": "^17.0.2",
 | 
					 | 
				
			||||||
    "@iconify/json": "^2.1.62",
 | 
					 | 
				
			||||||
    "@iconify/vue": "^3.2.1",
 | 
					 | 
				
			||||||
    "@types/bmapgl": "^0.0.5",
 | 
					 | 
				
			||||||
    "@types/crypto-js": "^4.1.1",
 | 
					 | 
				
			||||||
    "@types/node": "^17.0.44",
 | 
					 | 
				
			||||||
    "@types/qs": "^6.9.7",
 | 
					 | 
				
			||||||
    "@types/ua-parser-js": "^0.7.36",
 | 
					 | 
				
			||||||
    "@typescript-eslint/eslint-plugin": "^5.28.0",
 | 
					 | 
				
			||||||
    "@typescript-eslint/parser": "^5.28.0",
 | 
					 | 
				
			||||||
    "@vitejs/plugin-vue": "^2.3.3",
 | 
					 | 
				
			||||||
    "@vitejs/plugin-vue-jsx": "^1.3.10",
 | 
					 | 
				
			||||||
    "@vue/eslint-config-prettier": "^7.0.0",
 | 
					 | 
				
			||||||
    "@vue/eslint-config-typescript": "^11.0.0",
 | 
					 | 
				
			||||||
    "commitizen": "^4.2.4",
 | 
					 | 
				
			||||||
    "cross-env": "^7.0.3",
 | 
					 | 
				
			||||||
    "cz-conventional-changelog": "^3.3.0",
 | 
					 | 
				
			||||||
    "cz-customizable": "^6.3.0",
 | 
					 | 
				
			||||||
    "eslint": "^8.17.0",
 | 
					 | 
				
			||||||
    "eslint-config-airbnb-base": "^15.0.0",
 | 
					 | 
				
			||||||
    "eslint-config-prettier": "^8.5.0",
 | 
					 | 
				
			||||||
    "eslint-import-resolver-alias": "^1.1.2",
 | 
					 | 
				
			||||||
    "eslint-plugin-import": "^2.26.0",
 | 
					 | 
				
			||||||
    "eslint-plugin-prettier": "^4.0.0",
 | 
					 | 
				
			||||||
    "eslint-plugin-vue": "9.1.1",
 | 
					 | 
				
			||||||
    "husky": "^8.0.1",
 | 
					 | 
				
			||||||
    "lint-staged": "^13.0.1",
 | 
					 | 
				
			||||||
    "mockjs": "^1.1.0",
 | 
					 | 
				
			||||||
    "patch-package": "^6.4.7",
 | 
					 | 
				
			||||||
    "postinstall-postinstall": "^2.1.0",
 | 
					 | 
				
			||||||
    "prettier": "^2.7.0",
 | 
					 | 
				
			||||||
    "rollup-plugin-visualizer": "^5.6.0",
 | 
					 | 
				
			||||||
    "sass": "^1.52.3",
 | 
					 | 
				
			||||||
    "standard-version": "^9.5.0",
 | 
					 | 
				
			||||||
    "typescript": "^4.7.3",
 | 
					 | 
				
			||||||
    "unocss": "^0.39.0",
 | 
					 | 
				
			||||||
    "unplugin-icons": "^0.14.3",
 | 
					 | 
				
			||||||
    "unplugin-vue-components": "0.19.6",
 | 
					 | 
				
			||||||
    "unplugin-vue-define-options": "^0.6.1",
 | 
					 | 
				
			||||||
    "vite": "^2.9.12",
 | 
					 | 
				
			||||||
    "vite-plugin-compression": "^0.5.1",
 | 
					 | 
				
			||||||
    "vite-plugin-html": "^3.2.0",
 | 
					 | 
				
			||||||
    "vite-plugin-mock": "^2.9.6",
 | 
					 | 
				
			||||||
    "vite-plugin-svg-icons": "^2.0.1",
 | 
					 | 
				
			||||||
    "vue-eslint-parser": "^9.0.2",
 | 
					 | 
				
			||||||
    "vue-tsc": "^0.37.8"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "homepage": "https://github.com/honghuangdc/soybean-admin",
 | 
					  "homepage": "https://github.com/honghuangdc/soybean-admin",
 | 
				
			||||||
  "repository": {
 | 
					  "repository": {
 | 
				
			||||||
    "url": "https://github.com/honghuangdc/soybean-admin.git"
 | 
					    "url": "https://github.com/honghuangdc/soybean-admin.git"
 | 
				
			||||||
@@ -114,5 +15,123 @@
 | 
				
			|||||||
  "bugs": {
 | 
					  "bugs": {
 | 
				
			||||||
    "url": "https://github.com/honghuangdc/soybean-admin/issues"
 | 
					    "url": "https://github.com/honghuangdc/soybean-admin/issues"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "license": "MIT"
 | 
					  "keywords": [
 | 
				
			||||||
 | 
					    "Vue",
 | 
				
			||||||
 | 
					    "Vue3",
 | 
				
			||||||
 | 
					    "admin",
 | 
				
			||||||
 | 
					    "admin-template",
 | 
				
			||||||
 | 
					    "vue-admin",
 | 
				
			||||||
 | 
					    "vue-admin-template",
 | 
				
			||||||
 | 
					    "Vite3",
 | 
				
			||||||
 | 
					    "Vite",
 | 
				
			||||||
 | 
					    "vite-admin",
 | 
				
			||||||
 | 
					    "TypeScript",
 | 
				
			||||||
 | 
					    "TS",
 | 
				
			||||||
 | 
					    "NaiveUI",
 | 
				
			||||||
 | 
					    "naive-ui",
 | 
				
			||||||
 | 
					    "naive-admin",
 | 
				
			||||||
 | 
					    "NaiveUI-Admin",
 | 
				
			||||||
 | 
					    "naive-ui-admin",
 | 
				
			||||||
 | 
					    "UnoCSS"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "scripts": {
 | 
				
			||||||
 | 
					    "dev": "cross-env VITE_SERVICE_ENV=dev vite",
 | 
				
			||||||
 | 
					    "dev:test": "cross-env VITE_SERVICE_ENV=test vite",
 | 
				
			||||||
 | 
					    "dev:prod": "cross-env VITE_SERVICE_ENV=prod vite",
 | 
				
			||||||
 | 
					    "dev:tauri": "pnpm tauri dev",
 | 
				
			||||||
 | 
					    "build": "npm run typecheck && cross-env VITE_SERVICE_ENV=prod vite build",
 | 
				
			||||||
 | 
					    "build:dev": "npm run typecheck && cross-env VITE_SERVICE_ENV=dev vite build",
 | 
				
			||||||
 | 
					    "build:test": "npm run typecheck && cross-env VITE_SERVICE_ENV=test vite build",
 | 
				
			||||||
 | 
					    "build:vercel": "cross-env VITE_HASH_ROUTE=Y VITE_VERCEL=Y vite build",
 | 
				
			||||||
 | 
					    "build:tauri": "pnpm tauri build",
 | 
				
			||||||
 | 
					    "tauri-icon": "pnpm tauri icon ./public/logo.png",
 | 
				
			||||||
 | 
					    "preview": "vite preview",
 | 
				
			||||||
 | 
					    "typecheck": "vue-tsc --noEmit --skipLibCheck",
 | 
				
			||||||
 | 
					    "lint": "eslint . --fix",
 | 
				
			||||||
 | 
					    "format": "soy prettier-write",
 | 
				
			||||||
 | 
					    "commit": "soy git-commit",
 | 
				
			||||||
 | 
					    "cleanup": "soy cleanup",
 | 
				
			||||||
 | 
					    "update-pkg": "soy ncu",
 | 
				
			||||||
 | 
					    "release": "soy release",
 | 
				
			||||||
 | 
					    "tsx": "tsx",
 | 
				
			||||||
 | 
					    "logo": "tsx ./scripts/logo.ts",
 | 
				
			||||||
 | 
					    "prepare": "soy init-simple-git-hooks"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "@antv/data-set": "0.11.8",
 | 
				
			||||||
 | 
					    "@antv/g2": "4.2.10",
 | 
				
			||||||
 | 
					    "@better-scroll/core": "2.5.1",
 | 
				
			||||||
 | 
					    "@soybeanjs/vue-materials": "0.2.0",
 | 
				
			||||||
 | 
					    "@vueuse/core": "10.1.2",
 | 
				
			||||||
 | 
					    "axios": "1.4.0",
 | 
				
			||||||
 | 
					    "clipboard": "2.0.11",
 | 
				
			||||||
 | 
					    "colord": "2.9.3",
 | 
				
			||||||
 | 
					    "crypto-js": "4.1.1",
 | 
				
			||||||
 | 
					    "dayjs": "1.11.8",
 | 
				
			||||||
 | 
					    "echarts": "5.4.2",
 | 
				
			||||||
 | 
					    "form-data": "4.0.0",
 | 
				
			||||||
 | 
					    "lodash-es": "4.17.21",
 | 
				
			||||||
 | 
					    "naive-ui": "2.34.4",
 | 
				
			||||||
 | 
					    "pinia": "2.1.4",
 | 
				
			||||||
 | 
					    "print-js": "1.6.0",
 | 
				
			||||||
 | 
					    "qs": "6.11.2",
 | 
				
			||||||
 | 
					    "swiper": "9.4.1",
 | 
				
			||||||
 | 
					    "ua-parser-js": "1.0.35",
 | 
				
			||||||
 | 
					    "vditor": "3.9.3",
 | 
				
			||||||
 | 
					    "vue": "3.3.4",
 | 
				
			||||||
 | 
					    "vue-i18n": "9.2.2",
 | 
				
			||||||
 | 
					    "vue-router": "4.2.2",
 | 
				
			||||||
 | 
					    "vuedraggable": "4.1.0",
 | 
				
			||||||
 | 
					    "wangeditor": "4.7.15",
 | 
				
			||||||
 | 
					    "xgplayer": "3.0.4"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "devDependencies": {
 | 
				
			||||||
 | 
					    "@amap/amap-jsapi-types": "0.0.13",
 | 
				
			||||||
 | 
					    "@iconify/json": "2.2.78",
 | 
				
			||||||
 | 
					    "@iconify/vue": "4.1.1",
 | 
				
			||||||
 | 
					    "@soybeanjs/cli": "0.6.2",
 | 
				
			||||||
 | 
					    "@soybeanjs/vite-plugin-vue-page-route": "0.0.5",
 | 
				
			||||||
 | 
					    "@tauri-apps/cli": "^1.3.1",
 | 
				
			||||||
 | 
					    "@types/bmapgl": "0.0.7",
 | 
				
			||||||
 | 
					    "@types/crypto-js": "4.1.1",
 | 
				
			||||||
 | 
					    "@types/node": "20.3.1",
 | 
				
			||||||
 | 
					    "@types/qs": "6.9.7",
 | 
				
			||||||
 | 
					    "@types/ua-parser-js": "0.7.36",
 | 
				
			||||||
 | 
					    "@unocss/preset-uno": "0.53.1",
 | 
				
			||||||
 | 
					    "@unocss/transformer-directives": "0.53.1",
 | 
				
			||||||
 | 
					    "@unocss/vite": "0.53.1",
 | 
				
			||||||
 | 
					    "@vitejs/plugin-vue": "4.2.3",
 | 
				
			||||||
 | 
					    "@vitejs/plugin-vue-jsx": "3.0.1",
 | 
				
			||||||
 | 
					    "cross-env": "7.0.3",
 | 
				
			||||||
 | 
					    "eslint": "8.42.0",
 | 
				
			||||||
 | 
					    "eslint-config-soybeanjs": "0.4.9",
 | 
				
			||||||
 | 
					    "mockjs": "1.1.0",
 | 
				
			||||||
 | 
					    "rollup-plugin-visualizer": "5.9.2",
 | 
				
			||||||
 | 
					    "sass": "1.63.4",
 | 
				
			||||||
 | 
					    "simple-git-hooks": "2.8.1",
 | 
				
			||||||
 | 
					    "tsx": "3.12.7",
 | 
				
			||||||
 | 
					    "typescript": "5.1.3",
 | 
				
			||||||
 | 
					    "unplugin-icons": "0.16.3",
 | 
				
			||||||
 | 
					    "unplugin-vue-components": "0.25.1",
 | 
				
			||||||
 | 
					    "vite": "4.3.9",
 | 
				
			||||||
 | 
					    "vite-plugin-compression": "0.5.1",
 | 
				
			||||||
 | 
					    "vite-plugin-mock": "2.9.8",
 | 
				
			||||||
 | 
					    "vite-plugin-progress": "0.0.7",
 | 
				
			||||||
 | 
					    "vite-plugin-pwa": "0.16.4",
 | 
				
			||||||
 | 
					    "vite-plugin-svg-icons": "2.0.1",
 | 
				
			||||||
 | 
					    "vite-plugin-vue-devtools": "0.2.0",
 | 
				
			||||||
 | 
					    "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"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "soybean": {
 | 
				
			||||||
 | 
					    "useSoybeanToken": true
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										732
									
								
								patches/mockjs@1.1.0.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,732 @@
 | 
				
			|||||||
 | 
					diff --git a/dist/mock.js b/dist/mock.js
 | 
				
			||||||
 | 
					index 35d5b9af3eff34324656879705dcb81470fc9697..3e6a52e0fbfdd39d3aaf1592ffd19ecde33320f3 100644
 | 
				
			||||||
 | 
					--- a/dist/mock.js
 | 
				
			||||||
 | 
					+++ b/dist/mock.js
 | 
				
			||||||
 | 
					@@ -126,17 +126,17 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 /* 1 */
 | 
				
			||||||
 | 
					 /***/ (function(module, exports, __webpack_require__) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-	/*
 | 
				
			||||||
 | 
					+	/*
 | 
				
			||||||
 | 
					 	    ## Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	    处理数据模板。
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    * Handler.gen( template, name?, context? )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	        入口方法。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	    * Data Template Definition, DTD
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	        处理数据模板定义。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	        * Handler.array( options )
 | 
				
			||||||
 | 
					@@ -146,7 +146,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        * Handler.string( options )
 | 
				
			||||||
 | 
					 	        * Handler.function( options )
 | 
				
			||||||
 | 
					 	        * Handler.regexp( options )
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	        处理路径(相对和绝对)。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	        * Handler.getValueByKeyPath( key, options )
 | 
				
			||||||
 | 
					@@ -177,7 +177,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	    Handle.gen(template, name, options)
 | 
				
			||||||
 | 
					 	    context
 | 
				
			||||||
 | 
					-	        currentContext, templateCurrentContext,
 | 
				
			||||||
 | 
					+	        currentContext, templateCurrentContext,
 | 
				
			||||||
 | 
					 	        path, templatePath
 | 
				
			||||||
 | 
					 	        root, templateRoot
 | 
				
			||||||
 | 
					 	*/
 | 
				
			||||||
 | 
					@@ -456,7 +456,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	                phed = Handler.placeholder(ph, options.context.currentContext, options.context.templateCurrentContext, options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	                // 只有一个占位符,并且没有其他字符
 | 
				
			||||||
 | 
					-	                if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { //
 | 
				
			||||||
 | 
					+	                if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { //
 | 
				
			||||||
 | 
					 	                    result = phed
 | 
				
			||||||
 | 
					 	                    break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@@ -627,7 +627,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	            }
 | 
				
			||||||
 | 
					 	            // 引用的值已经计算好
 | 
				
			||||||
 | 
					 	            if (currentContext && (key in currentContext)) return currentContext[key]
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	            // 尚未计算,递归引用数据模板中的属性
 | 
				
			||||||
 | 
					 	            if (templateCurrentContext &&
 | 
				
			||||||
 | 
					 	                (typeof templateCurrentContext === 'object') &&
 | 
				
			||||||
 | 
					@@ -816,13 +816,13 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        var tpl = Mock.heredoc(function() {
 | 
				
			||||||
 | 
					 	            /*!
 | 
				
			||||||
 | 
					 	        {{email}}{{age}}
 | 
				
			||||||
 | 
					-	        <!-- Mock {
 | 
				
			||||||
 | 
					+	        <!-- Mock {
 | 
				
			||||||
 | 
					 	            email: '@EMAIL',
 | 
				
			||||||
 | 
					 	            age: '@INT(1,100)'
 | 
				
			||||||
 | 
					 	        } -->
 | 
				
			||||||
 | 
					 	            *\/
 | 
				
			||||||
 | 
					 	        })
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    **相关阅读**
 | 
				
			||||||
 | 
					 	    * [Creating multiline strings in JavaScript](http://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript)、
 | 
				
			||||||
 | 
					 	*/
 | 
				
			||||||
 | 
					@@ -850,7 +850,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 		解析数据模板(属性名部分)。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 		* Parser.parse( name )
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 			```json
 | 
				
			||||||
 | 
					 			{
 | 
				
			||||||
 | 
					 				parameters: [ name, inc, range, decimal ],
 | 
				
			||||||
 | 
					@@ -922,7 +922,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					 	    ## Mock.Random
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    工具类,用于生成各种随机数据。
 | 
				
			||||||
 | 
					 	*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@@ -1251,7 +1251,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	        替代图片源
 | 
				
			||||||
 | 
					 	            http://fpoimg.com/
 | 
				
			||||||
 | 
					-	        参考自
 | 
				
			||||||
 | 
					+	        参考自
 | 
				
			||||||
 | 
					 	            http://rensanning.iteye.com/blog/1933310
 | 
				
			||||||
 | 
					 	            http://code.tutsplus.com/articles/the-top-8-placeholders-for-web-designers--net-19485
 | 
				
			||||||
 | 
					 	    */
 | 
				
			||||||
 | 
					@@ -1541,7 +1541,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        var bg_colour = Math.floor(Math.random() * 16777215).toString(16);
 | 
				
			||||||
 | 
					 	        bg_colour = "#" + ("000000" + bg_colour).slice(-6);
 | 
				
			||||||
 | 
					 	        document.bgColor = bg_colour;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
 | 
				
			||||||
 | 
					 	        Creating random colors is actually more difficult than it seems. The randomness itself is easy, but aesthetically pleasing randomness is more difficult.
 | 
				
			||||||
 | 
					 	        https://github.com/devongovett/color-generator
 | 
				
			||||||
 | 
					@@ -1561,7 +1561,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	    http://tool.c7sky.com/webcolor
 | 
				
			||||||
 | 
					 	        网页设计常用色彩搭配表
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    https://github.com/One-com/one-color
 | 
				
			||||||
 | 
					 	        An OO-based JavaScript color parser/computation toolkit with support for RGB, HSV, HSL, CMYK, and alpha channels.
 | 
				
			||||||
 | 
					 	        API 很赞
 | 
				
			||||||
 | 
					@@ -1593,7 +1593,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	            color += letters[Math.floor(Math.random() * 16)]
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        return color
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	        // 随机生成一个无脑的颜色,格式为 '#RRGGBB'。
 | 
				
			||||||
 | 
					 	        // _brainlessColor()
 | 
				
			||||||
 | 
					 	        var color = Math.floor(
 | 
				
			||||||
 | 
					@@ -1959,7 +1959,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        return result.join(' ')
 | 
				
			||||||
 | 
					 	    },
 | 
				
			||||||
 | 
					-	    //
 | 
				
			||||||
 | 
					+	    //
 | 
				
			||||||
 | 
					 	    cparagraph: function(min, max) {
 | 
				
			||||||
 | 
					 	        var len = range(3, 7, min, max)
 | 
				
			||||||
 | 
					 	        var result = []
 | 
				
			||||||
 | 
					@@ -2282,17 +2282,17 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        随机生成一个 URL。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	        [URL 规范](http://www.w3.org/Addressing/URL/url-spec.txt)
 | 
				
			||||||
 | 
					-	            http                    Hypertext Transfer Protocol
 | 
				
			||||||
 | 
					-	            ftp                     File Transfer protocol
 | 
				
			||||||
 | 
					-	            gopher                  The Gopher protocol
 | 
				
			||||||
 | 
					-	            mailto                  Electronic mail address
 | 
				
			||||||
 | 
					-	            mid                     Message identifiers for electronic mail
 | 
				
			||||||
 | 
					-	            cid                     Content identifiers for MIME body part
 | 
				
			||||||
 | 
					-	            news                    Usenet news
 | 
				
			||||||
 | 
					-	            nntp                    Usenet news for local NNTP access only
 | 
				
			||||||
 | 
					-	            prospero                Access using the prospero protocols
 | 
				
			||||||
 | 
					+	            http                    Hypertext Transfer Protocol
 | 
				
			||||||
 | 
					+	            ftp                     File Transfer protocol
 | 
				
			||||||
 | 
					+	            gopher                  The Gopher protocol
 | 
				
			||||||
 | 
					+	            mailto                  Electronic mail address
 | 
				
			||||||
 | 
					+	            mid                     Message identifiers for electronic mail
 | 
				
			||||||
 | 
					+	            cid                     Content identifiers for MIME body part
 | 
				
			||||||
 | 
					+	            news                    Usenet news
 | 
				
			||||||
 | 
					+	            nntp                    Usenet news for local NNTP access only
 | 
				
			||||||
 | 
					+	            prospero                Access using the prospero protocols
 | 
				
			||||||
 | 
					 	            telnet rlogin tn3270    Reference to interactive sessions
 | 
				
			||||||
 | 
					-	            wais                    Wide Area Information Servers
 | 
				
			||||||
 | 
					+	            wais                    Wide Area Information Servers
 | 
				
			||||||
 | 
					 	    */
 | 
				
			||||||
 | 
					 	    url: function(protocol, host) {
 | 
				
			||||||
 | 
					 	        return (protocol || this.protocol()) + '://' + // protocol?
 | 
				
			||||||
 | 
					@@ -2422,9 +2422,9 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	    西南   重庆市 四川省 贵州省 云南省 西藏自治区
 | 
				
			||||||
 | 
					 	    西北   陕西省 甘肃省 青海省 宁夏回族自治区 新疆维吾尔自治区
 | 
				
			||||||
 | 
					 	    港澳台 香港特别行政区 澳门特别行政区 台湾省
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    **排序**
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    ```js
 | 
				
			||||||
 | 
					 	    var map = {}
 | 
				
			||||||
 | 
					 	    _.each(_.keys(REGIONS),function(id){
 | 
				
			||||||
 | 
					@@ -6527,7 +6527,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 		                "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
 | 
				
			||||||
 | 
					 		                "a" / "b" / "c" / "d" / "e" / "f" /
 | 
				
			||||||
 | 
					 		                "A" / "B" / "C" / "D" / "E" / "F"
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		    https://github.com/victorquinn/chancejs/blob/develop/chance.js#L1349
 | 
				
			||||||
 | 
					 		*/
 | 
				
			||||||
 | 
					 		guid: function() {
 | 
				
			||||||
 | 
					@@ -6629,7 +6629,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	function CaptureGroup(n) {
 | 
				
			||||||
 | 
					-	    Group.call(this, "capture-group"), this.index = cgs[this.offset] || (cgs[this.offset] = index++),
 | 
				
			||||||
 | 
					+	    Group.call(this, "capture-group"), this.index = cgs[this.offset] || (cgs[this.offset] = index++),
 | 
				
			||||||
 | 
					 	    this.body = n;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@@ -6711,7 +6711,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	            }
 | 
				
			||||||
 | 
					 	            return r = l ? '"' + u(l) + '"' : "end of input", "Expected " + t + " but " + r + " found.";
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					-	        this.expected = n, this.found = l, this.offset = u, this.line = t, this.column = r,
 | 
				
			||||||
 | 
					+	        this.expected = n, this.found = l, this.offset = u, this.line = t, this.column = r,
 | 
				
			||||||
 | 
					 	        this.name = "SyntaxError", this.message = e(n, l);
 | 
				
			||||||
 | 
					 	    }
 | 
				
			||||||
 | 
					 	    function u(n) {
 | 
				
			||||||
 | 
					@@ -6724,8 +6724,8 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        function r(l) {
 | 
				
			||||||
 | 
					 	            function u(l, u, t) {
 | 
				
			||||||
 | 
					 	                var r, e;
 | 
				
			||||||
 | 
					-	                for (r = u; t > r; r++) e = n.charAt(r), "\n" === e ? (l.seenCR || l.line++, l.column = 1,
 | 
				
			||||||
 | 
					-	                l.seenCR = !1) : "\r" === e || "\u2028" === e || "\u2029" === e ? (l.line++, l.column = 1,
 | 
				
			||||||
 | 
					+	                for (r = u; t > r; r++) e = n.charAt(r), "\n" === e ? (l.seenCR || l.line++, l.column = 1,
 | 
				
			||||||
 | 
					+	                l.seenCR = !1) : "\r" === e || "\u2028" === e || "\u2029" === e ? (l.line++, l.column = 1,
 | 
				
			||||||
 | 
					 	                l.seenCR = !0) : (l.column++, l.seenCR = !1);
 | 
				
			||||||
 | 
					 	            }
 | 
				
			||||||
 | 
					 	            return Mt !== l && (Mt > l && (Mt = 0, Dt = {
 | 
				
			||||||
 | 
					@@ -6743,19 +6743,19 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function c() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r, o;
 | 
				
			||||||
 | 
					-	            return l = qt, u = i(), null !== u ? (t = qt, 124 === n.charCodeAt(qt) ? (r = fl,
 | 
				
			||||||
 | 
					-	            qt++) : (r = null, 0 === Wt && e(sl)), null !== r ? (o = c(), null !== o ? (r = [ r, o ],
 | 
				
			||||||
 | 
					-	            t = r) : (qt = t, t = il)) : (qt = t, t = il), null === t && (t = al), null !== t ? (Lt = l,
 | 
				
			||||||
 | 
					-	            u = hl(u, t), null === u ? (qt = l, l = u) : l = u) : (qt = l, l = il)) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, u = i(), null !== u ? (t = qt, 124 === n.charCodeAt(qt) ? (r = fl,
 | 
				
			||||||
 | 
					+	            qt++) : (r = null, 0 === Wt && e(sl)), null !== r ? (o = c(), null !== o ? (r = [ r, o ],
 | 
				
			||||||
 | 
					+	            t = r) : (qt = t, t = il)) : (qt = t, t = il), null === t && (t = al), null !== t ? (Lt = l,
 | 
				
			||||||
 | 
					+	            u = hl(u, t), null === u ? (qt = l, l = u) : l = u) : (qt = l, l = il)) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function i() {
 | 
				
			||||||
 | 
					 	            var n, l, u, t, r;
 | 
				
			||||||
 | 
					-	            if (n = qt, l = f(), null === l && (l = al), null !== l) if (u = qt, Wt++, t = d(),
 | 
				
			||||||
 | 
					+	            if (n = qt, l = f(), null === l && (l = al), null !== l) if (u = qt, Wt++, t = d(),
 | 
				
			||||||
 | 
					 	            Wt--, null === t ? u = al : (qt = u, u = il), null !== u) {
 | 
				
			||||||
 | 
					-	                for (t = [], r = h(), null === r && (r = a()); null !== r; ) t.push(r), r = h(),
 | 
				
			||||||
 | 
					+	                for (t = [], r = h(), null === r && (r = a()); null !== r; ) t.push(r), r = h(),
 | 
				
			||||||
 | 
					 	                null === r && (r = a());
 | 
				
			||||||
 | 
					-	                null !== t ? (r = s(), null === r && (r = al), null !== r ? (Lt = n, l = dl(l, t, r),
 | 
				
			||||||
 | 
					+	                null !== t ? (r = s(), null === r && (r = al), null !== r ? (Lt = n, l = dl(l, t, r),
 | 
				
			||||||
 | 
					 	                null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il);
 | 
				
			||||||
 | 
					 	            } else qt = n, n = il; else qt = n, n = il;
 | 
				
			||||||
 | 
					 	            return n;
 | 
				
			||||||
 | 
					@@ -6766,148 +6766,148 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function f() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, 94 === n.charCodeAt(qt) ? (u = pl, qt++) : (u = null, 0 === Wt && e(vl)),
 | 
				
			||||||
 | 
					+	            return l = qt, 94 === n.charCodeAt(qt) ? (u = pl, qt++) : (u = null, 0 === Wt && e(vl)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = wl()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function s() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, 36 === n.charCodeAt(qt) ? (u = Al, qt++) : (u = null, 0 === Wt && e(Cl)),
 | 
				
			||||||
 | 
					+	            return l = qt, 36 === n.charCodeAt(qt) ? (u = Al, qt++) : (u = null, 0 === Wt && e(Cl)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = gl()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function h() {
 | 
				
			||||||
 | 
					 	            var n, l, u;
 | 
				
			||||||
 | 
					-	            return n = qt, l = a(), null !== l ? (u = d(), null !== u ? (Lt = n, l = bl(l, u),
 | 
				
			||||||
 | 
					+	            return n = qt, l = a(), null !== l ? (u = d(), null !== u ? (Lt = n, l = bl(l, u),
 | 
				
			||||||
 | 
					 	            null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n, n = il), n;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function d() {
 | 
				
			||||||
 | 
					 	            var n, l, u;
 | 
				
			||||||
 | 
					-	            return Wt++, n = qt, l = p(), null !== l ? (u = k(), null === u && (u = al), null !== u ? (Lt = n,
 | 
				
			||||||
 | 
					-	            l = Tl(l, u), null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n,
 | 
				
			||||||
 | 
					+	            return Wt++, n = qt, l = p(), null !== l ? (u = k(), null === u && (u = al), null !== u ? (Lt = n,
 | 
				
			||||||
 | 
					+	            l = Tl(l, u), null === l ? (qt = n, n = l) : n = l) : (qt = n, n = il)) : (qt = n,
 | 
				
			||||||
 | 
					 	            n = il), Wt--, null === n && (l = null, 0 === Wt && e(kl)), n;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function p() {
 | 
				
			||||||
 | 
					 	            var n;
 | 
				
			||||||
 | 
					-	            return n = v(), null === n && (n = w(), null === n && (n = A(), null === n && (n = C(),
 | 
				
			||||||
 | 
					+	            return n = v(), null === n && (n = w(), null === n && (n = A(), null === n && (n = C(),
 | 
				
			||||||
 | 
					 	            null === n && (n = g(), null === n && (n = b()))))), n;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function v() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r, o, c;
 | 
				
			||||||
 | 
					-	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)),
 | 
				
			||||||
 | 
					-	            null !== u ? (t = T(), null !== t ? (44 === n.charCodeAt(qt) ? (r = ml, qt++) : (r = null,
 | 
				
			||||||
 | 
					-	            0 === Wt && e(Rl)), null !== r ? (o = T(), null !== o ? (125 === n.charCodeAt(qt) ? (c = Fl,
 | 
				
			||||||
 | 
					-	            qt++) : (c = null, 0 === Wt && e(Ql)), null !== c ? (Lt = l, u = Sl(t, o), null === u ? (qt = l,
 | 
				
			||||||
 | 
					-	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)),
 | 
				
			||||||
 | 
					+	            null !== u ? (t = T(), null !== t ? (44 === n.charCodeAt(qt) ? (r = ml, qt++) : (r = null,
 | 
				
			||||||
 | 
					+	            0 === Wt && e(Rl)), null !== r ? (o = T(), null !== o ? (125 === n.charCodeAt(qt) ? (c = Fl,
 | 
				
			||||||
 | 
					+	            qt++) : (c = null, 0 === Wt && e(Ql)), null !== c ? (Lt = l, u = Sl(t, o), null === u ? (qt = l,
 | 
				
			||||||
 | 
					+	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function w() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r;
 | 
				
			||||||
 | 
					-	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)),
 | 
				
			||||||
 | 
					-	            null !== u ? (t = T(), null !== t ? (n.substr(qt, 2) === Ul ? (r = Ul, qt += 2) : (r = null,
 | 
				
			||||||
 | 
					-	            0 === Wt && e(El)), null !== r ? (Lt = l, u = Gl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)),
 | 
				
			||||||
 | 
					+	            null !== u ? (t = T(), null !== t ? (n.substr(qt, 2) === Ul ? (r = Ul, qt += 2) : (r = null,
 | 
				
			||||||
 | 
					+	            0 === Wt && e(El)), null !== r ? (Lt = l, u = Gl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function A() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r;
 | 
				
			||||||
 | 
					-	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)),
 | 
				
			||||||
 | 
					-	            null !== u ? (t = T(), null !== t ? (125 === n.charCodeAt(qt) ? (r = Fl, qt++) : (r = null,
 | 
				
			||||||
 | 
					-	            0 === Wt && e(Ql)), null !== r ? (Lt = l, u = Bl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, 123 === n.charCodeAt(qt) ? (u = xl, qt++) : (u = null, 0 === Wt && e(yl)),
 | 
				
			||||||
 | 
					+	            null !== u ? (t = T(), null !== t ? (125 === n.charCodeAt(qt) ? (r = Fl, qt++) : (r = null,
 | 
				
			||||||
 | 
					+	            0 === Wt && e(Ql)), null !== r ? (Lt = l, u = Bl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function C() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, 43 === n.charCodeAt(qt) ? (u = jl, qt++) : (u = null, 0 === Wt && e($l)),
 | 
				
			||||||
 | 
					+	            return l = qt, 43 === n.charCodeAt(qt) ? (u = jl, qt++) : (u = null, 0 === Wt && e($l)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = ql()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function g() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, 42 === n.charCodeAt(qt) ? (u = Ll, qt++) : (u = null, 0 === Wt && e(Ml)),
 | 
				
			||||||
 | 
					+	            return l = qt, 42 === n.charCodeAt(qt) ? (u = Ll, qt++) : (u = null, 0 === Wt && e(Ml)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Dl()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function b() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, 63 === n.charCodeAt(qt) ? (u = Hl, qt++) : (u = null, 0 === Wt && e(Ol)),
 | 
				
			||||||
 | 
					+	            return l = qt, 63 === n.charCodeAt(qt) ? (u = Hl, qt++) : (u = null, 0 === Wt && e(Ol)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Wl()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function k() {
 | 
				
			||||||
 | 
					 	            var l;
 | 
				
			||||||
 | 
					-	            return 63 === n.charCodeAt(qt) ? (l = Hl, qt++) : (l = null, 0 === Wt && e(Ol)),
 | 
				
			||||||
 | 
					+	            return 63 === n.charCodeAt(qt) ? (l = Hl, qt++) : (l = null, 0 === Wt && e(Ol)),
 | 
				
			||||||
 | 
					 	            l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function T() {
 | 
				
			||||||
 | 
					 	            var l, u, t;
 | 
				
			||||||
 | 
					-	            if (l = qt, u = [], zl.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null,
 | 
				
			||||||
 | 
					-	            0 === Wt && e(Il)), null !== t) for (;null !== t; ) u.push(t), zl.test(n.charAt(qt)) ? (t = n.charAt(qt),
 | 
				
			||||||
 | 
					+	            if (l = qt, u = [], zl.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null,
 | 
				
			||||||
 | 
					+	            0 === Wt && e(Il)), null !== t) for (;null !== t; ) u.push(t), zl.test(n.charAt(qt)) ? (t = n.charAt(qt),
 | 
				
			||||||
 | 
					 	            qt++) : (t = null, 0 === Wt && e(Il)); else u = il;
 | 
				
			||||||
 | 
					-	            return null !== u && (Lt = l, u = Jl(u)), null === u ? (qt = l, l = u) : l = u,
 | 
				
			||||||
 | 
					+	            return null !== u && (Lt = l, u = Jl(u)), null === u ? (qt = l, l = u) : l = u,
 | 
				
			||||||
 | 
					 	            l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function x() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r;
 | 
				
			||||||
 | 
					-	            return l = qt, 40 === n.charCodeAt(qt) ? (u = Kl, qt++) : (u = null, 0 === Wt && e(Nl)),
 | 
				
			||||||
 | 
					-	            null !== u ? (t = R(), null === t && (t = F(), null === t && (t = m(), null === t && (t = y()))),
 | 
				
			||||||
 | 
					-	            null !== t ? (41 === n.charCodeAt(qt) ? (r = Pl, qt++) : (r = null, 0 === Wt && e(Vl)),
 | 
				
			||||||
 | 
					-	            null !== r ? (Lt = l, u = Xl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, 40 === n.charCodeAt(qt) ? (u = Kl, qt++) : (u = null, 0 === Wt && e(Nl)),
 | 
				
			||||||
 | 
					+	            null !== u ? (t = R(), null === t && (t = F(), null === t && (t = m(), null === t && (t = y()))),
 | 
				
			||||||
 | 
					+	            null !== t ? (41 === n.charCodeAt(qt) ? (r = Pl, qt++) : (r = null, 0 === Wt && e(Vl)),
 | 
				
			||||||
 | 
					+	            null !== r ? (Lt = l, u = Xl(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function y() {
 | 
				
			||||||
 | 
					 	            var n, l;
 | 
				
			||||||
 | 
					-	            return n = qt, l = c(), null !== l && (Lt = n, l = Yl(l)), null === l ? (qt = n,
 | 
				
			||||||
 | 
					+	            return n = qt, l = c(), null !== l && (Lt = n, l = Yl(l)), null === l ? (qt = n,
 | 
				
			||||||
 | 
					 	            n = l) : n = l, n;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function m() {
 | 
				
			||||||
 | 
					 	            var l, u, t;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Zl ? (u = Zl, qt += 2) : (u = null, 0 === Wt && e(_l)),
 | 
				
			||||||
 | 
					-	            null !== u ? (t = c(), null !== t ? (Lt = l, u = nu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Zl ? (u = Zl, qt += 2) : (u = null, 0 === Wt && e(_l)),
 | 
				
			||||||
 | 
					+	            null !== u ? (t = c(), null !== t ? (Lt = l, u = nu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function R() {
 | 
				
			||||||
 | 
					 	            var l, u, t;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === lu ? (u = lu, qt += 2) : (u = null, 0 === Wt && e(uu)),
 | 
				
			||||||
 | 
					-	            null !== u ? (t = c(), null !== t ? (Lt = l, u = tu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === lu ? (u = lu, qt += 2) : (u = null, 0 === Wt && e(uu)),
 | 
				
			||||||
 | 
					+	            null !== u ? (t = c(), null !== t ? (Lt = l, u = tu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function F() {
 | 
				
			||||||
 | 
					 	            var l, u, t;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === ru ? (u = ru, qt += 2) : (u = null, 0 === Wt && e(eu)),
 | 
				
			||||||
 | 
					-	            null !== u ? (t = c(), null !== t ? (Lt = l, u = ou(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === ru ? (u = ru, qt += 2) : (u = null, 0 === Wt && e(eu)),
 | 
				
			||||||
 | 
					+	            null !== u ? (t = c(), null !== t ? (Lt = l, u = ou(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function Q() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r, o;
 | 
				
			||||||
 | 
					-	            if (Wt++, l = qt, 91 === n.charCodeAt(qt) ? (u = iu, qt++) : (u = null, 0 === Wt && e(au)),
 | 
				
			||||||
 | 
					-	            null !== u) if (94 === n.charCodeAt(qt) ? (t = pl, qt++) : (t = null, 0 === Wt && e(vl)),
 | 
				
			||||||
 | 
					+	            if (Wt++, l = qt, 91 === n.charCodeAt(qt) ? (u = iu, qt++) : (u = null, 0 === Wt && e(au)),
 | 
				
			||||||
 | 
					+	            null !== u) if (94 === n.charCodeAt(qt) ? (t = pl, qt++) : (t = null, 0 === Wt && e(vl)),
 | 
				
			||||||
 | 
					 	            null === t && (t = al), null !== t) {
 | 
				
			||||||
 | 
					-	                for (r = [], o = S(), null === o && (o = U()); null !== o; ) r.push(o), o = S(),
 | 
				
			||||||
 | 
					+	                for (r = [], o = S(), null === o && (o = U()); null !== o; ) r.push(o), o = S(),
 | 
				
			||||||
 | 
					 	                null === o && (o = U());
 | 
				
			||||||
 | 
					-	                null !== r ? (93 === n.charCodeAt(qt) ? (o = fu, qt++) : (o = null, 0 === Wt && e(su)),
 | 
				
			||||||
 | 
					-	                null !== o ? (Lt = l, u = hu(t, r), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	                null !== r ? (93 === n.charCodeAt(qt) ? (o = fu, qt++) : (o = null, 0 === Wt && e(su)),
 | 
				
			||||||
 | 
					+	                null !== o ? (Lt = l, u = hu(t, r), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	                l = il)) : (qt = l, l = il);
 | 
				
			||||||
 | 
					 	            } else qt = l, l = il; else qt = l, l = il;
 | 
				
			||||||
 | 
					 	            return Wt--, null === l && (u = null, 0 === Wt && e(cu)), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function S() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r;
 | 
				
			||||||
 | 
					-	            return Wt++, l = qt, u = U(), null !== u ? (45 === n.charCodeAt(qt) ? (t = pu, qt++) : (t = null,
 | 
				
			||||||
 | 
					-	            0 === Wt && e(vu)), null !== t ? (r = U(), null !== r ? (Lt = l, u = wu(u, r), null === u ? (qt = l,
 | 
				
			||||||
 | 
					-	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il), Wt--,
 | 
				
			||||||
 | 
					+	            return Wt++, l = qt, u = U(), null !== u ? (45 === n.charCodeAt(qt) ? (t = pu, qt++) : (t = null,
 | 
				
			||||||
 | 
					+	            0 === Wt && e(vu)), null !== t ? (r = U(), null !== r ? (Lt = l, u = wu(u, r), null === u ? (qt = l,
 | 
				
			||||||
 | 
					+	            l = u) : l = u) : (qt = l, l = il)) : (qt = l, l = il)) : (qt = l, l = il), Wt--,
 | 
				
			||||||
 | 
					 	            null === l && (u = null, 0 === Wt && e(du)), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function U() {
 | 
				
			||||||
 | 
					 	            var n, l;
 | 
				
			||||||
 | 
					-	            return Wt++, n = G(), null === n && (n = E()), Wt--, null === n && (l = null, 0 === Wt && e(Au)),
 | 
				
			||||||
 | 
					+	            return Wt++, n = G(), null === n && (n = E()), Wt--, null === n && (l = null, 0 === Wt && e(Au)),
 | 
				
			||||||
 | 
					 	            n;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function E() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, Cu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, 0 === Wt && e(gu)),
 | 
				
			||||||
 | 
					+	            return l = qt, Cu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null, 0 === Wt && e(gu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function G() {
 | 
				
			||||||
 | 
					 	            var n;
 | 
				
			||||||
 | 
					-	            return n = L(), null === n && (n = Y(), null === n && (n = H(), null === n && (n = O(),
 | 
				
			||||||
 | 
					-	            null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), null === n && (n = J(),
 | 
				
			||||||
 | 
					-	            null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), null === n && (n = V(),
 | 
				
			||||||
 | 
					-	            null === n && (n = X(), null === n && (n = _(), null === n && (n = nl(), null === n && (n = ll(),
 | 
				
			||||||
 | 
					+	            return n = L(), null === n && (n = Y(), null === n && (n = H(), null === n && (n = O(),
 | 
				
			||||||
 | 
					+	            null === n && (n = W(), null === n && (n = z(), null === n && (n = I(), null === n && (n = J(),
 | 
				
			||||||
 | 
					+	            null === n && (n = K(), null === n && (n = N(), null === n && (n = P(), null === n && (n = V(),
 | 
				
			||||||
 | 
					+	            null === n && (n = X(), null === n && (n = _(), null === n && (n = nl(), null === n && (n = ll(),
 | 
				
			||||||
 | 
					 	            null === n && (n = ul(), null === n && (n = tl()))))))))))))))))), n;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function B() {
 | 
				
			||||||
 | 
					@@ -6916,154 +6916,154 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function j() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, 46 === n.charCodeAt(qt) ? (u = ku, qt++) : (u = null, 0 === Wt && e(Tu)),
 | 
				
			||||||
 | 
					+	            return l = qt, 46 === n.charCodeAt(qt) ? (u = ku, qt++) : (u = null, 0 === Wt && e(Tu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = xu()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function $() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return Wt++, l = qt, mu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null,
 | 
				
			||||||
 | 
					-	            0 === Wt && e(Ru)), null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u,
 | 
				
			||||||
 | 
					+	            return Wt++, l = qt, mu.test(n.charAt(qt)) ? (u = n.charAt(qt), qt++) : (u = null,
 | 
				
			||||||
 | 
					+	            0 === Wt && e(Ru)), null !== u && (Lt = l, u = bu(u)), null === u ? (qt = l, l = u) : l = u,
 | 
				
			||||||
 | 
					 	            Wt--, null === l && (u = null, 0 === Wt && e(yu)), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function q() {
 | 
				
			||||||
 | 
					 	            var n;
 | 
				
			||||||
 | 
					-	            return n = M(), null === n && (n = D(), null === n && (n = Y(), null === n && (n = H(),
 | 
				
			||||||
 | 
					-	            null === n && (n = O(), null === n && (n = W(), null === n && (n = z(), null === n && (n = I(),
 | 
				
			||||||
 | 
					-	            null === n && (n = J(), null === n && (n = K(), null === n && (n = N(), null === n && (n = P(),
 | 
				
			||||||
 | 
					-	            null === n && (n = V(), null === n && (n = X(), null === n && (n = Z(), null === n && (n = _(),
 | 
				
			||||||
 | 
					-	            null === n && (n = nl(), null === n && (n = ll(), null === n && (n = ul(), null === n && (n = tl()))))))))))))))))))),
 | 
				
			||||||
 | 
					+	            return n = M(), null === n && (n = D(), null === n && (n = Y(), null === n && (n = H(),
 | 
				
			||||||
 | 
					+	            null === n && (n = O(), null === n && (n = W(), null === n && (n = z(), null === n && (n = I(),
 | 
				
			||||||
 | 
					+	            null === n && (n = J(), null === n && (n = K(), null === n && (n = N(), null === n && (n = P(),
 | 
				
			||||||
 | 
					+	            null === n && (n = V(), null === n && (n = X(), null === n && (n = Z(), null === n && (n = _(),
 | 
				
			||||||
 | 
					+	            null === n && (n = nl(), null === n && (n = ll(), null === n && (n = ul(), null === n && (n = tl()))))))))))))))))))),
 | 
				
			||||||
 | 
					 	            n;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function L() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Su()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function M() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Fu ? (u = Fu, qt += 2) : (u = null, 0 === Wt && e(Qu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Uu()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function D() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Eu ? (u = Eu, qt += 2) : (u = null, 0 === Wt && e(Gu)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Eu ? (u = Eu, qt += 2) : (u = null, 0 === Wt && e(Gu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Bu()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function H() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === ju ? (u = ju, qt += 2) : (u = null, 0 === Wt && e($u)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === ju ? (u = ju, qt += 2) : (u = null, 0 === Wt && e($u)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = qu()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function O() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Lu ? (u = Lu, qt += 2) : (u = null, 0 === Wt && e(Mu)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Lu ? (u = Lu, qt += 2) : (u = null, 0 === Wt && e(Mu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Du()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function W() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Hu ? (u = Hu, qt += 2) : (u = null, 0 === Wt && e(Ou)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Hu ? (u = Hu, qt += 2) : (u = null, 0 === Wt && e(Ou)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Wu()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function z() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === zu ? (u = zu, qt += 2) : (u = null, 0 === Wt && e(Iu)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === zu ? (u = zu, qt += 2) : (u = null, 0 === Wt && e(Iu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Ju()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function I() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Ku ? (u = Ku, qt += 2) : (u = null, 0 === Wt && e(Nu)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Ku ? (u = Ku, qt += 2) : (u = null, 0 === Wt && e(Nu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Pu()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function J() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Vu ? (u = Vu, qt += 2) : (u = null, 0 === Wt && e(Xu)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Vu ? (u = Vu, qt += 2) : (u = null, 0 === Wt && e(Xu)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = Yu()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function K() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Zu ? (u = Zu, qt += 2) : (u = null, 0 === Wt && e(_u)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Zu ? (u = Zu, qt += 2) : (u = null, 0 === Wt && e(_u)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = nt()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function N() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === lt ? (u = lt, qt += 2) : (u = null, 0 === Wt && e(ut)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === lt ? (u = lt, qt += 2) : (u = null, 0 === Wt && e(ut)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = tt()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function P() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === rt ? (u = rt, qt += 2) : (u = null, 0 === Wt && e(et)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === rt ? (u = rt, qt += 2) : (u = null, 0 === Wt && e(et)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = ot()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function V() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === ct ? (u = ct, qt += 2) : (u = null, 0 === Wt && e(it)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === ct ? (u = ct, qt += 2) : (u = null, 0 === Wt && e(it)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = at()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function X() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === ft ? (u = ft, qt += 2) : (u = null, 0 === Wt && e(st)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === ft ? (u = ft, qt += 2) : (u = null, 0 === Wt && e(st)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = ht()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function Y() {
 | 
				
			||||||
 | 
					 	            var l, u, t;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === dt ? (u = dt, qt += 2) : (u = null, 0 === Wt && e(pt)),
 | 
				
			||||||
 | 
					-	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)),
 | 
				
			||||||
 | 
					-	            null !== t ? (Lt = l, u = wt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === dt ? (u = dt, qt += 2) : (u = null, 0 === Wt && e(pt)),
 | 
				
			||||||
 | 
					+	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)),
 | 
				
			||||||
 | 
					+	            null !== t ? (Lt = l, u = wt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function Z() {
 | 
				
			||||||
 | 
					 	            var l, u, t;
 | 
				
			||||||
 | 
					-	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)),
 | 
				
			||||||
 | 
					-	            null !== u ? (gt.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(bt)),
 | 
				
			||||||
 | 
					-	            null !== t ? (Lt = l, u = kt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)),
 | 
				
			||||||
 | 
					+	            null !== u ? (gt.test(n.charAt(qt)) ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(bt)),
 | 
				
			||||||
 | 
					+	            null !== t ? (Lt = l, u = kt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function _() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r;
 | 
				
			||||||
 | 
					-	            if (l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)),
 | 
				
			||||||
 | 
					+	            if (l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)),
 | 
				
			||||||
 | 
					 	            null !== u) {
 | 
				
			||||||
 | 
					-	                if (t = [], yt.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(mt)),
 | 
				
			||||||
 | 
					-	                null !== r) for (;null !== r; ) t.push(r), yt.test(n.charAt(qt)) ? (r = n.charAt(qt),
 | 
				
			||||||
 | 
					+	                if (t = [], yt.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(mt)),
 | 
				
			||||||
 | 
					+	                null !== r) for (;null !== r; ) t.push(r), yt.test(n.charAt(qt)) ? (r = n.charAt(qt),
 | 
				
			||||||
 | 
					 	                qt++) : (r = null, 0 === Wt && e(mt)); else t = il;
 | 
				
			||||||
 | 
					-	                null !== t ? (Lt = l, u = Rt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	                null !== t ? (Lt = l, u = Rt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	                l = il);
 | 
				
			||||||
 | 
					 	            } else qt = l, l = il;
 | 
				
			||||||
 | 
					 	            return l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function nl() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r;
 | 
				
			||||||
 | 
					-	            if (l = qt, n.substr(qt, 2) === Ft ? (u = Ft, qt += 2) : (u = null, 0 === Wt && e(Qt)),
 | 
				
			||||||
 | 
					+	            if (l = qt, n.substr(qt, 2) === Ft ? (u = Ft, qt += 2) : (u = null, 0 === Wt && e(Qt)),
 | 
				
			||||||
 | 
					 	            null !== u) {
 | 
				
			||||||
 | 
					-	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)),
 | 
				
			||||||
 | 
					-	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt),
 | 
				
			||||||
 | 
					+	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)),
 | 
				
			||||||
 | 
					+	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt),
 | 
				
			||||||
 | 
					 	                qt++) : (r = null, 0 === Wt && e(Ut)); else t = il;
 | 
				
			||||||
 | 
					-	                null !== t ? (Lt = l, u = Et(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	                null !== t ? (Lt = l, u = Et(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	                l = il);
 | 
				
			||||||
 | 
					 	            } else qt = l, l = il;
 | 
				
			||||||
 | 
					 	            return l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function ll() {
 | 
				
			||||||
 | 
					 	            var l, u, t, r;
 | 
				
			||||||
 | 
					-	            if (l = qt, n.substr(qt, 2) === Gt ? (u = Gt, qt += 2) : (u = null, 0 === Wt && e(Bt)),
 | 
				
			||||||
 | 
					+	            if (l = qt, n.substr(qt, 2) === Gt ? (u = Gt, qt += 2) : (u = null, 0 === Wt && e(Bt)),
 | 
				
			||||||
 | 
					 	            null !== u) {
 | 
				
			||||||
 | 
					-	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)),
 | 
				
			||||||
 | 
					-	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt),
 | 
				
			||||||
 | 
					+	                if (t = [], St.test(n.charAt(qt)) ? (r = n.charAt(qt), qt++) : (r = null, 0 === Wt && e(Ut)),
 | 
				
			||||||
 | 
					+	                null !== r) for (;null !== r; ) t.push(r), St.test(n.charAt(qt)) ? (r = n.charAt(qt),
 | 
				
			||||||
 | 
					 	                qt++) : (r = null, 0 === Wt && e(Ut)); else t = il;
 | 
				
			||||||
 | 
					-	                null !== t ? (Lt = l, u = jt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	                null !== t ? (Lt = l, u = jt(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	                l = il);
 | 
				
			||||||
 | 
					 	            } else qt = l, l = il;
 | 
				
			||||||
 | 
					 	            return l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function ul() {
 | 
				
			||||||
 | 
					 	            var l, u;
 | 
				
			||||||
 | 
					-	            return l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)),
 | 
				
			||||||
 | 
					+	            return l = qt, n.substr(qt, 2) === Tt ? (u = Tt, qt += 2) : (u = null, 0 === Wt && e(xt)),
 | 
				
			||||||
 | 
					 	            null !== u && (Lt = l, u = $t()), null === u ? (qt = l, l = u) : l = u, l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        function tl() {
 | 
				
			||||||
 | 
					 	            var l, u, t;
 | 
				
			||||||
 | 
					-	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)),
 | 
				
			||||||
 | 
					-	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)),
 | 
				
			||||||
 | 
					-	            null !== t ? (Lt = l, u = bu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					+	            return l = qt, 92 === n.charCodeAt(qt) ? (u = At, qt++) : (u = null, 0 === Wt && e(Ct)),
 | 
				
			||||||
 | 
					+	            null !== u ? (n.length > qt ? (t = n.charAt(qt), qt++) : (t = null, 0 === Wt && e(vt)),
 | 
				
			||||||
 | 
					+	            null !== t ? (Lt = l, u = bu(t), null === u ? (qt = l, l = u) : l = u) : (qt = l,
 | 
				
			||||||
 | 
					 	            l = il)) : (qt = l, l = il), l;
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
 | 
					 	        var rl, el = arguments.length > 1 ? arguments[1] : {}, ol = {
 | 
				
			||||||
 | 
					@@ -7234,7 +7234,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	var Util = __webpack_require__(3)
 | 
				
			||||||
 | 
					 	var Random = __webpack_require__(5)
 | 
				
			||||||
 | 
					 	    /*
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    */
 | 
				
			||||||
 | 
					 	var Handler = {
 | 
				
			||||||
 | 
					 	    extend: Util.extend
 | 
				
			||||||
 | 
					@@ -7481,7 +7481,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	        return Random.integer(min, max)
 | 
				
			||||||
 | 
					 	    },
 | 
				
			||||||
 | 
					 	    /*
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    */
 | 
				
			||||||
 | 
					 	    charset: function(node, result, cache) {
 | 
				
			||||||
 | 
					 	        // node.invert
 | 
				
			||||||
 | 
					@@ -7642,11 +7642,11 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	    ## valid(template, data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	    校验真实数据 data 是否与数据模板 template 匹配。
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    实现思路:
 | 
				
			||||||
 | 
					 	    1. 解析规则。
 | 
				
			||||||
 | 
					 	        先把数据模板 template 解析为更方便机器解析的 JSON-Schame
 | 
				
			||||||
 | 
					-	        name               属性名
 | 
				
			||||||
 | 
					+	        name               属性名
 | 
				
			||||||
 | 
					 	        type               属性值类型
 | 
				
			||||||
 | 
					 	        template           属性值模板
 | 
				
			||||||
 | 
					 	        properties         对象属性数组
 | 
				
			||||||
 | 
					@@ -7655,7 +7655,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	    2. 递归验证规则。
 | 
				
			||||||
 | 
					 	        然后用 JSON-Schema 校验真实数据,校验项包括属性名、值类型、值、值生成规则。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-	    提示信息
 | 
				
			||||||
 | 
					+	    提示信息
 | 
				
			||||||
 | 
					 	    https://github.com/fge/json-schema-validator/blob/master/src/main/resources/com/github/fge/jsonschema/validator/validation.properties
 | 
				
			||||||
 | 
					 	    [JSON-Schama validator](http://json-schema-validator.herokuapp.com/)
 | 
				
			||||||
 | 
					 	    [Regexp Demo](http://demos.forbeslindesay.co.uk/regexp/)
 | 
				
			||||||
 | 
					@@ -7693,8 +7693,8 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	                    +step
 | 
				
			||||||
 | 
					 	                    整数部分
 | 
				
			||||||
 | 
					 	                    小数部分
 | 
				
			||||||
 | 
					-	                boolean
 | 
				
			||||||
 | 
					-	                string
 | 
				
			||||||
 | 
					+	                boolean
 | 
				
			||||||
 | 
					+	                string
 | 
				
			||||||
 | 
					 	                    min-max
 | 
				
			||||||
 | 
					 	                    count
 | 
				
			||||||
 | 
					 	    ## properties
 | 
				
			||||||
 | 
					@@ -7949,9 +7949,9 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					 	    完善、友好的提示信息
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	    Equal, not equal to, greater than, less than, greater than or equal to, less than or equal to
 | 
				
			||||||
 | 
					-	    路径 验证类型 描述
 | 
				
			||||||
 | 
					+	    路径 验证类型 描述
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	    Expect path.name is less than or equal to expected, but path.name is actual.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@@ -8264,7 +8264,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	Util.extend(MockXMLHttpRequest.prototype, {
 | 
				
			||||||
 | 
					 	    // https://xhr.spec.whatwg.org/#the-open()-method
 | 
				
			||||||
 | 
					 	    // Sets the request method, request URL, and synchronous flag.
 | 
				
			||||||
 | 
					-	    open: function(method, url, async, username, password) {
 | 
				
			||||||
 | 
					+	    open: function(method, url, async = true, username, password) {
 | 
				
			||||||
 | 
					 	        var that = this
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	        Util.extend(this.custom, {
 | 
				
			||||||
 | 
					@@ -8310,6 +8310,8 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					 	            var xhr = createNativeXMLHttpRequest()
 | 
				
			||||||
 | 
					 	            this.custom.xhr = xhr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+                MockXMLHttpRequest.prototype.upload = xhr.upload
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	            // 初始化所有事件,用于监听原生 XHR 对象的事件
 | 
				
			||||||
 | 
					 	            for (var i = 0; i < XHR_EVENTS.length; i++) {
 | 
				
			||||||
 | 
					 	                xhr.addEventListener(XHR_EVENTS[i], handle)
 | 
				
			||||||
 | 
					@@ -8360,6 +8362,7 @@ return /******/ (function(modules) { // webpackBootstrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 	        // 原生 XHR
 | 
				
			||||||
 | 
					 	        if (!this.match) {
 | 
				
			||||||
 | 
					+                this.custom.xhr.responseType = this.responseType || ''
 | 
				
			||||||
 | 
					 	            this.custom.xhr.send(data)
 | 
				
			||||||
 | 
					 	            return
 | 
				
			||||||
 | 
					 	        }
 | 
				
			||||||
							
								
								
									
										11471
									
								
								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 defaultColor = '#1890ff';
 | 
					 | 
				
			||||||
  const themeColor = window.localStorage.getItem(key) || defaultColor;
 | 
					 | 
				
			||||||
  const cssVars = `--primary-color: ${themeColor}`;
 | 
					 | 
				
			||||||
  document.documentElement.style.cssText = cssVars;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
addThemeColorCssVars();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
initSvgLogo('#loadingLogo');
 | 
					 | 
				
			||||||
							
								
								
									
										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);
 | 
				
			||||||
							
								
								
									
										3
									
								
								src-tauri/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					# Generated by Cargo
 | 
				
			||||||
 | 
					# will have compiled files and executables
 | 
				
			||||||
 | 
					/target/
 | 
				
			||||||
							
								
								
									
										4302
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										28
									
								
								src-tauri/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					[package]
 | 
				
			||||||
 | 
					name = "app"
 | 
				
			||||||
 | 
					version = "0.1.0"
 | 
				
			||||||
 | 
					description = "A Tauri App"
 | 
				
			||||||
 | 
					authors = ["you"]
 | 
				
			||||||
 | 
					license = ""
 | 
				
			||||||
 | 
					repository = ""
 | 
				
			||||||
 | 
					default-run = "app"
 | 
				
			||||||
 | 
					edition = "2021"
 | 
				
			||||||
 | 
					rust-version = "1.57"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[build-dependencies]
 | 
				
			||||||
 | 
					tauri-build = { version = "1.1.1", features = [] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dependencies]
 | 
				
			||||||
 | 
					serde_json = "1.0"
 | 
				
			||||||
 | 
					serde = { version = "1.0", features = ["derive"] }
 | 
				
			||||||
 | 
					tauri = { version = "1.1.1", features = ["api-all"] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[features]
 | 
				
			||||||
 | 
					# by default Tauri runs in production mode
 | 
				
			||||||
 | 
					# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL
 | 
				
			||||||
 | 
					default = [ "custom-protocol" ]
 | 
				
			||||||
 | 
					# this feature is used for production builds where `devPath` points to the filesystem
 | 
				
			||||||
 | 
					# DO NOT remove this
 | 
				
			||||||
 | 
					custom-protocol = [ "tauri/custom-protocol" ]
 | 
				
			||||||
							
								
								
									
										3
									
								
								src-tauri/build.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
					  tauri_build::build()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/128x128.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 9.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/128x128@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 20 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/32x32.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square107x107Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square142x142Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 10 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square150x150Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 11 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square284x284Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 22 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square30x30Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square310x310Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 24 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square44x44Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square71x71Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square89x89Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/StoreLogo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/icon.icns
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/icon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 42 KiB  | 
							
								
								
									
										10
									
								
								src-tauri/src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					#![cfg_attr(
 | 
				
			||||||
 | 
					  all(not(debug_assertions), target_os = "windows"),
 | 
				
			||||||
 | 
					  windows_subsystem = "windows"
 | 
				
			||||||
 | 
					)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
					  tauri::Builder::default()
 | 
				
			||||||
 | 
					    .run(tauri::generate_context!())
 | 
				
			||||||
 | 
					    .expect("error while running tauri application");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										60
									
								
								src-tauri/tauri.conf.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "$schema": "../node_modules/@tauri-apps/cli/schema.json",
 | 
				
			||||||
 | 
					  "build": {
 | 
				
			||||||
 | 
					    "beforeBuildCommand": "npm run build",
 | 
				
			||||||
 | 
					    "beforeDevCommand": "npm run dev",
 | 
				
			||||||
 | 
					    "devPath": "http://localhost:3200",
 | 
				
			||||||
 | 
					    "distDir": "../dist"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "package": {
 | 
				
			||||||
 | 
					    "productName": "soybean-admin",
 | 
				
			||||||
 | 
					    "version": "0.1.0"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "tauri": {
 | 
				
			||||||
 | 
					    "allowlist": {
 | 
				
			||||||
 | 
					      "all": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "bundle": {
 | 
				
			||||||
 | 
					      "active": true,
 | 
				
			||||||
 | 
					      "category": "DeveloperTool",
 | 
				
			||||||
 | 
					      "copyright": "",
 | 
				
			||||||
 | 
					      "deb": {
 | 
				
			||||||
 | 
					        "depends": []
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "externalBin": [],
 | 
				
			||||||
 | 
					      "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"],
 | 
				
			||||||
 | 
					      "identifier": "cn.soybeanjs.tauri-admin",
 | 
				
			||||||
 | 
					      "longDescription": "",
 | 
				
			||||||
 | 
					      "macOS": {
 | 
				
			||||||
 | 
					        "entitlements": null,
 | 
				
			||||||
 | 
					        "exceptionDomain": "",
 | 
				
			||||||
 | 
					        "frameworks": [],
 | 
				
			||||||
 | 
					        "providerShortName": null,
 | 
				
			||||||
 | 
					        "signingIdentity": null
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "resources": [],
 | 
				
			||||||
 | 
					      "shortDescription": "",
 | 
				
			||||||
 | 
					      "targets": "all",
 | 
				
			||||||
 | 
					      "windows": {
 | 
				
			||||||
 | 
					        "certificateThumbprint": null,
 | 
				
			||||||
 | 
					        "digestAlgorithm": "sha256",
 | 
				
			||||||
 | 
					        "timestampUrl": ""
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "security": {
 | 
				
			||||||
 | 
					      "csp": null
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "updater": {
 | 
				
			||||||
 | 
					      "active": false
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "windows": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "fullscreen": false,
 | 
				
			||||||
 | 
					        "height": 800,
 | 
				
			||||||
 | 
					        "resizable": true,
 | 
				
			||||||
 | 
					        "title": "soybean-admin",
 | 
				
			||||||
 | 
					        "width": 1000
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -13,12 +13,14 @@
 | 
				
			|||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { zhCN, dateZhCN } from 'naive-ui';
 | 
					import { dateZhCN, zhCN } from 'naive-ui';
 | 
				
			||||||
import { useThemeStore, subscribeStore } from '@/store';
 | 
					import { subscribeStore, useThemeStore } from '@/store';
 | 
				
			||||||
 | 
					import { useGlobalEvents } from '@/composables';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const theme = useThemeStore();
 | 
					const theme = useThemeStore();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
subscribeStore();
 | 
					subscribeStore();
 | 
				
			||||||
 | 
					useGlobalEvents();
 | 
				
			||||||
</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  | 
| 
		 Before Width: | Height: | Size: 19 KiB 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  | 
| 
		 Before Width: | Height: | Size: 77 KiB 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  | 
| 
		 Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB  | 
							
								
								
									
										1
									
								
								src/assets/svg-icon/no-icon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 8.1 KiB  | 
| 
		 Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB  | 
| 
		 Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB  | 
| 
		 Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB  | 
| 
		 Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 327 B  | 
@@ -1 +0,0 @@
 | 
				
			|||||||
<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-activity"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline></svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 282 B  | 
@@ -1 +0,0 @@
 | 
				
			|||||||
<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-at-sign"><circle cx="12" cy="12" r="4"></circle><path d="M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94"></path></svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 322 B  | 
| 
		 Before Width: | Height: | Size: 8.6 KiB  | 
@@ -1 +0,0 @@
 | 
				
			|||||||
<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-cast"><path d="M2 16.1A5 5 0 0 1 5.9 20M2 12.05A9 9 0 0 1 9.95 20M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6"></path><line x1="2" y1="20" x2="2.01" y2="20"></line></svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 387 B  | 
@@ -1 +0,0 @@
 | 
				
			|||||||
<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-chrome"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="4"></circle><line x1="21.17" y1="8" x2="12" y2="8"></line><line x1="3.95" y1="6.06" x2="8.54" y2="14"></line><line x1="10.88" y1="21.94" x2="15.46" y2="14"></line></svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 448 B  |