瀏覽代碼

first commit

李万涛 1 年之前
當前提交
eace0ed190
共有 100 個文件被更改,包括 11570 次插入0 次删除
  1. 2 0
      .gitignore
  2. 16 0
      .hbuilderx/launch.json
  3. 284 0
      App.vue
  4. 36 0
      README.en.md
  5. 39 0
      README.md
  6. 60 0
      common/index.js
  7. 125 0
      common/mixins/index.js
  8. 295 0
      common/pay/index.js
  9. 72 0
      common/platform/index.js
  10. 465 0
      common/request/apis.js
  11. 79 0
      common/request/index.js
  12. 187 0
      common/request/request.js
  13. 70 0
      common/router/index.js
  14. 2036 0
      common/router/uni-simple-router.js
  15. 140 0
      common/share/index.js
  16. 15 0
      common/store/index.js
  17. 112 0
      common/store/modules/init.js
  18. 214 0
      common/store/modules/user.js
  19. 585 0
      common/utils/sdk-h5.js
  20. 137 0
      common/utils/tools.js
  21. 178 0
      common/wechat/sdk.js
  22. 297 0
      common/wechat/wechat.js
  23. 二進制
      components/.DS_Store
  24. 292 0
      components/elise-audio/elise-audio.vue
  25. 40 0
      components/elise-audio/redme.md
  26. 591 0
      components/tnui-wx-user-info/tnui-wx-user-info.vue
  27. 62 0
      components/wike-ad/wike-ad.vue
  28. 49 0
      components/wike-flow-main/wike-flow-main.vue
  29. 232 0
      components/wike-loading-page/wike-loading-page.vue
  30. 88 0
      components/wike-modal-qrcode/wike-modal-qrcode.vue
  31. 154 0
      components/wike-model/wike-model.vue
  32. 147 0
      components/wike-painter/common/relation.js
  33. 218 0
      components/wike-painter/nvue.js
  34. 0 0
      components/wike-painter/painter.js
  35. 50 0
      components/wike-painter/props.js
  36. 479 0
      components/wike-painter/utils.js
  37. 407 0
      components/wike-painter/wike-painter.vue
  38. 176 0
      components/wike-scrollview/wike-scrollview.vue
  39. 145 0
      components/wike-skeleton/wike-skeleton.vue
  40. 438 0
      components/wike-tabbar/wike-tabbar.vue
  41. 435 0
      components/wike-tabbar2/wike-tabbar2.vue
  42. 20 0
      index.html
  43. 38 0
      main.js
  44. 105 0
      manifest.json
  45. 13 0
      node_modules/.package-lock.json
  46. 22 0
      node_modules/@babel/runtime/LICENSE
  47. 19 0
      node_modules/@babel/runtime/README.md
  48. 98 0
      node_modules/@babel/runtime/helpers/AsyncGenerator.js
  49. 5 0
      node_modules/@babel/runtime/helpers/AwaitValue.js
  50. 30 0
      node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js
  51. 284 0
      node_modules/@babel/runtime/helpers/applyDecs.js
  52. 11 0
      node_modules/@babel/runtime/helpers/arrayLikeToArray.js
  53. 5 0
      node_modules/@babel/runtime/helpers/arrayWithHoles.js
  54. 7 0
      node_modules/@babel/runtime/helpers/arrayWithoutHoles.js
  55. 9 0
      node_modules/@babel/runtime/helpers/assertThisInitialized.js
  56. 56 0
      node_modules/@babel/runtime/helpers/asyncGeneratorDelegate.js
  57. 50 0
      node_modules/@babel/runtime/helpers/asyncIterator.js
  58. 37 0
      node_modules/@babel/runtime/helpers/asyncToGenerator.js
  59. 7 0
      node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js
  60. 7 0
      node_modules/@babel/runtime/helpers/checkPrivateRedeclaration.js
  61. 22 0
      node_modules/@babel/runtime/helpers/classApplyDescriptorDestructureSet.js
  62. 9 0
      node_modules/@babel/runtime/helpers/classApplyDescriptorGet.js
  63. 13 0
      node_modules/@babel/runtime/helpers/classApplyDescriptorSet.js
  64. 7 0
      node_modules/@babel/runtime/helpers/classCallCheck.js
  65. 7 0
      node_modules/@babel/runtime/helpers/classCheckPrivateStaticAccess.js
  66. 7 0
      node_modules/@babel/runtime/helpers/classCheckPrivateStaticFieldDescriptor.js
  67. 9 0
      node_modules/@babel/runtime/helpers/classExtractFieldDescriptor.js
  68. 5 0
      node_modules/@babel/runtime/helpers/classNameTDZError.js
  69. 10 0
      node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js
  70. 10 0
      node_modules/@babel/runtime/helpers/classPrivateFieldGet.js
  71. 8 0
      node_modules/@babel/runtime/helpers/classPrivateFieldInitSpec.js
  72. 9 0
      node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js
  73. 7 0
      node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js
  74. 11 0
      node_modules/@babel/runtime/helpers/classPrivateFieldSet.js
  75. 9 0
      node_modules/@babel/runtime/helpers/classPrivateMethodGet.js
  76. 8 0
      node_modules/@babel/runtime/helpers/classPrivateMethodInitSpec.js
  77. 5 0
      node_modules/@babel/runtime/helpers/classPrivateMethodSet.js
  78. 13 0
      node_modules/@babel/runtime/helpers/classStaticPrivateFieldDestructureSet.js
  79. 13 0
      node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js
  80. 14 0
      node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js
  81. 8 0
      node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js
  82. 5 0
      node_modules/@babel/runtime/helpers/classStaticPrivateMethodSet.js
  83. 22 0
      node_modules/@babel/runtime/helpers/construct.js
  84. 20 0
      node_modules/@babel/runtime/helpers/createClass.js
  85. 60 0
      node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js
  86. 24 0
      node_modules/@babel/runtime/helpers/createForOfIteratorHelperLoose.js
  87. 24 0
      node_modules/@babel/runtime/helpers/createSuper.js
  88. 400 0
      node_modules/@babel/runtime/helpers/decorate.js
  89. 16 0
      node_modules/@babel/runtime/helpers/defaults.js
  90. 24 0
      node_modules/@babel/runtime/helpers/defineEnumerableProperties.js
  91. 16 0
      node_modules/@babel/runtime/helpers/defineProperty.js
  92. 95 0
      node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js
  93. 3 0
      node_modules/@babel/runtime/helpers/esm/AwaitValue.js
  94. 28 0
      node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js
  95. 282 0
      node_modules/@babel/runtime/helpers/esm/applyDecs.js
  96. 9 0
      node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js
  97. 3 0
      node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
  98. 4 0
      node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
  99. 7 0
      node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js
  100. 54 0
      node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+unpackage
+node_moudules

+ 16 - 0
.hbuilderx/launch.json

@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 284 - 0
App.vue

@@ -0,0 +1,284 @@
+<script>
+	import {
+		init
+	} from "@/common";
+	export default {
+		onLaunch(options) {
+			init(options);
+			// #ifndef MP-TOUTIAO
+			uni.hideTabBar({});
+			// #endif		
+			
+		}
+	};
+</script>
+
+<style lang="scss">
+	/*每个页面公共css */
+	@import "uview-ui/index.scss";
+	@import "animate.css";
+	@import "static/iconfont/iconfont.css";
+	@import './tuniao-ui/index.scss';
+	@import './tuniao-ui/iconfont.css';
+	.flxe{
+		display: flex;
+	}
+	.justify-between{
+		justify-content: space-between;
+	}
+	.flxe-column{
+		flex-direction: column;
+	}
+	.align-center{
+		align-items: center;
+	}
+	.justify-center{
+		justify-content: center;
+	}
+	.flex-wrap{
+		flex-wrap: wrap;
+	}
+
+
+.u-relative,
+.u-rela {
+	position: relative;
+}
+
+.u-absolute,
+.u-abso {
+	position: absolute;
+}
+
+// nvue不能用标签命名样式,不能放在微信组件中,否则微信开发工具会报警告,无法使用标签名当做选择器
+/* #ifndef APP-NVUE */
+image {
+	display: inline-block;
+}
+
+// 在weex,也即nvue中,所有元素默认为border-box
+view,
+text {
+	box-sizing: border-box;
+}
+/* #endif */
+
+.u-font-xs {
+	font-size: 22rpx;
+}
+
+.u-font-sm {
+	font-size: 26rpx;
+}
+
+.u-font-md {
+	font-size: 28rpx;
+}
+
+.u-font-lg {
+	font-size: 30rpx;
+}
+
+.u-font-xl {
+	font-size: 34rpx;
+}
+
+.u-flex {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+}
+
+.u-flex-wrap {
+	flex-wrap: wrap;
+}
+
+.u-flex-nowrap {
+	flex-wrap: nowrap;
+}
+
+.u-col-center {
+	align-items: center;
+}
+
+.u-col-top {
+	align-items: flex-start;
+}
+
+.u-col-bottom {
+	align-items: flex-end;
+}
+
+.u-row-center {
+	justify-content: center;
+}
+
+.u-row-left {
+	justify-content: flex-start;
+}
+
+.u-row-right {
+	justify-content: flex-end;
+}
+
+.u-row-between {
+	justify-content: space-between;
+}
+
+.u-row-around {
+	justify-content: space-around;
+}
+
+.u-text-left {
+	text-align: left;
+}
+
+.u-text-center {
+	text-align: center;
+}
+
+.u-text-right {
+	text-align: right;
+}
+
+.u-flex-col {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+}
+
+/**
+* 弹性盒三段式布局
+*/
+.page_box {
+	height: 100%;
+	width: 100%;
+	display: flex;
+	flex-direction: column;
+	justify-content: space-between;
+	overflow-x: hidden;
+	background: $u-bg-color;
+}
+.scroll-box {
+	flex: 1;
+	height: 100%;
+	position: relative;
+}
+.content_box {
+	flex: 1;
+	overflow-y: auto;
+}
+
+/**
+* 溢出省略号
+* @param {Number} 行数
+*/
+@mixin ellipsis($rowCount: 1) {
+	@if $rowCount <=1 {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	} @else {
+		min-width: 0;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: $rowCount;
+		-webkit-box-orient: vertical;
+	}
+}
+@for $i from 1 through 12 {
+	.u-ellipsis-#{$i} {
+		@include ellipsis($i);
+	}
+}
+
+// 定义flex等分
+@for $i from 0 through 12 {
+	.u-flex-#{$i} {
+		flex: $i;
+	}
+}
+
+// 定义字体(px)单位,小于20都为px单位字体
+@for $i from 9 to 20 {
+	.u-font-#{$i} {
+		font-size: $i + px;
+	}
+}
+
+// 定义字体(rpx)单位,大于或等于20的都为rpx单位字体
+@for $i from 20 through 40 {
+	.u-font-#{$i} {
+		font-size: $i + rpx;
+	}
+}
+
+// 定义内外边距,历遍1-100
+@for $i from 0 through 100 {
+	// 只要双数和能被5除尽的数
+	@if $i % 2 == 0 or $i % 5 == 0 {
+		// 得出:u-margin-30或者u-m-30
+		.u-margin-#{$i},
+		.u-m-#{$i} {
+			margin: $i + rpx !important;
+		}
+		.u-m-x-#{$i} {
+			margin-left: $i + rpx !important;
+			margin-right: $i + rpx !important;
+		}
+		.u-m-y-#{$i} {
+			margin-top: $i + rpx !important;
+			margin-bottom: $i + rpx !important;
+		}
+
+		// 得出:u-padding-30或者u-p-30
+		.u-padding-#{$i},
+		.u-p-#{$i} {
+			padding: $i + rpx !important;
+		}
+		.u-p-x-#{$i} {
+			padding-left: $i + rpx !important;
+			padding-right: $i + rpx !important;
+		}
+		.u-p-y-#{$i} {
+			padding-top: $i + rpx !important;
+			padding-bottom: $i + rpx !important;
+		}
+
+		@each $short, $long in l left, t top, r right, b bottom {
+			// 缩写版,结果如: u-m-l-30
+			// 定义外边距
+			.u-m-#{$short}-#{$i} {
+				margin-#{$long}: $i + rpx !important;
+			}
+
+			// 定义内边距
+			.u-p-#{$short}-#{$i} {
+				padding-#{$long}: $i + rpx !important;
+			}
+
+			// 完整版,结果如:u-margin-left-30
+			// 定义外边距
+			.u-margin-#{$long}-#{$i} {
+				margin-#{$long}: $i + rpx !important;
+			}
+
+			// 定义内边距
+			.u-padding-#{$long}-#{$i} {
+				padding-#{$long}: $i + rpx !important;
+			}
+		}
+	}
+}
+
+// 重置nvue的默认关于flex的样式
+.u-reset-nvue {
+	flex-direction: row;
+	align-items: center;
+}
+
+</style>

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# 零工招聘
+
+#### Description
+{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Instructions
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Contribution
+
+1.  Fork the repository
+2.  Create Feat_xxx branch
+3.  Commit your code
+4.  Create Pull Request
+
+
+#### Gitee Feature
+
+1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4.  The most valuable open source project [GVP](https://gitee.com/gvp)
+5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 39 - 0
README.md

@@ -0,0 +1,39 @@
+# ChatGPT
+
+#### 介绍
+{**以下是 Gitee 平台说明,您可以替换此简介**
+Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
+无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 使用说明
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 参与贡献
+
+1.  Fork 本仓库
+2.  新建 Feat_xxx 分支
+3.  提交代码
+4.  新建 Pull Request
+
+
+#### 特技
+
+1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
+3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
+4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
+5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 60 - 0
common/index.js

@@ -0,0 +1,60 @@
+// 挂载变量
+// import {
+// 	API_URL,
+// 	API_ROOT
+// } from '@/common/request/request';
+import store from '@/common/store';
+import http from '@/common/request';
+import platform from '@/common/platform';
+import tools from '@/common/utils/tools'
+// mixin混入
+import mixin from '@/common/mixins';
+// #ifdef H5
+// uni方法重写, h5的粘贴板的设置,获取。图片视频的保存
+import wxsdk from '@/common/wechat/sdk'
+import VConsole from 'vconsole'
+import '@/common/utils/sdk-h5.js'
+// #endif
+
+
+
+import wechat from '@/common/wechat/wechat';
+
+const install = Vue => {
+	// Vue.prototype.$API_URL = API_URL;
+	// Vue.prototype.$API_ROOT = API_ROOT;
+	// 挂载请求
+	Vue.prototype.$http = http;
+	// 平台判断
+	Vue.prototype.$platform = platform;
+	// 挂载工具函数
+	Vue.prototype.$tools = tools;
+	Vue.mixin(mixin);
+
+	// #ifdef H5
+	// 微信H5,sdk挂载
+	Vue.prototype.$wxsdk = wxsdk;
+	//  调试微信jssdk
+	// new VConsole()
+	// #endif
+}
+
+export async function init(options) {
+	// #ifdef H5
+	platform.entry();
+	// #endif
+	// #ifdef MP-WEIXIN
+	// 检测小程序更新(如果从朋友圈场景进入则无此API)
+	options.scene !== 1154 && wechat.checkMiniProgramUpdate();
+	// #endif
+	await store.dispatch("appInit", options); // 加载基本信息
+	await store.dispatch("getTemplate", options);//获取模板消息
+	// #ifdef MP-WEIXIN
+	await store.dispatch('getMessageIds'); //订阅消息
+	// #endif
+	
+}
+
+export default {
+	install
+}

+ 125 - 0
common/mixins/index.js

@@ -0,0 +1,125 @@
+/**
+ * MixinIndex v1.0.0
+ * @description shopro-mixin-index 1.0.0 shopro全局入口组件
+ * @Author lidongtony
+ * @Date 2021-04-18
+ * @Email lidongtony@qq.com
+ */
+
+import store from '@/common/store'
+import share from '@/common/share'
+import http from '@/common/request'
+import $platform from '@/common/platform'
+import {
+	router
+} from '@/common/router'
+export default {
+	onLoad(options) {
+		let that = this;
+		// 后端拼接的具体page页面 直接进入 (如订阅消息场景下直接跳转)
+		// #ifdef MP
+		console.log(options);
+		console.log(options.scene);
+		if (options?.scene) {
+			let scene = decodeURIComponent(options.scene);
+			let sceneObj = scene.split('=');
+			options[sceneObj[0]] = sceneObj[1];
+		}
+		// #endif
+		if (options?.page) {
+			router.replace({
+				path: decodeURIComponent(options.page)
+			})
+		}
+		if (options?.custom_id) {
+			router.replace({
+				path: '/pages/index/view',
+				query: {
+					id: options.custom_id
+				}
+			})
+		}
+		if (options?.spm) {
+			let shareParams = share.getShareQuery(options.spm);
+			// 保存推荐信息
+			if (shareParams.shareUserId) {
+				if (store.getters.isLogin) {
+					http('commission.addTeam', {
+						spm: options.spm
+					});
+				} else {
+					uni.setStorageSync('spm', options.spm);
+				}
+			}
+			// 跳转分享路径
+			let page = {};
+			if (shareParams.page) {
+				page.path = shareParams.page;
+			}
+			if (shareParams.pageId) {
+				page.query = {
+					id: shareParams.pageId
+				}
+			}
+			if (page.path) {
+				router.replace(page);
+			}
+		}
+	},
+	// #ifdef MP-WEIXIN
+	onShareAppMessage(res) {
+		let that = this;
+		// uni.$emit('ON_WX_SHARE')
+		let shareInfo = store.getters.shareInfo;
+		// console.log(shareInfo)
+		return {
+			title: shareInfo.title,
+			path: shareInfo.path,
+			imageUrl: shareInfo.image,
+			// success(res) {
+			// 	uni.showToast({
+			// 		title: '分享成功'
+			// 	})
+
+			// },
+			// fail(res) {
+			// 	uni.showToast({
+			// 		title: '分享失败',
+			// 		icon: 'none'
+			// 	})
+			// },
+			complete() {}
+		}
+	},
+	onShareTimeline(res) {
+		let that = this;
+		let shareInfo = store.getters.shareInfo;
+		let query = shareInfo.query;
+		// console.log(query);
+		//携带当前页面资源ID参数
+		let currentPage = getCurrentPages()[getCurrentPages().length - 1];
+		let options = currentPage.options;
+		if (JSON.stringify(options) != '{}' && options.id) {
+			query += `&id=${options.id}`;
+		}
+        // console.log(query)
+		return {
+			title: shareInfo.title,
+			query: query,
+			imageUrl: shareInfo.image,
+			// success(res) {
+			// 	uni.showToast({
+			// 		title: '分享成功'
+			// 	})
+			// },
+			// fail(res) {
+			// 	uni.showToast({
+			// 		title: '分享失败',
+			// 		icon: 'none'
+			// 	})
+			// },
+			complete() {}
+		}
+	}
+	// #endif
+}

+ 295 - 0
common/pay/index.js

@@ -0,0 +1,295 @@
+import $http from '@/common/request/index'
+// #ifdef H5
+import wxsdk from '@/common/wechat/sdk'
+// #endif
+import wechat from '@/common/wechat/wechat'
+import {
+	router as $Router
+} from '@/common/router/index.js'
+import store from '@/common/store';
+import $platform from '@/common/platform';
+
+/**
+ * 支付
+ * 
+ * @param {String} payment = ['wechat','alipay','wallet']  	- 支付方式
+ * @param {Object} order = {}  								- 订单详情
+ * @param {String} orderType = ['goods','recharge'] 		- 订单类型
+ */
+
+export default class ShoproPay {
+
+
+	//						wxOfficialAccount			wxMiniProgram			App						H5
+	// 			wechat			公众号JSSDK支付				小程序支付			微信开放平台支付			H5网页支付
+	//			alipay			复制网址						复制网址				支付宝开放平台支付		    直接跳转链接
+	// 			wallet			v							v					v						v
+
+
+	constructor(payment, order, orderType) {
+		this.payment = payment;
+		this.order = order;
+		this.orderType = orderType;
+		this.platform = $platform.get();
+		
+		let payMehod = this.getPayMethod();
+		payMehod();
+
+	}
+
+	getPayMethod() {
+		var payMethod = {
+			'wxOfficialAccount': {
+				'wechat': () => {
+					this.wxOfficialAccountPay()
+				},
+				'alipay': () => {
+					this.copyPayLink()
+				},
+				'wallet': () => {
+					this.walletPay()
+				}
+			},
+			'wxMiniProgram': {
+				'wechat': () => {
+					this.wxMiniProgramPay()
+				},
+				'alipay': () => {
+					this.copyPayLink()
+				},
+				'wallet': () => {
+					this.walletPay()
+				}
+			},
+			'App': {
+				'wechat': () => {
+					this.wechatPay()
+				},
+				'alipay': () => {
+					this.aliPay()
+				},
+				'wallet': () => {
+					this.walletPay()
+				},
+			},
+			'H5': {
+				'wechat': () => {
+					this.wechatWapPay()
+				},
+				'alipay': () => {
+					this.goToPayLink()
+				},
+				'wallet': () => {
+					this.walletPay()
+				},
+			},
+		}
+		return payMethod[this.platform][this.payment];
+	}
+
+
+
+	// 预支付
+	prepay() {
+		let that = this;
+		// console.log(this.platform);
+		return new Promise((resolve, reject) => {
+			let that = this;
+			let params = {
+				order_number: that.order.order_number,
+				payment: that.payment,
+				platform:that.platform,
+				is_commission:that.orderType
+			}
+			if (uni.getStorageSync('openid')) {
+				params.openid = uni.getStorageSync('openid');
+			}
+			$http('pay.prepay', params, '支付中').then(res => {
+				// console.log(res);
+				if (res.code === 0) {
+					res.data === 'no_openid' ?
+						uni.showModal({
+							title: '微信支付',
+							content: '请先绑定微信再使用微信支付',
+							confirmColor:'#00CA88',
+							success: function(res) {
+								if (res.confirm) {
+									wechat.bind();
+								}
+							},
+						}) :
+						resolve(res);
+
+				}
+			})
+		});
+	}
+
+
+	// 微信H5支付
+	async wxOfficialAccountPay() {
+		let that = this;   
+		let result = await this.prepay();
+		wxsdk.wxpay(result.data, (res) => {
+			res.errMsg == "chooseWXPay:ok" ? that.payResult('success') : that.payResult('fail')
+		});
+
+	}
+
+	//浏览器微信支付
+	async wechatWapPay() {
+		let that = this;
+		let result = await this.prepay();
+		if (result.code === 1) {
+			var url = result.data.pay_data.match(/url\=\'(\S*)\'/);
+			let reg = new RegExp('&amp;', 'g') //g代表全部
+			let newUrl = url[1].replace(reg, '&');
+			let domain = store.getters.initShop.domain; //域名需要https
+			let params = encodeURIComponent(
+				`${domain}pages/order/payment/result?orderId=${that.order.id}&type=${that.payment}&orderType=${that.orderType}`
+			)
+			// let params = encodeURIComponent(
+			// 	`${domain}pages/user/public/paymentdetail?orderId=${that.order.id}&type=${that.payment}&orderType=${that.orderType}`
+			// )
+			window.location.href = newUrl + '&redirect_url=' + params;
+		}
+	}
+
+	// 微信小程序支付
+	async wxMiniProgramPay() {
+		let that = this;
+		
+		let result = await this.prepay();
+		
+		uni.requestPayment({
+			provider: 'wxpay',
+			...result.data,
+			success: res => {
+				console.log(res);
+				that.payResult('success')
+				
+			},
+			fail: err => {
+				console.log('支付取消或者失败:', err);
+				err.errMsg !== "requestPayment:fail cancel" && that.payResult('fail')
+				uni.showModal({
+					title: '失败',
+					content: '支付取消或者失败',
+					confirmText: '重新支付',
+					confirmColor:'#00CA88',
+					success: (res) => {
+						if (res.confirm) {
+							that.wxMiniProgramPay()
+						}
+					}
+				})
+			}
+		});
+	}
+
+	// 余额支付
+	async walletPay() {
+		let that = this;
+		let result = await this.prepay();
+		result.code === 1 && that.payResult('success')
+	}
+
+	// 支付宝复制链接支付
+	async copyPayLink() {
+		let that = this;
+		let result = await this.prepay();
+		if (result.code === 1) {
+			//引入showModal 点击确认 复制链接;
+			uni.showModal({
+				title: '支付宝支付',
+				content: '复制链接到外部浏览器',
+				confirmText: '复制链接',
+				confirmColor:'#00CA88',
+				success: (res) => {
+					if (res.confirm) {
+						uni.setClipboardData({
+							data: result.data.pay_data,
+							success: function(data) {
+								that.$u.toast('已复制到剪切板');
+							}
+						});
+					}
+				}
+			})
+		}
+	}
+
+	// 支付链接
+	async goToPayLink() {
+		let that = this;
+		let result = await this.prepay();
+		if (result.code === 1) {
+			window.location = result.data.pay_data;
+		}
+	}
+
+	// 支付宝支付
+	async aliPay() {
+		let that = this;
+		let result = await this.prepay();
+		if (result.code === 1) {
+			uni.requestPayment({
+				provider: 'alipay',
+				orderInfo: result.data.pay_data, //支付宝订单数据
+				success: res => {
+					that.payResult('success')
+				},
+				fail: err => {
+					console.log('支付取消或者失败:', err);
+					err.errMsg !== "requestPayment:fail cancel" && that.payResult('fail')
+				}
+			});
+		}
+	}
+
+	// 微信支付
+	async wechatPay() {
+		let that = this;
+		let result = await this.prepay();
+		if (result.code === 1) {
+			uni.requestPayment({
+				provider: 'wxpay',
+				orderInfo: JSON.parse(result.data.pay_data), //微信订单数据(官方说是string。实测为object)
+				success: res => {
+					that.payResult('success')
+				},
+				fail: err => {
+					err.errMsg !== "requestPayment:fail cancel" && that.payResult('fail')
+					console.log('支付取消或者失败:', err);
+				}
+			});
+		}
+	}
+
+
+	// 支付结果跳转,success:成功,fail:失败
+	payResult(resultType) {
+		const that = this;
+		if(resultType == 'success'){
+			store.dispatch('getUserInfo')
+			$Router.replace({
+				path: '/pages/user/public/paymentdetail',
+				query: {
+					orderId: that.order.id,
+					type: that.payment, //重新支付的时候使用
+					payState: resultType,
+					orderType: that.orderType
+				}
+			});
+			store.commit("subscribeMessage", 'unread_msg');
+			
+		}else{
+			uni.showToast({
+				title:'支付失败',
+				icon:'none'
+			})
+		}
+		
+	}
+
+}

+ 72 - 0
common/platform/index.js

@@ -0,0 +1,72 @@
+// #ifdef H5
+// 微信H5
+import wxsdk from '@/common/wechat/sdk';
+import {
+	router
+} from '@/common/router';
+// #endif
+export default {
+
+	// 获取当前运行平台
+	get() {
+		let platform = '';
+		// #ifdef H5
+		wxsdk.isWechat() ? (platform = 'wxOfficialAccount') : (platform = 'H5');
+		// #endif
+		// #ifdef APP-PLUS
+		platform = 'App';
+		// #endif
+		// #ifdef MP-WEIXIN
+		platform = 'wxMiniProgram';
+		// #endif
+		// #ifdef MP-ALIPAY
+		platform = 'alipayMiniProgram';
+		// #endif
+		if (platform !== '') {
+			uni.setStorageSync('platform', platform);
+		} else {
+			uni.showToast({
+				title: '暂不支持该平台',
+				icon: 'none'
+			});
+		}
+		return platform;
+	},
+	set(platform) {
+		uni.setStorageSync('platform', platform);
+		return platform;
+	},
+
+	// 检测当前运行机型
+	device() {
+		return uni.getSystemInfoSync().platform;
+	},
+
+	// 获取前端真实主机
+	host() {
+		let host = location.origin;
+		let basePath = router.$route.options.base;
+		let mode = router.$route.options.mode;
+		host += basePath;
+		if (mode === 'hash') {
+			host += '#/';
+		}
+		return host;
+	},
+
+	// 处理wechat jssdk 签名网址(针对IOS微信浏览器做优化)
+	entry() {
+		let that = this;
+		var entryUrl = location.href;
+		if (this.device() === 'ios') {
+			if (typeof(location.entryUrl) !== 'undefined') {
+				entryUrl = location.entryUrl;
+			} else {
+				location.entryUrl = entryUrl;
+			}
+		}
+		return entryUrl;
+	},
+
+
+}

+ 465 - 0
common/request/apis.js

@@ -0,0 +1,465 @@
+/**
+ * 接口列表文件
+ */
+export default {
+	conf: {
+		getGroupConf: {
+			url: "conf/getGroupConf",
+			auth: false,
+			method: "GET", //全局信息
+		}
+	},
+	template: {
+		list: {
+			url: "template/list",
+			auth: false,
+			method: "GET", //全局信息
+		},
+		info: {
+			url: "template/info",
+			auth: false,
+			method: "GET", //全局信息
+		}
+	},
+	ai: {
+		chat: {
+			url: "ai/chat",
+			auth: true,
+			method: "POST",
+		},
+		chat4: {
+			url: "ai/chat4",
+			auth: false,
+			method: "POST",
+		},
+		chat4event: {
+			url: "ai/chat4event",
+			auth: false,
+			method: "POST",
+		},
+		getProxy: {
+			url: "ai/getProxy",
+			auth: true,
+			method: "GET",
+		},
+		test: {
+			url: "ai/test",
+			auth: false,
+			method: "POST",
+		},
+		getAddress: {
+			url: "ai/getAddress",
+			auth: true,
+			method: "GET",
+		},
+		checkText: {
+			url: "ai/checkText",
+			auth: true,
+			method: "GET",
+		},
+		painting: {
+			url: "ai/painting",
+			auth: true,
+			method: "POST",
+		},
+		showTask: {
+			url: "ai/showTask",
+			auth: true,
+			method: "GET",
+		},
+		tts: {
+			url: "ai/tts",
+			auth: true,
+			method: "POST",
+		},
+		ttsJob: {
+			url: "ai/ttsJob",
+			auth: true,
+			method: "GET",
+		},
+		recognizer: {
+			url: "ai/recognizer",
+			auth: true,
+			method: "POST",
+		}
+	},
+
+	gallery: {
+		getOpensdDetail: {
+			url: "gallery/getOpensdDetail",
+			auth: true,
+			method: "GET",
+		},
+		list: {
+			url: "gallery/list",
+			auth: true,
+			method: "GET",
+		},
+		del: {
+			url: "gallery/del",
+			auth: true,
+			method: "POST",
+		},
+		getWords: {
+			url: "gallery/getWords",
+			auth: false,
+			method: "GET",
+		},
+		getModels: {
+			url: "gallery/getModels",
+			auth: false,
+			method: "GET",
+		},
+
+		// 生成diffcution
+		create: {
+			url: "gallery/create",
+			auth: true,
+			method: "POST",
+		},
+		chat: {
+			url: "gallery/chat",
+			auth: true,
+			method: "POST",
+		},
+		all: {
+			url: "gallery/all",
+			auth: false,
+			method: "GET",
+		},
+		fetch: {
+			url: "gallery/fetch",
+			auth: true,
+			method: "GET",
+		},
+		detail: {
+			url: "gallery/detail",
+			auth: false,
+			method: "GET",
+		},
+		imagine: {
+			url: "gallery/imagine",
+			auth: true,
+			method: "POST",
+		},
+		getAsyncResult: {
+			url: "gallery/getAsyncResult",
+			auth: true,
+			method: "GET",
+		},
+		upscale: {
+			url: "gallery/upscale",
+			auth: true,
+			method: "POST",
+		},
+		variation: {
+			url: "gallery/variation",
+			auth: true,
+			method: "POST",
+		},
+		setOpen: {
+			url: "gallery/setOpen",
+			auth: true,
+			method: "POST",
+		},
+		test: {
+			url: "gallery/test",
+			auth: true,
+			method: "POST",
+		}
+	},
+	commission: {
+		addTeam: {
+			url: "commission/addTeam",
+			auth: false,
+			method: "POST", //绑定分享关系
+		},
+		teamList: {
+			url: "commission/teamList",
+			auth: false,
+			method: "GET", //首页信息
+		},
+		auth: {
+			url: "commission/auth",
+			auth: false,
+			method: "GET", //分销商信息
+		},
+		apply: {
+			url: "commission/apply",
+			auth: false,
+			method: "POST", //申请成为分销商
+		},
+		incomeLog: {
+			url: "commission/incomeLog",
+			auth: false,
+			method: "GET", //我的佣金收入明细
+		},
+		cashoutLog: {
+			url: "commission/cashoutLog",
+			auth: false,
+			method: "GET", //提现记录
+		},
+		extract: {
+			url: "commission/extract",
+			auth: false,
+			method: "POST", //申请提现
+		},
+		ranking: {
+			url: "commission/ranking",
+			auth: false,
+			method: "GET", //分销排行榜
+		},
+		update: {
+			url: "commission/update",
+			auth: false,
+			method: "POST", //提现信息
+		},
+		create: {
+			url: "commission/create",
+			auth: false,
+			method: "POST", //付费成为分销商下单
+		}
+	},
+	question: {
+		list: {
+			url: "question/list",
+			auth: false,
+			method: "GET", //对话记录
+		},
+		my: {
+			url: "question/my",
+			auth: false,
+			method: "GET", //对话记录
+		},
+		add: {
+			url: "question/add",
+			auth: false,
+			method: "POST", //对话记录
+		},
+		del: {
+			url: "question/del",
+			auth: false,
+			method: "POST", //对话记录删除
+		}
+	},
+	city: {
+		list: {
+			url: "city/list",
+			auth: false,
+			method: "GET", //图片上传
+		},
+	},
+	common: {
+		upload: {
+			url: "common/upload",
+			auth: false,
+			method: "POST", //图片上传
+		},
+		del_pic: {
+			url: "common/del_pic",
+			auth: false,
+			method: "POST", //图片删除
+		},
+		template: {
+			url: "common/template",
+			auth: false,
+			method: "GET", //模板数据
+		},
+		sendMobileCode: {
+			url: "common/sendMobileCode",
+			auth: false,
+			method: "POST", //验证码
+		},
+		qrcodePath: {
+			url: "common/qrcodePath",
+			auth: false,
+			method: "GET", //二维码数据
+		}
+	},
+	wechat: {
+		miniappSilenceAuth: {
+			url: "wechat/miniappSilenceAuth",
+			auth: false,
+			method: "POST", //微信小程序静默登录
+		},
+		miniappAuth: {
+			url: "wechat/miniappAuth",
+			auth: false,
+			method: "POST", //小程序登录
+		},
+		authBindindPhone: {
+			url: "wechat/authBindindPhone",
+			auth: false,
+			method: "POST", //手机号登录
+		},
+		wechatJssdk: {
+			url: "wechat/wechatJssdk",
+			auth: false,
+			method: "GET",
+		},
+		wechatAuth: {
+			url: "wechat/wechatAuth",
+			auth: false,
+			method: "GET",
+		},
+		authBindindPhoneCode: {
+			url: "wechat/authBindindPhoneCode",
+			auth: false,
+			method: "POST", //手机号登录
+		}
+	},
+	user: {
+		info: {
+			url: "user/info",
+			auth: true,
+			method: "POST", //用户信息
+		},
+		profile: {
+			url: "user/profile",
+			auth: true,
+			method: "POST", //修改用户信息
+		},
+		userData: {
+			url: "user/userData",
+			auth: true,
+			method: "GET", //用户重要信息
+		},
+		login: {
+			url: "user/login",
+			auth: false,
+			method: "POST", //用户登录
+		},
+		register: {
+			url: "user/register",
+			auth: false,
+			method: "POST", //用户注册
+		}
+	},
+	order: {
+		create: {
+			url: "order/create",
+			auth: true,
+			method: "POST", //创建订单
+		},
+		detail: {
+			url: "order/detail",
+			auth: true,
+			method: "GET", //订单详情
+		},
+		my: {
+			url: "order/my",
+			auth: true,
+			method: "GET", //订单记录
+		},
+		createSettle: {
+			url: "order/createSettle",
+			auth: true,
+			method: "POST", //创建订单
+		},
+		detailSettle: {
+			url: "order/detailSettle",
+			auth: true,
+			method: "GET", //入驻订单详情
+		}
+	},
+	pay: {
+		prepay: {
+			url: "pay/prepay",
+			auth: true,
+			method: "POST", //微信预支付
+		},
+		hupijiaopay: {
+			url: "pay/hupijiaopay",
+			auth: true,
+			method: "POST", //虎皮椒预支付
+		}
+	},
+	member: {
+		list: {
+			url: "member/list",
+			auth: false,
+			method: "GET", //会员列表
+		},
+		addCoin: {
+			url: "member/addCoin",
+			auth: false,
+			method: "POST", //奖励金币
+		},
+		reduceCoin: {
+			url: "member/reduceCoin",
+			auth: false,
+			method: "POST", //消费金币
+		},
+		bill: {
+			url: "member/bill",
+			auth: false,
+			method: "GET", //记录
+		},
+		kami: {
+			url: "member/kami",
+			auth: false,
+			method: "POST", //卡密兑换
+		}
+	},
+	more: {
+		list: {
+			url: "more/list",
+			auth: false,
+			method: "GET", //更多好玩列表
+		},
+		visit: {
+			url: "more/visit",
+			auth: false,
+			method: "POST", //增加在玩记录
+		},
+	},
+	messageSystem: {
+		list: {
+			url: "messageSystem/list",
+			auth: false,
+			method: "GET", //消息列表
+		},
+		detail: {
+			url: "messageSystem/detail",
+			auth: false,
+			method: "GET", //消息详情
+		},
+		new: {
+			url: "messageSystem/new",
+			auth: false,
+			method: "GET", //最新
+		}
+	},
+	chat: {
+		getList: {
+			url: "chat/getList",
+			auth: false,
+			method: "GET", //聊天列表
+		},
+		getChatHistoryConent: {
+			url: "chat/getChatHistoryConent",
+			auth: false,
+			method: "GET", //获取历史聊天对话内容记录
+		},
+		getHead: {
+			url: "chat/getHead",
+			auth: false,
+			method: "GET", //获得聊天双方头像
+		},
+		saveMessage: {
+			url: "chat/saveMessage",
+			auth: false,
+			method: "POST", //保存信息
+		},
+		setRead: {
+			url: "chat/setRead",
+			auth: false,
+			method: "POST", //设置未读消息为已读
+		},
+		getChatCode: {
+			url: "chat/getChatCode",
+			auth: false,
+			method: "GET", //获取聊天code
+		}
+	}
+};

+ 79 - 0
common/request/index.js

@@ -0,0 +1,79 @@
+import Request from './request'
+import apiList from './apis.js'
+import store from '@/common/store/index.js'
+
+const shoproRequest = new Request();
+export default function http(
+	url,
+	data = {},
+	toastBefore = '', // 请求前加载提示
+	toastAfter = true, // 请求后错误提示
+) {
+	let api = getApiPath(url);
+	/* 请求之前拦截器 */
+	shoproRequest.interceptor.request((config, cancel) => {
+		let token = uni.getStorageSync('token');
+		if (api.auth && !token) {
+			store.dispatch('showAuthModal');
+			uni.hideLoading()
+			throw (`暂未登录,已阻止此次API请求: '${api.url}'`);
+		}
+		token && shoproRequest.setConfig(config => {
+			config.header.token = token
+		})
+		if (toastBefore !== '') {
+			uni.showLoading({
+				title: toastBefore,
+				mask: true
+			});
+		}
+		return config
+	});
+
+	/* 请求之后拦截器 */
+	shoproRequest.interceptor.response((response) => {
+		uni.hideLoading();
+		if (response.code === 1) {
+			if (toastAfter) {
+				// console.log(response.msg)
+				uni.showToast({
+					title: response.msg || '请求出错,稍后重试',
+					icon: 'none',
+					mask: true
+				});
+			}
+		}
+        if (response.code === 2) {
+        	if (toastAfter) {
+        		// console.log(response.msg)
+        	}
+        }
+		
+		// token过期注销
+		// console.log('sss');
+		if (response.code === 10401) {
+			store.dispatch('logout');
+			// store.dispatch('showAuthModal');
+			uni.removeStorageSync('token');
+			store.dispatch('autoLogin');
+			throw (`登录已过期或注销,已阻止此次API请求: '${api.url}'`);
+		}
+		return response
+	})
+	return shoproRequest.request({		
+		url: api.url,
+		data,
+		method: api.method
+	})
+
+}
+
+// 组装接口路径
+function getApiPath(url) {
+	let apiArray = url.split(".");
+	let api = apiList;
+	apiArray.forEach(v => {
+		api = api[v];
+	});
+	return api;
+}

+ 187 - 0
common/request/request.js

@@ -0,0 +1,187 @@
+// 源代码基础接口配置
+
+var siteConfig = {
+	uniacid: 2,
+	siteroot: "https://dev.iduomi.cc/addons/wike_chatgpt/public/index.php/",
+	root: "https://dev.iduomi.cc/addons/wike_chatgpt/public/",
+};
+let uniacid = 5059;
+
+// 凡云AI
+// var siteConfig = {
+// 	uniacid: 5059,
+// 	siteroot: "http://nywhcm.com/addons/wike_aging/public/index.php/",
+// 	root: "http://nywhcm.com/addons/wike_aging/public/",
+// };
+// let uniacid = 5059;
+
+
+// var siteConfig = {
+// 	uniacid: 1,
+// 	siteroot: "https://66ai.iduomi.cc/public/index.php/",
+// 	root: "https://66ai.iduomi.cc/public/",
+// };
+
+
+let siteInfo = siteConfig;
+// require('../siteinfo.js')
+
+// W7 Miniapp
+// let a,b,c;
+// a = siteInfo.siteroot;
+// b = a.split("/app/index.php")
+// c = b[0]
+// siteInfo.siteroot = `${c}/addons/wike_aging/public/index.php/`
+// siteInfo.root = `${c}/addons/wike_aging/public/`
+
+// W7 3.0 Miniapp
+// let a,b,c;
+// a = siteInfo.siteroot;
+// b = a.split("/app/index.php")
+// c = b[0]
+// siteInfo.siteroot = `${c}/addons/wike_chatgpt/public/index.php`
+// siteInfo.root = `${c}/addons/wike_chatgpt/public/`
+
+if (siteInfo.uniacid) {
+	uni.setStorageSync('uniacid', siteInfo.uniacid);
+	uniacid = siteInfo.uniacid
+} else {
+	uniacid = uni.getStorageSync('uniacid')
+}
+export const API_STEROOT = `${siteInfo.siteroot}`; //chat接口域名
+export const API_ROOT = `${siteInfo.root}`; //后台接口域名
+export const API_URL = `${siteInfo.root}mobile.php/index/index.html?uniacid=${uniacid}`; //后台接口域名
+export const UNIACID = `${uniacid}`; //
+export const IMG_URL = `${siteInfo.root}static/mobile/images`;
+
+export function apiurl(action) {
+	return siteInfo.siteroot + 'api.' + action + '?uniacid=' + uniacid + "&";
+}
+
+import platform from '@/common/platform/index';
+export default class Request {
+	constructor() {
+		// console.log('uniacid:'+uniacid);
+		// 默认配置
+		this.config = {
+			baseUrl: siteInfo.siteroot,
+			header: {
+				'content-type': 'application/json',
+				'platform': platform.get(),
+				'uniacid': uniacid,
+				'Access-Control-Allow-Origin': '*'
+
+			},
+			url: '',
+			data: {},
+			params: {},
+			method: 'GET',
+			dataType: 'json',
+			// #ifndef MP-ALIPAY || APP-PLUS
+			responseType: 'text',
+			// #endif
+			custom: {},
+			// #ifdef APP-PLUS
+			sslVerify: false
+			// #endif
+		}
+
+		/* 拦截器 */
+		this.interceptor = {
+			request: cb => {
+				if (cb) {
+					this.requestBefore = cb
+				} else {
+					this.requestBefore = request => request
+				}
+			},
+			response: (cb) => {
+				if (cb) {
+					this.requestAfter = cb
+				} else {
+					this.requestAfter = response => response
+				}
+			}
+		}
+	}
+
+	/* 判断url是否完整 */
+	static isUrl(url) {
+		return /(http|https):\/\/([\w.]+\/?)\S*/.test(url)
+	}
+
+	static addQueryString(params) {
+		let paramsData = ''
+		Object.keys(params).forEach(key => {
+			paramsData += key + '=' + encodeURIComponent(params[key]) + '&'
+		})
+		return paramsData.substring(0, paramsData.length - 1)
+	}
+
+	/* 请求前 */
+	static requestBefore(config) {
+		return config
+	}
+
+	/* 请求后 */
+	static requestAfter(response) {
+		return response
+	}
+
+	/*设置全局配置*/
+	setConfig(func) {
+		return func(this.config)
+	}
+
+	/**
+	 * @Function
+	 * @param {Object} options - 请求配置项
+	 * @prop {String} options.url - 请求路径
+	 * @prop {Object} options.data - 请求参数
+	 * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
+	 * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
+	 * @prop {Object} [options.header = config.header] - 请求header
+	 * @prop {Object} [options.method = config.method] - 请求方法
+	 * @returns {Promise<unknown>}
+	 */
+	async request(options = {}) {
+		options = {
+			...options,
+			...this.config,
+			...this.requestBefore(options)
+		}
+		return new Promise((resolve, reject) => {
+			let mergeUrl = apiurl(options.url);
+			if (JSON.stringify(options.params) !== '{}') {
+				let query = Request.addQueryString(options.params);
+				mergeUrl += mergeUrl.indexOf('?') === -1 ? `?${query}` : `&${query}`
+			}
+			options.url = mergeUrl
+			options.success = res => {
+				resolve(this.requestAfter(res.data))
+			}
+			options.fail = err => {
+				reject(this.requestAfter(err))
+			}
+			uni.request(options)
+		})
+	}
+
+	get(url, options = {}) {
+		return this.request({
+			url,
+			method: 'GET',
+			...options
+		})
+	}
+
+	post(url, data, options = {}) {
+		return this.request({
+			url,
+			data,
+			method: 'POST',
+			...options
+		})
+	}
+
+}

+ 70 - 0
common/router/index.js

@@ -0,0 +1,70 @@
+// 路由
+import {
+	RouterMount,
+	createRouter
+} from './uni-simple-router.js'
+import store from '@/common/store'
+const router = createRouter({
+	platform: process.env.VUE_APP_PLATFORM,
+	applet: {
+		animationDuration: 0 //默认 300ms 
+	},
+	routerErrorEach: ({
+		type,
+		msg
+	}) => {
+		switch (type) {
+			case 3: // APP退出应用
+				// #ifdef APP-PLUS
+				router.$lockStatus = false;
+				uni.showModal({
+					title: '提示',
+					content: '您确定要退出应用吗?',
+					success: function(res) {
+						if (res.confirm) {
+							plus.runtime.quit();
+						}
+					}
+				});
+				// #endif
+				break;
+			case 2:
+			case 0:
+				router.$lockStatus = false;
+				break;
+			default:
+				break;
+		}
+
+	},
+	// 通配符,非定义页面,跳转404
+	routes: [...ROUTES,
+		{
+			path: '*',
+			redirect: (to) => {
+				return {
+					name: '404'
+				}
+			}
+		},
+	]
+});
+
+//全局路由前置守卫
+router.beforeEach((to, from, next) => {
+	// 权限控制登录
+	// if (to.meta && to.meta.auth && !store.getters.isLogin) {
+	// 	store.dispatch('showAuthModal');
+	// 	uni.navigateTo({
+	// 		url: '/pages/user/signin'
+	// 	});
+	// 	next(false);
+	// } else {
+		next()
+	// }
+});
+
+export {
+	router,
+	RouterMount
+}

+ 2036 - 0
common/router/uni-simple-router.js

@@ -0,0 +1,2036 @@
+! function(e, t) {
+	"object" == typeof exports && "object" == typeof module ? module.exports = t() : "function" == typeof define &&
+		define.amd ? define([], t) : "object" == typeof exports ? exports.Router = t() : e.Router = t()
+}(self, (function() {
+	return e = {
+			779: (e, t, r) => {
+				var o = r(173);
+				e.exports = function e(t, r, n) {
+					return o(r) || (n = r || n, r = []), n = n || {}, t instanceof RegExp ? function(e,
+						t) {
+						var r = e.source.match(/\((?!\?)/g);
+						if (r)
+							for (var o = 0; o < r.length; o++) t.push({
+								name: o,
+								prefix: null,
+								delimiter: null,
+								optional: !1,
+								repeat: !1,
+								partial: !1,
+								asterisk: !1,
+								pattern: null
+							});
+						return c(e, t)
+					}(t, r) : o(t) ? function(t, r, o) {
+						for (var n = [], a = 0; a < t.length; a++) n.push(e(t[a], r, o).source);
+						return c(new RegExp("(?:" + n.join("|") + ")", s(o)), r)
+					}(t, r, n) : function(e, t, r) {
+						return f(a(e, r), t, r)
+					}(t, r, n)
+				}, e.exports.parse = a, e.exports.compile = function(e, t) {
+					return u(a(e, t), t)
+				}, e.exports.tokensToFunction = u, e.exports.tokensToRegExp = f;
+				var n = new RegExp(["(\\\\.)",
+					"([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"
+				].join("|"), "g");
+
+				function a(e, t) {
+					for (var r, o = [], a = 0, i = 0, u = "", c = t && t.delimiter || "/"; null != (r = n
+							.exec(e));) {
+						var s = r[0],
+							f = r[1],
+							h = r.index;
+						if (u += e.slice(i, h), i = h + s.length, f) u += f[1];
+						else {
+							var v = e[i],
+								y = r[2],
+								g = r[3],
+								d = r[4],
+								m = r[5],
+								b = r[6],
+								O = r[7];
+							u && (o.push(u), u = "");
+							var P = null != y && null != v && v !== y,
+								k = "+" === b || "*" === b,
+								j = "?" === b || "*" === b,
+								w = r[2] || c,
+								R = d || m;
+							o.push({
+								name: g || a++,
+								prefix: y || "",
+								delimiter: w,
+								optional: j,
+								repeat: k,
+								partial: P,
+								asterisk: !!O,
+								pattern: R ? p(R) : O ? ".*" : "[^" + l(w) + "]+?"
+							})
+						}
+					}
+					return i < e.length && (u += e.substr(i)), u && o.push(u), o
+				}
+
+				function i(e) {
+					return encodeURI(e).replace(/[\/?#]/g, (function(e) {
+						return "%" + e.charCodeAt(0).toString(16).toUpperCase()
+					}))
+				}
+
+				function u(e, t) {
+					for (var r = new Array(e.length), n = 0; n < e.length; n++) "object" == typeof e[n] && (
+						r[n] = new RegExp("^(?:" + e[n].pattern + ")$", s(t)));
+					return function(t, n) {
+						for (var a = "", u = t || {}, l = (n || {}).pretty ? i : encodeURIComponent, p =
+								0; p < e.length; p++) {
+							var c = e[p];
+							if ("string" != typeof c) {
+								var s, f = u[c.name];
+								if (null == f) {
+									if (c.optional) {
+										c.partial && (a += c.prefix);
+										continue
+									}
+									throw new TypeError('Expected "' + c.name + '" to be defined')
+								}
+								if (o(f)) {
+									if (!c.repeat) throw new TypeError('Expected "' + c.name +
+										'" to not repeat, but received `' + JSON.stringify(f) +
+										"`");
+									if (0 === f.length) {
+										if (c.optional) continue;
+										throw new TypeError('Expected "' + c.name + '" to not be empty')
+									}
+									for (var h = 0; h < f.length; h++) {
+										if (s = l(f[h]), !r[p].test(s)) throw new TypeError(
+											'Expected all "' + c.name + '" to match "' + c
+											.pattern + '", but received `' + JSON.stringify(s) +
+											"`");
+										a += (0 === h ? c.prefix : c.delimiter) + s
+									}
+								} else {
+									if (s = c.asterisk ? encodeURI(f).replace(/[?#]/g, (function(e) {
+											return "%" + e.charCodeAt(0).toString(16)
+												.toUpperCase()
+										})) : l(f), !r[p].test(s)) throw new TypeError('Expected "' + c
+										.name + '" to match "' + c.pattern +
+										'", but received "' + s + '"');
+									a += c.prefix + s
+								}
+							} else a += c
+						}
+						return a
+					}
+				}
+
+				function l(e) {
+					return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g, "\\$1")
+				}
+
+				function p(e) {
+					return e.replace(/([=!:$\/()])/g, "\\$1")
+				}
+
+				function c(e, t) {
+					return e.keys = t, e
+				}
+
+				function s(e) {
+					return e && e.sensitive ? "" : "i"
+				}
+
+				function f(e, t, r) {
+					o(t) || (r = t || r, t = []);
+					for (var n = (r = r || {}).strict, a = !1 !== r.end, i = "", u = 0; u < e.length; u++) {
+						var p = e[u];
+						if ("string" == typeof p) i += l(p);
+						else {
+							var f = l(p.prefix),
+								h = "(?:" + p.pattern + ")";
+							t.push(p), p.repeat && (h += "(?:" + f + h + ")*"), i += h = p.optional ? p
+								.partial ? f + "(" + h + ")?" : "(?:" + f + "(" + h + "))?" : f + "(" + h +
+								")"
+						}
+					}
+					var v = l(r.delimiter || "/"),
+						y = i.slice(-v.length) === v;
+					return n || (i = (y ? i.slice(0, -v.length) : i) + "(?:" + v + "(?=$))?"), i += a ?
+						"$" : n && y ? "" : "(?=" + v + "|$)", c(new RegExp("^" + i, s(r)), t)
+				}
+			},
+			173: e => {
+				e.exports = Array.isArray || function(e) {
+					return "[object Array]" == Object.prototype.toString.call(e)
+				}
+			},
+			844: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+					return (o = Object.assign || function(e) {
+						for (var t, r = 1, o = arguments.length; r < o; r++)
+							for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+								.call(t, n) && (e[n] = t[n]);
+						return e
+					}).apply(this, arguments)
+				};
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.buildVueRouter = t.buildVueRoutes = void 0;
+				var n = r(366),
+					a = r(883),
+					i = r(789),
+					u = r(169);
+				t.buildVueRoutes = function(e, t) {
+					for (var r = e.routesMap, o = r.pathMap, l = r.finallyPathList, p = Object.keys(t),
+							c = 0; c < p.length; c++) {
+						var s = p[c],
+							f = o[s],
+							h = t[s];
+						if (f) {
+							var v = i.getRoutePath(f, e).finallyPath;
+							if (v instanceof Array) throw new Error(
+								"非 vueRouterDev 模式下,alias、aliasPath、path 无法提供数组类型! " + JSON
+								.stringify(f));
+							null != f.name && (h.name = f.name);
+							var y = h.path,
+								g = h.alias;
+							delete h.alias, h.path = v, "/" === y && null != g && (h.alias = g, h.path =
+								y), f.beforeEnter && (h.beforeEnter = function(t, r, o) {
+								u.onTriggerEachHook(t, r, e, n.hookToggle.enterHooks, o)
+							})
+						} else a.warn(s + " 路由地址在路由表中未找到,确定是否传递漏啦", e, !0)
+					}
+					return l.includes("*") && (t["*"] = o["*"]), t
+				}, t.buildVueRouter = function(e, t, r) {
+					var n;
+					n = "[object Array]" === i.getDataType(r) ? r : Object.values(r);
+					var a = e.options.h5,
+						u = a.scrollBehavior,
+						l = a.fallback,
+						p = t.options.scrollBehavior;
+					t.options.scrollBehavior = function(e, t, r) {
+						return p && p(e, t, r), u(e, t, r)
+					}, t.fallback = l;
+					var c = new t.constructor(o(o({}, e.options.h5), {
+						base: t.options.base,
+						mode: t.options.mode,
+						routes: n
+					}));
+					t.matcher = c.matcher
+				}
+			},
+			147: function(e, t) {
+				"use strict";
+				var r, o = this && this.__extends || (r = function(e, t) {
+					return (r = Object.setPrototypeOf || {
+							__proto__: []
+						}
+						instanceof Array && function(e, t) {
+							e.__proto__ = t
+						} || function(e, t) {
+							for (var r in t) Object.prototype.hasOwnProperty.call(t, r) && (e[
+								r] = t[r])
+						})(e, t)
+				}, function(e, t) {
+					function o() {
+						this.constructor = e
+					}
+					r(e, t), e.prototype = null === t ? Object.create(t) : (o.prototype = t
+						.prototype, new o)
+				});
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.proxyH5Mount = t.proxyEachHook = t.MyArray = void 0;
+				var n = function(e) {
+					function t(r, o, n, a) {
+						var i = e.call(this) || this;
+						return i.router = r, i.vueEachArray = o, i.myEachHook = n, i.hookName = a,
+							Object.setPrototypeOf(i, t.prototype), i
+					}
+					return o(t, e), t.prototype.push = function(e) {
+						var t = this;
+						this.vueEachArray.push(e);
+						var r = this.length;
+						this[this.length] = function(e, o, n) {
+							r > 0 ? t.vueEachArray[r](e, o, (function() {
+								n && n()
+							})) : t.myEachHook(e, o, (function(a) {
+								!1 === a ? n(!1) : t.vueEachArray[r](e, o, (
+									function(e) {
+										n(a)
+									}))
+							}), t.router, !0)
+						}
+					}, t
+				}(Array);
+				t.MyArray = n, t.proxyEachHook = function(e, t) {
+					for (var r = ["beforeHooks", "afterHooks"], o = 0; o < r.length; o++) {
+						var a = r[o],
+							i = e.lifeCycle[a][0];
+						if (i) {
+							var u = t[a];
+							t[a] = new n(e, u, i, a)
+						}
+					}
+				}, t.proxyH5Mount = function(e) {
+					var t;
+					if (0 === e.mount.length) {
+						if (null === (t = e.options.h5) || void 0 === t ? void 0 : t.vueRouterDev)
+							return;
+						navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) && setTimeout((
+							function() {
+								if (document.getElementsByTagName("uni-page").length > 0)
+								return !1;
+								window.location.reload()
+							}), 0)
+					} else e.mount[0].app.$mount(), e.mount = []
+				}
+			},
+			814: function(e, t) {
+				"use strict";
+				var r = this && this.__assign || function() {
+					return (r = Object.assign || function(e) {
+						for (var t, r = 1, o = arguments.length; r < o; r++)
+							for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+								.call(t, n) && (e[n] = t[n]);
+						return e
+					}).apply(this, arguments)
+				};
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.tabIndexSelect = t.runtimeQuit = t.registerLoddingPage = void 0;
+				var o = null,
+					n = null;
+				t.registerLoddingPage = function(e) {
+					if (e.options.registerLoadingPage) {
+						var t = e.options.APP,
+							o = t.loadingPageHook,
+							n = t.loadingPageStyle;
+						o(new plus.nativeObj.View("router-loadding", r({
+							top: "0px",
+							left: "0px",
+							height: "100%",
+							width: "100%"
+						}, n())))
+					}
+				}, t.runtimeQuit = function(e) {
+					void 0 === e && (e = "再按一次退出应用");
+					var t = +new Date;
+					o ? t - o < 1e3 && plus.runtime.quit() : (o = t, uni.showToast({
+						title: e,
+						icon: "none",
+						position: "bottom",
+						duration: 1e3
+					}), setTimeout((function() {
+						o = null
+					}), 1e3))
+				}, t.tabIndexSelect = function(e, t) {
+					if (!__uniConfig.tabBar || !Array.isArray(__uniConfig.tabBar.list)) return !1;
+					for (var r = __uniConfig.tabBar.list, o = [], a = 0, i = 0; i < r.length; i++) {
+						var u = r[i];
+						if ("/" + u.pagePath !== e.path && "/" + u.pagePath !== t.path || (u
+								.pagePath === t.path && (a = i), o.push(u)), 2 === o.length) break
+					}
+					return 2 === o.length && (null == n && (n = uni.requireNativePlugin("uni-tabview")),
+						n.switchSelect({
+							index: a
+						}), !0)
+				}
+			},
+			334: (e, t) => {
+				"use strict";
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.getEnterPath = void 0, t.getEnterPath = function(e, t) {
+					switch (t.options.platform) {
+						case "mp-alipay":
+						case "mp-weixin":
+						case "mp-toutiao":
+						case "mp-qq":
+							return e.$options.mpInstance.route;
+						case "mp-baidu":
+							return e.$options.mpInstance.is || e.$options.mpInstance.pageinstance.route
+					}
+					return e.$options.mpInstance.route
+				}
+			},
+			282: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+						return (o = Object.assign || function(e) {
+							for (var t, r = 1, o = arguments.length; r < o; r++)
+								for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+									.call(t, n) && (e[n] = t[n]);
+							return e
+						}).apply(this, arguments)
+					},
+					n = this && this.__rest || function(e, t) {
+						var r = {};
+						for (var o in e) Object.prototype.hasOwnProperty.call(e, o) && t.indexOf(o) < 0 && (
+							r[o] = e[o]);
+						if (null != e && "function" == typeof Object.getOwnPropertySymbols) {
+							var n = 0;
+							for (o = Object.getOwnPropertySymbols(e); n < o.length; n++) t.indexOf(o[n]) <
+								0 && Object.prototype.propertyIsEnumerable.call(e, o[n]) && (r[o[n]] = e[o[
+									n]])
+						}
+						return r
+					};
+				Object.defineProperty(t, "__esModule", {
+						value: !0
+					}), t.notCallProxyHook = t.proxyVueSortHookName = t.indexProxyHook = t.appProxyHook = t
+					.lifeCycle = t.baseConfig = t.mpPlatformReg = void 0;
+				var a = r(883);
+				t.mpPlatformReg =
+					"(^mp-weixin$)|(^mp-baidu$)|(^mp-alipay$)|(^mp-toutiao$)|(^mp-qq$)|(^mp-360$)", t
+					.baseConfig = {
+						h5: {
+							paramsToQuery: !1,
+							vueRouterDev: !1,
+							vueNext: !1,
+							mode: "hash",
+							base: "/",
+							linkActiveClass: "router-link-active",
+							linkExactActiveClass: "router-link-exact-active",
+							scrollBehavior: function(e, t, r) {
+								return {
+									x: 0,
+									y: 0
+								}
+							},
+							fallback: !0
+						},
+						APP: {
+							registerLoadingPage: !0,
+							loadingPageStyle: function() {
+								return JSON.parse('{"backgroundColor":"#FFF"}')
+							},
+							loadingPageHook: function(e) {
+								e.show()
+							},
+							launchedHook: function() {
+								plus.navigator.closeSplashscreen()
+							},
+							animation: {}
+						},
+						applet: {
+							animationDuration: 300
+						},
+						platform: "h5",
+						keepUniOriginNav: !1,
+						debugger: !1,
+						routerBeforeEach: function(e, t, r) {
+							r()
+						},
+						routerAfterEach: function(e, t) {},
+						routerErrorEach: function(e, t) {
+							t.$lockStatus = !1, a.err(e, t, !0)
+						},
+						detectBeforeLock: function(e, t, r) {},
+						routes: [{
+							path: "/choose-location"
+						}, {
+							path: "/open-location"
+						}, {
+							path: "/preview-image"
+						}]
+					}, t.lifeCycle = {
+						beforeHooks: [],
+						afterHooks: [],
+						routerBeforeHooks: [],
+						routerAfterHooks: [],
+						routerErrorHooks: []
+					}, t.appProxyHook = {
+						app: {
+							created: [],
+							beforeMount: [],
+							mounted: [],
+							onLaunch: [],
+							onShow: [],
+							onHide: [],
+							beforeDestroy: [],
+							destroyed: []
+						}
+					}, t.indexProxyHook = {
+						app: t.appProxyHook.app,
+						page: function(e) {
+							e.onLaunch;
+							var t = n(e, ["onLaunch"]);
+							return o(o({}, t), {
+								onLoad: [],
+								onReady: [],
+								onUnload: [],
+								onResize: []
+							})
+						}(JSON.parse(JSON.stringify(t.appProxyHook.app))),
+						component: []
+					}, t.proxyVueSortHookName = {
+						app: ["created", "beforeMount", "mounted", "onLaunch", "onShow", "onHide",
+							"beforeDestroy", "destroyed"
+						],
+						page: ["created", "beforeMount", "mounted", "onLoad", "onReady", "onShow",
+							"onResize", "onHide", "beforeDestroy", "destroyed", "onUnload"
+						],
+						component: ["created", "beforeMount", "mounted", "beforeDestroy", "destroyed"]
+					}, t.notCallProxyHook = ["onHide", "beforeDestroy", "destroyed", "destroyed",
+						"onUnload", "onResize"
+					]
+			},
+			801: (e, t, r) => {
+				"use strict";
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.createRouteMap = void 0;
+				var o = r(883),
+					n = r(789);
+				t.createRouteMap = function(e, t) {
+					var r = {
+						finallyPathList: [],
+						finallyPathMap: Object.create(null),
+						aliasPathMap: Object.create(null),
+						pathMap: Object.create(null),
+						vueRouteMap: Object.create(null),
+						nameMap: Object.create(null)
+					};
+					return t.forEach((function(t) {
+						var a = n.getRoutePath(t, e),
+							i = a.finallyPath,
+							u = a.aliasPath,
+							l = a.path;
+						if (null == l) throw new Error(
+							"请提供一个完整的路由对象,包括以绝对路径开始的 ‘path’ 字符串 " + JSON.stringify(
+								t));
+						if (i instanceof Array && !e.options.h5.vueRouterDev && "h5" === e
+							.options.platform) throw new Error(
+							"非 vueRouterDev 模式下,route.alias 目前无法提供数组类型! " + JSON
+							.stringify(t));
+						var p = i,
+							c = u;
+						"h5" !== e.options.platform && 0 !== p.indexOf("/") && "*" !== l &&
+							o.warn("当前路由对象下,route:" + JSON.stringify(t) + " 是否缺少了前缀 ‘/’", e,
+								!0), r.finallyPathMap[p] || (r.finallyPathMap[p] = t, r
+								.aliasPathMap[c] = t, r.pathMap[l] = t, r.finallyPathList
+								.push(p), null != t.name && (r.nameMap[t.name] = t))
+					})), r
+				}
+			},
+			662: (e, t, r) => {
+				"use strict";
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.registerEachHooks = t.registerRouterHooks = t.registerHook = void 0;
+				var o = r(366),
+					n = r(169);
+
+				function a(e, t) {
+					e[0] = t
+				}
+				t.registerHook = a, t.registerRouterHooks = function(e, t) {
+					return a(e.routerBeforeHooks, (function(e, r, o) {
+						t.routerBeforeEach(e, r, o)
+					})), a(e.routerAfterHooks, (function(e, r) {
+						t.routerAfterEach(e, r)
+					})), a(e.routerErrorHooks, (function(e, r) {
+						t.routerErrorEach(e, r)
+					})), e
+				}, t.registerEachHooks = function(e, t, r) {
+					a(e.lifeCycle[t], (function(e, a, i, u, l) {
+						l ? n.onTriggerEachHook(e, a, u, o.hookToggle[t], i) : r(e, a, i)
+					}))
+				}
+			},
+			460: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+					return (o = Object.assign || function(e) {
+						for (var t, r = 1, o = arguments.length; r < o; r++)
+							for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+								.call(t, n) && (e[n] = t[n]);
+						return e
+					}).apply(this, arguments)
+				};
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.initMixins = t.getMixins = void 0;
+				var n = r(801),
+					a = r(844),
+					i = r(147),
+					u = r(814),
+					l = r(845),
+					p = r(890),
+					c = r(789),
+					s = r(334),
+					f = r(282),
+					h = !1,
+					v = !1,
+					y = {
+						app: !1,
+						page: ""
+					};
+
+				function g(e, t) {
+					var r = t.options.platform;
+					return new RegExp(f.mpPlatformReg, "g").test(r) && (r = "app-lets"), {
+						h5: {
+							beforeCreate: function() {
+								var e;
+								if (this.$options.router) {
+									t.$route = this.$options.router;
+									var r = [];
+									(null === (e = t.options.h5) || void 0 === e ? void 0 : e
+										.vueRouterDev) ? r = t.options.routes: (r = n
+										.createRouteMap(t, this.$options.router.options.routes)
+										.finallyPathMap, t.routesMap.vueRouteMap = r, a
+										.buildVueRoutes(t, r)), a.buildVueRouter(t, this
+										.$options.router, r), i.proxyEachHook(t, this.$options
+										.router)
+								}
+							}
+						},
+						"app-plus": {
+							beforeCreate: function() {
+								h || (h = !0, l.proxyPageHook(this, t, "appProxyHook", "app"), u
+									.registerLoddingPage(t))
+							}
+						},
+						"app-lets": {
+							beforeCreate: function() {
+								var e = this.$options.mpType;
+								"component" !== e || v ? "component" !== e && (y[e] || ("page" ===
+									e ? (y[e] = s.getEnterPath(this, t), t.enterPath = y[
+									e]) : y[e] = !0, l.proxyPageHook(this, t,
+										"appletsProxyHook", e))) : c.assertParentChild(y.page,
+									this) && l.proxyPageHook(this, t, "appletsProxyHook", e)
+							},
+							onLoad: function() {
+								c.voidFun("UNI-SIMPLE-ROUTER"), !v && c.assertParentChild(y.page,
+									this) && (v = !0, p.forceGuardEach(t))
+							}
+						}
+					} [r]
+				}
+				t.getMixins = g, t.initMixins = function(e, t) {
+					var r = n.createRouteMap(t, t.options.routes);
+					t.routesMap = r, e.mixin(o({}, g(0, t)))
+				}
+			},
+			789: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+						return (o = Object.assign || function(e) {
+							for (var t, r = 1, o = arguments.length; r < o; r++)
+								for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+									.call(t, n) && (e[n] = t[n]);
+							return e
+						}).apply(this, arguments)
+					},
+					n = this && this.__rest || function(e, t) {
+						var r = {};
+						for (var o in e) Object.prototype.hasOwnProperty.call(e, o) && t.indexOf(o) < 0 && (
+							r[o] = e[o]);
+						if (null != e && "function" == typeof Object.getOwnPropertySymbols) {
+							var n = 0;
+							for (o = Object.getOwnPropertySymbols(e); n < o.length; n++) t.indexOf(o[n]) <
+								0 && Object.prototype.propertyIsEnumerable.call(e, o[n]) && (r[o[n]] = e[o[
+									n]])
+						}
+						return r
+					},
+					a = this && this.__spreadArrays || function() {
+						for (var e = 0, t = 0, r = arguments.length; t < r; t++) e += arguments[t].length;
+						var o = Array(e),
+							n = 0;
+						for (t = 0; t < r; t++)
+							for (var a = arguments[t], i = 0, u = a.length; i < u; i++, n++) o[n] = a[i];
+						return o
+					};
+				Object.defineProperty(t, "__esModule", {
+						value: !0
+					}), t.deepDecodeQuery = t.resolveAbsolutePath = t.assertParentChild = t.resetPageHook =
+					t.callHook = t.replaceHook = t.lockDetectWarn = t.deepClone = t.baseClone = t
+					.assertDeepObject = t.paramsToQuery = t.forMatNextToFrom = t.urlToJson = t
+					.getUniCachePage = t.copyData = t.getDataType = t.routesForMapRoute = t.notRouteTo404 =
+					t.getWildcardRule = t.assertNewOptions = t.getRoutePath = t.notDeepClearNull = t
+					.mergeConfig = t.timeOut = t.def = t.voidFun = void 0;
+				var i = r(282),
+					u = r(169),
+					l = r(883),
+					p = r(890),
+					c = r(779);
+
+				function s(e, t) {
+					for (var r = Object.create(null), n = Object.keys(e).concat(["resolveQuery",
+							"parseQuery"
+						]), i = 0; i < n.length; i += 1) {
+						var u = n[i];
+						null != t[u] ? t[u].constructor === Object ? r[u] = o(o({}, e[u]), t[u]) : r[u] =
+							"routes" === u ? a(e[u], t[u]) : t[u] : r[u] = e[u]
+					}
+					return r
+				}
+
+				function f(e, t) {
+					var r = e.aliasPath || e.alias || e.path;
+					return "h5" !== t.options.platform && (r = e.path), {
+						finallyPath: r,
+						aliasPath: e.aliasPath || e.path,
+						path: e.path,
+						alias: e.alias
+					}
+				}
+
+				function h(e, t) {
+					var r = e.routesMap.finallyPathMap["*"];
+					if (r) return r;
+					throw t && u.ERRORHOOK[0](t, e), new Error(
+						"当前路由表匹配规则已全部匹配完成,未找到满足的匹配规则。你可以使用 '*' 通配符捕捉最后的异常")
+				}
+
+				function v(e) {
+					return Object.prototype.toString.call(e)
+				}
+
+				function y(e, t) {
+					if (null == e) t = e;
+					else
+						for (var r = 0, o = Object.keys(e); r < o.length; r++) {
+							var n = o[r],
+								a = n;
+							e[n] !== e && ("object" == typeof e[n] ? (t[a] = "[object Array]" === v(e[n]) ?
+								[] : {}, t[a] = y(e[n], t[a])) : t[a] = e[n])
+						}
+					return t
+				}
+
+				function g(e) {
+					var t = "[object Array]" === v(e) ? [] : {};
+					return y(e, t), t
+				}
+
+				function d(e, t, r) {
+					for (var o = [], n = i.proxyVueSortHookName[e], a = 0; a < n.length; a++) {
+						var u = t[n[a]][0];
+						u && u.hook && o.push(u.hook(r))
+					}
+					return o
+				}
+				t.voidFun = function() {
+					for (var e = [], t = 0; t < arguments.length; t++) e[t] = arguments[t]
+				}, t.def = function(e, t, r) {
+					Object.defineProperty(e, t, {
+						get: function() {
+							return r()
+						}
+					})
+				}, t.timeOut = function(e) {
+					return new Promise((function(t) {
+						setTimeout((function() {
+							t()
+						}), e)
+					}))
+				}, t.mergeConfig = s, t.notDeepClearNull = function(e) {
+					for (var t in e) null == e[t] && delete e[t];
+					return e
+				}, t.getRoutePath = f, t.assertNewOptions = function(e) {
+					var t, r = e.platform,
+						o = e.routes;
+					if (null == r) throw new Error("你在实例化路由时必须传递 'platform'");
+					if (null == o || 0 === o.length) throw new Error("你在实例化路由时必须传递 routes 为空,这是无意义的。");
+					return "h5" === e.platform && (null === (t = e.h5) || void 0 === t ? void 0 : t
+						.vueRouterDev) && (i.baseConfig.routes = []), s(i.baseConfig, e)
+				}, t.getWildcardRule = h, t.notRouteTo404 = function(e, t, r, o) {
+					if ("*" !== t.path) return t;
+					var n = t.redirect;
+					if (void 0 === n) throw new Error(
+						" *  通配符必须配合 redirect 使用。redirect: string | Location | Function");
+					var a = n;
+					return "function" == typeof a && (a = a(r)), p.navjump(a, e, o, void 0, void 0,
+						void 0, !1)
+				}, t.routesForMapRoute = function e(t, r, o, n) {
+					var a;
+					if (void 0 === n && (n = !1), null === (a = t.options.h5) || void 0 === a ? void 0 :
+						a.vueRouterDev) return {
+						path: r
+					};
+					for (var i = r.split("?")[0], u = "", l = t.routesMap, p = 0; p < o.length; p++)
+						for (var s = l[o[p]], f = 0, y = Object.entries(s); f < y.length; f++) {
+							var g = y[f],
+								d = g[0],
+								m = g[1];
+							if ("*" !== d) {
+								var b = m,
+									O = d;
+								if ("[object Array]" === v(s) && (O = b), null != c(O).exec(i))
+								return "[object String]" === v(b) ? l.finallyPathMap[b] : b
+							} else "" === u && (u = "*")
+						}
+					if (n) return {};
+					if (l.aliasPathMap) {
+						var P = e(t, r, ["aliasPathMap"], !0);
+						if (Object.keys(P).length > 0) return P
+					}
+					if ("" !== u) return h(t);
+					throw new Error(r + " 路径无法在路由表中找到!检查跳转路径及路由表")
+				}, t.getDataType = v, t.copyData = function(e) {
+					return JSON.parse(JSON.stringify(e))
+				}, t.getUniCachePage = function(e) {
+					var t = getCurrentPages();
+					if (null == e) return t;
+					if (0 === t.length) return t;
+					var r = t.reverse()[e];
+					return null == r ? [] : r
+				}, t.urlToJson = function(e) {
+					var t = {},
+						r = e.split("?"),
+						o = r[0],
+						n = r[1];
+					if (null != n)
+						for (var a = 0, i = n.split("&"); a < i.length; a++) {
+							var u = i[a].split("=");
+							t[u[0]] = u[1]
+						}
+					return {
+						path: o,
+						query: t
+					}
+				}, t.forMatNextToFrom = function(e, t, r) {
+					var o = [t, r],
+						n = o[0],
+						a = o[1];
+					if ("h5" === e.options.platform) {
+						var i = e.options.h5,
+							u = i.vueNext,
+							l = i.vueRouterDev;
+						u || l || (n = p.createRoute(e, void 0, n), a = p.createRoute(e, void 0, a))
+					} else n = p.createRoute(e, void 0, g(n)), a = p.createRoute(e, void 0, g(a));
+					return {
+						matTo: n,
+						matFrom: a
+					}
+				}, t.paramsToQuery = function(e, t) {
+					var r;
+					if ("h5" === e.options.platform && !(null === (r = e.options.h5) || void 0 === r ?
+							void 0 : r.paramsToQuery)) return t;
+					if ("[object Object]" === v(t)) {
+						var a = t,
+							i = a.name,
+							l = a.params,
+							p = n(a, ["name", "params"]),
+							c = l;
+						if ("h5" !== e.options.platform && null == c && (c = {}), null != i && null !=
+							c) {
+							var s = e.routesMap.nameMap[i];
+							null == s && (s = h(e, {
+								type: 2,
+								msg: "命名路由为:" + i + " 的路由,无法在路由表中找到!",
+								toRule: t
+							}));
+							var y = f(s, e).finallyPath;
+							if (!y.includes(":")) return o(o({}, p), {
+								path: y,
+								query: c
+							});
+							u.ERRORHOOK[0]({
+								type: 2,
+								msg: "动态路由:" + y + " 无法使用 paramsToQuery!",
+								toRule: t
+							}, e)
+						}
+					}
+					return t
+				}, t.assertDeepObject = function(e) {
+					var t = null;
+					try {
+						t = JSON.stringify(e).match(/\{|\[|\}|\]/g)
+					} catch (e) {
+						l.warnLock("传递的参数解析对象失败。" + e)
+					}
+					return null != t && t.length > 3
+				}, t.baseClone = y, t.deepClone = g, t.lockDetectWarn = function(e, t, r, o, n) {
+					if ("afterHooks" === n) o();
+					else {
+						var a = e.options.detectBeforeLock;
+						a && a(e, t, r), e.$lockStatus ? e.options.routerErrorEach({
+							type: 2,
+							msg: "当前页面正在处于跳转状态,请稍后再进行跳转...."
+						}, e) : o()
+					}
+				}, t.replaceHook = function(e, t, r, o) {
+					var n = t.$options,
+						a = e[r][o],
+						u = {};
+					if ("[object Array]" === v(a) && (u = {
+							beforeCreate: [],
+							created: [],
+							beforeMount: [],
+							mounted: [],
+							beforeDestroy: [],
+							destroyed: []
+						}), null != a) {
+						for (var l = i.proxyVueSortHookName[o], p = function(r) {
+								var p = l[r],
+									c = n[p];
+								if ("[object Array]" === v(c)) {
+									if (1 === c.length && c.toString().includes(
+										"UNI-SIMPLE-ROUTER")) return "continue";
+									var s = {
+											options: [],
+											hook: Function
+										},
+										f = c.splice(c.length - 1, 1, (function() {
+											for (var e = [], t = 0; t < arguments
+												.length; t++) e[t] = arguments[t];
+											return s.options = e
+										}))[0];
+									s.hook = function(r) {
+										return e.enterPath.replace(/^\//, "") !== r.replace(
+											/^\//, "") && "app" !== o ? function() {} : (i
+											.notCallProxyHook.includes(p) || f.apply(t, s
+												.options),
+											function() {
+												c.splice(c.length - 1, 1, f)
+											})
+									}, Object.keys(u).length > 0 ? u[p] = [s] : a[p] = [s]
+								}
+							}, c = 0; c < l.length; c++) p(c);
+						Object.keys(u).length > 0 && a.push(u)
+					}
+				}, t.callHook = d, t.resetPageHook = function(e, t) {
+					var r = t.trim().match(/^(\/?[^\?\s]+)(\?[\s\S]*$)?$/);
+					if (null == r) throw new Error("还原hook失败。请检查 【" + t + "】 路径是否正确。");
+					t = r[1];
+					var o = "appletsProxyHook";
+					"app-plus" === e.options.platform && (o = "appProxyHook");
+					for (var n = [], a = 0, i = Object.entries(e[o]); a < i.length; a++) {
+						var u = i[a],
+							l = u[0],
+							p = u[1],
+							c = l;
+						if ("[object Array]" === v(p))
+							for (var s = 0; s < p.length; s++) n = n.concat(d(c, p[s], t));
+						else n = n.concat(d(c, p, t))
+					}
+					setTimeout((function() {
+						for (var e = 0; e < n.length; e++) n[e]()
+					}), 500)
+				}, t.assertParentChild = function(e, t) {
+					for (; null != t.$parent;) {
+						var r = t.$parent.$mp;
+						if (r.page && r.page.is === e) return !0;
+						t = t.$parent
+					}
+					try {
+						if (t.$mp.page.is === e || t.$mp.page.route === e) return !0
+					} catch (e) {
+						return !1
+					}
+					return !1
+				}, t.resolveAbsolutePath = function(e, t) {
+					var r = /^\/?([^\?\s]+)(\?.+)?$/,
+						o = e.trim();
+					if (!r.test(o)) throw new Error("【" + e + "】 路径错误,请提供完整的路径(10001)。");
+					var n = o.match(r);
+					if (null == n) throw new Error("【" + e + "】 路径错误,请提供完整的路径(10002)。");
+					var a = n[2] || "";
+					if (/^\.\/[^\.]+/.test(o)) return (t.currentRoute.path + e).replace(/[^\/]+\.\//,
+						"");
+					var i = n[1].replace(/\//g, "\\/").replace(/\.\./g, "[^\\/]+").replace(/\./g,
+						"\\."),
+						u = new RegExp("^\\/" + i + "$"),
+						l = t.options.routes.filter((function(e) {
+							return u.test(e.path)
+						}));
+					if (1 !== l.length) throw new Error("【" + e +
+					"】 路径错误,尝试转成绝对路径失败,请手动转成绝对路径(10003)。");
+					return l[0].path + a
+				}, t.deepDecodeQuery = function e(t) {
+					for (var r = "[object Array]" === v(t) ? [] : {}, o = Object.keys(t), n = 0; n < o
+						.length; n++) {
+						var a = o[n],
+							i = t[a];
+						if ("string" == typeof i) try {
+							var u = JSON.parse(decodeURIComponent(i));
+							"object" != typeof u && (u = i), r[a] = u
+						} catch (e) {
+							try {
+								r[a] = decodeURIComponent(i)
+							} catch (e) {
+								r[a] = i
+							}
+						} else if ("object" == typeof i) {
+							var l = e(i);
+							r[a] = l
+						} else r[a] = i
+					}
+					return r
+				}
+			},
+			883: (e, t) => {
+				"use strict";
+
+				function r(e, t, r, o) {
+					if (void 0 === o && (o = !1), !o) {
+						var n = "[object Object]" === t.toString();
+						if (!1 === t) return !1;
+						if (n && !1 === t[e]) return !1
+					}
+					return console[e](r), !0
+				}
+				Object.defineProperty(t, "__esModule", {
+						value: !0
+					}), t.warnLock = t.log = t.warn = t.err = t.isLog = void 0, t.isLog = r, t.err =
+					function(e, t, o) {
+						r("error", t.options.debugger, e, o)
+					}, t.warn = function(e, t, o) {
+						r("warn", t.options.debugger, e, o)
+					}, t.log = function(e, t, o) {
+						r("log", t.options.debugger, e, o)
+					}, t.warnLock = function(e) {
+						console.warn(e)
+					}
+			},
+			607: function(e, t, r) {
+				"use strict";
+				var o = this && this.__createBinding || (Object.create ? function(e, t, r, o) {
+						void 0 === o && (o = r), Object.defineProperty(e, o, {
+							enumerable: !0,
+							get: function() {
+								return t[r]
+							}
+						})
+					} : function(e, t, r, o) {
+						void 0 === o && (o = r), e[o] = t[r]
+					}),
+					n = this && this.__exportStar || function(e, t) {
+						for (var r in e) "default" === r || Object.prototype.hasOwnProperty.call(t, r) || o(
+							t, e, r)
+					};
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.createRouter = t.RouterMount = t.runtimeQuit = void 0, n(r(366), t), n(r(309), t);
+				var a = r(814);
+				Object.defineProperty(t, "runtimeQuit", {
+					enumerable: !0,
+					get: function() {
+						return a.runtimeQuit
+					}
+				});
+				var i = r(963);
+				Object.defineProperty(t, "RouterMount", {
+					enumerable: !0,
+					get: function() {
+						return i.RouterMount
+					}
+				}), Object.defineProperty(t, "createRouter", {
+					enumerable: !0,
+					get: function() {
+						return i.createRouter
+					}
+				})
+			},
+			366: (e, t) => {
+				"use strict";
+				var r, o, n;
+				Object.defineProperty(t, "__esModule", {
+						value: !0
+					}), t.rewriteMethodToggle = t.navtypeToggle = t.hookToggle = void 0, (n = t
+						.hookToggle || (t.hookToggle = {})).beforeHooks = "beforeEach", n.afterHooks =
+					"afterEach", n.enterHooks = "beforeEnter", (o = t.navtypeToggle || (t
+						.navtypeToggle = {})).push = "navigateTo", o.replace = "redirectTo", o.replaceAll =
+					"reLaunch", o.pushTab = "switchTab", o.back = "navigateBack", (r = t
+						.rewriteMethodToggle || (t.rewriteMethodToggle = {})).navigateTo = "push", r
+					.navigate = "push", r.redirectTo = "replace", r.reLaunch = "replaceAll", r.switchTab =
+					"pushTab", r.navigateBack = "back"
+			},
+			309: (e, t) => {
+				"use strict";
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				})
+			},
+			169: function(e, t, r) {
+				"use strict";
+				var o = this && this.__rest || function(e, t) {
+					var r = {};
+					for (var o in e) Object.prototype.hasOwnProperty.call(e, o) && t.indexOf(o) < 0 && (
+						r[o] = e[o]);
+					if (null != e && "function" == typeof Object.getOwnPropertySymbols) {
+						var n = 0;
+						for (o = Object.getOwnPropertySymbols(e); n < o.length; n++) t.indexOf(o[n]) <
+							0 && Object.prototype.propertyIsEnumerable.call(e, o[n]) && (r[o[n]] = e[o[
+								n]])
+					}
+					return r
+				};
+				Object.defineProperty(t, "__esModule", {
+						value: !0
+					}), t.loopCallHook = t.transitionTo = t.onTriggerEachHook = t.callHook = t
+					.callBeforeRouteLeave = t.HOOKLIST = t.ERRORHOOK = void 0;
+				var n = r(789),
+					a = r(890),
+					i = r(147),
+					u = r(814);
+
+				function l(e, t, r, o) {
+					var a, i = n.getUniCachePage(0);
+					if (Object.keys(i).length > 0) {
+						var u = void 0;
+						switch ("h5" === e.options.platform ? u = i.$options.beforeRouteLeave : null != i
+							.$vm && (u = i.$vm.$options.beforeRouteLeave), n.getDataType(u)) {
+							case "[object Array]":
+								a = (a = u[0]).bind(i);
+								break;
+							case "[object Function]":
+								a = u.bind(i.$vm)
+						}
+					}
+					return p(a, t, r, e, o)
+				}
+
+				function p(e, t, r, o, n, a) {
+					void 0 === a && (a = !0), null != e && e instanceof Function ? !0 === a ? e(t, r, n, o,
+						!1) : (e(t, r, (function() {}), o, !1), n()) : n()
+				}
+
+				function c(e, t, r, o, a, i) {
+					var u = n.forMatNextToFrom(e, t, r),
+						l = u.matTo,
+						p = u.matFrom;
+					"h5" === e.options.platform ? s(a, 0, i, e, l, p, o) : s(a.slice(0, 4), 0, (function() {
+						i((function() {
+							s(a.slice(4), 0, n.voidFun, e, l, p, o)
+						}))
+					}), e, l, p, o)
+				}
+
+				function s(e, r, i, l, p, c, f) {
+					var h = n.routesForMapRoute(l, p.path, ["finallyPathMap", "pathMap"]);
+					if (e.length - 1 < r) return i();
+					var v = e[r],
+						y = t.ERRORHOOK[0];
+					v(l, p, c, h, (function(t) {
+						if ("app-plus" === l.options.platform && (!1 !== t && "string" !=
+								typeof t && "object" != typeof t || u.tabIndexSelect(p, c)), !
+							1 === t) "h5" === l.options.platform && i(!1), y({
+							type: 0,
+							msg: "管道函数传递 false 导航被终止!",
+							matTo: p,
+							matFrom: c,
+							nextTo: t
+						}, l);
+						else if ("string" == typeof t || "object" == typeof t) {
+							var n = f,
+								h = t;
+							if ("object" == typeof t) {
+								var v = t.NAVTYPE;
+								h = o(t, ["NAVTYPE"]), null != v && (n = v)
+							}
+							a.navjump(h, l, n, {
+								from: c,
+								next: i
+							})
+						} else null == t ? (r++, s(e, r, i, l, p, c, f)) : y({
+							type: 1,
+							msg: "管道函数传递未知类型,无法被识别。导航被终止!",
+							matTo: p,
+							matFrom: c,
+							nextTo: t
+						}, l)
+					}))
+				}
+				t.ERRORHOOK = [function(e, t) {
+					return t.lifeCycle.routerErrorHooks[0](e, t)
+				}], t.HOOKLIST = [function(e, t, r, o, n) {
+					return p(e.lifeCycle.routerBeforeHooks[0], t, r, e, n)
+				}, function(e, t, r, o, n) {
+					return l(e, t, r, n)
+				}, function(e, t, r, o, n) {
+					return p(e.lifeCycle.beforeHooks[0], t, r, e, n)
+				}, function(e, t, r, o, n) {
+					return p(o.beforeEnter, t, r, e, n)
+				}, function(e, t, r, o, n) {
+					return p(e.lifeCycle.afterHooks[0], t, r, e, n, !1)
+				}, function(e, t, r, o, n) {
+					return e.$lockStatus = !1, "h5" === e.options.platform && i.proxyH5Mount(e), p(e
+						.lifeCycle.routerAfterHooks[0], t, r, e, n, !1)
+				}], t.callBeforeRouteLeave = l, t.callHook = p, t.onTriggerEachHook = function(e, r, o,
+					n, a) {
+					var i = [];
+					switch (n) {
+						case "beforeEach":
+							i = t.HOOKLIST.slice(0, 3);
+							break;
+						case "afterEach":
+							i = t.HOOKLIST.slice(4);
+							break;
+						case "beforeEnter":
+							i = t.HOOKLIST.slice(3, 4)
+					}
+					c(o, e, r, "push", i, a)
+				}, t.transitionTo = c, t.loopCallHook = s
+			},
+			890: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+					return (o = Object.assign || function(e) {
+						for (var t, r = 1, o = arguments.length; r < o; r++)
+							for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+								.call(t, n) && (e[n] = t[n]);
+						return e
+					}).apply(this, arguments)
+				};
+				Object.defineProperty(t, "__esModule", {
+						value: !0
+					}), t.createRoute = t.forceGuardEach = t.backOptionsBuild = t.navjump = t.lockNavjump =
+					void 0;
+				var n = r(366),
+					a = r(99),
+					i = r(789),
+					u = r(169),
+					l = r(845),
+					p = r(169);
+
+				function c(e, t, r, o, n) {
+					i.lockDetectWarn(t, e, r, (function() {
+						"h5" !== t.options.platform && (t.$lockStatus = !0), s(e, t, r, void 0,
+							o, n)
+					}))
+				}
+
+				function s(e, t, r, c, s, h, v) {
+					if (void 0 === v && (v = !0), "back" === r) {
+						var y;
+						if (y = "string" == typeof e ? +e : e.delta || 1, "h5" === t.options.platform) {
+							t.$route.go(-y);
+							var g = (h || {
+									success: i.voidFun
+								}).success || i.voidFun,
+								d = (h || {
+									complete: i.voidFun
+								}).complete || i.voidFun;
+							return g({
+								errMsg: "navigateBack:ok"
+							}), void d({
+								errMsg: "navigateBack:ok"
+							})
+						}
+						e = f(t, y, h)
+					}
+					var m = a.queryPageToMap(e, t).rule;
+					m.type = n.navtypeToggle[r];
+					var b = i.paramsToQuery(t, m),
+						O = a.resolveQuery(b, t);
+					if ("h5" === t.options.platform)
+						if ("push" !== r && (r = "replace"), null != c) c.next(o({
+							replace: "push" !== r
+						}, O));
+						else if ("push" === r && Reflect.has(O, "events")) {
+						if (Reflect.has(O, "name")) throw new Error(
+							"在h5端上使用 'push'、'navigateTo' 跳转时,如果包含 events 不允许使用 name 跳转,因为 name 实现了动态路由。请更换为 path 或者 url 跳转!"
+							);
+						uni.navigateTo(O, !0, i.voidFun, s)
+					} else t.$route[r](O, O.success || i.voidFun, O.fail || i.voidFun);
+					else {
+						var P = {
+							path: ""
+						};
+						if (null == c) {
+							var k = i.routesForMapRoute(t, O.path, ["finallyPathMap", "pathMap"]);
+							k = i.notRouteTo404(t, k, O, r), O = o(o(o(o({}, k), {
+								params: {}
+							}), O), {
+								path: k.path
+							}), P = l.createToFrom(O, t)
+						} else P = c.from;
+						if (l.createFullPath(O, P), !1 === v) return O;
+						u.transitionTo(t, O, P, r, p.HOOKLIST, (function(e) {
+							uni[n.navtypeToggle[r]](O, !0, e, s)
+						}))
+					}
+				}
+
+				function f(e, t, r) {
+					var n = h(e, t),
+						a = o(o({}, r || {}), {
+							path: n.path,
+							query: n.query,
+							delta: t
+						});
+					if ("[object Object]" === i.getDataType(r)) {
+						var u = r,
+							l = u.animationDuration,
+							p = u.animationType;
+						null != l && (a.animationDuration = l), null != p && (a.animationType = p);
+						var c = r.from;
+						null != c && (a.BACKTYPE = c)
+					}
+					return a
+				}
+
+				function h(e, t, r) {
+					void 0 === t && (t = 0);
+					var u = {
+						name: "",
+						meta: {},
+						path: "",
+						fullPath: "",
+						NAVTYPE: "",
+						query: {},
+						params: {},
+						BACKTYPE: (r || {
+							BACKTYPE: ""
+						}).BACKTYPE || ""
+					};
+					if (19970806 === t) return u;
+					if ("h5" === e.options.platform) {
+						var l = {
+							path: ""
+						};
+						l = null != r ? r : e.$route.currentRoute;
+						var p = i.copyData(l.params);
+						delete p.__id__;
+						var c = a.parseQuery(o(o({}, p), i.copyData(l.query)), e);
+						l = o(o({}, l), {
+							query: c
+						}), u.path = l.path, u.fullPath = l.fullPath || "", u.query = i.deepDecodeQuery(
+							l.query || {}), u.NAVTYPE = n.rewriteMethodToggle[l.type || "reLaunch"]
+					} else {
+						var s = {};
+						if (null != r) s = o(o({}, r), {
+							openType: r.type
+						});
+						else {
+							var f = i.getUniCachePage(t);
+							if (0 === Object.keys(f).length) throw e.options.routerErrorEach({
+								type: 3,
+								msg: "不存在的页面栈,请确保有足够的页面可用,当前 level:" + t
+							}, e), new Error("不存在的页面栈,请确保有足够的页面可用,当前 level:" + t);
+							var h = f.options || {};
+							s = o(o({}, f.$page || {}), {
+								query: i.deepDecodeQuery(h),
+								fullPath: decodeURIComponent((f.$page || {}).fullPath || "/" + f
+									.route)
+							}), "app-plus" !== e.options.platform && (s.path = "/" + f.route)
+						}
+						var v = s.openType;
+						u.query = s.query, u.path = s.path, u.fullPath = s.fullPath, u.NAVTYPE = n
+							.rewriteMethodToggle[v || "reLaunch"]
+					}
+					var y = i.routesForMapRoute(e, u.path, ["finallyPathMap", "pathMap"]),
+						g = o(o({}, u), y);
+					return g.query = a.parseQuery(g.query, e), g
+				}
+				t.lockNavjump = c, t.navjump = s, t.backOptionsBuild = f, t.forceGuardEach = function(e, t,
+					r) {
+					if (void 0 === t && (t = "replaceAll"), void 0 === r && (r = !1), "h5" === e.options
+						.platform) throw new Error(
+						"在h5端上使用:forceGuardEach 是无意义的,目前 forceGuardEach 仅支持在非h5端上使用");
+					var o = i.getUniCachePage(0);
+					0 === Object.keys(o).length && e.options.routerErrorEach({
+						type: 3,
+						msg: "不存在的页面栈,请确保有足够的页面可用,当前 level:0"
+					}, e);
+					var n = o,
+						a = n.route,
+						u = n.options;
+					c({
+						path: "/" + a,
+						query: i.deepDecodeQuery(u || {})
+					}, e, t, r)
+				}, t.createRoute = h
+			},
+			845: (e, t, r) => {
+				"use strict";
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.proxyPageHook = t.createFullPath = t.createToFrom = void 0;
+				var o = r(789),
+					n = r(890),
+					a = r(99);
+				t.createToFrom = function(e, t) {
+					var r = o.getUniCachePage(0);
+					return "[object Array]" === o.getDataType(r) ? o.deepClone(e) : n.createRoute(t)
+				}, t.createFullPath = function(e, t) {
+					if (null == e.fullPath) {
+						var r = a.stringifyQuery(e.query);
+						e.fullPath = e.path + r
+					}
+					null == t.fullPath && (r = a.stringifyQuery(t.query), t.fullPath = t.path + r)
+				}, t.proxyPageHook = function(e, t, r, n) {
+					o.replaceHook(t, e, r, n)
+				}
+			},
+			99: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+					return (o = Object.assign || function(e) {
+						for (var t, r = 1, o = arguments.length; r < o; r++)
+							for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+								.call(t, n) && (e[n] = t[n]);
+						return e
+					}).apply(this, arguments)
+				};
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.stringifyQuery = t.parseQuery = t.resolveQuery = t.queryPageToMap = void 0;
+				var n = r(789),
+					a = r(169),
+					i = r(883),
+					u = /[!'()*]/g,
+					l = function(e) {
+						return "%" + e.charCodeAt(0).toString(16)
+					},
+					p = /%2C/g,
+					c = function(e) {
+						return encodeURIComponent(e).replace(u, l).replace(p, ",")
+					};
+				t.queryPageToMap = function(e, t) {
+					var r = {},
+						i = "",
+						u = e.success,
+						l = e.fail;
+					if ("[object Object]" === n.getDataType(e)) {
+						var p = e;
+						if (null != p.path) {
+							var c = n.urlToJson(p.path),
+								s = c.path,
+								f = c.query;
+							i = n.routesForMapRoute(t, s, ["finallyPathList", "pathMap"]), r = o(o({},
+								f), e.query || {}), p.path = s, p.query = r, delete e.params
+						} else null != p.name ? null == (i = t.routesMap.nameMap[p.name]) ? i = n
+							.getWildcardRule(t, {
+								type: 2,
+								msg: "命名路由为:" + p.name + " 的路由,无法在路由表中找到!",
+								toRule: e
+							}) : (r = e.params || {}, delete e.query) : i = n.getWildcardRule(t, {
+								type: 2,
+								msg: e + " 解析失败,请检测当前路由表下是否有包含。",
+								toRule: e
+							})
+					} else e = n.urlToJson(e), i = n.routesForMapRoute(t, e.path, ["finallyPathList",
+						"pathMap"
+					]), r = e.query;
+					if ("h5" === t.options.platform) {
+						n.getRoutePath(i, t).finallyPath.includes(":") && null == e.name && a.ERRORHOOK[
+							0]({
+							type: 2,
+							msg: "当有设置 alias或者aliasPath 为动态路由时,不允许使用 path 跳转。请使用 name 跳转!",
+							route: i
+						}, t);
+						var h = e.complete,
+							v = e.success,
+							y = e.fail;
+						if ("[object Function]" === n.getDataType(h)) {
+							var g = function(e, t) {
+								"[object Function]" === n.getDataType(t) && t.apply(this, e), h
+									.apply(this, e)
+							};
+							u = function() {
+								for (var e = [], t = 0; t < arguments.length; t++) e[t] = arguments[
+									t];
+								g.call(this, e, v)
+							}, l = function() {
+								for (var e = [], t = 0; t < arguments.length; t++) e[t] = arguments[
+									t];
+								g.call(this, e, y)
+							}
+						}
+					}
+					var d = e;
+					return "[object Function]" === n.getDataType(d.success) && (d.success = u),
+						"[object Function]" === n.getDataType(d.fail) && (d.fail = l), {
+							rule: d,
+							route: i,
+							query: r
+						}
+				}, t.resolveQuery = function(e, t) {
+					var r = "query";
+					null != e.params && (r = "params"), null != e.query && (r = "query");
+					var o = n.copyData(e[r] || {}),
+						a = t.options.resolveQuery;
+					if (a) {
+						var u = a(o);
+						"[object Object]" !== n.getDataType(u) ? i.warn(
+							"请按格式返回参数: resolveQuery?:(jsonQuery:{[propName: string]: any;})=>{[propName: string]: any;}",
+							t) : e[r] = u
+					} else {
+						if (!n.assertDeepObject(o)) return e;
+						var l = JSON.stringify(o);
+						e[r] = {
+							query: l
+						}
+					}
+					return e
+				}, t.parseQuery = function(e, t) {
+					var r = t.options.parseQuery;
+					if (r) e = r(n.copyData(e)), "[object Object]" !== n.getDataType(e) && i.warn(
+						"请按格式返回参数: parseQuery?:(jsonQuery:{[propName: string]: any;})=>{[propName: string]: any;}",
+						t);
+					else if (Reflect.get(e, "query")) {
+						var o = Reflect.get(e, "query");
+						if ("string" == typeof o) try {
+							o = JSON.parse(o)
+						} catch (e) {
+							i.warn("尝试解析深度对象失败,按原样输出。" + e, t)
+						}
+						if ("object" == typeof o) return n.deepDecodeQuery(o)
+					}
+					return e
+				}, t.stringifyQuery = function(e) {
+					var t = e ? Object.keys(e).map((function(t) {
+						var r = e[t];
+						if (void 0 === r) return "";
+						if (null === r) return c(t);
+						if (Array.isArray(r)) {
+							var o = [];
+							return r.forEach((function(e) {
+								void 0 !== e && (null === e ? o.push(c(t)) : o
+									.push(c(t) + "=" + c(e)))
+							})), o.join("&")
+						}
+						return c(t) + "=" + c(r)
+					})).filter((function(e) {
+						return e.length > 0
+					})).join("&") : null;
+					return t ? "?" + t : ""
+				}
+			},
+			314: (e, t, r) => {
+				"use strict";
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.rewriteMethod = void 0;
+				var o = r(366),
+					n = r(789),
+					a = r(883),
+					i = r(809),
+					u = ["navigateTo", "redirectTo", "reLaunch", "switchTab", "navigateBack"];
+				t.rewriteMethod = function(e) {
+					!1 === e.options.keepUniOriginNav && u.forEach((function(t) {
+						var r = uni[t];
+						uni[t] = function(u, l, p, c) {
+							void 0 === l && (l = !1), l ? i.uniOriginJump(e, r, t, u, p,
+								c) : ("app-plus" === e.options.platform && 0 ===
+								Object.keys(e.appMain).length && (e.appMain = {
+									NAVTYPE: t,
+									path: u.url
+								}),
+								function(e, t, r) {
+									if ("app-plus" === r.options.platform) {
+										var i = null;
+										e && (i = e.openType), null != i &&
+											"appLaunch" === i && (t = "reLaunch")
+									}
+									if ("reLaunch" === t && '{"url":"/"}' === JSON
+										.stringify(e) && (a.warn(
+											"uni-app 原生方法:reLaunch({url:'/'}) 默认被重写啦!你可以使用 this.$Router.replaceAll() 或者 uni.reLaunch({url:'/?xxx=xxx'})",
+											r, !0), t = "navigateBack", e = {
+											from: "backbutton"
+										}), "navigateBack" === t) {
+										var u = 1;
+										null == e && (e = {
+											delta: 1
+										}), "[object Number]" === n.getDataType(
+											e.delta) && (u = e.delta), r.back(u,
+											e)
+									} else {
+										var l = o.rewriteMethodToggle[t],
+											p = e.url;
+										if (!p.startsWith("/")) {
+											var c = n.resolveAbsolutePath(p, r);
+											p = c, e.url = c
+										}
+										if ("switchTab" === t) {
+											var s = n.routesForMapRoute(r, p, [
+													"pathMap", "finallyPathList"
+												]),
+												f = n.getRoutePath(s, r)
+												.finallyPath;
+											if ("[object Array]" === n.getDataType(
+													f) && a.warn(
+													"uni-app 原生方法跳转路径为:" + p +
+													"。此路为是tab页面时,不允许设置 alias 为数组的情况,并且不能为动态路由!当然你可以通过通配符*解决!",
+													r, !0), "*" === f && a.warn(
+													"uni-app 原生方法跳转路径为:" + p +
+													"。在路由表中找不到相关路由表!当然你可以通过通配符*解决!",
+													r, !0), "h5" === r.options
+												.platform) {
+												var h = e.success;
+												e.success = function() {
+													for (var t = [], r = 0; r <
+														arguments.length; r++)
+														t[r] = arguments[r];
+													null == h || h.apply(null,
+															t), n.timeOut(150)
+														.then((function() {
+															var t = e
+																.detail ||
+																{};
+															if (Object
+																.keys(t)
+																.length >
+																0 &&
+																Reflect
+																.has(t,
+																	"index"
+																	)) {
+																var r =
+																	n
+																	.getUniCachePage(
+																		0
+																		);
+																if (0 ===
+																	Object
+																	.keys(
+																		r
+																		)
+																	.length
+																	)
+																	return !
+																		1;
+																var o =
+																	r,
+																	a =
+																	o
+																	.$options
+																	.onTabItemTap;
+																if (a)
+																	for (
+																		var i =
+																			0; i <
+																		a
+																		.length; i++
+																		)
+																		a[
+																			i]
+																		.call(
+																			o,
+																			t
+																			)
+															}
+														}))
+												}
+											}
+											p = f
+										}
+										var v = e,
+											y = v.events,
+											g = v.success,
+											d = v.fail,
+											m = v.complete,
+											b = v.animationType,
+											O = {
+												path: p,
+												events: y,
+												success: g,
+												fail: d,
+												complete: m,
+												animationDuration: v
+													.animationDuration,
+												animationType: b
+											};
+										r[l](n.notDeepClearNull(O))
+									}
+								}(u, t, e))
+						}
+					}))
+				}
+			},
+			963: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+					return (o = Object.assign || function(e) {
+						for (var t, r = 1, o = arguments.length; r < o; r++)
+							for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+								.call(t, n) && (e[n] = t[n]);
+						return e
+					}).apply(this, arguments)
+				};
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.createRouter = t.RouterMount = void 0;
+				var n = r(282),
+					a = r(789),
+					i = r(662),
+					u = r(460),
+					l = r(890),
+					p = r(314),
+					c = function() {},
+					s = new Promise((function(e) {
+						return c = e
+					}));
+				t.createRouter = function(e) {
+					var t = a.assertNewOptions(e),
+						r = {
+							options: t,
+							mount: [],
+							Vue: null,
+							appProxyHook: n.appProxyHook,
+							appletsProxyHook: n.indexProxyHook,
+							appMain: {},
+							enterPath: "",
+							$route: null,
+							$lockStatus: !1,
+							routesMap: {},
+							lifeCycle: i.registerRouterHooks(n.lifeCycle, t),
+							push: function(e) {
+								l.lockNavjump(e, r, "push")
+							},
+							replace: function(e) {
+								l.lockNavjump(e, r, "replace")
+							},
+							replaceAll: function(e) {
+								l.lockNavjump(e, r, "replaceAll")
+							},
+							pushTab: function(e) {
+								l.lockNavjump(e, r, "pushTab")
+							},
+							back: function(e, t) {
+								void 0 === e && (e = 1), "[object Object]" !== a.getDataType(t) ?
+									t = {
+										from: "navigateBack"
+									} : Reflect.has(t, "from") || (t = o(o({}, t), {
+										from: "navigateBack"
+									})), l.lockNavjump(e + "", r, "back", void 0, t)
+							},
+							forceGuardEach: function(e, t) {
+								l.forceGuardEach(r, e, t)
+							},
+							beforeEach: function(e) {
+								i.registerEachHooks(r, "beforeHooks", e)
+							},
+							afterEach: function(e) {
+								i.registerEachHooks(r, "afterHooks", e)
+							},
+							install: function(e) {
+								r.Vue = e, p.rewriteMethod(this), u.initMixins(e, this), Object
+									.defineProperty(e.prototype, "$Router", {
+										get: function() {
+											var e = r;
+											return Object.defineProperty(this, "$Router", {
+												value: e,
+												writable: !1,
+												configurable: !1,
+												enumerable: !1
+											}), Object.seal(e)
+										}
+									}), Object.defineProperty(e.prototype, "$Route", {
+										get: function() {
+											return l.createRoute(r)
+										}
+									}), Object.defineProperty(e.prototype, "$AppReady", {
+										get: function() {
+											return "h5" === r.options.platform ? Promise
+												.resolve() : s
+										},
+										set: function(e) {
+											!0 === e && c()
+										}
+									})
+							}
+						};
+					return a.def(r, "currentRoute", (function() {
+						return l.createRoute(r)
+					})), r.beforeEach((function(e, t, r) {
+						return r()
+					})), r.afterEach((function() {})), r
+				}, t.RouterMount = function(e, t, r) {
+					if (void 0 === r && (r = "#app"), "[object Array]" !== a.getDataType(t.mount))
+					throw new Error("挂载路由失败,router.app 应该为数组类型。当前类型:" + typeof t.mount);
+					if (t.mount.push({
+							app: e,
+							el: r
+						}), "h5" === t.options.platform) {
+						var o = t.$route;
+						o.replace({
+							path: o.currentRoute.fullPath
+						})
+					}
+				}
+			},
+			809: function(e, t, r) {
+				"use strict";
+				var o = this && this.__assign || function() {
+						return (o = Object.assign || function(e) {
+							for (var t, r = 1, o = arguments.length; r < o; r++)
+								for (var n in t = arguments[r]) Object.prototype.hasOwnProperty
+									.call(t, n) && (e[n] = t[n]);
+							return e
+						}).apply(this, arguments)
+					},
+					n = this && this.__awaiter || function(e, t, r, o) {
+						return new(r || (r = Promise))((function(n, a) {
+							function i(e) {
+								try {
+									l(o.next(e))
+								} catch (e) {
+									a(e)
+								}
+							}
+
+							function u(e) {
+								try {
+									l(o.throw(e))
+								} catch (e) {
+									a(e)
+								}
+							}
+
+							function l(e) {
+								var t;
+								e.done ? n(e.value) : (t = e.value, t instanceof r ? t : new r((
+									function(e) {
+										e(t)
+									}))).then(i, u)
+							}
+							l((o = o.apply(e, t || [])).next())
+						}))
+					},
+					a = this && this.__generator || function(e, t) {
+						var r, o, n, a, i = {
+							label: 0,
+							sent: function() {
+								if (1 & n[0]) throw n[1];
+								return n[1]
+							},
+							trys: [],
+							ops: []
+						};
+						return a = {
+							next: u(0),
+							throw: u(1),
+							return: u(2)
+						}, "function" == typeof Symbol && (a[Symbol.iterator] = function() {
+							return this
+						}), a;
+
+						function u(a) {
+							return function(u) {
+								return function(a) {
+									if (r) throw new TypeError("Generator is already executing.");
+									for (; i;) try {
+										if (r = 1, o && (n = 2 & a[0] ? o.return : a[0] ? o
+												.throw || ((n = o.return) && n.call(o), 0) : o
+												.next) && !(n = n.call(o, a[1])).done) return n;
+										switch (o = 0, n && (a = [2 & a[0], n.value]), a[0]) {
+											case 0:
+											case 1:
+												n = a;
+												break;
+											case 4:
+												return i.label++, {
+													value: a[1],
+													done: !1
+												};
+											case 5:
+												i.label++, o = a[1], a = [0];
+												continue;
+											case 7:
+												a = i.ops.pop(), i.trys.pop();
+												continue;
+											default:
+												if (!((n = (n = i.trys).length > 0 && n[n
+															.length - 1]) || 6 !== a[0] && 2 !==
+														a[0])) {
+													i = 0;
+													continue
+												}
+												if (3 === a[0] && (!n || a[1] > n[0] && a[1] <
+														n[3])) {
+													i.label = a[1];
+													break
+												}
+												if (6 === a[0] && i.label < n[1]) {
+													i.label = n[1], n = a;
+													break
+												}
+												if (n && i.label < n[2]) {
+													i.label = n[2], i.ops.push(a);
+													break
+												}
+												n[2] && i.ops.pop(), i.trys.pop();
+												continue
+										}
+										a = t.call(e, i)
+									} catch (e) {
+										a = [6, e], o = 0
+									} finally {
+										r = n = 0
+									}
+									if (5 & a[0]) throw a[1];
+									return {
+										value: a[0] ? a[1] : void 0,
+										done: !0
+									}
+								}([a, u])
+							}
+						}
+					},
+					i = this && this.__rest || function(e, t) {
+						var r = {};
+						for (var o in e) Object.prototype.hasOwnProperty.call(e, o) && t.indexOf(o) < 0 && (
+							r[o] = e[o]);
+						if (null != e && "function" == typeof Object.getOwnPropertySymbols) {
+							var n = 0;
+							for (o = Object.getOwnPropertySymbols(e); n < o.length; n++) t.indexOf(o[n]) <
+								0 && Object.prototype.propertyIsEnumerable.call(e, o[n]) && (r[o[n]] = e[o[
+									n]])
+						}
+						return r
+					};
+				Object.defineProperty(t, "__esModule", {
+					value: !0
+				}), t.formatOriginURLQuery = t.uniOriginJump = void 0;
+				var u = r(99),
+					l = r(789),
+					p = r(282),
+					c = 0,
+					s = "reLaunch";
+
+				function f(e, t, r) {
+					var n, a = t.url,
+						i = t.path,
+						p = t.query,
+						c = t.animationType,
+						s = t.animationDuration,
+						f = t.events,
+						h = t.success,
+						v = t.fail,
+						y = t.complete,
+						g = t.delta,
+						d = t.animation,
+						m = u.stringifyQuery(p || {}),
+						b = "" === m ? i || a : (i || a) + m,
+						O = {};
+					return "app-plus" === e.options.platform && "navigateBack" !== r && (O = (null === (n =
+						e.options.APP) || void 0 === n ? void 0 : n.animation) || {}, O = o(o({},
+						O), d || {})), l.notDeepClearNull({
+						delta: g,
+						url: b,
+						animationType: c || O.animationType,
+						animationDuration: s || O.animationDuration,
+						events: f,
+						success: h,
+						fail: v,
+						complete: y
+					})
+				}
+				t.uniOriginJump = function(e, t, r, u, h, v) {
+					var y = f(e, u, r),
+						g = y.complete,
+						d = i(y, ["complete"]),
+						m = e.options.platform.trim();
+					0 === c && "h5" !== m && l.resetPageHook(e, d.url), null != v && !1 === v ? (0 ===
+						c && (c++, "h5" !== m && (e.Vue.prototype.$AppReady = !0)), g && g.apply(
+							null, {
+								msg: "forceGuardEach强制触发并且不执行跳转"
+							}), h && h.apply(null, {
+							msg: "forceGuardEach强制触发并且不执行跳转"
+						})) : t(o(o({}, d), {
+						from: u.BACKTYPE,
+						complete: function() {
+							for (var t, o, i, u, f = [], v = 0; v < arguments
+								.length; v++) f[v] = arguments[v];
+							return n(this, void 0, void 0, (function() {
+								var n, v, y;
+								return a(this, (function(a) {
+									switch (a.label) {
+										case 0:
+											return 0 === c && (
+													c++,
+													"h5" !==
+													m && (e.Vue
+														.prototype
+														.$AppReady = !
+														0),
+													"app-plus" ===
+													m && ((n =
+															plus
+															.nativeObj
+															.View
+															.getViewById(
+																"router-loadding"
+																)
+															) &&
+														n
+														.close(),
+														(v = null ===
+															(t = e
+																.options
+																.APP
+																) ||
+															void 0 ===
+															t ?
+															void 0 :
+															t
+															.launchedHook
+															) &&
+														v())),
+												y = 0,
+												new RegExp(p
+													.mpPlatformReg,
+													"g").test(
+												m) ? y =
+												null === (o = e
+													.options
+													.applet) ||
+												void 0 === o ?
+												void 0 : o
+												.animationDuration :
+												"app-plus" ===
+												m &&
+												"navigateBack" ===
+												r &&
+												"navigateTo" ===
+												s && (y =
+													null === (
+														u =
+														null ===
+														(i = e
+															.options
+															.APP
+															) ||
+														void 0 ===
+														i ?
+														void 0 :
+														i
+														.animation
+														) ||
+													void 0 ===
+													u ? void 0 :
+													u
+													.animationDuration
+													),
+												"navigateTo" !==
+												r &&
+												"navigateBack" !==
+												r || 0 === y ? [
+													3, 2
+												] : [4, l
+													.timeOut(y)
+												];
+										case 1:
+											a.sent(), a.label =
+												2;
+										case 2:
+											return s = r, g && g
+												.apply(null, f),
+												h && h.apply(
+													null, f), [
+													2]
+									}
+								}))
+							}))
+						}
+					}))
+				}, t.formatOriginURLQuery = f
+			}
+		}, t = {},
+		function r(o) {
+			if (t[o]) return t[o].exports;
+			var n = t[o] = {
+				exports: {}
+			};
+			return e[o].call(n.exports, n, n.exports, r), n.exports
+		}(607);
+	var e, t
+}));

+ 140 - 0
common/share/index.js

@@ -0,0 +1,140 @@
+/**
+ * Share v1.0.0
+ * @Class Share
+ * @description shopro-share 1.0.0 分享方法
+ * @Author lidongtony
+ * @Date 2021-04-19
+ * @Email lidongtony@qq.com
+ */
+import {
+	API_URL,
+	API_ROOT,
+	UNIACID
+} from '@/common/request/request';
+import store from "@/common/store";
+import $platform from "@/common/platform";
+// #ifdef H5
+import wxsdk from "@/common/wechat/sdk";
+// #endif
+export default {
+
+	// 设置分享信息
+	setShareInfo(scene = {
+		title: '', // 自定义分享标题
+		desc: '',  // 自定义描述
+		image: '', // 自定义分享图片
+		// path:'',
+		params: {} // 自定义分享参数
+	}) {
+		let that = this;
+		let shareInfo = {
+			title: '', 		// 分享标题
+			desc: '', 		// 描述
+			image: '', 		// 分享图片
+			path: '', 		// 分享路径
+			copyLink: '', 	// 复制链接
+			query: ''		// 分享参数
+		}
+		// let shareConfig = store.getters.initShare;
+		// let shopConfig = store.getters.appInfo;
+		let shareConfig = store.getters.appInfo;
+		// console.log(shareConfig)
+		
+		// let pages = getCurrentPages();
+		// let route = pages[pages.length - 1].route;
+		// console.log(route)
+		
+		// if (shopConfig?.domain === '' || shareConfig.share_title === '' || shareConfig.share_img_path === '') {
+		// 	throw '请在商城配置中设置商城域名和分享信息'
+		// }
+
+		// 设置自定义分享信息
+		shareInfo.title = scene.title !== '' ? scene.title : shareConfig.share_title;
+		shareInfo.image = scene.image !== '' ? scene.image : shareConfig.share_img_path;
+		shareInfo.desc = scene.desc !== '' ? scene.desc : shareConfig.share_des;
+		
+		// 自动拼接分享用户参数
+		let query = that.setShareQuery(scene.params);
+		// let stay = shareConfig.share_img_path.split('public/')[0]+'public/h5?uniacid='+UNIACID;
+		// #ifdef H5
+		let stay = window.location.href.split('/h5')[0]+'/h5/?uniacid='+UNIACID;
+		// console.log(window.location.href);
+		// #endif
+		// console.log(stay);
+		// #ifdef MP
+		shareInfo.path = `/pages/index/index?${query}`;
+		// console.log(shareInfo);
+		// #endif
+		// #ifndef MP
+		// shareInfo.path = `${store.getters.appInfo?.domain}?${query}`;
+		// shareInfo.path = scene.path !== '' ? scene.path :`${stay}&{query}`;
+		shareInfo.path = `${stay}&${query}`;
+		// console.log(shareInfo.path);
+		// #endif //initShop
+		// shareInfo.copyLink = `${store.getters.appInfo?.domain}?${query}`;
+		// shareInfo.query = query;
+		// #ifdef H5
+		console.log(shareInfo);
+		if($platform.get() === 'wxOfficialAccount') {
+			wxsdk.share(shareInfo);
+		}
+		// #endif
+		store.commit("shareInfo", shareInfo);
+		return shareInfo;
+	},
+
+	// 自定义分享参数拼接: 由于小程序码长度限制(B码最大32位长度),为了确保分享参数最大可扩展性,使用spm方法拼接 shareUserId.page.pageId.platform.from ----例 spm=88888888.3.1666666.3.2 即为ID为88888888用户通过微信网页平台生成了拼团ID为1666666的拼团分享海报
+	setShareQuery(params) {
+		let shareUserId = '0'; // 设置分享者用户ID
+		if (params&&params.shareId) {
+			// if (store.getters.isLogin) {
+				shareUserId = store.getters.userInfo.id;
+			// }
+		}
+		if (params.shareId === undefined) {
+			if (store.getters.isLogin) {
+				shareUserId = store.getters.userInfo.id;
+			}
+		}
+		let page = '1'; // 页面类型: 1=首页(默认),2=商品,3=拼团...按需扩展
+		if (params.page !== undefined) {
+			page = params.page;
+		}
+		let pageId = '0'; // 设置页面ID: 如商品ID、拼团ID等
+		if (params.pageId !== undefined) {
+			pageId = params.pageId;
+		}
+		let platform = ['H5', 'wxOfficialAccount', 'wxMiniProgram', 'App'].indexOf($platform.get()) +
+		1; // 设置分享的平台渠道: 1=H5,2=微信公众号网页,3=微信小程序,4=App,...按需扩展
+		let from = '1'; // 设置分享方式: 1=直接转发,2=海报,3=链接,...按需扩展
+		// if (params.from !== undefined) {
+		// 	from = params.from;
+		// }
+		//spmParam = ...  可按需扩展
+		return `spm=${shareUserId}.${page}.${pageId}.${platform}.${from}`;
+	},
+	getShareQuery(spm) {
+		let shareParams = {};
+		let shareParamsArray = spm.split('.');
+		if(shareParamsArray[0] != '0') {
+			shareParams.shareUserId = shareParamsArray[0];
+		}
+		switch(shareParamsArray[1]) {
+			case '1':
+			// 默认首页不跳转
+			break;
+			case '2':
+			shareParams.page = '/pages/tasklist/taskdetails';
+			break;
+			case '3':
+			shareParams.page = '/pages/activity/groupon/detail';
+			break;
+		}
+		if(shareParamsArray[2] !== '0') {
+			shareParams.pageId = shareParamsArray[2];
+		}
+		shareParams.platform = shareParamsArray[3];
+		shareParams.from = shareParamsArray[4];
+		return shareParams;
+	}
+}

+ 15 - 0
common/store/index.js

@@ -0,0 +1,15 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+import init from './modules/init.js'
+import user from './modules/user.js'
+
+const store = new Vuex.Store({
+	modules: {
+		init,
+		user
+	}
+})
+
+export default store

+ 112 - 0
common/store/modules/init.js

@@ -0,0 +1,112 @@
+import http from '@/common/request/index'
+import share from '@/common/share';
+import ws from "@/store/ws.js";
+
+const state = {
+	appInfo: {},
+	wechat: {autologin:true}, // 微信配置
+	share: {}, // 分享配置
+	payment: {}, // 支付配置
+	recharge: uni.getStorageSync("recharge") || {}, //充值配置
+	shareInfo: {} ,// 默认分享数据
+	homeTemplate: [], // 首页模板数据
+}
+
+const getters = {
+	appInfo: state => state.appInfo,
+	initWechat: state => state.wechat,
+	initShare: state => state.share,
+	shareInfo: state => state.shareInfo,
+	homeTemplate: state => state.homeTemplate,
+}
+
+const actions = {
+	// 初始化数据
+	async appInit({
+		commit,
+		dispatch
+	}, options) {
+		var params = 'system.config';
+		const result = await http('conf.getGroupConf', {
+			group: params
+		}).then(res => {
+			// uni.hideTabBar()
+			if (res.code === 0) {
+				// uni.setNavigationBarTitle({
+				// 	title: res.data.site_name
+				// });
+				commit('appInfo', res.data);
+				uni.setStorageSync('appInfo', res.data);
+				if (!options?.query?.token) {
+					dispatch('autoLogin');
+				}
+				// ws.init();
+				// #ifdef MP-WEIXIN
+				if(res.data.examine_mode == 1){
+					uni.reLaunch({
+						url:'/pages/wx/wx'
+					});
+					return false;
+				}
+				// #endif
+				// if(res.data.bottom_menu_status == 1){
+				// 	dispatch('getbottom_menu',res.data)
+				// }else{
+				// 	uni.setTabBarItem({
+				// 	  index: 0,
+				// 	  text: '找好活',
+				// 	})
+				// 	uni.setTabBarItem({
+				// 	  index: 1,
+				// 	  text: '找师傅',
+				// 	})
+				// 	uni.setTabBarItem({
+				// 	  index: 2,
+				// 	  text: '消息',
+				// 	})
+				// 	uni.setTabBarItem({
+				// 	  index: 3,
+				// 	  text: '我的',
+				// 	})
+				// 	// uni.showTabBar({animation:true})
+				// }
+				return res.data;
+			}
+			return false;
+		});
+	},
+	// 获取模板数据
+	async getTemplate({
+		commit
+	}, options) {
+		const result = await http('common.template');
+		if (result.code === 0) {
+			commit('TEMPLATE', result.data);
+			uni.setStorageSync('homeTemplate', result.data);
+			return result.data;
+		} else {
+			return false;
+		}
+	},
+	
+}
+
+const mutations = {
+	appInfo(state, data) {
+		state.appInfo = data;
+	},
+	shareInfo(state, shareInfo) {
+		state.shareInfo = shareInfo;
+	},
+	TEMPLATE(state, data) {
+		state.template = data;
+		state.homeTemplate = data
+	}
+}
+
+export default {
+	state,
+	mutations,
+	actions,
+	getters
+}

+ 214 - 0
common/store/modules/user.js

@@ -0,0 +1,214 @@
+// 用户数据模块
+import http from '@/common/request/index'
+import store from '@/common/store'
+import tools from '@/common/utils/tools'
+import wechat from '@/common/wechat/wechat'
+import share from '@/common/share'
+
+const state = {
+	token: uni.getStorageSync("token") || "",
+	isLogin: uni.getStorageSync("isLogin") || false, // 是否登陆
+	userInfo: uni.getStorageSync("userInfo") || {}, // 用户信息
+	userData: {}, //用户其他相关数据
+	subscribeMessageIdsMap: [], //小程序订阅消息模板ids
+	authType: '' ,// smsLogin:手机号登录注册, accountLogin:密码登录, forgotPwd:忘记密码, changePwd:修改密码, bindMobile:绑定手机号
+	tabbarList:[]
+}
+
+const getters = {
+	token: state => state.token,
+	isLogin: state => state.isLogin,
+	userInfo: state => state.userInfo,
+	authType: state => state.authType,
+	userData: state => state.userData,
+	tabbarList: state => state.tabbarList,
+	subscribeMessageIdsMap: state => state.subscribeMessageIdsMap
+}
+
+const actions = {
+	// 获取用户信息
+	getUserInfo({
+		commit,
+		dispatch,
+		getters,
+		state
+	}, token = '') {
+		return new Promise((resolve, reject) => {
+			console.log(token);
+			token && uni.setStorageSync('token', token);
+			http('user.info').then(res => {		
+				// console.log(res);
+					if (res.code === 0) {
+						let lastLoginStatus = getters.isLogin;
+						commit('userInfo', res.data);
+						commit('isLogin', true);
+						!lastLoginStatus && share.setShareInfo();
+						// 存在分享信息 添加分享记录
+						let spm = uni.getStorageSync('spm');
+						if (spm) {
+							http('commission.addTeam', {
+								spm: spm
+							});
+							uni.removeStorageSync('spm');
+						}
+						resolve(res.data)
+					} 
+				}).then(() => {
+					// uni.showModal({
+					// 	title:'提示',
+					// 	content:'账号已被锁定,请联系管理员',
+					// 	showCancel:false,
+					// 	confirmText:'确定',
+					// 	confirmColor:'#00e699'
+					// })
+					// 只有在登录的时候请求购物车信息,订单信息,获取登录信息之后。
+					// token && dispatch('getCartList');
+					// console.log('sss');
+					// dispatch('tabbarInit');
+					token && dispatch('getUserData');
+					// dispatch('getMember');
+				})
+				.catch(e => {
+					reject(e)
+				})
+		})
+	},
+	// 用户其他相关信息
+	getUserData({
+		commit
+	}) {
+		return new Promise((resolve, reject) => {
+			http('user.userData').then(res => {				
+				commit('USER_DATA', res.data);
+				resolve(res)
+			}).catch(e => {
+				reject(e)
+			})
+		})
+	},
+
+	// 自动登录
+	async autoLogin({
+		getters,
+		dispatch
+	}) {
+		// console.log('s')
+		if (getters.initWechat?.autologin && !getters.isLogin) { // 微信开启自动登录 并且当前未登录,进入自动登录流程
+			let token = '';
+			// #ifdef H5
+			// wechat.login();
+			// #endif
+			// #ifdef MP-WEIXIN
+			token = await wechat.getWxMiniProgramSessionKey(true);
+			// #endif
+			token && await dispatch('getUserInfo', token);
+		} else if (getters.isLogin) { // 已经登录,直接获取用户信息
+			await dispatch('getUserInfo');
+		}
+		share.setShareInfo();
+		// 初始化小程序session_key
+		// #ifdef MP-WEIXIN
+		if (!getters.initWechat?.autologin) {
+			await wechat.getWxMiniProgramSessionKey(false);
+		}
+		// #endif
+	},
+
+	// 退出登录
+	logout({
+		commit,
+		dispatch
+	}) {
+		uni.getStorageSync('token');
+		commit('token', "");
+		uni.removeStorageSync('chatSessionId');
+		commit('isLogin', false);
+		commit('userInfo', {});
+		commit('USER_DATA', {});
+		// 重置全局分享信息
+		share.setShareInfo();
+	},
+
+	// 获取订阅消息模板ids;
+	getMessageIds({
+		commit,
+		state
+	}) {
+		http('conf.getGroupConf',{group:'system.notification'}).then(res => {
+			commit('formatMessage', res.data)
+			Promise.resolve(res.data)
+		}).catch(e => {
+			Promise.reject(e)
+		})
+
+	},
+}
+
+const mutations = {
+	token(state, payload) {
+		state.token = payload;
+		uni.setStorageSync("token", payload);
+	},
+	// 登录态
+	isLogin(state, data) {
+		state.isLogin = data;
+		uni.setStorageSync('isLogin', data);
+	},
+	// 用户信息
+	userInfo(state, data) {
+		state.userInfo = data;
+		uni.setStorageSync("userInfo", data);
+	},
+	// 小程序订阅消息模板ids
+	MESSAGE_IDS(state, data) {
+		state.subscribeMessageIds = data;
+	},
+	USER_DATA(state, data) {
+		state.userData = data;
+		uni.setStorageSync("userData", data);
+	},
+	AUTH_TYPE(state, data) {
+		data ? uni.hideTabBar() : uni.showTabBar();
+		state.authType = data;
+	},
+	// 订阅消息
+	subscribeMessage(state, type) {
+		let arr = state.subscribeMessageIdsMap[type];
+		arr.length && uni.requestSubscribeMessage({
+			tmplIds: arr,
+			success: (res) => {
+				// console.log(res);
+			},
+			fail: (err) => {
+				// console.log(err);
+			}
+
+		});
+	},
+
+	// 解析订阅消息数据
+	formatMessage(state, messageIdsObj) {
+		// 各场景下用到的订阅模板
+		let typeMap = {
+			'unread_msg': ['pay_suc','examine_result','company_examine'],
+			// 'order':['pay_suc','recommend','new_video']
+		}
+		let idsMap = {}
+		Object.keys(typeMap).forEach(key => {
+			idsMap[key] = []
+			typeMap[key].forEach(item => {
+				idsMap[key].push(messageIdsObj[item])
+			})
+		})
+		state.subscribeMessageIdsMap = idsMap
+	},
+}
+
+
+
+export default {
+	state,
+	mutations,
+	actions,
+	getters
+}

+ 585 - 0
common/utils/sdk-h5.js

@@ -0,0 +1,585 @@
+//#ifdef H5
+/** 
+ * 设置剪切板
+uni.setClipboardData({ data:'文字', success:function(data){}, fail:function(err){}, complete:function(res){} })
+
+获取剪贴板
+uni.getClipboardData({success:function(data){}, fail:function(err){}, complete:function(res){} })
+
+保存图片到系统相册
+uni.saveImageToPhotosAlbum({ filePath: res.tempFilePaths[0], success: function () { console.log('save success'); } })
+
+保存视频到系统相册
+uni.saveVideoToPhotosAlbum({ filePath: res.tempFilePath, success: function () { console.log('save success'); } });
+ * **/
+! function(t, e) {
+	try {
+		window.ClipboardJS = e();
+	} catch (e) {};
+	"object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define
+		.amd ? define([], e) : "object" == typeof exports ? exports.ClipboardJS = e() : t.ClipboardJS = e()
+}(this, function() {
+	return function(n) {
+		var o = {};
+
+		function r(t) {
+			if (o[t]) return o[t].exports;
+			var e = o[t] = {
+				i: t,
+				l: !1,
+				exports: {}
+			};
+			return n[t].call(e.exports, e, e.exports, r), e.l = !0, e.exports
+		}
+		return r.m = n, r.c = o, r.d = function(t, e, n) {
+			r.o(t, e) || Object.defineProperty(t, e, {
+				enumerable: !0,
+				get: n
+			})
+		}, r.r = function(t) {
+			"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {
+				value: "Module"
+			}), Object.defineProperty(t, "__esModule", {
+				value: !0
+			})
+		}, r.t = function(e, t) {
+			if (1 & t && (e = r(e)), 8 & t) return e;
+			if (4 & t && "object" == typeof e && e && e.__esModule) return e;
+			var n = Object.create(null);
+			if (r.r(n), Object.defineProperty(n, "default", {
+					enumerable: !0,
+					value: e
+				}), 2 & t && "string" != typeof e)
+				for (var o in e) r.d(n, o, function(t) {
+					return e[t]
+				}.bind(null, o));
+			return n
+		}, r.n = function(t) {
+			var e = t && t.__esModule ? function() {
+				return t.default
+			} : function() {
+				return t
+			};
+			return r.d(e, "a", e), e
+		}, r.o = function(t, e) {
+			return Object.prototype.hasOwnProperty.call(t, e)
+		}, r.p = "", r(r.s = 0)
+	}([function(t, e, n) {
+		"use strict";
+		var r = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t) {
+				return typeof t
+			} : function(t) {
+				return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" :
+					typeof t
+			},
+			i = function() {
+				function o(t, e) {
+					for (var n = 0; n < e.length; n++) {
+						var o = e[n];
+						o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(
+							t, o.key, o)
+					}
+				}
+				return function(t, e, n) {
+					return e && o(t.prototype, e), n && o(t, n), t
+				}
+			}(),
+			a = o(n(1)),
+			c = o(n(3)),
+			u = o(n(4));
+
+		function o(t) {
+			return t && t.__esModule ? t : {
+				default: t
+			}
+		}
+		var l = function(t) {
+			function o(t, e) {
+				! function(t, e) {
+					if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function")
+				}(this, o);
+				var n = function(t, e) {
+					if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+					return !e || "object" != typeof e && "function" != typeof e ? t : e
+				}(this, (o.__proto__ || Object.getPrototypeOf(o)).call(this));
+				return n.resolveOptions(e), n.listenClick(t), n
+			}
+			return function(t, e) {
+				if ("function" != typeof e && null !== e) throw new TypeError(
+					"Super expression must either be null or a function, not " + typeof e);
+				t.prototype = Object.create(e && e.prototype, {
+					constructor: {
+						value: t,
+						enumerable: !1,
+						writable: !0,
+						configurable: !0
+					}
+				}), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e)
+			}(o, c.default), i(o, [{
+				key: "resolveOptions",
+				value: function() {
+					var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
+					this.action = "function" == typeof t.action ? t.action : this.defaultAction, this.target = "function" ==
+						typeof t.target ? t.target : this.defaultTarget, this.text = "function" == typeof t.text ? t.text : this
+						.defaultText, this.container = "object" === r(t.container) ? t.container : document.body
+				}
+			}, {
+				key: "listenClick",
+				value: function(t) {
+					var e = this;
+					this.listener = (0, u.default)(t, "click", function(t) {
+						return e.onClick(t)
+					})
+				}
+			}, {
+				key: "onClick",
+				value: function(t) {
+					var e = t.delegateTarget || t.currentTarget;
+					this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new a.default({
+						action: this.action(e),
+						target: this.target(e),
+						text: this.text(e),
+						container: this.container,
+						trigger: e,
+						emitter: this
+					})
+				}
+			}, {
+				key: "defaultAction",
+				value: function(t) {
+					return s("action", t) || 'copy'
+				}
+			}, {
+				key: "defaultTarget",
+				value: function(t) {
+					var e = s("target", t);
+					if (e) {
+						return document.querySelector(e)
+					}
+				}
+			}, {
+				key: "defaultText",
+				value: function(t) {
+					return s("text", t) || this.text
+				}
+			}, {
+				key: "destroy",
+				value: function() {
+					this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction =
+						null)
+				}
+			}], [{
+				key: "isSupported",
+				value: function() {
+					var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"],
+						e = "string" == typeof t ? [t] : t,
+						n = !!document.queryCommandSupported;
+					return e.forEach(function(t) {
+						n = n && !!document.queryCommandSupported(t)
+					}), n
+				}
+			}]), o
+		}();
+
+		function s(t, e) {
+			var n = "data-clipboard-" + t;
+			let isFun = e && typeof e.hasAttribute === 'function';
+			if (isFun && e.hasAttribute(n)) {
+				return e.getAttribute(n)
+			}
+		}
+		t.exports = l
+	}, function(t, e, n) {
+		"use strict";
+		var o, r = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t) {
+				return typeof t
+			} : function(t) {
+				return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" :
+					typeof t
+			},
+			i = function() {
+				function o(t, e) {
+					for (var n = 0; n < e.length; n++) {
+						var o = e[n];
+						o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(
+							t, o.key, o)
+					}
+				}
+				return function(t, e, n) {
+					return e && o(t.prototype, e), n && o(t, n), t
+				}
+			}(),
+			a = n(2),
+			c = (o = a) && o.__esModule ? o : {
+				default: o
+			};
+		var u = function() {
+			function e(t) {
+				! function(t, e) {
+					if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function")
+				}(this, e), this.resolveOptions(t), this.initSelection()
+			}
+			return i(e, [{
+				key: "resolveOptions",
+				value: function() {
+					var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
+					this.action = t.action, this.container = t.container, this.emitter = t.emitter, this.target = t.target,
+						this.text = t.text, this.trigger = t.trigger, this.selectedText = ""
+				}
+			}, {
+				key: "initSelection",
+				value: function() {
+					this.text ? this.selectFake() : this.target && this.selectTarget()
+				}
+			}, {
+				key: "selectFake",
+				value: function() {
+					var t = this,
+						e = "rtl" == document.documentElement.getAttribute("dir");
+					this.removeFake(), this.fakeHandlerCallback = function() {
+							return t.removeFake()
+						}, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem =
+						document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border =
+						"0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position =
+						"absolute", this.fakeElem.style[e ? "right" : "left"] = "-9999px";
+					var n = window.pageYOffset || document.documentElement.scrollTop;
+					this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value =
+						this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, c.default)(this.fakeElem),
+						this.copyText()
+				}
+			}, {
+				key: "removeFake",
+				value: function() {
+					this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler =
+						null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem),
+						this.fakeElem = null)
+				}
+			}, {
+				key: "selectTarget",
+				value: function() {
+					this.selectedText = (0, c.default)(this.target), this.copyText()
+				}
+			}, {
+				key: "copyText",
+				value: function() {
+					var e = void 0;
+					try {
+						e = document.execCommand(this.action)
+					} catch (t) {
+						e = !1
+					}
+					this.handleResult(e)
+				}
+			}, {
+				key: "handleResult",
+				value: function(t) {
+					this.emitter.emit(t ? "success" : "error", {
+						action: this.action,
+						text: this.selectedText,
+						trigger: this.trigger,
+						clearSelection: this.clearSelection.bind(this)
+					})
+				}
+			}, {
+				key: "clearSelection",
+				value: function() {
+					this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges()
+				}
+			}, {
+				key: "destroy",
+				value: function() {
+					this.removeFake()
+				}
+			}, {
+				key: "action",
+				set: function() {
+					var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "copy";
+					if (this._action = t, "copy" !== this._action && "cut" !== this._action) throw new Error(
+						'Invalid "action" value, use either "copy" or "cut"')
+				},
+				get: function() {
+					return this._action
+				}
+			}, {
+				key: "target",
+				set: function(t) {
+					if (void 0 !== t) {
+						if (!t || "object" !== (void 0 === t ? "undefined" : r(t)) || 1 !== t.nodeType) throw new Error(
+							'Invalid "target" value, use a valid Element');
+						if ("copy" === this.action && t.hasAttribute("disabled")) throw new Error(
+							'Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
+						if ("cut" === this.action && (t.hasAttribute("readonly") || t.hasAttribute("disabled"))) throw new Error(
+							'Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'
+						);
+						this._target = t
+					}
+				},
+				get: function() {
+					return this._target
+				}
+			}]), e
+		}();
+		t.exports = u
+	}, function(t, e) {
+		t.exports = function(t) {
+			var e;
+			if ("SELECT" === t.nodeName) t.focus(), e = t.value;
+			else if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) {
+				var n = t.hasAttribute("readonly");
+				n || t.setAttribute("readonly", ""), t.select(), t.setSelectionRange(0, t.value.length), n || t.removeAttribute(
+					"readonly"), e = t.value
+			} else {
+				t.hasAttribute("contenteditable") && t.focus();
+				var o = window.getSelection(),
+					r = document.createRange();
+				r.selectNodeContents(t), o.removeAllRanges(), o.addRange(r), e = o.toString()
+			}
+			return e
+		}
+	}, function(t, e) {
+		function n() {}
+		n.prototype = {
+			on: function(t, e, n) {
+				var o = this.e || (this.e = {});
+				return (o[t] || (o[t] = [])).push({
+					fn: e,
+					ctx: n
+				}), this
+			},
+			once: function(t, e, n) {
+				var o = this;
+
+				function r() {
+					o.off(t, r), e.apply(n, arguments)
+				}
+				return r._ = e, this.on(t, r, n)
+			},
+			emit: function(t) {
+				for (var e = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[t] || []).slice(), o = 0, r = n.length; o <
+					r; o++) n[o].fn.apply(n[o].ctx, e);
+				return this
+			},
+			off: function(t, e) {
+				var n = this.e || (this.e = {}),
+					o = n[t],
+					r = [];
+				if (o && e)
+					for (var i = 0, a = o.length; i < a; i++) o[i].fn !== e && o[i].fn._ !== e && r.push(o[i]);
+				return r.length ? n[t] = r : delete n[t], this
+			}
+		}, t.exports = n
+	}, function(t, e, n) {
+		var d = n(5),
+			h = n(6);
+		t.exports = function(t, e, n) {
+			if (!t && !e && !n) throw new Error("Missing required arguments");
+			if (!d.string(e)) throw new TypeError("Second argument must be a String");
+			if (!d.fn(n)) throw new TypeError("Third argument must be a Function");
+			if (d.node(t)) return s = e, f = n, (l = t).addEventListener(s, f), {
+				destroy: function() {
+					l.removeEventListener(s, f)
+				}
+			};
+			if (d.nodeList(t)) return a = t, c = e, u = n, Array.prototype.forEach.call(a, function(t) {
+				t.addEventListener(c, u)
+			}), {
+				destroy: function() {
+					Array.prototype.forEach.call(a, function(t) {
+						t.removeEventListener(c, u)
+					})
+				}
+			};
+			if (d.string(t)) return o = t, r = e, i = n, h(document.body, o, r, i);
+			throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");
+			var o, r, i, a, c, u, l, s, f
+		}
+	}, function(t, n) {
+		n.node = function(t) {
+			return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType
+		}, n.nodeList = function(t) {
+			var e = Object.prototype.toString.call(t);
+			return void 0 !== t && ("[object NodeList]" === e || "[object HTMLCollection]" === e) && "length" in t && (0 ===
+				t.length || n.node(t[0]))
+		}, n.string = function(t) {
+			return "string" == typeof t || t instanceof String
+		}, n.fn = function(t) {
+			return "[object Function]" === Object.prototype.toString.call(t)
+		}
+	}, function(t, e, n) {
+		var a = n(7);
+
+		function i(t, e, n, o, r) {
+			var i = function(e, n, t, o) {
+				return function(t) {
+					t.delegateTarget = a(t.target, n), t.delegateTarget && o.call(e, t)
+				}
+			}.apply(this, arguments);
+			return t.addEventListener(n, i, r), {
+				destroy: function() {
+					t.removeEventListener(n, i, r)
+				}
+			}
+		}
+		t.exports = function(t, e, n, o, r) {
+			return "function" == typeof t.addEventListener ? i.apply(null, arguments) : "function" == typeof n ? i.bind(
+				null, document).apply(null, arguments) : ("string" == typeof t && (t = document.querySelectorAll(t)), Array.prototype
+				.map.call(t, function(t) {
+					return i(t, e, n, o, r)
+				}))
+		}
+	}, function(t, e) {
+		if ("undefined" != typeof Element && !Element.prototype.matches) {
+			var n = Element.prototype;
+			n.matches = n.matchesSelector || n.mozMatchesSelector || n.msMatchesSelector || n.oMatchesSelector || n.webkitMatchesSelector
+		}
+		t.exports = function(t, e) {
+			for (; t && 9 !== t.nodeType;) {
+				if ("function" == typeof t.matches && t.matches(e)) return t;
+				t = t.parentNode
+			}
+		}
+	}])
+});
+let Types = {
+	isFunction: function(obj) {
+		var type = Object.prototype.toString.call(obj)
+		return type == '[object Function]'
+	},
+	isObject: function(obj) {
+		var type = Object.prototype.toString.call(obj)
+		return type == '[object Object]'
+	},
+	isString: function(obj) {
+		var type = Object.prototype.toString.call(obj)
+		return type == '[object String]'
+	}
+}
+uni.setClipboardData = function(options) {
+	let emptyFun = function() {}
+	let config = {
+		data: null,
+		event: null,
+		success: emptyFun,
+		fail: emptyFun,
+		complete: emptyFun
+	}
+	if (options && Types.isObject(options)) {
+		config = Object.assign({}, config, options)
+	}
+	if (options && Types.isString(options)) {
+		config = Object.assign({}, config, {
+			data: options
+		})
+	}
+	let data = config.data
+	let success = config.success || emptyFun
+	let fail = config.fail || emptyFun
+	let complete = config.complete || emptyFun
+	let e = config.event || window.event || {}
+	let cb = new ClipboardJS('.null', {
+		text: () => data
+	})
+	cb.on('success', function(res) {
+		window.__clipboard__ = data;
+		success && Types.isFunction(success) && success({
+			data: res.text
+		})
+		complete && Types.isFunction(complete) && complete()
+		cb.off('error')
+		cb.off('success')
+		cb.destroy()
+	})
+	cb.on('error', function(err) {
+		fail && Types.isFunction(fail) && fail(err)
+		complete && Types.isFunction(complete) && complete()
+		cb.off('error')
+		cb.off('success')
+		cb.destroy()
+	})
+	cb.onClick(e)
+};
+uni.getClipboardData = function(options) {
+	let emptyFun = function() {}
+	let config = {
+		data: null,
+		event: null,
+		success: emptyFun,
+		fail: emptyFun,
+		complete: emptyFun
+	}
+	if (options && Types.isObject(options)) {
+		config = Object.assign({}, config, options)
+	}
+	let success = config.success || emptyFun
+	let fail = config.fail || emptyFun
+	let complete = config.complete || emptyFun
+	if (window.__clipboard__ !== undefined) {
+		success && Types.isFunction(success) && success({
+			data: window.__clipboard__
+		})
+	} else {
+		fail && Types.isFunction(fail) && fail({
+			data: null
+		})
+	}
+	complete && Types.isFunction(complete) && complete()
+};
+
+function fileDownLoad(data) {
+	var linkElement = document.createElement('a')
+	linkElement.setAttribute('href', data.blob)
+	linkElement.setAttribute('downLoad', data.name)
+	linkElement.click()
+}
+uni.saveImageToPhotosAlbum = uni.saveVideoToPhotosAlbum = function(options) {
+	let emptyFun = function() {}
+	let config = {
+		filePath: null,
+		success: emptyFun,
+		fail: emptyFun,
+		complete: emptyFun
+	}
+	if (options && Types.isObject(options)) {
+		config = Object.assign({}, config, options)
+	}
+	if (options && Types.isString(options)) {
+		config = Object.assign({}, config, {
+			filePath: options
+		})
+	}
+	let filePath = config.filePath
+	let success = config.success || emptyFun
+	let fail = config.fail || emptyFun
+	let complete = config.complete || emptyFun
+	if (!filePath) {
+		fail && Types.isFunction(fail) && fail({
+			msg: 'no File'
+		})
+		complete && Types.isFunction(complete) && complete()
+		return
+	}
+	let names = filePath.split('/')
+	let name = names[names.length - 1]
+	uni.downloadFile({
+		url: filePath,
+		success: function(res) {
+			let tempFilePath = res.tempFilePath
+			fileDownLoad({
+				name: name,
+				blob: tempFilePath
+			})
+			success && Types.isFunction(success) && success({
+				filePath: filePath
+			})
+		},
+		fail: function(err) {
+			fail && Types.isFunction(fail) && fail({
+				msg: err
+			})
+		},
+		complete: function() {
+			complete && Types.isFunction(complete) && complete()
+		}
+	})
+}
+//#endif

+ 137 - 0
common/utils/tools.js

@@ -0,0 +1,137 @@
+import {
+	router
+} from '@/common/router'
+export default {
+
+	/**
+	 * 跳转再封装,主要是为了兼容外链。
+	 * @param {String} path - 跳转路径
+	 * @param {isTabbar} isTabbar - 是否是底部导航
+	 */
+	routerTo(path, isTabbar) {
+		if (path) {
+			// 是否跳转外部链接
+			if (~path.indexOf('http') || ~path.indexOf('www')) {
+				// #ifdef H5
+				window.location = path;
+				// #endif
+				// #ifndef  H5
+				router.push({
+					path: '/pages/public/webview',
+					query: {
+						'webviewPath': path
+					}
+				})
+				// #endif
+				return false
+			}
+			if (isTabbar) {
+				router.replaceAll(path)
+			} else {
+				path.includes('/pages/index') && !path.includes('/pages/index/view') ? router.replaceAll(path) : router
+					.push(path)
+			}
+
+		} else {
+			console.log(`%cerr:没有填写跳转路径`, 'color:green;background:yellow');
+		}
+	},
+	/**
+	 * 图片处理-预览图片
+	 * @param {Array} urls - 图片列表
+	 * @param {Number} current - 首个预览下标
+	 */
+	previewImage(urls = [], current = 0) {
+		uni.previewImage({
+			urls: urls,
+			current: current,
+			indicator: 'default',
+			loop: true,
+			fail(err) {
+				console.log('previewImage出错', urls, err)
+			},
+		})
+	},
+
+	/**
+	 * 数据分组
+	 * @param {Array} oArr - 原数组列表
+	 * @param {Number} length - 单个数组长度
+	 * @return {Array}  arr - 分组后的新数组
+	 */
+	splitData(oArr = [], length = 1) {
+		let arr = [];
+		let minArr = [];
+		oArr.forEach(c => {
+			if (minArr.length === length) {
+				minArr = [];
+			}
+			if (minArr.length === 0) {
+				arr.push(minArr);
+			}
+			minArr.push(c);
+		});
+
+		return arr;
+	},
+
+	/**
+	 * 剩余时间格式化
+	 * @param {Number} t - 剩余多少秒
+	 * @return {Object}  format - 格式后的天时分秒对象
+	 */
+	format(t) {
+		let format = {
+			d: '00',
+			h: '00',
+			m: '00',
+			s: '00'
+		};
+		if (t > 0) {
+			let d = Math.floor(t / 86400);
+			let h = Math.floor((t / 3600) % 24);
+			let m = Math.floor((t / 60) % 60);
+			let s = Math.floor(t % 60);
+			format.d = d < 10 ? '0' + d : d;
+			format.h = h < 10 ? '0' + h : h;
+			format.m = m < 10 ? '0' + m : m;
+			format.s = s < 10 ? '0' + s : s;
+		}
+		return format;
+	},
+
+	/**
+	 * 打电话
+	 * @param {String<Number>} phoneNumber - 数字字符串
+	 */
+	callPhone(phoneNumber = '') {
+		let num = phoneNumber.toString()
+		uni.makePhoneCall({
+			phoneNumber: num,
+			fail(err) {
+				console.log('makePhoneCall出错', err)
+			},
+		});
+	},
+	
+	/**
+	 * 微信头像
+	 * @param {String} url -图片地址
+	 */
+	checkMPUrl(url) {
+		// #ifdef MP
+		if (
+			url.substring(0, 4) === 'http' &&
+			url.substring(0, 5) !== 'https' &&
+			url.substring(0, 12) !== 'http://store' &&
+			url.substring(0, 10) !== 'http://tmp' &&
+			url.substring(0, 10) !== 'http://usr'
+		) {
+			url = 'https' + url.substring(4, url.length);
+		}
+		// #endif
+		return url;
+	},
+
+
+}

+ 178 - 0
common/wechat/sdk.js

@@ -0,0 +1,178 @@
+var jweixin = require("jweixin-module");
+import http from "@/common/request/index";
+import $platform from "@/common/platform";
+export default {
+	//判断是否在微信中
+	isWechat() {
+		var ua = window.navigator.userAgent.toLowerCase();
+		if (ua.match(/micromessenger/i) == "micromessenger") {
+			return true;
+		} else {
+			return false;
+		}
+	},
+	// 鉴权页面
+	initJssdk(callback) {
+		let url = window.location.href.split('#')[0]
+		
+		http("wechat.wechatJssdk", {
+			uri: url
+		}).then(res => {
+			// console.log(res);
+			jweixin.config({
+				debug: res.data.debug,
+				appId: res.data.appId,
+				timestamp: res.data.timestamp,
+				nonceStr: res.data.nonceStr,
+				signature: res.data.signature,
+				jsApiList: res.data.jsApiList,
+				openTagList: res.data.openTagList
+			});
+			if (callback) {
+				callback(res.data);
+			}
+		});
+	},
+
+	//在需要定位页面调用
+	getLocation(callback) {
+		this.isWechat() && this.initJssdk(function(res) {
+			jweixin.ready(function() {
+				jweixin.getLocation({
+					type: "gcj02", // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
+					success: function(res) {
+						callback(res);
+					},
+					fail: function(res) {
+						console.log("%c微信H5sdk,getLocation失败:",
+							"color:green;background:yellow");
+					},
+				});
+			});
+		});
+	},
+
+	//获取微信收货地址
+	openAddress(callback) {
+		this.isWechat() && this.initJssdk(function(res) {
+			jweixin.ready(function() {
+				jweixin.openAddress({
+					success: function(res) {
+						callback(res);
+					},
+					fail: function(err) {
+						console.log("%c微信H5sdk,openAddress失败:",
+							"color:green;background:yellow");
+					},
+					complete: function(msg) {}
+				});
+			});
+		});
+	},
+
+	// 微信扫码
+	scanQRCode(callback) {
+		this.isWechat() && this.initJssdk(function(res) {
+			jweixin.ready(function() {
+				jweixin.scanQRCode({
+					needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+					scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
+					success: function(res) {
+						callback(res);
+					},
+					fail: function(res) {
+						console.log("%c微信H5sdk,scanQRCode失败:",
+							"color:green;background:yellow");
+					},
+				});
+			});
+		});
+	},
+
+	// 微信分享
+	share(data, callback) {
+		// console.log('1',data);
+		this.isWechat() && this.initJssdk(function(res) {
+			jweixin.ready(function() {
+				// console.log(data);
+				var shareData = {
+					title: data.title,
+					desc: data.desc,
+					link: data.path,
+					imgUrl: data.image,
+					success: function(res) {
+						console.log('分享成功ll');
+						// callback(res);
+						// 分享后的一些操作,比如分享统计等等
+					},
+					cancel: function(res) {
+						// console.log(res);
+					}
+				};
+
+				jweixin.updateAppMessageShareData(shareData); //新版接口
+				//分享到朋友圈接口
+				jweixin.updateTimelineShareData(shareData);
+
+
+			});
+		});
+
+	},
+
+
+	// 打开坐标位置
+	openLocation(data, callback) { //打开位置
+		this.isWechat() && this.initJssdk(function(res) {
+			jweixin.ready(function() {
+				jweixin.openLocation({ //根据传入的坐标打开地图
+					latitude: data.latitude,
+					longitude: data.longitude
+				});
+			});
+		});
+	},
+	// 选择图片
+	chooseImage(callback) { //选择图片
+		this.isWechat() && this.initJssdk(function(res) {
+			jweixin.ready(function() {
+				jweixin.chooseImage({
+					count: 1,
+					sizeType: ["compressed"],
+					sourceType: ["album"],
+					success: function(rs) {
+						callback(rs);
+					}
+				});
+			});
+		});
+	},
+
+	//微信支付
+	wxpay(data, callback) {
+		let that = this;
+		this.isWechat() && this.initJssdk(function(res) {
+			jweixin.ready(function() {
+				jweixin.chooseWXPay({
+					timestamp: data
+						.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
+					nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位
+					package: data.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
+					signType: data.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
+					paySign: data.paySign, // 支付签名
+					success: function(res) {
+						callback(res);
+					},
+					fail: function(res) {
+						console.log("%c微信H5sdk,chooseWXPay失败:",
+							"color:green;background:yellow");
+						callback(res);
+					},
+					cancel: function(res) {
+
+					},
+				});
+			});
+		});
+	}
+};

+ 297 - 0
common/wechat/wechat.js

@@ -0,0 +1,297 @@
+import api from "@/common/request/index";
+import $platform from "@/common/platform";
+import store from "@/common/store";
+import {
+	API_URL,
+	API_ROOT,
+	UNIACID
+} from '@/common/request/request';
+
+export default {
+	eventMap(event) {
+		let map = "";
+		switch (event) {
+			case "login":
+				map = "登录中...";
+				break;
+			case "refresh":
+				map = "更新中...";
+				break;
+			case "bind":
+				map = "绑定中...";
+				break;
+		}
+		return map;
+	},
+
+	async login() {
+		let token = "";
+		// #ifdef MP-WEIXIN
+		token = await this.wxMiniProgramOauth("login");
+		return token;
+		// #endif
+		// #ifdef H5
+		this.wxOfficialAccountOauth("login");
+		// #endif
+		// #ifdef APP-PLUS
+		token = await this.wxOpenPlatformOauth("login");
+		return token;
+		// #endif
+	},
+	async refresh() {
+		
+		let token = "";
+		// #ifdef MP-WEIXIN
+		token = await this.wxMiniProgramOauth("refresh");
+		return token;
+		// #endif
+		// #ifdef H5
+		this.wxOfficialAccountOauth("refresh");
+		// #endif
+		// #ifdef APP-PLUS
+		token = await this.wxOpenPlatformOauth("refresh");
+		return token;
+		// #endif
+	},
+	async bind() {
+		let token = "";
+		// #ifdef MP-WEIXIN
+		token = await this.wxMiniProgramOauth("bind");
+		return token;
+		// #endif
+		// #ifdef H5
+		this.wxOfficialAccountOauth("bind");
+		// #endif
+		// #ifdef APP-PLUS
+		token = await this.wxOpenPlatformOauth("bind");
+		return token;
+		// #endif
+	},
+
+	// #ifdef H5
+	// 微信公众号网页登录&刷新头像昵称&绑定
+	wxOfficialAccountOauth(event = "login") {
+		if ($platform.get() !== "wxOfficialAccount") {
+		   uni.showToast({
+		    title: "请在微信浏览器中打开",
+		    icon: "none"
+		   });
+		   throw false;
+		  }
+		  let host = $platform.host();
+		  console.log(host)
+		  let payloadObject = {
+		   host: host,   
+		   event,
+		   token: (event !== "login" && store.getters.isLogin) ? uni.getStorageSync("token") : ""
+		  };
+		  let payload = encodeURIComponent(JSON.stringify(payloadObject));
+		  let redirect_uri = encodeURIComponent(`${host}pages/user/signin?payload=${payload}&uniacid=${UNIACID}`);
+		  
+		  let oauthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + store.getters.appInfo.wechat_appid +
+		   `&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=1&uniacid=${UNIACID}`;
+		  uni.setStorageSync("lastPage", window.location.href);
+		  window.location = oauthUrl;
+		  console.log(window.location);
+		
+	},
+
+	// 微信公众号网页静默登录:临时登录获取OpenId 不入库不绑定用户
+	wxOfficialAccountBaseLogin() {
+		let state = encodeURIComponent(window.location.href);
+		window.location = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + store.getters.initWechat.appid +
+			`&redirect_uri=${API_URL}user/wxOfficialAccountBaseLogin&response_type=code&scope=snsapi_base&state=${state}`;
+		throw "stop";
+	},
+	// #endif
+
+	// #ifdef APP-PLUS
+	// 微信开放平台登录
+	wxOpenPlatformOauth(event = "login") {
+		let that = this;
+		return new Promise((resolve, reject) => {
+			uni.login({
+				provider: "weixin",
+				success: function(loginRes) {
+					if (loginRes.errMsg === "login:ok") {
+						let authResult = loginRes.authResult;
+						api("user.wxOpenPlatformOauth", {
+							authResult,
+							event
+						}, that.eventMap(event)).then(res => {
+							if (res.code === 1) {
+								resolve(res.data.token);
+							} else {
+								resolve(false);
+							}
+						});
+					}
+				},
+				fail: function(res) {
+					uni.showToast({
+						title: "登录失败,请稍后再试"
+					});
+					resolve(false);
+					api("common.debug", {
+						info: res
+					});
+				},
+				complete: function(res) {}
+			});
+		});
+	},
+	// #endif
+
+	// #ifdef MP-WEIXIN
+	// 微信小程序静默登录
+	async getWxMiniProgramSessionKey(autoLogin = true) {
+		let sessionStatus = false;
+		let session_key = "";
+		return new Promise((resolve, reject) => {
+			uni.checkSession({
+				success(res) {
+					if (res.errMsg === "checkSession:ok") sessionStatus = true;
+				},
+				complete() {
+					// console.log(uni.getStorageSync("session_key"))
+					if (uni.getStorageSync("session_key") && sessionStatus && !autoLogin) {
+						resolve(uni.getStorageSync("session_key"));
+					} else {
+						uni.login({
+							success: function(info) {
+								let code = info.code;
+								api("wechat.miniappSilenceAuth", {
+									code: code
+								}).then(res => {
+									if (res.code === 0) {
+										
+										uni.setStorageSync("session_key", res
+											.data.session_key);
+										if (autoLogin) {
+											if (res.data.token) {
+												resolve(res.data.token);
+											} else {
+												resolve(false);
+											}
+										}
+										resolve(res.data.session_key);
+									} else {
+										reject(res.msg);
+									}
+								});
+							}
+						});
+					}
+				}
+			});
+		});
+	},
+
+	// 微信小程序获取用户信息登录
+	wxMiniProgramOauth(event = "login") {
+		let that = this;
+		let session_key = uni.getStorageSync("session_key");
+		uni.showLoading({
+			title: that.eventMap(event)
+		});
+		return new Promise((resolve, reject) => {
+			uni.getUserProfile({ // 必须手动确认触发
+				desc: "展示用户头像昵称", // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
+				success: res => {
+					// console.log(res);
+					if (res.errMsg === "getUserProfile:ok") {
+						
+						api("wechat.miniapp_auth", {
+							event,
+							session_key,
+							encryptedData: res.encryptedData,
+							iv: res.iv,
+							signature: res.signature,
+						}).then(res => {
+							// console.log(res)
+							if (res.code === 0) {
+								uni.setStorageSync('isLogin',true)
+								// store.commit('isLogin', true);
+								store.dispatch('getUserInfo')
+								resolve(res.data.token);
+							} else {
+								uni.removeStorageSync("session_key");
+								that.getWxMiniProgramSessionKey(false);
+								resolve(false);
+							}
+						});
+						// console.log(res)
+						resolve(res.userInfo);
+					}
+				},
+				complete: res => {
+					uni.hideLoading();
+					if(res.errMsg === "getUserProfile:fail auth deny"){
+						resolve(res);
+						uni.showToast({
+							title:'获取头像昵称失败',
+							icon:'none'
+						})
+					}
+				}
+			});
+		});
+	},
+    getPhoneNumber(e){
+		let that = this;
+		let session_key = uni.getStorageSync("session_key");
+		// console.log(e)
+		return new Promise((resolve, reject) => {
+		api("wechat.authBindindPhone", {
+			encryptedData: e.encryptedData,
+			iv:e.iv,
+			session_key,
+            // client:'yuesao'			
+		}).then(ress => {
+			if(ress.code === 0){
+				resolve(ress)
+			}else{
+				uni.showToast({
+					title:'登录失败',
+					icon:'none'
+				})
+			}
+		});
+		});
+	},
+	// 小程序更新
+	checkMiniProgramUpdate() {
+		if (uni.canIUse("getUpdateManager")) {
+			const updateManager = uni.getUpdateManager();
+			updateManager.onCheckForUpdate(function(res) {
+				// 请求完新版本信息的回调
+				if (res.hasUpdate) {
+					updateManager.onUpdateReady(function() {
+						uni.showModal({
+							title: "更新提示",
+							content: "新版本已经准备好,是否重启应用?",
+							confirmColor:'#7728f5',
+							success: function(res) {
+								if (res.confirm) {
+									// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+									updateManager.applyUpdate();
+								}
+							}
+						});
+					});
+					updateManager.onUpdateFailed(function() {
+						// 新的版本下载失败
+						uni.showModal({
+							title: "已经有新版本了哟~",
+							confirmColor:'#7728f5',
+							content: "新版本已经上线啦~,请您删除当前小程序,重新搜索打开哟~"
+						});
+					});
+				}
+			});
+		}
+	},
+	// #endif
+
+
+};

二進制
components/.DS_Store


+ 292 - 0
components/elise-audio/elise-audio.vue

@@ -0,0 +1,292 @@
+<template>
+	<view class='flex audio' :class="{active:status}" :style="{background:audioColor}" @click='play(audioId)'>
+		<view class='mr-3'>
+			<view class="wifi-symbol " :class="status?'active':''">
+				<view class="wifi-circle first"></view>
+				<view class="wifi-circle second"></view>
+				<view class="wifi-circle third"></view>
+			</view>
+		</view>
+		
+		<view v-if="!create" class="ml-4">生成</view>
+		<block v-else>
+			<view v-if="Loading" class="loading_icon">
+				<u-loading-icon size="18" color="#fff"></u-loading-icon>
+			</view>
+			<view v-else class="ml-4">{{status?'暂停':'阅读'}}</view>
+		</block>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				context: null,
+				duration: 100,
+				status: false,
+				task_id:'',
+				Loading:false,
+				currentid:'',
+				create:false
+			}
+		},
+		props: {
+			url: {
+				type: String,
+				default: ''
+			},
+			content: {
+				type: String,
+				default: ''
+			},
+			audioColor: {
+				type: String,
+				default: '#5ba5ef'
+			},
+			index: {
+				type: Number,
+				default: 0
+			},
+			cancel: {
+				type: Boolean,
+				default:false
+			},
+			// create: {
+			// 	type: Boolean,
+			// 	default:false
+			// },
+			durationS: [String, Number],
+			audioId: [String, Number]
+		},
+		created() {
+			this.context = uni.createInnerAudioContext();
+			// this.context.autoplay = true
+			this.context.src = this.url;
+			this.context.volume = 1;
+			this.onEnded();
+			uni.$on('stop', (id) => {
+				if (id && id != this.audioId) {
+					this.context.stop();
+					this.status = false;
+				} else if (!id) {
+					this.context.stop();
+					this.status = false;
+				}
+			})
+		},
+		methods: {
+			play(id) { //点击播放
+				if (this.url) {
+					if (this.status) {
+						this.context.pause();
+						this.status = !this.status;
+					} else {
+						uni.$emit('stop', id)
+						this.context.volume = 1;
+						this.context.play()
+						
+						this.status = !this.status;
+					}
+				} else {
+					if(id == this.currentid&&this.Loading){
+						uni.showToast({
+							title:'正在生成',
+							icon:'none'
+						})
+						return;
+					}
+					if(id == this.currentid&&!this.Loading){
+						// console.log('1');
+						if (this.status) {
+							this.context.pause();
+							this.status = !this.status;
+						} else {
+							uni.$emit('stop', id)
+							this.context.volume = 1;
+							this.context.play()
+							this.status = !this.status;
+						}
+						return;
+					}
+					this.create = true
+					this.cancel = false
+					this.Loading = true
+					this.currentid = id
+                    this.$http('ai.tts', {
+                    	text: this.content
+                    }).then(res => {
+						if(res.code == 0){
+							this.task_id = res.data.task_id
+							
+							this.aittsJob(id)
+						}else{
+							uni.showToast({
+								title:'阅读失败',
+								icon:'none'
+							})
+							this.Loading = false
+							this.create = false
+						}
+					})
+				}
+			},
+			aittsJob(id){
+				
+				this.$http('ai.ttsJob', {
+					task_ids: this.task_id
+				}).then(res => {
+					if (res.code == 0) {
+						if(this.cancel){
+							this.status = false;
+							this.Loading = false
+							return;
+						}
+						if (res.data.task_status == 'Running') {
+							setTimeout(() => {
+								this.aittsJob()
+							}, 1500);
+							return;
+						}
+						let ress = {
+							speech_url:res.data.task_result.speech_url,
+							index:this.index
+						}
+						this.context.src = res.data.task_result.speech_url
+						
+						uni.$emit('stop', id)
+						
+						// this.status = !this.status;
+						this.Loading = false
+						this.$emit('aittsjob',ress);
+						// this.context.play()
+						
+						
+					} else {
+						uni.showToast({
+							title:'阅读失败',
+							icon:'none'
+						})
+						this.Loading = false
+						this.create = false
+					}
+				});
+			},
+			onEnded() { //播放结束
+				this.context.onEnded(() => {
+					this.status = false;
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.audio {
+		background: #68d7bb;
+		height: 45rpx;
+		border-radius: 60rpx;
+		width: 125rpx;
+		align-items: center;
+        position: relative;
+		// padding: 20rpx;
+		&.active {
+			opacity: 0.8;
+		}
+
+	}
+
+	.flex {
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+	}
+
+	.flex-1 {
+		flex: 1;
+	}
+
+	.ml-3 {
+		margin-right: 30rpx;
+		color: #fff;
+	}
+
+	.ml-4 {
+		font-size: 24rpx;
+		margin-right: 20rpx;
+		color: #fff;
+		position: absolute;
+		right: 0;
+	}
+
+	.mr-3 {
+		margin-left: 30rpx;
+	}
+
+	.wifi-symbol {
+		width: 50rpx;
+		height: 50rpx;
+		box-sizing: border-box;
+		overflow: hidden;
+		transform: rotate(135deg) translate3d(0, 0, 0);
+		-webkit-transform: rotate(135deg) translate3d(0, 0, 0);
+		backface-visibility: hidden;
+		-webkit-backface-visibility: hidden;
+	}
+
+	.wifi-circle {
+		border: 5rpx solid #fff;
+		border-radius: 50%;
+		position: absolute;
+	}
+
+	.first {
+		width: 5rpx;
+		height: 5rpx;
+		background: #fff;
+		top: 45rpx;
+		left: 45rpx;
+	}
+
+	.second {
+		width: 25rpx;
+		height: 25rpx;
+		top: 35rpx;
+		left: 35rpx;
+	}
+
+	.third {
+		width: 40rpx;
+		height: 40rpx;
+		top: 25rpx;
+		left: 25rpx;
+	}
+
+	.active {
+		.second {
+			animation: fadeInOut 1s infinite 0.2s;
+			-webkit-animation: fadeInOut 1s infinite 0.2s;
+		}
+
+		.third {
+			animation: fadeInOut 1s infinite 0.4s;
+			-webkit-animation: fadeInOut 1s infinite 0.4s;
+		}
+	}
+
+	@keyframes fadeInOut {
+		0% {
+			opacity: 0;
+			/*初始状态 透明度为0*/
+		}
+
+		100% {
+			opacity: 1;
+			/*结尾状态 透明度为1*/
+		}
+	}
+	.loading_icon{
+		margin-right: 18rpx;
+	}
+</style>

+ 40 - 0
components/elise-audio/redme.md

@@ -0,0 +1,40 @@
+## 参数
+
+| url      | audioColor | durationS       | audioId         |                                               |
+| -------- | ----------- | -------------- | -------------- | ----------------------------------------------------- |
+| 音频链接 | 背景颜色  | 音频长度 | 组件id | 
+
+## 使用方法
+
+```javascript
+//html
+<template>
+  <elise-audio
+    audioId="audio1"
+    :url="url"
+    audioColor="#68d7bb"
+    :durationS="5"
+  ></elise-audio>
+</template>
+
+//js
+<script>
+import eliseAudio from '@/components/elise-audio/elise-audio.vue'
+export default {
+    components: {eliseAudio},
+    data() {
+        return{
+            url: ''
+        }
+    },
+    methods: {
+      //暂停播放-
+      onPauseAudio(){
+        uni.$emit('stop')
+      }
+    },
+} 
+</script>
+
+```
+

+ 591 - 0
components/tnui-wx-user-info/tnui-wx-user-info.vue

@@ -0,0 +1,591 @@
+<template>
+  <view
+    v-if="openModal"
+    class="wx-authorization-modal"
+  >
+    <view
+      class="wam__mask"
+      @touchmove.prevent=""
+      @tap.stop="closeModal"
+    ></view>
+    
+    <!-- 内容区域 -->
+    <view class="wam__wrapper">
+      <!-- 关闭按钮 -->
+      <view class="wam__close-btn" @tap.stop="closeModal">
+        <text class="tn-icon-close"></text>
+      </view>
+      <!-- 标题 -->
+	  <!-- #ifdef MP-WEIXIN -->
+      <view class="wam__title">获取您的昵称、头像</view>
+      <!-- tips -->
+      <view class="wam__sub-title">
+        获取用户头像、昵称,主要用于向用户提供具有辨识度的用户中心界面
+      </view>
+      <!-- #endif -->
+	  <!-- #ifdef H5 -->
+	  <view class="wam__title">获取您的手机号</view>
+	  <!-- tips -->
+	  <view class="wam__sub-title">
+	    获取用户手机号,主要用于向用户提供具有辨识度的用户中心界面
+	  </view>
+	  <!-- #endif -->
+      <!-- 头像选择 -->
+	  <!-- #ifdef MP-WEIXIN -->
+      <view class="wam__avatar">
+        <view class="button-shadow">
+          <button
+            class="button"
+            open-type="chooseAvatar"
+            @chooseavatar="chooseAvatarEvent"
+          >
+            <view v-if="userInfo.avatar" class="avatar__image">
+              <image class="image" :src="userInfo.avatar" mode="aspectFill"></image>
+            </view>
+            <view v-else class="avatar__empty">
+              <image class="image" src="" mode="aspectFill"></image>
+            </view>
+            <view class="avatar--icon">
+              <view class="tn-icon-camera-fill"></view>
+            </view>
+          </button>
+        </view>
+      </view>
+      <!-- #endif -->
+      <!-- 昵称输入 -->
+      <view class="wam__nickname">
+		  <!-- #ifdef MP-WEIXIN -->
+        <view class="nickname__data">
+          <input class="input" type="nickname" maxlength="13" v-model="userInfo.nickname" placeholder="请输入昵称" placeholder-style="color: #AAAAAA;">
+        </view>
+		 <!-- #endif -->
+		<!-- #ifdef H5 -->
+			<view class="nickname__data">
+			  <input class="input" type="number"  v-model="userInfo.phone" placeholder="请输入手机号" placeholder-style="color: #AAAAAA;">
+			</view>
+			<view class="nickname__data tn-flex align-center justify-between">
+			  <input class="input" style="width: 145px;" type="number"  v-model="userInfo.code" placeholder="请输入验证码" placeholder-style="color: #AAAAAA;">
+			  <view @tap="getCode" class="getcode">{{tips}}</view>
+			</view>
+		<!-- #endif -->
+		
+      </view>
+      
+      <u-code :seconds="seconds" @end="end" @start="start" ref="uCode"
+      @change="codeChange"></u-code>
+	  <!-- #ifdef MP-WEIXIN -->
+	  <view class="wam__button">
+		  <!-- 保存按钮 -->
+	  	<view
+	  	  class="wam__submit-btn"
+	  	 
+	  	  hover-class="tn-btn-hover-class"
+	  	  :hover-stay-time="150"
+	  	  @tap.stop="submitUserInfo"
+	  	>
+		<!-- :class="[{
+		  'disabled': !userInfo.avatar || !userInfo.nickname
+		}]" -->
+	  	  授 权 登 录
+	  	</view>
+	  	<!-- <button v-if="platform == 'wxMiniProgram'&&userInfo.avatar&&userInfo.nickname" class="getbuttons" open-type="getPhoneNumber" @getphonenumber="getphone"></button> -->
+	  </view>
+      <!-- #endif -->
+     <!-- #ifdef H5 -->
+     <view class="wam__button">
+     		  <!-- 保存按钮 -->
+     	<view
+     	  class="wam__submit-btn"
+     	 :class="[{
+     	   'disabled': !userInfo.phone || !userInfo.code
+     	 }]"
+     	  hover-class="tn-btn-hover-class"
+     	  :hover-stay-time="150"
+     	  @tap.stop="binding"
+     	>
+     		
+     	  授 权 登 录
+     	</view>
+     </view>
+     <!-- #endif -->
+    </view>
+  </view>
+</template>
+
+<script>
+	import { mapMutations, mapActions, mapState, mapGetters } from 'vuex';
+	import wechat from '@/common/wechat/wechat';
+  import { apiurl } from '@/common/request/request';
+  import platform from '@/common/platform/index';
+  export default {
+    options: {
+      // 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现(不会出现shadow节点下再去创建元素)
+      virtualHost: true
+    },
+    props: {
+      value: {
+        type: Boolean,
+        default: false
+      }
+    },
+    data() {
+      return {
+		  tips: '获取验证码',
+		seconds: 60,
+        openModal: false,
+        userInfo: {
+          avatar: '',
+          nickname: ''
+        },
+		platform:platform.get()
+      }
+    },
+    watch: {
+      value: {
+        handler(val) {
+          this.openModal = val
+        },
+        immediate: true
+      }
+    },
+	computed: {
+		...mapGetters(['appInfo','isLogin'])
+	},
+    methods: {
+      ...mapActions(['getUserInfo']),
+      // 头像选择
+      chooseAvatarEvent(e) {
+		var that = this;
+		uni.uploadFile({
+			url: apiurl('common/upload'),
+			filePath: e.detail.avatarUrl,
+			name: 'file',
+			formData: {
+				accept: 'image'
+			},
+			success: res2 => {
+				let a = JSON.parse(res2.data);
+				if (a.code == 0) {
+					that.userInfo.avatar = a.data.path
+				}else{
+					uni.showToast({
+						title:'上传头像失败',
+						icon:'none'
+					})
+				}
+			}
+		});
+      },
+      // 绑定手机号
+      async getphone(e) {
+      	let that = this;
+      		let res = await wechat.getPhoneNumber(e.detail);
+      		if(res.code === 0){
+      			// uni.showToast({
+      			// 	title:that.cur?'绑定成功':'登录成功',
+      			// 	duration:1500
+      			// })
+      			// that.whether = true;
+      			// that.$store.commit('userInfo',res.data)
+      			// uni.navigateTo({
+      			// 	url:'/pages/public/webview?url=https://y.iduomi.cc/api/wechat_login.html'
+      			// })
+				uni.showToast({
+					icon:'loading',
+					title:'授权登录中...'
+				})
+				that.userprofile()
+      		}				
+      },
+	  getCode(){
+		  var that = this;
+		  if(!that.userInfo.phone){
+			  // uni.$u.toast('请输入手机号');
+			  // return;
+			  return uni.showToast({
+			    icon: 'none',
+			    title: '请输入手机号'
+			  })
+		  }else if(!uni.$u.test.mobile(that.userInfo.phone)){
+			  // uni.$u.toast('请输入正确的手机号');
+			  // return;
+			 return uni.showToast({
+			   icon: 'none',
+			   title: '请输入正确的手机号'
+			 }) 
+		  }
+		  if(that.$refs.uCode.canGetCode) {
+		  					// 模拟向后端请求验证码
+		  					uni.showLoading({
+		  						title: '正在获取验证码'
+		  					})
+							that.$http('common.sendMobileCode',{mobile:that.userInfo.phone,event:'register'}).then(res=>{
+								if(res.code == 0){
+									setTimeout(() => {
+										uni.hideLoading();
+										// 这里此提示会被that.start()方法中的提示覆盖
+										// uni.$u.toast('验证码已发送');
+										uni.showToast({
+										  icon: 'none',
+										  title: '验证码已发送'
+										})
+										// 通知验证码组件内部开始倒计时
+										that.$refs.uCode.start();
+									}, 2000);
+								}
+							})
+		  				} else {
+		  					// uni.$u.toast('倒计时结束后再发送');
+							uni.showToast({
+							  icon: 'none',
+							  title: '倒计时结束后再发送'
+							})
+		  				}
+	  },
+	  end() {
+	  				// uni.$u.toast('倒计时结束');
+					uni.showToast({
+					  icon: 'none',
+					  title: '倒计时结束'
+					})
+	  			},
+	  			start() {
+	  				// uni.$u.toast('倒计时开始');
+					uni.showToast({
+					  icon: 'none',
+					  title: '倒计时开始'
+					})
+	  			},
+	  codeChange(text){
+		  // console.log(text);
+		  this.tips = text;
+	  },
+      // 更新用户信息
+      submitUserInfo() {
+		  // console.log(platform.get());
+        // 判断是否已经选择了用户头像和输入了用户昵称
+        if (!this.userInfo.avatar) {
+          return uni.showToast({
+            icon: 'none',
+            title: '请上传头像'
+          })
+        }else if(!this.userInfo.nickname){
+			return uni.showToast({
+			  icon: 'none',
+			  title: '请输入昵称'
+			})
+		}else if(!uni.$u.test.rangeLength('abc', [1, 13])){
+			return uni.showToast({
+			  icon: 'none',
+			  title: '昵称过长'
+			})
+		}else{
+			uni.showToast({
+				icon:'loading',
+				title:'授权登录中...'
+			})
+			this.userprofile()
+		}
+        
+        // 更新完成事件
+        // this.$emit('updated', this.userInfo)
+        
+      },
+      userprofile(){
+		  this.$http('user.profile',{nickname: this.userInfo.nickname,avatar: this.userInfo.avatar}).then( res => {
+		  	if(res.code == 0){
+		  		
+		  		this.$store.dispatch('getUserInfo')
+		  		setTimeout(function() {
+		  		uni.showToast({
+		  			title:'登录成功',
+		  		})
+				setTimeout(function() {
+					uni.navigateBack()
+				}, 1500);
+		  		}, 1500);
+		  	}else{
+		  		that.$u.toast('登录失败,请重试');
+		  	}
+		  })
+	  },
+      // 关闭弹框
+      closeModal() {
+        this.$emit('input', false)
+      },
+      // 绑定手机号
+      binding(){
+      	let that = this;
+		
+		if(!that.userInfo.phone){
+					  // uni.$u.toast('请输入手机号');
+					  // return;
+					  return uni.showToast({
+					    icon: 'none',
+					    title: '请输入手机号'
+					  })
+		}else if(!uni.$u.test.mobile(that.userInfo.phone)){
+					  // uni.$u.toast('请输入正确的手机号');
+					  // return;
+					 return uni.showToast({
+					   icon: 'none',
+					   title: '请输入正确的手机号'
+					 }) 
+		}else if(!that.userInfo.code){
+			return uni.showToast({
+			  icon: 'none',
+			  title: '请输入验证码'
+			})
+		}
+		uni.showToast({
+			icon:'loading',
+			title:'授权登录中...'
+		})
+      	that.$http(
+      		'wechat.authBindindPhoneCode',
+      		{
+      			phone: that.userInfo.phone,
+      			code: that.userInfo.code
+      		},
+      		// '中...'
+      	).then(res => {
+      		if (res.code === 0) {
+      			uni.showToast({
+      				title:'登录成功',
+      				duration:1500
+      			})
+      			setTimeout(function(){
+      				// uni.navigateBack({
+      				// })
+					// this.$emit('updated', that.userInfo)
+					uni.switchTab({
+						url:'/pages/user/user'
+					})
+      			},1500);
+      			that.$store.commit('userInfo',res.data)
+      		} else {
+      			that.$u.toast(res.msg);
+      		}
+      	});
+      },
+      
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  
+  @import '../../static/iconfont/tuniao.css';
+  
+  .wx-authorization-modal {
+    position: fixed;
+    left: 0;
+    top: 0;
+    width: 100vw;
+    height: 100vh;
+    // z-index: 99998;
+    
+    view {
+      box-sizing: border-box;
+    }
+    
+    .image {
+      width: 100%;
+      height: 100%;
+      border-radius: inherit;
+    }
+    
+    .wam {
+      /* mask */
+      &__mask {
+        position: absolute;
+        left: 0;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        background-color: rgba(0, 0, 0, 0.5);
+        opacity: 0;
+        animation: showMask 0.25s ease 0.1s forwards;
+      }
+      
+      /* close-btn */
+      &__close-btn {
+        position: absolute;
+        top: 30rpx;
+        right: 30rpx;
+        // z-index: 99999;
+      }
+      
+      /* wrapper */
+      &__wrapper {
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        width: 100%;
+        background-color: #FFFFFF;
+        border-radius: 20rpx 20rpx 0rpx 0rpx;
+        padding: 40rpx;
+        padding-top: 60rpx;
+        padding-bottom: 40rpx;
+        padding-bottom: calc(constant(safe-area-inset-bottom) + 40rpx);
+        padding-bottom: calc(env(safe-area-inset-bottom) + 40rpx);
+        transform-origin: center bottom;
+        transform: scaleY(0);
+        animation: showWrapper 0.25s ease 0.1s forwards;
+        // z-index: 99999;
+      }
+      
+      /* title */
+      &__title {
+        font-size: 34rpx;
+      }
+      /* sub-title */
+      &__sub-title {
+        font-size: 26rpx;
+        color: #AAAAAA;
+        margin-top: 16rpx;
+        padding-bottom: 30rpx;
+      }
+      
+      /* 头像选择 */
+      &__avatar {
+        width: 100%;
+        margin-top: 30rpx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        
+        .button-shadow {
+          border: 8rpx solid rgba(255,255,255,0.05);
+          box-shadow: 0rpx 0rpx 80rpx 0rpx rgba(0, 0, 0, 0.15);
+          border-radius: 50%;
+        }
+        
+        .button {
+          position: relative;
+          width: 160rpx;
+          height: 160rpx;
+          border-radius: 50%;
+          overflow: visible;
+          background-image: repeating-linear-gradient(45deg, #E4E9EC, #F8F7F8);
+          color: #FFFFFF;
+          background-color: transparent;
+          padding: 0;
+          margin: 0;
+          font-size: inherit;
+          line-height: inherit;
+          border: none;
+          &::after {
+            border: none;
+          }
+        }
+        
+        .avatar {
+          &__empty, &__image {
+            width: 100%;
+            height: 100%;
+            border-radius: inherit;
+          }
+          
+          &--icon {
+            position: absolute;
+            right: -10rpx;
+            bottom: -6rpx;
+            width: 60rpx;
+            height: 60rpx;
+            // transform: translate(50%, 50%);
+            background-color: #1D2541;
+            color: #FFFFFF;
+            border-radius: 50%;
+            border: 6rpx solid #FFFFFF;
+            line-height: 1;
+            font-size: 36rpx;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+          }
+        }
+      }
+      
+      /* 昵称 */
+      &__nickname {
+        margin-top: 40rpx;
+        
+        .nickname {
+          
+          &__data {
+            margin-top: 26rpx;
+            width: 100%;
+            // padding: 26rpx 46rpx;
+			padding: 26rpx 26rpx 26rpx 46rpx;
+            border-radius: 16rpx;
+            background-color: #F8F7F8;
+            
+            .input {
+              color: #080808;
+            }
+          }
+        }
+      }
+      
+      /* 保存按钮 */
+      &__submit-btn {
+        width: 100%;
+        background-color: #05C160;
+        color: #FFFFFF;
+        margin-top: 60rpx;
+        border-radius: 16rpx;
+        padding: 25rpx;
+        font-size: 32rpx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        
+        &.disabled {
+          background-color: #E6E6E6;
+        }
+      }
+      
+      
+    }
+  }
+  
+  .tn-btn-hover-class {
+    box-shadow: inset 10rpx 2rpx 40rpx 0rpx rgba(0, 0, 0, 0.05);
+  }
+  
+  @keyframes showMask {
+    0% {
+      opacity: 0;
+    }
+    100% {
+      opacity: 1;
+    }
+  }
+  @keyframes showWrapper {
+    0% {
+      transform: scaleY(0);
+    }
+    100% {
+      transform: scaleY(1);
+    }
+  }
+  .wam__button{
+	  position: relative;
+	  font-weight: bold;
+	  .getbuttons{
+	  	position: absolute;
+	  	width: 100%;
+	  	height: 88rpx;
+	  	opacity: 0;
+		top: 0;
+	  }
+  }
+  .getcode{
+	  color: #fff;
+	  background: #05C160;
+	  padding: 8rpx 26rpx;
+	  border-radius: 12rpx;
+	  font-size: 24rpx;
+  }
+</style>

+ 62 - 0
components/wike-ad/wike-ad.vue

@@ -0,0 +1,62 @@
+<template>
+	<view>
+		<u-swiper v-if="homeTemplate&&homeTemplate.banner&&homeTemplate.banner.length>0" :list="homeTemplate.banner" keyName="path" easingFunction="easeOutCubic" height="120" indicator radius="10"
+			@click="click"></u-swiper>
+	</view>
+</template>
+
+<script>
+	import {
+		mapMutations,
+		mapActions,
+		mapState,
+		mapGetters
+	} from 'vuex';
+	export default {
+		name: "wike-ad",
+		data() {
+			return {};
+		},
+		computed: {
+			...mapGetters(['appInfo', 'homeTemplate'])
+		},
+		methods: {
+			click(index) {
+				var that = this,
+					del = {};
+				del = that.homeTemplate.banner[index];
+				// console.log(del);
+				if (del.link_type == 2) {
+					// #ifdef MP-WEIXIN
+					uni.navigateTo({
+						url: '/pages/user/public/webview?url=' + escape(del.link_url)
+					})
+					// #endif
+					// #ifdef H5
+					window.location = del.link_url
+					// #endif
+				} else if (del.link_type == 1) {
+					// console.log(del);
+					uni.navigateTo({
+						url: del.link_url,
+					});
+				
+				} else if (del.link_type == 0) {
+					uni.switchTab({
+						url: del.link_url
+					});
+				} else if (del.link_type == 3) {
+					uni.navigateToMiniProgram({
+						appId: del.link_url,
+						path: del.link_other,
+						success(res) {}
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 49 - 0
components/wike-flow-main/wike-flow-main.vue

@@ -0,0 +1,49 @@
+<template>
+	<view>
+		<view class="adContainer">
+		<ad v-if="flowtype == 2" :unit-id="banner_id"></ad>
+		<ad v-if="flowtype == 3" :unit-id="video_banner_id" ad-type="video" ad-theme="white"></ad>
+		<ad-custom v-if="flowtype == 4" :unit-id="native_id"></ad-custom>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"wike-flow-main",
+		data() {
+			return {
+			};
+		},
+		props:{
+		flowtype: {
+			type:Number,
+			default:4,
+		},
+		banner_id: {
+			type:String,
+			default: ''
+		},
+		video_banner_id: {
+			type:String,
+			default: ''
+		},
+		native_id: {
+			type:String,
+			default: ''
+		}
+		},
+		methods:{
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+.adContainer{
+	width: 100%;
+	// margin-top: 30rpx;
+	// padding: 30rpx;
+	// margin: 0 30rpx 30rpx;
+}
+</style>

+ 232 - 0
components/wike-loading-page/wike-loading-page.vue

@@ -0,0 +1,232 @@
+<template>
+	<view>
+		
+			<!-- #ifdef H5 -->
+			<!-- <view class="loading-wrap" v-if="isLoading">
+			<u-loading-page :loading="isLoading" loading-text="正在加载" icon-size="35" color="#9e9e9e" loadingColor="#9e9e9e"></u-loading-page>
+			</view> -->
+			<view class="loading-wrap" v-show="isLoading">
+				<!-- <view class="ue-page-loading"></view> -->
+				<image class="loading-image" src="/static/images/loading.gif"></image>
+				<!-- <u-loading-icon  textSize="19" :vertical="true" size="42" mode="semicircle"></u-loading-icon> -->
+			</view>
+			<!-- #endif -->
+			
+			<!-- #ifdef MP-WEIXIN -->
+			<!-- <view class="loading-wrap" v-if="appInfo.examine_mode == 1 || isLoading">
+			<u-loading-page :loading="appInfo.examine_mode == 1 || isLoading" loading-text="正在加载" icon-size="35" color="#9e9e9e" loadingColor="#9e9e9e"></u-loading-page>
+			</view> -->
+			<view class="loading-wrap" v-if="appInfo.examine_mode == 1 || isLoading">
+				<!-- <view class="ue-page-loading"></view> -->
+				<image class="loading-image" src="/static/images/loading.gif"></image>
+				<!-- <u-loading-icon  textSize="19" :vertical="true" size="42" ></u-loading-icon> -->
+			</view>
+			<!-- #endif -->
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapMutations,
+		mapActions,
+		mapState,
+		mapGetters
+	} from 'vuex';
+	export default {
+		name:"wike-loading-page",
+		data() {
+			return {
+				
+			};
+		},
+		props: {
+			isLoading: {
+				type: Boolean,
+				default: true
+			}
+		},
+		computed: {
+			...mapGetters(['appInfo'])
+		},
+		mounted : async function() {
+			// // #ifdef MP-WEIXIN || MP-KUAISHOU
+			// let init = await this.appInit()
+			// 	if(init.examine_mode == 1){
+			// 		this.$Router.replaceAll('/pages/wx/wx')
+			// 	}
+			// // #endif
+		},
+		methods: {
+			...mapActions(['appInit']),
+		}
+	}
+</script>
+
+<style>
+/* .loading-wrap {
+		width: 100vw;
+		height: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 99999;
+	} */
+
+// 加载
+	.loading-wrap {
+		width: 100vw;
+		height: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-justify-content: center;
+		justify-content: center;
+		-webkit-align-items: center;
+		align-items: center;
+		z-index: 9999;
+		background: #fff;
+		
+	}
+.loading-image{
+			width: 600rpx;
+			height: 400rpx;
+		}
+	.loading {
+		width: 180rpx;
+		height: 180rpx;
+		position: relative;
+	}
+
+	.loading-bg {
+		width: 180rpx;
+		height: 180rpx;
+		position: absolute;
+		top: 0;
+		left: 0;
+		z-index: 0;
+	}
+
+	.loading-rotateing {
+		position: absolute;
+		top: 0;
+		left: 0;
+		z-index: 1;
+		width: 180rpx;
+		height: 180rpx;
+		-webkit-animation: rotating 600ms linear 0ms reverse infinite;
+		animation: rotating 600ms linear 0ms reverse infinite;
+	}
+
+	@-webkit-keyframes rotating {
+		from {
+			-webkit-transform: rotate(0);
+			transform: rotate(0);
+		}
+
+		to {
+			-webkit-transform: rotate(-360deg);
+			transform: rotate(-360deg);
+		}
+	}
+
+	@keyframes rotating {
+		from {
+			-webkit-transform: rotate(0);
+			transform: rotate(0);
+		}
+
+		to {
+			-webkit-transform: rotate(-360deg);
+			transform: rotate(-360deg);
+		}
+	}
+
+	/* 加载样式2 */
+	.ue-page-loading {
+		position: absolute;
+		top: calc(50% - 1.25em);
+		left: calc(50% - 1.25em);
+		width: 2.5em;
+		height: 2.5em;
+		-webkit-transform: rotate(165deg);
+		transform: rotate(165deg);
+		z-index: 10;
+	}
+
+	.ue-page-loading:before,
+	.ue-page-loading:after {
+		content: '';
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		display: block;
+		width: .5em;
+		height: .5em;
+		border-radius: .25em;
+		-webkit-transform: translate(-50%, -50%);
+		transform: translate(-50%, -50%)
+	}
+
+	.ue-page-loading:before {
+		-webkit-animation: before 2s infinite;
+		animation: before 2s infinite
+	}
+
+	.ue-page-loading:after {
+		-webkit-animation: after 2s infinite;
+		animation: after 2s infinite
+	}
+
+	@keyframes before {
+		0% {
+			width: .5em;
+			-webkit-box-shadow: 1em -.5em rgba(225, 20, 98, .75), -1em .5em rgba(111, 202, 220, .75);
+			box-shadow: 1em -.5em rgba(225, 20, 98, .75), -1em .5em rgba(111, 202, 220, .75)
+		}
+
+		35% {
+			width: 2.5em;
+			-webkit-box-shadow: 0 -.5em rgba(225, 20, 98, .75), 0 .5em rgba(111, 202, 220, .75);
+			box-shadow: 0 -.5em rgba(225, 20, 98, .75), 0 .5em rgba(111, 202, 220, .75)
+		}
+
+		70% {
+			width: .5em;
+			-webkit-box-shadow: -1em -.5em rgba(225, 20, 98, .75), 1em .5em rgba(111, 202, 220, .75);
+			box-shadow: -1em -.5em rgba(225, 20, 98, .75), 1em .5em rgba(111, 202, 220, .75)
+		}
+
+		100% {
+			-webkit-box-shadow: 1em -.5em rgba(225, 20, 98, .75), -1em .5em rgba(111, 202, 220, .75);
+			box-shadow: 1em -.5em rgba(225, 20, 98, .75), -1em .5em rgba(111, 202, 220, .75)
+		}
+	}
+
+	@keyframes after {
+		0% {
+			height: .5em;
+			-webkit-box-shadow: .5em 1em rgba(61, 184, 143, .75), -.5em -1em rgba(233, 169, 32, .75);
+			box-shadow: .5em 1em rgba(61, 184, 143, .75), -.5em -1em rgba(233, 169, 32, .75)
+		}
+
+		35% {
+			height: 2.5em;
+			-webkit-box-shadow: .5em 0 rgba(61, 184, 143, .75), -.5em 0 rgba(233, 169, 32, .75);
+			box-shadow: .5em 0 rgba(61, 184, 143, .75), -.5em 0 rgba(233, 169, 32, .75)
+		}
+
+		70% {
+			height: .5em;
+			-webkit-box-shadow: .5em -1em rgba(61, 184, 143, .75), -.5em 1em rgba(233, 169, 32, .75);
+			box-shadow: .5em -1em rgba(61, 184, 143, .75), -.5em 1em rgba(233, 169, 32, .75)
+		}
+
+		100% {
+			-webkit-box-shadow: .5em 1em rgba(61, 184, 143, .75), -.5em -1em rgba(233, 169, 32, .75);
+			box-shadow: .5em 1em rgba(61, 184, 143, .75), -.5em -1em rgba(233, 169, 32, .75)
+		}
+	}
+</style>

+ 88 - 0
components/wike-modal-qrcode/wike-modal-qrcode.vue

@@ -0,0 +1,88 @@
+<template>
+	<view>
+		<u-popup :show="showconcern" mode="center" :round="10" @close="tuexchange" :closeOnClickOverlay="false">
+			<view class="carmimodal">
+				<view class="carmiclose" @click="tuexchange"><u-icon name="close-circle-fill" color="#fff" size="22"></u-icon></view>
+		
+				<view class="carmititle">长按识别二维码关注</view>
+				
+				<view v-if="qrcode" class="kf_qrcode tn-flex justify-center">
+					<u--image :showLoading="true" radius="10" showMenuByLongpress :src="qrcode" width="280px" height="280px" @click="clickuimage(qrcode)"></u--image>
+				</view>
+				<view @click="exchange" class="carmiexchange">我已关注·不再提醒</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"wike-modal-qrcode",
+		props:{
+			showconcern: {
+				type: Boolean,
+				default:false
+			},
+			qrcode: {
+				type: String,
+				default:''
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		
+		methods:{
+			exchange(){
+				uni.setStorageSync('focuson', true);
+				this.$emit('concernclose');
+			},
+			tuexchange(){
+				this.$emit('concernclose');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+.carmimodal {
+    	width: 600rpx;
+    	border-radius: 20rpx;
+    	position: relative;
+    	.carmiclose {
+    		position: absolute;
+    		right: 15rpx;
+    		top: 15rpx;
+    	}
+    	.carmititle {
+    		background: linear-gradient(to right, #00ca88, #00BCD4);
+    		color: #fff;
+    		height: 120rpx;
+    		line-height: 120rpx;
+    		font-size: 38rpx;
+    		font-weight: bold;
+    		text-align: center;
+    		border-radius: 20rpx 20rpx 0 0;
+    		// margin-bottom: 60rpx;
+    	}
+    	.carmiinput {
+    		margin: 30rpx;
+    	}
+    	.carmiexchange {
+    		margin: 40rpx 30rpx;
+    		background: linear-gradient(to right, #00ca88, #00BCD4);
+    		color: #fff;
+    		border-radius: 60rpx;
+    		height: 90rpx;
+    		line-height: 90rpx;
+    		text-align: center;
+			font-size: 32rpx;
+    	}
+    	.kf_qrcode{
+    		// margin-left: 200rpx;
+    		margin: 30rpx;
+    	}
+    }
+</style>

+ 154 - 0
components/wike-model/wike-model.vue

@@ -0,0 +1,154 @@
+<template>
+	<view class="userModel u-flex u-row-center u-col-center">
+		<view class="cont u-flex-col u-col-center" :style="{width: ad?'300px':'520rpx'}">
+			<image :src="appInfo.site_logo_path?appInfo.site_logo_path:'/static/images/head.jpg'"></image>
+			<view class="text u-text-center u-content-color u-p-l-60 u-p-r-60" v-html="title"></view>
+			<view v-if="ad&&wxBannerAdIds.length" class="u-p-t-20" style="width: 300px;">
+				<!-- #ifdef MP-QQ -->
+				<ad unit-id="8aa061ea8e5bac1c717623a7be7badd8"></ad>
+				<!-- #endif -->
+				<!-- #ifdef MP-WEIXIN -->
+				<ad :unit-id="wxBannerAdIds[Math.floor(Math.random() * wxBannerAdIds.length + 1) - 1]"></ad>
+				<!-- #endif -->
+			</view>
+			<view v-if="shareBtn" class="btn btn-box u-text-center adClass" hover-class="hover-class" hover-stay-time="50">
+				{{btnText}}
+				<button class="share-btn" open-type="share"></button>
+			</view>
+			<view v-else class="btn btn-box u-text-center adClass" hover-class="hover-class" hover-stay-time="50" @click="save">
+				{{btnText}}
+			</view>
+			<view v-if="closeText!=' '" class="no u-text-center u-p-t-30" @click="close">{{closeText}}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapMutations,
+		mapActions,
+		mapState,
+		mapGetters
+	} from 'vuex';
+	export default {
+		name: 'model',
+		props:{
+			title:{	//显示的内容
+				type: String,
+				default: '为了更好的浏览体验,快去授权登录吧'
+			},
+			authorize:{	//是否授权登录
+				type: Boolean,
+				default: true
+			},
+			ad:{	//广告
+				type: Boolean,
+				default: false
+			},
+			btnText:{	//按钮文字
+				type: String,
+				default: '授权登录'
+			},
+			closeText:{	//关闭文笔
+				type: String,
+				default: '暂时不用'
+			},
+			shareBtn:{ //分享按钮
+				type: Boolean,
+				default: false
+			}
+		},
+		computed: {
+			...mapGetters(['appInfo'])
+		},
+		methods: {
+			save(){
+				this.$emit('save');
+			},
+			close(){
+				this.$emit('close');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.userModel{
+		z-index: 9999999;
+		position: fixed;
+		top: 0;
+		left: 0;
+		width: 100vw;
+		height: 100vh;
+		background-color: rgba(0,0,0,0.6);
+		// backdrop-filter: blur(4rpx);
+		.cont{
+			width: 520rpx;
+			padding: 0px 0 50rpx 0;
+			background-color: #FFFFFF;
+			border-radius: 32rpx;
+			image{
+				width: 128rpx;
+				height: 128rpx;
+				margin-top: -60rpx;
+				margin-bottom: 40rpx;
+				border-radius: 50%;
+			}
+			.text{
+				line-height: 46rpx;
+			}
+			
+			.btn{
+				position: relative;
+				margin-top: 50rpx;
+				color: #FFFFFF;
+				width: 60%;
+				line-height: 80rpx;
+				border-radius: 80rpx;
+				background-color: #26b3a0;
+			}
+			.share-btn-box{
+				margin-left: 20%;
+				margin-top: 30rpx;
+			}
+			.share-btn{
+				position: absolute;
+				top: 0;
+				left: 0;
+				width: 100%;
+				height: 100%;
+				opacity: 0;
+			}
+			.no{
+				color: #B8B8B8;
+			}
+			
+		}
+		
+	}
+	.num{
+		font-size: 16px;
+		font-weight: 700;
+		color: #26b3a0;
+		padding: 0 8rpx;
+	}
+	
+	.adClass{
+		animation: tiaobig 1.2s ease-in-out alternate infinite;
+		// animation-iteration-count:1;
+	}
+	@keyframes tiaobig {
+		25% {
+			transform: scale(0.98);
+		}
+		50% {
+			transform: scale(1.08);
+		}
+		75% {
+			transform: scale(0.98);
+		}
+		100% {
+			transform: scale(1.08);
+		}
+	}
+</style>

+ 147 - 0
components/wike-painter/common/relation.js

@@ -0,0 +1,147 @@
+const styles = (v ='') =>  v.split(';').filter(v => v && !/^[\n\s]+$/.test(v)).map(v => {
+						const key = v.slice(0, v.indexOf(':'))
+						const value = v.slice(v.indexOf(':')+1)
+						return {
+							[key
+								.replace(/-([a-z])/g, function() { return arguments[1].toUpperCase()})
+								.replace(/\s+/g, '')
+							]: value.replace(/^\s+/, '').replace(/\s+$/, '') || ''
+						}
+					})
+export function parent(parent) {
+	return {
+		provide() {
+			return {
+				[parent]: this
+			}
+		},
+		data() {
+			return {
+				el: {
+					css: {},
+					views: []
+				},
+			}
+		},
+		watch: {
+			css: { 
+				handler(v) {
+					if(this.canvasId) {
+						this.el.css = (typeof v == 'object' ? v : v && Object.assign(...styles(v))) || {}
+						this.canvasWidth = this.el.css && this.el.css.width || this.canvasWidth
+						this.canvasHeight = this.el.css && this.el.css.height || this.canvasHeight
+					}
+				},
+				immediate: true
+			}
+		}
+	}
+}
+export function children(parent, options = {}) {
+	const indexKey = options.indexKey || 'index'
+	return {
+		inject: {
+			[parent]: {
+				default: null
+			}
+		},
+		watch: {
+			el: {
+				handler(v, o) {
+					if(JSON.stringify(v) != JSON.stringify(o))
+						this.bindRelation()
+				},
+				deep: true,
+				immediate: true
+			},
+			src: {
+				handler(v, o) {
+					if(v != o)
+						this.bindRelation()
+				},
+				immediate: true
+			},
+			text: {
+				handler(v, o) {
+					if(v != o) this.bindRelation()
+				},
+				immediate: true
+			},
+			css: {
+				handler(v, o) {
+					if(v != o)
+						this.el.css = (typeof v == 'object' ? v : v && Object.assign(...styles(v))) || {}
+				},
+				immediate: true
+			},
+			replace: {
+				handler(v, o) {
+					if(JSON.stringify(v) != JSON.stringify(o))
+						this.bindRelation()
+				},
+				deep: true,
+				immediate: true
+			}
+		},
+		created() {
+			if(!this._uid) {
+				this._uid = this._.uid
+			}
+			Object.defineProperty(this, 'parent', {
+				get: () => this[parent] || [],
+			})
+			Object.defineProperty(this, 'index', {
+				get: () =>  {
+					this.bindRelation();
+					const {parent: {el: {views=[]}={}}={}} = this
+					return views.indexOf(this.el)
+				},
+			});
+			this.el.type = this.type
+			
+			this.bindRelation()
+		},
+		// #ifdef VUE3
+		beforeUnmount() {
+			this.removeEl()
+		},
+		// #endif
+		// #ifdef VUE2
+		beforeDestroy() {
+			this.removeEl()
+		},
+		// #endif
+		methods: {
+			removeEl() {
+				if (this.parent) {
+					this.parent.el.views = this.parent.el.views.filter(
+						(item) => item._uid !== this._uid
+					);
+				}
+			},
+			bindRelation() {
+				if(!this.el._uid) {
+					this.el._uid = this._uid 
+				}
+				if(['text','qrcode'].includes(this.type)) {
+					this.el.text = this.$slots && this.$slots.default && this.$slots.default[0].text || `${this.text || ''}`.replace(/\\n/g, '\n')
+				}
+				if(this.type == 'image') {
+					this.el.src = this.src
+				}
+				if (!this.parent) {
+					return;
+				}
+				let views = this.parent.el.views || [];
+				if(views.indexOf(this.el) !== -1) {
+					this.parent.el.views = views.map(v => v._uid == this._uid ? this.el : v)
+				} else {
+					this.parent.el.views = [...views, this.el];
+				}
+			}
+		},
+		mounted() {
+			// this.bindRelation()
+		},
+	}
+}

+ 218 - 0
components/wike-painter/nvue.js

@@ -0,0 +1,218 @@
+// #ifdef APP-NVUE
+import { sleep, getImageInfo, isBase64, useNvue, networkReg } from './utils';
+const dom = weex.requireModule('dom')
+import {version } from '../../package.json'
+
+export default {
+	data() {
+		return {
+			tempFilePath: [],
+			isInitFile: false,
+			osName: uni.getSystemInfoSync().osName
+		}
+	},
+	created() {
+		// if (this.hybrid) return
+		// useNvue('_doc/uni_modules/lime-painter/', version, this.timeout).then(res => {
+		// 	this.isInitFile = true
+		// })
+	},
+	methods: {
+		getParentWeith() {
+			return new Promise(resolve => {
+				dom.getComponentRect(this.$refs.limepainter, (res) => {
+					this.parentWidth = Math.ceil(res.size.width)
+					this.canvasWidth = this.canvasWidth || this.parentWidth ||300
+					this.canvasHeight = res.size.height || this.canvasHeight||150
+					resolve(res.size)
+				})
+			})
+		},
+		onPageFinish() {
+			this.webview = this.$refs.webview
+			this.webview.evalJS(`init(${this.dpr})`)
+		},
+		onMessage(e) {
+			const res = e.detail.data[0] || null;
+			if (res.event) {
+				if (res.event == 'inited') {
+					this.inited = true
+				}
+				if(res.event == 'fail'){
+					this.$emit('fail', res)
+				}
+				if (res.event == 'layoutChange') {
+					const data = typeof res.data == 'string' ? JSON.parse(res.data) : res.data
+					this.canvasWidth = Math.ceil(data.width);
+					this.canvasHeight = Math.ceil(data.height);
+				}
+				if (res.event == 'progressChange') {
+					this.progress = res.data * 1
+				}
+				if (res.event == 'file') {
+					this.tempFilePath.push(res.data)
+					if (this.tempFilePath.length > 7) {
+						this.tempFilePath.shift()
+					}
+					return
+				}
+				if (res.event == 'success') {
+					if (res.data) {
+						this.tempFilePath.push(res.data)
+						if (this.tempFilePath.length > 8) {
+							this.tempFilePath.shift()
+						}
+						if (this.isCanvasToTempFilePath) {
+							this.setFilePath(this.tempFilePath.join(''), {isEmit:true})
+						}
+					} else {
+						this.$emit('fail', 'canvas no data')
+					}
+					return
+				}
+				this.$emit(res.event, JSON.parse(res.data));
+			} else if (res.file) {
+				this.file = res.data;
+			} else{
+				console.info(res[0])
+			}
+		},
+		getWebViewInited() {
+			if (this.inited) return Promise.resolve(this.inited);
+			return new Promise((resolve) => {
+				this.$watch(
+					'inited',
+					async val => {
+						if (val) {
+							resolve(val)
+						}
+					}, {
+						immediate: true
+					}
+				);
+			})
+		},
+		getTempFilePath() {
+			if (this.tempFilePath.length == 8) return Promise.resolve(this.tempFilePath)
+			return new Promise((resolve) => {
+				this.$watch(
+					'tempFilePath',
+					async val => {
+						if (val.length == 8) {
+							resolve(val.join(''))
+						}
+					}
+				);
+			})
+		},
+		getWebViewDone() {
+			if (this.progress == 1) return Promise.resolve(this.progress);
+			return new Promise((resolve) => {
+				this.$watch(
+					'progress',
+					async val => {
+						if (val == 1) {
+							this.$emit('done')
+							this.done = true
+							resolve(val)
+						}
+					}, {
+						immediate: true
+					}
+				);
+			})
+		},
+		async render(args) {
+			try {
+				await this.getSize(args)
+				const {width} = args.css || args
+				if(!width && this.parentWidth) {
+					Object.assign(args, {width: this.parentWidth})
+				}
+				const newNode = await this.calcImage(args);
+				await this.getWebViewInited()
+				this.webview.evalJS(`source(${JSON.stringify(newNode)})`)
+				await this.getWebViewDone()
+				await sleep(this.afterDelay)
+				if (this.isCanvasToTempFilePath) {
+					const params = {
+						fileType: this.fileType,
+						quality: this.quality
+					}
+					this.webview.evalJS(`save(${JSON.stringify(params)})`)
+				}
+				return Promise.resolve()
+			} catch (e) {
+				this.$emit('fail', e)
+			}
+		},
+		getfile(e){
+			let url = plus.io.convertLocalFileSystemURL( e )
+			return new Promise((resolve,reject)=>{
+				plus.io.resolveLocalFileSystemURL(url, entry => {
+					var reader = null;
+					entry.file( file => {
+						reader = new plus.io.FileReader();
+						reader.onloadend =  ( read )=> {
+							resolve(read.target.result)
+						};
+						reader.readAsDataURL( file );
+					}, function ( error ) {
+						alert( error.message );
+					} );
+				},err=>{
+					resolve(e)
+				})
+			})
+		},
+		async calcImage(args) {
+			let node = JSON.parse(JSON.stringify(args))
+			const urlReg = /url\((.+)\)/
+			const {backgroundImage} = node.css||{}
+			const isBG = backgroundImage && urlReg.exec(backgroundImage)[1]
+			const url = node.url || node.src || isBG
+			if(['text', 'qrcode'].includes(node.type)) {
+				return node
+			}
+			if ((node.type === "image" || isBG) && url && !isBase64(url) && (this.osName == 'ios' ? true : !networkReg.test(url))) {
+				let {path} = await getImageInfo(url)
+				if(this.osName == 'ios') {
+					path = await this.getfile(path)
+				}
+				if (isBG) {
+					node.css.backgroundImage = `url(${path})`
+				} else {
+					node.src = path
+				}
+			} else if (node.views && node.views.length) {
+				for (let i = 0; i < node.views.length; i++) {
+					node.views[i] = await this.calcImage(node.views[i])
+				}
+			}
+			return node
+		},
+		async canvasToTempFilePath(args = {}) {
+			if (!this.inited) {
+				return this.$emit('fail', 'no init')
+			}
+			this.tempFilePath = []
+			if (args.fileType == 'jpg') {
+				args.fileType = 'jpeg'
+			}
+			this.webview.evalJS(`save(${JSON.stringify(args)})`)
+			try {
+				let tempFilePath = await this.getTempFilePath()
+				tempFilePath = await this.setFilePath(tempFilePath)
+				args.success({
+					errMsg: "canvasToTempFilePath:ok",
+					tempFilePath
+				})
+			} catch (e) {
+				args.fail({
+					error: e
+				})
+			}
+		}
+	}
+}
+// #endif

File diff suppressed because it is too large
+ 0 - 0
components/wike-painter/painter.js


+ 50 - 0
components/wike-painter/props.js

@@ -0,0 +1,50 @@
+export default {
+	props: {
+		board: Object,
+		pathType: String, // 'base64'、'url'
+		fileType: {
+			type: String,
+			default: 'png'
+		},
+		quality: {
+			type: Number,
+			default: 1
+		},
+		css: [String, Object],
+		// styles: [String, Object],
+		width: [Number, String],
+		height: [Number, String],
+		pixelRatio: Number,
+		customStyle: String,
+		isCanvasToTempFilePath: Boolean,
+		// useCanvasToTempFilePath: Boolean,
+		sleep: {
+			type: Number,
+			default: 1000 / 30
+		},
+		beforeDelay: {
+			type: Number,
+			default: 100
+		},
+		afterDelay: {
+			type: Number,
+			default: 100
+		},
+		// #ifdef MP-WEIXIN || MP-TOUTIAO || MP-ALIPAY
+		type: {
+			type: String,
+			default: '2d'
+		},
+		// #endif
+		// #ifdef APP-NVUE
+		hybrid: Boolean,
+		timeout: {
+			type: Number,
+			default: 2000
+		},
+		// #endif
+		// #ifdef H5
+		useCORS: Boolean
+		// #endif
+	}
+}

+ 479 - 0
components/wike-painter/utils.js

@@ -0,0 +1,479 @@
+export const networkReg = /^(http|\/\/)/;
+export const isBase64 = (path) => /^data:image\/(\w+);base64/.test(path);
+export function sleep(delay) {
+	return new Promise(resolve => setTimeout(resolve, delay))
+}
+const isDev = ['devtools'].includes(uni.getSystemInfoSync().platform)
+// 缓存图片
+let cache = {}
+export function isNumber(value) {
+	return /^-?\d+(\.\d+)?$/.test(value);
+}
+export function toPx(value, baseSize, isDecimal = false) {
+	// 如果是数字
+	if (typeof value === 'number') {
+		return value
+	}
+	// 如果是字符串数字
+	if (isNumber(value)) {
+		return value * 1
+	}
+	// 如果有单位
+	if (typeof value === 'string') {
+		const reg = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g
+		const results = reg.exec(value);
+		if (!value || !results) {
+			return 0;
+		}
+		const unit = results[3];
+		value = parseFloat(value);
+		let res = 0;
+		if (unit === 'rpx') {
+			res = uni.upx2px(value);
+		} else if (unit === 'px') {
+			res = value * 1;
+		} else if (unit === '%') {
+			res = value * toPx(baseSize) / 100;
+		} else if (unit === 'em') {
+			res = value * toPx(baseSize || 14);
+		}
+		return isDecimal ? res.toFixed(2) * 1 : Math.round(res);
+	}
+	return 0
+}
+
+// 计算版本
+export function compareVersion(v1, v2) {
+	v1 = v1.split('.')
+	v2 = v2.split('.')
+	const len = Math.max(v1.length, v2.length)
+	while (v1.length < len) {
+		v1.push('0')
+	}
+	while (v2.length < len) {
+		v2.push('0')
+	}
+	for (let i = 0; i < len; i++) {
+		const num1 = parseInt(v1[i], 10)
+		const num2 = parseInt(v2[i], 10)
+
+		if (num1 > num2) {
+			return 1
+		} else if (num1 < num2) {
+			return -1
+		}
+	}
+	return 0
+}
+// #ifdef MP
+export const prefix = () => {
+	// #ifdef MP-TOUTIAO
+	return tt
+	// #endif
+	// #ifdef MP-WEIXIN
+	return wx
+	// #endif
+	// #ifdef MP-BAIDU
+	return swan
+	// #endif
+	// #ifdef MP-ALIPAY
+	return my
+	// #endif
+	// #ifdef MP-QQ
+	return qq
+	// #endif
+	// #ifdef MP-360
+	return qh
+	// #endif
+}
+// #endif
+
+
+const base64ToArrayBuffer = (data) => {
+	// #ifndef MP-WEIXIN || APP-PLUS
+	/**
+	 * Base64Binary.decode(base64_string);  
+	 * Base64Binary.decodeArrayBuffer(base64_string); 
+	 */
+	const Base64Binary = {
+		_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
+		/* will return a  Uint8Array type */
+		decodeArrayBuffer(input) {
+			const bytes = (input.length / 4) * 3;
+			const ab = new ArrayBuffer(bytes);
+			this.decode(input, ab);
+			return ab;
+		},
+		removePaddingChars(input) {
+			const lkey = this._keyStr.indexOf(input.charAt(input.length - 1));
+			if (lkey == 64) {
+				return input.substring(0, input.length - 1);
+			}
+			return input;
+		},
+		decode(input, arrayBuffer) {
+			//get last chars to see if are valid
+			input = this.removePaddingChars(input);
+			input = this.removePaddingChars(input);
+
+			const bytes = parseInt((input.length / 4) * 3, 10);
+
+			let uarray;
+			let chr1, chr2, chr3;
+			let enc1, enc2, enc3, enc4;
+			let i = 0;
+			let j = 0;
+
+			if (arrayBuffer)
+				uarray = new Uint8Array(arrayBuffer);
+			else
+				uarray = new Uint8Array(bytes);
+
+			input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+			for (i = 0; i < bytes; i += 3) {
+				//get the 3 octects in 4 ascii chars
+				enc1 = this._keyStr.indexOf(input.charAt(j++));
+				enc2 = this._keyStr.indexOf(input.charAt(j++));
+				enc3 = this._keyStr.indexOf(input.charAt(j++));
+				enc4 = this._keyStr.indexOf(input.charAt(j++));
+
+				chr1 = (enc1 << 2) | (enc2 >> 4);
+				chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+				chr3 = ((enc3 & 3) << 6) | enc4;
+
+				uarray[i] = chr1;
+				if (enc3 != 64) uarray[i + 1] = chr2;
+				if (enc4 != 64) uarray[i + 2] = chr3;
+			}
+			return uarray;
+		}
+	}
+	return Base64Binary.decodeArrayBuffer(data)
+	// #endif
+	// #ifdef MP-WEIXIN || APP-PLUS
+	return uni.base64ToArrayBuffer(data)
+	// #endif
+}
+
+
+/**
+ * base64转路径
+ * @param {Object} base64
+ */
+export function base64ToPath(base64) {
+	const [, format] = /^data:image\/(\w+);base64,/.exec(base64) || [];
+
+	return new Promise((resolve, reject) => {
+		// #ifdef MP
+		const fs = uni.getFileSystemManager()
+		//自定义文件名
+		if (!format) {
+			reject(new Error('ERROR_BASE64SRC_PARSE'))
+		}
+		const time = new Date().getTime();
+		let pre = prefix()
+		const filePath = `${pre.env.USER_DATA_PATH}/${time}.${format}`
+		//let buffer = base64ToArrayBuffer(bodyData)
+		fs.writeFile({
+			filePath,
+			data: base64.split(',')[1], //base64.replace(/^data:\S+\/\S+;base64,/, ''),
+			encoding: 'base64',
+			// data: buffer,
+			// encoding: 'binary',
+			success() {
+				resolve(filePath)
+			},
+			fail(err) {
+				reject(err)
+			}
+		})
+		// #endif
+
+		// #ifdef H5
+		// mime类型
+		let mimeString = base64.split(',')[0].split(':')[1].split(';')[0];
+		//base64 解码
+		let byteString = atob(base64.split(',')[1]);
+		//创建缓冲数组
+		let arrayBuffer = new ArrayBuffer(byteString.length);
+		//创建视图
+		let intArray = new Uint8Array(arrayBuffer);
+		for (let i = 0; i < byteString.length; i++) {
+			intArray[i] = byteString.charCodeAt(i);
+		}
+		resolve(URL.createObjectURL(new Blob([intArray], {
+			type: mimeString
+		})))
+		// #endif
+
+		// #ifdef APP-PLUS
+		const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
+		bitmap.loadBase64Data(base64, () => {
+			if (!format) {
+				reject(new Error('ERROR_BASE64SRC_PARSE'))
+			}
+			const time = new Date().getTime();
+			const filePath = `_doc/uniapp_temp/${time}.${format}`
+			bitmap.save(filePath, {},
+				() => {
+					bitmap.clear()
+					resolve(filePath)
+				},
+				(error) => {
+					bitmap.clear()
+					reject(error)
+				})
+		}, (error) => {
+			bitmap.clear()
+			reject(error)
+		})
+		// #endif
+	})
+}
+
+/**
+ * 路径转base64
+ * @param {Object} string
+ */
+export function pathToBase64(path) {
+	if (/^data:/.test(path)) return path
+	return new Promise((resolve, reject) => {
+		// #ifdef H5
+		let image = new Image();
+		image.setAttribute("crossOrigin", 'Anonymous');
+		image.onload = function() {
+			let canvas = document.createElement('canvas');
+			canvas.width = this.naturalWidth;
+			canvas.height = this.naturalHeight;
+			canvas.getContext('2d').drawImage(image, 0, 0);
+			let result = canvas.toDataURL('image/png')
+			resolve(result);
+			canvas.height = canvas.width = 0
+		}
+		image.src = path + '?v=' + Math.random()
+		image.onerror = (error) => {
+			reject(error);
+		};
+		// #endif
+
+		// #ifdef MP
+		if (uni.canIUse('getFileSystemManager')) {
+			uni.getFileSystemManager().readFile({
+				filePath: path,
+				encoding: 'base64',
+				success: (res) => {
+					resolve('data:image/png;base64,' + res.data)
+				},
+				fail: (error) => {
+					reject(error)
+				}
+			})
+		}
+		// #endif
+
+		// #ifdef APP-PLUS
+		plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), (entry) => {
+			entry.file((file) => {
+				const fileReader = new plus.io.FileReader()
+				fileReader.onload = (data) => {
+					resolve(data.target.result)
+				}
+				fileReader.onerror = (error) => {
+					reject(error)
+				}
+				fileReader.readAsDataURL(file)
+			}, reject)
+		}, reject)
+		// #endif
+	})
+}
+
+
+
+export function getImageInfo(path, useCORS) {
+	return new Promise(async (resolve, reject) => {
+		let src = path
+		if (cache[path] && cache[path].errMsg) {
+			resolve(cache[path])
+		} else {
+			try {
+				// if (!isBase64 && PLATFORM == UNI_PLATFORM.PLUS && !/^\/?(static|_doc)\//.test(src)) {
+				// 	src = await downloadFile(path) as string
+				// } else 
+				// #ifdef MP || APP-PLUS
+				if (isBase64(path)) {
+					src = await base64ToPath(path)
+				}
+				// #endif
+				// #ifdef H5
+				if(useCORS) {
+					src = await pathToBase64(path)
+				}
+				// #endif
+				
+			} catch (error) {
+				reject({
+					...error,
+					src
+				})
+			}
+			uni.getImageInfo({
+				src,
+				success: (image) => {
+					const localReg = /^\.|^\/(?=[^\/])/;
+					// #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO
+					image.path = localReg.test(src) ?  `/${image.path}` : image.path;
+					// #endif
+					// #ifdef H5
+					image.path = image.path.replace(/^\./, window.location.origin)
+					// #endif
+					
+					if(this.canvas.createImage) {
+						const img = this.canvas.createImage()
+						img.src = image.path
+						img.onload = function() {
+							image.path = img
+							cache[path] = image
+							resolve(cache[path])
+						}
+						img.onerror = function(err) {
+							reject({err,path})
+						}
+					} else if (isDev) {
+						resolve(image)
+					} else {
+						cache[path] = image
+						resolve(cache[path])
+					}
+				},
+				fail(err) {
+					console.error({err, path})
+					reject({err,path})
+				}
+			})
+		}
+	})
+}
+
+export function downloadFile(url) {
+	if (!url) return Promise.reject({
+		err: 'no url'
+	})
+	return new Promise((resolve, reject) => {
+		if (cache[url]) {
+			return reject()
+		}
+		cache[url] = 1
+		uni.downloadFile({
+			url,
+			success(res) {
+				resolve(res)
+			},
+			fail(err) {
+				reject(err)
+			}
+		})
+	})
+}
+
+// #ifdef APP-PLUS
+const getLocalFilePath = (path) => {
+	if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path
+		.indexOf('_downloads') === 0) {
+		return path
+	}
+	if (path.indexOf('file://') === 0) {
+		return path
+	}
+	if (path.indexOf('/storage/emulated/0/') === 0) {
+		return path
+	}
+	if (path.indexOf('/') === 0) {
+		const localFilePath = plus.io.convertAbsoluteFileSystem(path)
+		if (localFilePath !== path) {
+			return localFilePath
+		} else {
+			path = path.substr(1)
+		}
+	}
+	return '_www/' + path
+}
+const getFile = (url) => {
+	return new Promise((resolve, rejcet) => {
+		plus.io.resolveLocalFileSystemURL(url, resolve, (err) => {
+			resolve(false)
+		})
+	})
+}
+const createFile = ({
+	fs,
+	url,
+	target,
+	name
+}) => {
+	return new Promise((resolve, reject) => {
+		plus.io.resolveLocalFileSystemURL(url, res1 => {
+			fs.root.getDirectory(target, {
+				create: true
+			}, fileEntry => {
+				const success = () => {
+					res1.remove()
+					resolve()
+				}
+				getFile(target + name).then(res => {
+					if (res) {
+						res.remove((res2) => {
+							res1.moveTo(fileEntry, name, success, reject)
+						})
+					}
+					res1.moveTo(fileEntry, name, success, reject)
+				})
+			})
+		}, reject)
+	})
+}
+export function useNvue(target, version, timeout) {
+	return new Promise((resolve, reject) => {
+		plus.io.requestFileSystem(plus.io.PRIVATE_DOC, async (fs) => {
+			try {
+				cache['lime-painter'] = 0
+				let names = ['uni.webview.1.5.3.js', 'painter.js', 'index.html']
+				let urls = ['https://gitee.com/dcloud/uni-app/raw/dev/dist/',
+					'https://static-6d65bd90-8508-4d6c-abbc-a4ef5c8e49e7.bspapp.com/lime-painter/'
+				]
+				const oldVersion = plus.storage.getItem('lime-painter')
+				const isFile = await getFile(`${target}${names[1]}`)
+				if (isFile && oldVersion && compareVersion(oldVersion, version) >= 0) {
+					resolve()
+				} else {
+					for (var i = 0; i < names.length; i++) {
+						const name = names[i]
+						const file = await downloadFile(urls[i >= 1 ? 1 : 0] + name)
+						await createFile({
+							fs,
+							url: file.tempFilePath,
+							target,
+							name: name.includes('uni.webview') ? 'uni.webview.js' : name
+						})
+					}
+					plus.storage.setItem('lime-painter', version)
+					cache['lime-painter'] = version
+					resolve()
+				}
+			} catch (e) {
+				let index = parseInt(timeout / 20)
+				while (!cache['lime-painter'] && index) {
+					await sleep(20)
+					index--
+				}
+				if (cache['lime-painter']) {
+					resolve()
+				} else {
+					reject(e)
+				}
+			}
+		}, reject)
+	})
+}
+// #endif

+ 407 - 0
components/wike-painter/wike-painter.vue

@@ -0,0 +1,407 @@
+<template>
+	<view class="lime-painter" ref="limepainter">
+		<view v-if="canvasId && size" :style="styles">
+			<!-- #ifndef APP-NVUE -->
+			<canvas class="lime-painter__canvas" v-if="use2dCanvas" :id="canvasId" type="2d" :style="size"></canvas>
+			<canvas class="lime-painter__canvas" v-else :canvas-id="canvasId" :style="size" :id="canvasId"
+				:width="boardWidth * dpr" :height="boardHeight * dpr"></canvas>
+
+			<!-- #endif -->
+			<!-- #ifdef APP-NVUE -->
+			<web-view :style="size" ref="webview"
+				src="/uni_modules/lime-painter/static/index.html"
+				class="lime-painter__canvas" @pagefinish="onPageFinish" @error="onError" @onPostMessage="onMessage">
+			</web-view>
+			<!-- #endif -->
+		</view>
+		<slot />
+	</view>
+</template>
+
+
+<script>
+	import { parent } from './common/relation'
+	import props from './props'
+	import {toPx, base64ToPath, pathToBase64, isBase64, sleep, getImageInfo}from './utils';
+	//  #ifndef APP-NVUE
+	import { compareVersion } from './utils';
+	import Painter from './painter'
+	// import Painter from '@lime/'
+	const nvue = {}
+	//  #endif
+	//  #ifdef APP-NVUE
+	import nvue from './nvue'
+	//  #endif
+	export default {
+		name: 'lime-painter',
+		mixins: [props, parent('painter'), nvue],
+		data() {
+			return {
+				// #ifdef MP-WEIXIN || MP-TOUTIAO || MP-ALIPAY
+				use2dCanvas: true,
+				// #endif
+				// #ifndef MP-WEIXIN || MP-TOUTIAO || MP-ALIPAY
+				use2dCanvas: false,
+				// #endif
+				canvasHeight: 150,
+				canvasWidth: null,
+				parentWidth: 0,
+				inited: false,
+				progress: 0,
+				firstRender: 0,
+				done: false
+			};
+		},
+		computed: {
+			styles() {
+				return `${this.size}${this.customStyle||''};`
+			},
+			canvasId() {
+				return `l-painter${this._uid || this._.uid}`
+			},
+			size() {
+				if (this.boardWidth && this.boardHeight) {
+					return `width:${this.boardWidth}px; height: ${this.boardHeight}px;`;
+				}
+			},
+			dpr() {
+				return this.pixelRatio || uni.getSystemInfoSync().pixelRatio;
+			},
+			boardWidth() {
+				const {width = 0} = (this.elements && this.elements.css) || this.elements || this
+				const w = toPx(width||this.width)
+				return w || Math.max(w, toPx(this.canvasWidth));
+			},
+			boardHeight() {
+				const {height = 0} = (this.elements && this.elements.css) || this.elements || this
+				const h = toPx(height||this.height)
+				return h || Math.max(h, toPx(this.canvasHeight));
+			},
+			hasBoard() {
+				return this.board && Object.keys(this.board).length
+			},
+			elements() {
+				return this.hasBoard ? this.board : JSON.parse(JSON.stringify(this.el))
+			}
+		},
+		watch: {
+			// #ifdef MP-WEIXIN ||  MP-ALIPAY
+			size(v) {
+				// #ifdef MP-WEIXIN
+				if (this.use2dCanvas) {
+					this.inited = false;
+				}
+				// #endif
+				// #ifdef MP-ALIPAY
+				this.inited = false;
+				// #endif
+			},
+			// #endif
+		},
+		created() {
+			const { SDKVersion, version, platform } = uni.getSystemInfoSync();
+			// #ifdef MP-WEIXIN
+			this.use2dCanvas = this.type === '2d' && compareVersion(SDKVersion, '2.9.2') >= 0  && !this.isPC;
+			// #endif
+			// #ifdef MP-TOUTIAO
+			this.use2dCanvas = this.type === '2d' && compareVersion(SDKVersion, '1.78.0') >= 0;
+			// #endif
+			// #ifdef MP-ALIPAY
+			this.use2dCanvas = this.type === '2d' && compareVersion(my.SDKVersion, '2.7.15') >= 0;
+			// #endif
+		},
+		async mounted() {
+			await sleep(30)
+			await this.getParentWeith()
+			this.$nextTick(() => {
+				setTimeout(() => {
+					this.$watch('elements', this.watchRender, {
+						deep: true,
+						immediate: true
+					});
+				}, 30)
+			})
+		},
+		methods: {
+			async watchRender(val, old) {
+				if (!val || !val.views || (!this.firstRender ? !val.views.length : !this.firstRender) || !Object.keys(val).length || JSON.stringify(val) == JSON.stringify(old)) return;
+				this.firstRender = 1
+				clearTimeout(this.rendertimer)
+				this.rendertimer = setTimeout(() => {
+					this.render(val);
+				}, this.beforeDelay)
+			},
+			async setFilePath(path, param) {
+				let filePath = path
+				const {pathType = this.pathType} =  param || this
+				if (pathType == 'base64' && !isBase64(path)) {
+					filePath = await pathToBase64(path)
+				} else if (pathType == 'url' && isBase64(path)) {
+					filePath = await base64ToPath(path)
+				}
+				if (param && param.isEmit) {
+					this.$emit('success', filePath);
+				}
+				return filePath
+			},
+			async getSize(args) {
+				const {width} = args.css || args
+				const {height} = args.css || args
+				if (!this.size) {
+					if (width || height) {
+						this.canvasWidth = width || this.canvasWidth
+						this.canvasHeight = height || this.canvasHeight
+						await sleep(30);
+					} else {
+						await this.getParentWeith()
+					}
+				}
+			},
+			canvasToTempFilePathSync(args) {
+				this.stopWatch = this.$watch('done', (v) => {
+					if (v) {
+						this.canvasToTempFilePath(args)
+						this.stopWatch && this.stopWatch()
+					}
+				}, {
+					immediate: true
+				})
+				
+			},
+			// #ifndef APP-NVUE
+			getParentWeith() {
+				return new Promise(resolve => {
+					uni.createSelectorQuery()
+						.in(this)
+						.select(`.lime-painter`)
+						.boundingClientRect()
+						.exec(res => {
+							const {width, height} = res[0]||{}
+							this.parentWidth = Math.ceil(width||0)
+							this.canvasWidth = this.parentWidth || 300
+							this.canvasHeight = height || this.canvasHeight||150
+							resolve(res[0])
+						})
+				})
+			},
+			async render(args = {}) {
+				if(!Object.keys(args).length) {
+					return console.error('空对象')
+				}
+				this.progress = 0
+				this.done = false
+				await this.getSize(args)
+				const ctx = await this.getContext();
+				let {
+					use2dCanvas,
+					boardWidth,
+					boardHeight,
+					canvas,
+					afterDelay
+				} = this;
+				if (use2dCanvas && !canvas) {
+					return Promise.reject(new Error('render: fail canvas has not been created'));
+				}
+				this.boundary = {
+					top: 0,
+					left: 0,
+					width: boardWidth,
+					height: boardHeight
+				};
+				this.painter = null
+				if (!this.painter) {
+					const {width} = args.css || args
+					const {height} = args.css || args
+					if(!width && this.parentWidth) {
+						Object.assign(args, {width: this.parentWidth})
+					}
+					const param = {
+						context: ctx,
+						canvas,
+						width: boardWidth,
+						height: boardHeight,
+						pixelRatio: this.dpr,
+						useCORS: this.useCORS,
+						createImage: getImageInfo.bind(this),
+						listen: {
+							onProgress: (v) => {
+								this.progress = v
+								this.$emit('progress', v)
+							},
+							onEffectFail: (err) => {
+								this.$emit('faill', err)
+							}
+						}
+					}
+					this.painter = new Painter(param)
+				} 
+				
+				// vue3 赋值给data会引起图片无法绘制 
+				const { width, height } = await this.painter.source(JSON.parse(JSON.stringify(args)))
+				this.boundary.height = this.canvasHeight = height
+				this.boundary.width = this.canvasWidth = width
+				await sleep(this.sleep);
+				// 可能会因为尺寸改变影响绘制上下文
+				this.painter.setContext(this.ctx)
+				await this.painter.render()
+				await new Promise(resolve => this.$nextTick(resolve));
+				if (!use2dCanvas) {
+					await this.canvasDraw();
+				}
+				if (afterDelay && use2dCanvas) {
+					await sleep(afterDelay);
+				}
+				this.$emit('done');
+				this.done = true
+				if (this.isCanvasToTempFilePath) {
+					this.canvasToTempFilePath()
+						.then(res => {
+							this.$emit('success', res.tempFilePath)
+						})
+						.catch(err => {
+							this.$emit('fail', new Error(JSON.stringify(err)));
+						});
+				}
+				return Promise.resolve({
+					ctx,
+					draw: this.painter,
+					node: this.node
+				});
+			},
+			canvasDraw(flag = false) {
+				return new Promise((resolve, reject) => this.ctx.draw(flag, () => setTimeout(() => resolve(), this
+					.afterDelay)));
+			},
+			async getContext() {
+				if (!this.canvasWidth) {
+					this.$emit('fail', 'painter no size')
+					console.error('painter no size: 请给画板或父级设置尺寸')
+					return Promise.reject();
+				}
+				if (this.ctx && this.inited) {
+					return Promise.resolve(this.ctx);
+				}
+				const { type, use2dCanvas, dpr, boardWidth, boardHeight } = this;
+				const _getContext = () => {
+					return new Promise(resolve => {
+						uni.createSelectorQuery()
+							.in(this)
+							.select(`#${this.canvasId}`)
+							.boundingClientRect()
+							.exec(res => {
+								if (res) {
+									const ctx = uni.createCanvasContext(this.canvasId, this);
+									if (!this.inited) {
+										this.inited = true;
+										this.use2dCanvas = false;
+										this.canvas = res;
+									}
+									// #ifdef MP-ALIPAY
+									ctx.scale(dpr, dpr);
+									// #endif
+									this.ctx = ctx
+									resolve(this.ctx);
+								}
+							});
+					});
+				};
+				if (!use2dCanvas) {
+					return _getContext();
+				}
+				return new Promise(resolve => {
+					uni.createSelectorQuery()
+						.in(this)
+						.select(`#${this.canvasId}`)
+						.node()
+						.exec(res => {
+							let {node: canvas} = res[0];
+							if (!canvas) {
+								this.use2dCanvas = false;
+								resolve(this.getContext());
+							}
+							const ctx = canvas.getContext(type);
+							if (!this.inited) {
+								this.inited = true;
+								this.use2dCanvas = true;
+								this.canvas = canvas;
+							}
+							this.ctx = ctx
+							resolve(this.ctx);
+						});
+				});
+			},
+			canvasToTempFilePath(args = {}) {
+				return new Promise(async (resolve, reject) => {
+					const { use2dCanvas, canvasId, dpr, fileType, quality } = this;
+					
+					const success = async (res) => {
+						try {
+							const tempFilePath = await this.setFilePath(res.tempFilePath || res)
+							resolve(Object.assign(res, {tempFilePath}))
+						} catch (e) {
+							this.$emit('fail', e)
+						}
+					}
+					
+					let { top: y = 0, left: x = 0, width, height } = this.boundary || this;
+					let destWidth = width * dpr;
+					let destHeight = height * dpr;
+					// #ifdef MP-ALIPAY
+					width = destWidth;
+					height = destHeight;
+					// #endif
+					
+					const copyArgs = Object.assign({
+						x,
+						y,
+						width,
+						height,
+						destWidth,
+						destHeight,
+						canvasId,
+						fileType,
+						quality,
+						success,
+						fail: reject
+					}, args);
+					
+					if (use2dCanvas) {
+						try{
+							// #ifndef MP-ALIPAY
+							if(!args.pathType && !this.pathType) {args.pathType = 'url'}
+							const tempFilePath = await this.setFilePath(this.canvas.toDataURL(`image/${args.fileType||fileType}`.replace(/pg/, 'peg'), args.quality||quality), args)
+							args.success && args.success({tempFilePath})
+							resolve({tempFilePath})
+							// #endif
+							// #ifdef MP-ALIPAY
+							this.canvas.toTempFilePath(copyArgs)
+							// #endif
+						}catch(e){
+							args.fail && args.fail(e)
+							reject(e)
+						}
+					} else {
+						// #ifdef MP-ALIPAY
+						uni.canvasToTempFilePath(copyArgs);
+						// #endif
+						// #ifndef MP-ALIPAY
+						uni.canvasToTempFilePath(copyArgs, this);
+						// #endif
+					}
+				})
+			}
+			// #endif
+		}
+	};
+</script>
+<style>
+	.lime-painter,
+	.lime-painter__canvas {
+		// #ifndef APP-NVUE
+		width: 100%;
+		// #endif
+		// #ifdef APP-NVUE
+		flex: 1;
+		// #endif
+	}
+</style>

+ 176 - 0
components/wike-scrollview/wike-scrollview.vue

@@ -0,0 +1,176 @@
+<template>
+	<view class="flex">
+		<scroll-view scroll-y="true" style="width: 30%;"
+			:style="{height:scrollHeight + 'px','background-color':leftBgColor,'font-size':leftFs+'rpx'}">
+			<view v-for="(item,index) in viewList" class="text-overflow flex py-30 pr-20 align-center"
+				@click="leftClick(index,item)" :class="activeIndex==index?'selected':''">
+				<view style="width: 8rpx;height: 50rpx;"
+					:style="{'background-color':activeIndex==index?leftSelected:''}"></view>
+				<view class="pl-20" :style="{color:activeIndex==index?leftSelectedColor:'',width: 115+'px'}">
+					{{item.title}}
+				</view>
+			</view>
+		</scroll-view>
+		<scroll-view scroll-y="true"  style="width: 70%;"
+			:style="{ height:scrollHeight + 'px','background-color':rightBgColor,'font-size':rightFs+'rpx'}">
+			<view class="wike_ad">
+				<wike-ad></wike-ad>
+			</view>
+			
+				<navigator v-for="(item, index) in viewList[activeIndex].children" :key="index" class="helpme" :url="'/pages/template/detail?id=' + item.id">
+					
+					<view class="title">{{ item.title }}</view>
+					<view class="sub_title">{{ item.sub_title }}</view>
+				</navigator>
+			
+				<view style="height: 30rpx;">
+					
+				</view>
+			
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "gjs-scrollView",
+		props: {
+			//左右列表
+			viewList: {
+				type: Array,
+				default: []
+			},
+			//scroll-view的高度
+			scrollHeight: {
+				type: Number,
+				default: 826
+			},
+			//左边区域的背景色
+			leftBgColor: {
+				type: String,
+				default: '#F6F6F6'
+			},
+			//右边区域的背景色
+			rightBgColor: {
+				type: String,
+				default: '#FFFFFF'
+			},
+			//左边区域的字体大小(最好不改)
+			leftFs: {
+				type: Number,
+				default: 34
+			},
+			// //右边区域的字体大小(最好不改)
+			rightFs: {
+				type: Number,
+				default: 32
+			},
+			//左边选中的颜色
+			leftSelected: {
+				type: String,
+				default: '#26b3a0'
+			},
+			leftSelectedColor: {
+				type: String,
+				default: '#26b3a0'
+			}
+		},
+		data() {
+			return {
+				activeIndex: 0,
+				position: 'sv-0',
+				// leftFs: 32,
+				// rightFs: 32,
+				
+			};
+		},
+		methods: {
+			leftClick(e, item) {
+				this.activeIndex = e
+				this.$emit('leftClick', item.title)
+			},
+			rightClick(e) {
+				this.$emit('rightClick', e)
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	
+
+	.flex {
+		display: flex;
+		flex-direction: row;
+	}
+    .py-30 {
+      padding-top: 30rpx;
+      padding-bottom: 30rpx;
+    }
+	.pr-20 {
+	  padding-right: 20rpx;
+	}
+	.pl-20 {
+	  padding-left: 20rpx;
+	}
+	.selected {
+		background-color: #FFFFFF;
+	}
+
+	/* 超出部分显示... */
+	.text-overflow {
+		
+		overflow: hidden;
+		/*超出部分隐藏*/
+		white-space: nowrap;
+		/*不换行*/
+		text-overflow: ellipsis;
+		/*超出部分文字以...显示*/
+	}
+
+	.align-center {
+		align-items: center;
+	}
+	
+	.helpme {
+		background: #f5f8f7;
+		border-radius: 20rpx;
+		padding: 30rpx;
+		margin: 30rpx;
+		/* width: 48%;
+	
+		margin-bottom: 30rpx; */
+	
+		/* height: 92px; */
+	
+		.title {
+			font-size: 32rpx;
+			font-weight: bold;
+			margin-bottom: 18rpx;
+			color: #000;
+			overflow:hidden; text-overflow:ellipsis; white-space:nowrap
+		}
+	
+		.sub_title {
+			color: #8f9ca2;
+			font-size: 24rpx;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			display: -webkit-box;
+			-webkit-box-orient: vertical;
+			-webkit-line-clamp: 2;
+		}
+	}
+	.wike_ad{
+		margin: 30rpx;
+	}
+	//去掉横向滚动条
+	/* 滚动条宽度 */
+	#noneScrollbar .el-scrollbar__thumb {
+	  display: none;
+	}
+	#noneScrollbar .el-scrollbar__wrap {
+	  overflow-x: hidden;
+	  overflow-y: auto;
+	}
+</style>

+ 145 - 0
components/wike-skeleton/wike-skeleton.vue

@@ -0,0 +1,145 @@
+<template>
+	<view>
+		<view class="placeholder question" v-for="(item,index) in size" :key="index">
+			<block v-if="type==='question'">
+				<view class="ph-title"></view>
+				<view class="ph-name"></view>
+				<view class="ph-text"></view>
+				<view class="ph-text"></view>
+			</block>
+			<block v-if="type==='user'">
+				<view class="ph-avatar"></view>
+				<view class="user-info">
+					<view class="ph-name"></view>
+					<view class="ph-text"></view>
+					<view class="ph-text"></view>
+				</view>
+			</block>
+			
+			
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			count: {
+				type: Number,
+				default: 1
+			},
+			type: {
+				type: String,
+				default: "question"
+			}
+		},
+		data() {
+			return {
+				size: this.myReduce(this.count)
+			}
+		},
+		methods: {
+			// reduce 斐波那契数列
+			myReduce(n) {
+				return [...new Array(n).keys()].reduce((t, v) => {
+					v > 1 && t.push(t[v - 1] + t[v - 2])
+					return t
+				}, [1, 1])
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.placeholder {
+		background: var(--empty-bg--);
+		border-radius: 24rpx;
+		display: flex;
+		flex-direction: column;
+		margin: 0 24rpx 20rpx;
+		padding: 40rpx 32rpx;
+	}
+
+	.placeholder:nth-of-type(1) {
+		margin-top: 0;
+	}
+
+	.placeholder [class*="ph-"] {
+		background-color: #fafbfc;
+		margin-bottom: 24rpx;
+		overflow: hidden;
+		position: relative;
+		width: 100%;
+	}
+
+	.placeholder [class*="ph-"]::before {
+		animation-duration: 1.5s;
+		animation-fill-mode: forwards;
+		animation-iteration-count: infinite;
+		animation-name: PlaceholdersAnimation;
+		animation-timing-function: linear;
+		background: linear-gradient(90deg, transparent 0, rgba(0, 0, 0, .02) 20%, transparent 40%);
+		content: "";
+		height: 100%;
+		left: 0;
+		max-width: 1000px;
+		position: absolute;
+		top: 0;
+		width: 100vw;
+	}
+
+	.placeholder [class*="ph-"]:last-child {
+		margin-bottom: 0;
+	}
+
+	.placeholder.user {
+		flex-direction: row;
+	}
+
+	.placeholder.user .user-info {
+		flex: 1;
+	}
+
+	.placeholder .ph-title {
+		height: 54rpx;
+	}
+
+	.placeholder .ph-name {
+		height: 48rpx;
+		width: 240rpx;
+	}
+
+	.placeholder .ph-text {
+		height: 32rpx;
+		margin-bottom: 16rpx;
+	}
+
+	.placeholder .ph-avatar {
+		border-radius: 50%;
+		flex-shrink: 0;
+		height: 88rpx;
+		margin-right: 24rpx;
+		width: 88rpx;
+	}
+
+	@-webkit-keyframes PlaceholdersAnimation {
+		0% {
+			transform: translate3d(-30%, 0, 0);
+		}
+
+		100% {
+			transform: translate3d(100%, 0, 0);
+		}
+	}
+
+	@keyframes PlaceholdersAnimation {
+		0% {
+			transform: translate3d(-30%, 0, 0);
+		}
+
+		100% {
+			transform: translate3d(100%, 0, 0);
+		}
+	}
+</style>

+ 438 - 0
components/wike-tabbar/wike-tabbar.vue

@@ -0,0 +1,438 @@
+<template>
+	<view>
+		<view class="tabbar cu-bar flex-between bg-white" :class="isShowAnimate ? 'fadeInUp' : ''" :style="{'background-color':tabBar.bgColor,'border-top-color':tabBar.borderColor}"
+		 v-show="onTabbar">
+			<block v-for="(item, index) in tabBar.list" :key="index">
+				<view class="action tabbar-item" :class="[item.showBig?'add-action':'']" :style="{color:item.pagePath==('/'+nowPath)?themecolor:tabBar.color}"
+				 @click="clickTab(item)">
+					<block v-if="tabBar.showType=='img'">
+						<image class="tabbar-icon" :src="item.pagePath==('/'+nowPath)? item.selectedIconPath : item.iconPath"></image>
+					</block>
+					<block v-if="tabBar.showType=='iconfont'">
+						<view :class="['tabbar-icon',item.fontClass]" :style="{'font-size':'22px','background-color':item.showBig?themecolor:''}"></view>
+					</block>
+					<text class="tabbar-text">{{ item.text }}</text>
+					<text class="tabbar-item-num" v-if="item.num">{{item.num}}</text>
+				</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapMutations,
+		mapActions,
+		mapState,
+		mapGetters
+	} from 'vuex';
+	export default {
+		props: {
+			onTabbar: {
+				type: Boolean,
+				default: true
+			},
+			infonum: {
+				type: String,
+				default: ''
+			},
+			isShowAnimate: {
+				type: Boolean,
+				default: false
+			},
+			isglobalpartjob: {
+				type: String,
+				default: '1'
+			},
+			themecolor: {
+				type: String,
+				default: '#26B3A0'
+			},
+			is_aipainting:{
+				type: String,
+				default: ''
+			}
+		},
+		computed: {
+			...mapGetters(['appInfo'])
+		},
+		data() {
+			return {
+				showBig: false,
+				tabBar: {
+					color: '#333333',
+					selectedColor: '#26B3A0',
+					showType: "iconfont", //img/图片模式,iconfont/字体图标模式
+					borderColor: "#d3d3d3",
+					bgColor: "#ffffff",
+					list: [{
+							pagePath: "/pages/index/index",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-home-capsule",
+							"iconPath": "/static/images/tabs/index.png",
+							"selectedIconPath": "/static/images/tabs/indexs.png",
+							"text": "首页"
+						},
+						{
+							pagePath: "/pages/template/template",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-cube",
+							"iconPath": "/static/images/tabs/joblist.png",
+							"selectedIconPath": "/static/images/tabs/joblists.png",
+							"text": "应用"
+						},
+						{
+							pagePath: "/pages/painting/painting",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-image",
+							"iconPath": "/static/images/tabs/joblist.png",
+							"selectedIconPath": "/static/images/tabs/joblists.png",
+							"text": "绘画"
+						},
+						{
+							pagePath: "/pages/signin/signin",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-funds",
+							"iconPath": "/static/images/tabs/joblist.png",
+							"selectedIconPath": "/static/images/tabs/joblists.png",
+							"text": "任务"
+						},
+						{
+							pagePath: "/pages/user/user",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-my",
+							"iconPath": "/static/images/tabs/mine.png",
+							"selectedIconPath": "/static/images/tabs/mines.png",
+							"text": "我的"
+						}
+					]
+				},
+
+
+			};
+		},
+		
+		onReady() {
+			
+			try {
+				uni.hideTabBar({
+					animation: false
+				})
+			} catch (e) {
+				//TODO handle the exception
+			}
+			// setTimeout(function(){
+			// 	uni.showTabBar({});
+			// },600);
+		},
+		mounted() {
+			// console.log(this.is_aipainting);
+			if(this.tabBar.list.length>4&&this.is_aipainting == '2'){
+				this.tabBar.list.splice(2, 1)
+			}
+			
+			try {
+				uni.hideTabBar({
+					animation: false
+				})
+			} catch (e) {
+				//TODO handle the exception
+			}
+		},
+		methods: {
+			clickTab(item) {
+				
+				if (item.showBig == true) {
+					this.showBig = true
+				} else {
+					uni[item.navigateType]({
+						url: item.pagePath
+					});
+					this.showBig = false
+				}
+			},
+			toggleDialog() {
+				
+				this.showBig = !this.showBig
+			},
+			toPost(e) {
+				this.toggleDialog();
+				uni.navigateTo({
+					url: '/pages/' + e
+				})
+			},
+			// 路由跳转
+			jump(path, parmas) {
+				if (Boolean(uni.getStorageSync('userInfo').telnum)) {
+					this.$Router.push({
+						path: path,
+						query: parmas
+					});
+				} else {
+					this.$store.commit('LOGIN_TIP', true);
+				}
+				
+			}
+		},
+		computed: {
+			...mapState({
+				showLoginTip: state => state.user.showLoginTip,
+			}),
+			nowPath() {
+				return getCurrentPages()[0] && getCurrentPages()[0].route;
+			},
+		}
+	};
+</script>
+
+<style lang="scss">
+	.tabbar {
+		display: flex;
+		justify-content: space-around;
+		/* height: 8vh; */
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		z-index: 9999;
+		height: 98rpx;
+		background-color: #ffffff;
+		// border-top: 1px solid rgba(193, 192, 201, 0.5);
+		padding-bottom: constant(safe-area-inset-bottom);
+		padding-bottom: env(safe-area-inset-bottom);
+		box-shadow: 0 -10rpx 20rpx 0 rgba(137, 148, 143, .1);
+		min-height: 128rpx;
+		    padding: 0;
+		    height: calc(100rpx + env(safe-area-inset-bottom) / 2);
+		    padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+	}
+
+	.tabbar::before {
+		content: "";
+		width: 100%;
+		height: 152rpx;
+		// background: url(https://ls11.cn/attachment/images/9/2019/09/TW284XJ028xWXH1mCh7pw7WhZjK4Jj.png) no-repeat;
+		background-position: center;
+		background-size: cover;
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: -1;
+		padding-bottom: 0;
+		padding-bottom: calc(constant(safe-area-inset-bottom) - 12rpx);
+		padding-bottom: calc(env(safe-area-inset-bottom) - 12rpx);
+	}
+
+	.flex-between {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: -ms-flexbox;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: space-between;
+	}
+
+	.tabbar-item {
+		width: 33%;
+		display: -webkit-inline-box;
+		display: -webkit-inline-flex;
+		display: -ms-inline-flexbox;
+		display: inline-flex;
+		flex-basis: 33%;
+		flex-direction: column;
+		align-items: center;
+		justify-content: space-around;
+	}
+
+	.tabbar-item.active {
+		color: #fe8b1e;
+	}
+
+	.tabbar-item.big {
+		position: relative;
+		top: -23rpx;
+		// font-size: 130%;
+
+		.tabbar-icon {
+			width: 92rpx;
+			height: 92rpx;
+		}
+	}
+
+	.tabbar-icon {
+		width: 46rpx;
+		height: 46rpx;
+		display: block;
+		margin: 0 auto;
+		margin-bottom: 4rpx;
+		// font-size: 46rpx;
+		// line-height: 10rpx;
+	}
+
+	.tabbar-text {
+		font-size: 12px;
+		letter-spacing: 0;
+		text-align: center;
+		line-height: 14px;
+		display: block;
+		font-weight: 600;
+		// color: #333;
+	}
+
+	.tabbar-item-num {
+		position: absolute;
+		top: 1vw;
+		font-size: 20rpx;
+		padding: 4rpx;
+		border-radius: 50%;
+		background-color: #ff4a39;
+		color: #ffffff;
+		width: 28rpx;
+		height: 28rpx;
+		text-align: center;
+		line-height: 28rpx;
+		left: 45rpx;
+		margin: auto;
+		right: 0;
+	}
+
+	.bg {
+		position: fixed;
+		z-index: 1007;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		background-color: #000;
+		opacity: .8;
+	}
+
+	.fixed-fabu {
+		position: fixed;
+		left: 0;
+		bottom: 0;
+		z-index: 1008;
+		background-color: #fff;
+		width: 100%;
+		padding: 30rpx;
+		border-top-left-radius: 12rpx;
+		border-top-right-radius: 12rpx;
+
+		h2 {
+			font-size: 18px;
+			color: #333;
+			font-weight: 400;
+			text-align: center;
+			margin: 20rpx 0;
+		}
+
+		.ul {
+			padding: 0 50rpx;
+		}
+	}
+
+	.close {
+		width: 44px;
+		height: 44px;
+		display: block;
+		margin: 35px auto;
+	}
+
+	@keyframes fabu_animate_in {
+		0% {
+			transform: scale(1);
+		}
+
+		50% {
+			transform: scale(1.2);
+		}
+
+		100% {
+			transform: scale(1);
+		}
+	}
+
+	.ani_fabu_in {
+		animation: fabu_animate_in .5s 0s ease-in-out;
+		animation-fill-mode: both;
+		animation-iteration-count: 1
+	}
+
+	@keyframes close_rotate {
+		0% {
+			transform: rotate(0deg)
+		}
+
+		100% {
+			transform: rotate(360deg)
+		}
+	}
+
+	.close_rotate {
+		animation: close_rotate .5s .1s ease-in-out;
+		animation-fill-mode: both;
+		animation-iteration-count: 1
+	}
+
+	.btn-personal-rec {
+		border-radius: 10rpx;
+		line-height: 150rpx;
+		height: 150rpx;
+		font-size: 50rpx;
+		color: #fff;
+		font-weight: bold;
+		margin: 40rpx auto;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		box-shadow: 0rpx 14rpx 34rpx rgba(41, 57, 88, 0.4);
+	}
+
+	.btn-personal-rec .btn-img {
+		margin-right: 20rpx;
+		width: 70rpx;
+		height: 70rpx;
+	}
+
+	.recruit {
+		background: linear-gradient(to right, #03a9f48c, #03A9F4);
+	}
+
+	.partjob {
+		background: linear-gradient(to right, #FF98008c, #FF9800);
+		// line-height: 100rpx;
+	}
+
+	.resume {
+		background: linear-gradient(to right, #FF57228c, #FF5722);
+	}
+
+	@keyframes fadeInUp {
+		from {
+			opacity: 0;
+			-webkit-transform: translate3d(0, 100%, 0);
+			transform: translate3d(0, 100%, 0);
+		}
+
+		to {
+			opacity: 1;
+			-webkit-transform: translate3d(0, 0, 0);
+			transform: translate3d(0, 0, 0);
+		}
+	}
+
+	.fadeInUp {
+		animation-name: fadeInUp;
+		animation-duration: .5s;
+		animation-delay: 0s;
+	}
+	
+	
+	
+</style>

+ 435 - 0
components/wike-tabbar2/wike-tabbar2.vue

@@ -0,0 +1,435 @@
+<template>
+	<view>
+		<view class="tabbar cu-bar flex-between bg-white" :class="isShowAnimate ? 'fadeInUp' : ''" :style="{'background-color':tabBar.bgColor,'border-top-color':tabBar.borderColor}"
+		 v-show="onTabbar">
+			<block v-for="(item, index) in tabBar.list" :key="index">
+				<view class="action tabbar-item" :class="[item.showBig?'add-action':'']" :style="{color:item.pagePath==('/'+nowPath)?themecolor:tabBar.color}"
+				 @click="clickTab(item)">
+					<block v-if="tabBar.showType=='img'">
+						<image class="tabbar-icon" :src="item.pagePath==('/'+nowPath)? item.selectedIconPath : item.iconPath"></image>
+					</block>
+					<block v-if="tabBar.showType=='iconfont'">
+						<view :class="['tabbar-icon',item.fontClass]" :style="{'font-size':'22px','background-color':item.showBig?themecolor:''}"></view>
+					</block>
+					<text class="tabbar-text">{{ item.text }}</text>
+					<text class="tabbar-item-num" v-if="item.num">{{item.num}}</text>
+				</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapMutations,
+		mapActions,
+		mapState,
+		mapGetters
+	} from 'vuex';
+	export default {
+		props: {
+			onTabbar: {
+				type: Boolean,
+				default: true
+			},
+			infonum: {
+				type: String,
+				default: ''
+			},
+			isShowAnimate: {
+				type: Boolean,
+				default: false
+			},
+			isglobalpartjob: {
+				type: String,
+				default: '1'
+			},
+			themecolor: {
+				type: String,
+				default: '#26B3A0'
+			},
+			is_aipainting:{
+				type: String,
+				default: ''
+			}
+		},
+		// computed: {
+		// 	...mapGetters(['appInfo'])
+		// },
+		data() {
+			return {
+				showBig: false,
+				tabBar: {
+					color: '#333333',
+					selectedColor: '#26B3A0',
+					showType: "iconfont", //img/图片模式,iconfont/字体图标模式
+					borderColor: "#d3d3d3",
+					bgColor: "#ffffff",
+					list: [{
+							pagePath: "/pages/index/index",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-level",
+							"iconPath": "/static/images/tabs/index.png",
+							"selectedIconPath": "/static/images/tabs/indexs.png",
+							"text": "助手问答"
+						},
+						{
+							pagePath: "/pages/template/template",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-chemistry",
+							"iconPath": "/static/images/tabs/joblist.png",
+							"selectedIconPath": "/static/images/tabs/joblists.png",
+							"text": "助手百宝箱"
+						},
+						{
+							pagePath: "/pages/painting/painting",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-image",
+							"iconPath": "/static/images/tabs/joblist.png",
+							"selectedIconPath": "/static/images/tabs/joblists.png",
+							"text": "AI绘画"
+						},
+						{
+							pagePath: "/pages/signin/signin",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-constellation",
+							"iconPath": "/static/images/tabs/joblist.png",
+							"selectedIconPath": "/static/images/tabs/joblists.png",
+							"text": "任务栏"
+						},
+						{
+							pagePath: "/pages/user/user",
+							navigateType: "switchTab",
+							showBig: false,
+							fontClass: "tn-icon-emoji-good",
+							"iconPath": "/static/images/tabs/mine.png",
+							"selectedIconPath": "/static/images/tabs/mines.png",
+							"text": "个人中心"
+						}
+					],
+					
+				},
+
+
+			};
+		},
+		onReady() {
+			try {
+				uni.hideTabBar({
+					animation: false
+				})
+			} catch (e) {
+				//TODO handle the exception
+			}
+			// setTimeout(function(){
+			// 	uni.showTabBar({});
+			// },600);
+		},
+		mounted() {
+			if(this.tabBar.list.length>4&&this.is_aipainting == '2'){
+				this.tabBar.list.splice(2, 1)
+			}
+			try {
+				uni.hideTabBar({
+					animation: false
+				})
+			} catch (e) {
+				//TODO handle the exception
+			}
+		},
+		methods: {
+			clickTab(item) {
+				
+				if (item.showBig == true) {
+					this.showBig = true
+				} else {
+					uni[item.navigateType]({
+						url: item.pagePath
+					});
+					this.showBig = false
+				}
+			},
+			toggleDialog() {
+				
+				this.showBig = !this.showBig
+			},
+			toPost(e) {
+				this.toggleDialog();
+				uni.navigateTo({
+					url: '/pages/' + e
+				})
+			},
+			// 路由跳转
+			jump(path, parmas) {
+				if (Boolean(uni.getStorageSync('userInfo').telnum)) {
+					this.$Router.push({
+						path: path,
+						query: parmas
+					});
+				} else {
+					this.$store.commit('LOGIN_TIP', true);
+				}
+				
+			}
+		},
+		computed: {
+			...mapState({
+				showLoginTip: state => state.user.showLoginTip,
+			}),
+			nowPath() {
+				return getCurrentPages()[0] && getCurrentPages()[0].route;
+			},
+		}
+	};
+</script>
+
+<style lang="scss">
+	.tabbar {
+		display: flex;
+		justify-content: space-around;
+		/* height: 8vh; */
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		z-index: 9999;
+		height: 98rpx;
+		background-color: #ffffff;
+		// border-top: 1px solid rgba(193, 192, 201, 0.5);
+		padding-bottom: constant(safe-area-inset-bottom);
+		padding-bottom: env(safe-area-inset-bottom);
+		box-shadow: 0 -10rpx 20rpx 0 rgba(137, 148, 143, .1);
+		min-height: 128rpx;
+		    padding: 0;
+		    height: calc(100rpx + env(safe-area-inset-bottom) / 2);
+		    padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+	}
+
+	.tabbar::before {
+		content: "";
+		width: 100%;
+		height: 152rpx;
+		// background: url(https://ls11.cn/attachment/images/9/2019/09/TW284XJ028xWXH1mCh7pw7WhZjK4Jj.png) no-repeat;
+		background-position: center;
+		background-size: cover;
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: -1;
+		padding-bottom: 0;
+		padding-bottom: calc(constant(safe-area-inset-bottom) - 12rpx);
+		padding-bottom: calc(env(safe-area-inset-bottom) - 12rpx);
+	}
+
+	.flex-between {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: -ms-flexbox;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: space-between;
+	}
+
+	.tabbar-item {
+		width: 33%;
+		display: -webkit-inline-box;
+		display: -webkit-inline-flex;
+		display: -ms-inline-flexbox;
+		display: inline-flex;
+		flex-basis: 33%;
+		flex-direction: column;
+		align-items: center;
+		justify-content: space-around;
+	}
+
+	.tabbar-item.active {
+		color: #fe8b1e;
+	}
+
+	.tabbar-item.big {
+		position: relative;
+		top: -23rpx;
+		// font-size: 130%;
+
+		.tabbar-icon {
+			width: 92rpx;
+			height: 92rpx;
+		}
+	}
+
+	.tabbar-icon {
+		width: 46rpx;
+		height: 46rpx;
+		display: block;
+		margin: 0 auto;
+		margin-bottom: 4rpx;
+		// font-size: 46rpx;
+		// line-height: 10rpx;
+	}
+
+	.tabbar-text {
+		font-size: 12px;
+		letter-spacing: 0;
+		text-align: center;
+		line-height: 14px;
+		display: block;
+		font-weight: 600;
+		// color: #333;
+	}
+
+	.tabbar-item-num {
+		position: absolute;
+		top: 1vw;
+		font-size: 20rpx;
+		padding: 4rpx;
+		border-radius: 50%;
+		background-color: #ff4a39;
+		color: #ffffff;
+		width: 28rpx;
+		height: 28rpx;
+		text-align: center;
+		line-height: 28rpx;
+		left: 45rpx;
+		margin: auto;
+		right: 0;
+	}
+
+	.bg {
+		position: fixed;
+		z-index: 1007;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		background-color: #000;
+		opacity: .8;
+	}
+
+	.fixed-fabu {
+		position: fixed;
+		left: 0;
+		bottom: 0;
+		z-index: 1008;
+		background-color: #fff;
+		width: 100%;
+		padding: 30rpx;
+		border-top-left-radius: 12rpx;
+		border-top-right-radius: 12rpx;
+
+		h2 {
+			font-size: 18px;
+			color: #333;
+			font-weight: 400;
+			text-align: center;
+			margin: 20rpx 0;
+		}
+
+		.ul {
+			padding: 0 50rpx;
+		}
+	}
+
+	.close {
+		width: 44px;
+		height: 44px;
+		display: block;
+		margin: 35px auto;
+	}
+
+	@keyframes fabu_animate_in {
+		0% {
+			transform: scale(1);
+		}
+
+		50% {
+			transform: scale(1.2);
+		}
+
+		100% {
+			transform: scale(1);
+		}
+	}
+
+	.ani_fabu_in {
+		animation: fabu_animate_in .5s 0s ease-in-out;
+		animation-fill-mode: both;
+		animation-iteration-count: 1
+	}
+
+	@keyframes close_rotate {
+		0% {
+			transform: rotate(0deg)
+		}
+
+		100% {
+			transform: rotate(360deg)
+		}
+	}
+
+	.close_rotate {
+		animation: close_rotate .5s .1s ease-in-out;
+		animation-fill-mode: both;
+		animation-iteration-count: 1
+	}
+
+	.btn-personal-rec {
+		border-radius: 10rpx;
+		line-height: 150rpx;
+		height: 150rpx;
+		font-size: 50rpx;
+		color: #fff;
+		font-weight: bold;
+		margin: 40rpx auto;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		box-shadow: 0rpx 14rpx 34rpx rgba(41, 57, 88, 0.4);
+	}
+
+	.btn-personal-rec .btn-img {
+		margin-right: 20rpx;
+		width: 70rpx;
+		height: 70rpx;
+	}
+
+	.recruit {
+		background: linear-gradient(to right, #03a9f48c, #03A9F4);
+	}
+
+	.partjob {
+		background: linear-gradient(to right, #FF98008c, #FF9800);
+		// line-height: 100rpx;
+	}
+
+	.resume {
+		background: linear-gradient(to right, #FF57228c, #FF5722);
+	}
+
+	@keyframes fadeInUp {
+		from {
+			opacity: 0;
+			-webkit-transform: translate3d(0, 100%, 0);
+			transform: translate3d(0, 100%, 0);
+		}
+
+		to {
+			opacity: 1;
+			-webkit-transform: translate3d(0, 0, 0);
+			transform: translate3d(0, 0, 0);
+		}
+	}
+
+	.fadeInUp {
+		animation-name: fadeInUp;
+		animation-duration: .5s;
+		animation-delay: 0s;
+	}
+	
+	
+	
+</style>

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 38 - 0
main.js

@@ -0,0 +1,38 @@
+import Vue from 'vue'
+import App from './App'
+import uView from "uview-ui";
+import store from "@/common/store";
+import {router,RouterMount} from "@/common/router";
+import common from "@/common";
+import TuniaoUI from 'tuniao-ui';
+import Tuniaostore from './store';
+import ws from "@/store/ws.js";
+import base64 from '@/store/base64';
+let vuexStore = require('@/store/$t.mixin.js');
+async function bootstrap() {
+	App.mpType = "app";
+	//引入路由
+	Vue.use(router);
+	// 引入全局uView
+	Vue.use(uView);
+	// 加载common
+	Vue.use(common);
+	Vue.prototype.$ws = ws;
+	Vue.prototype.$base64 = base64;
+	// 引入全局图鸟ui
+	Vue.use(TuniaoUI);
+	Vue.mixin(vuexStore);
+	const app = new Vue({
+		store,
+		Tuniaostore,
+		...App
+	});
+	// #ifdef H5
+	RouterMount(app, router, "#app");
+	// #endif
+	// #ifndef H5
+	app.$mount();
+	// #endif
+}
+
+bootstrap();

+ 105 - 0
manifest.json

@@ -0,0 +1,105 @@
+{
+	"name": "AI智能问答机器人",
+	"appid": "__UNI__D246315",
+	"description": "",
+	"versionName": "1.0.0",
+	"versionCode": "100",
+	"transformPx": false,
+	/* 5+App特有相关 */
+	"app-plus": {
+		"usingComponents": true,
+		"nvueStyleCompiler": "uni-app",
+		"compilerVersion": 3,
+		"splashscreen": {
+			"alwaysShowBeforeRender": true,
+			"waiting": true,
+			"autoclose": true,
+			"delay": 0
+		},
+		/* 模块配置 */
+		"modules": {},
+		/* 应用发布信息 */
+		"distribute": {
+			/* android打包配置 */
+			"android": {
+				"permissions": [
+					"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+					"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
+					"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+					"<uses-feature android:name=\"android.hardware.camera\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+				]
+			},
+			/* ios打包配置 */
+			"ios": {},
+			/* SDK配置 */
+			"sdkConfigs": {}
+		}
+	},
+	/* 快应用特有相关 */
+	"quickapp": {},
+	/* 小程序特有相关 */
+	"mp-weixin": {
+		"appid": "wxe4e85b7bc9cf5a6f",
+		"setting": {
+			"urlCheck": false,
+			"es6": true,
+			"minified": true,
+			"postcss": true
+		},
+		"usingComponents": true,
+		"permission": {}
+	},
+	"mp-alipay": {
+		"usingComponents": true
+	},
+	"mp-baidu": {
+		"usingComponents": true
+	},
+	"mp-toutiao": {
+		"usingComponents": true
+	},
+	"uniStatistics": {
+		"enable": false
+	},
+	"optimization": {
+		"subPackages": true
+	},
+	"vueVersion": "2",
+	"h5": {
+		"router": {
+			"mode": "history",
+			"base": "/h5/"
+		},
+		"title": "",
+		"devServer": {
+			"https": false,
+			"proxy": {
+				"/addons": {
+					"target": "http://nywhcm.com",
+					"pathRewrite": {
+						// "^/prefix": ""
+					}
+				}
+			}
+		},
+		"template": "",
+		"sdkConfigs": {
+			"maps": {
+				"qqmap": {
+					"key": "EDJBZ-G5CCP-RCNDN-VROAR-KDCV2-J5FK4"
+				}
+			}
+		}
+	}
+}

+ 13 - 0
node_modules/.package-lock.json

@@ -0,0 +1,13 @@
+{
+    "name": "完美三级联动",
+    "version": "1.0.1",
+    "lockfileVersion": 2,
+    "requires": true,
+    "packages": {
+        "node_modules/animate.css": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz",
+            "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
+        }
+    }
+}

+ 22 - 0
node_modules/@babel/runtime/LICENSE

@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2014-present Sebastian McKenzie and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 19 - 0
node_modules/@babel/runtime/README.md

@@ -0,0 +1,19 @@
+# @babel/runtime
+
+> babel's modular runtime helpers
+
+See our website [@babel/runtime](https://babeljs.io/docs/en/babel-runtime) for more information.
+
+## Install
+
+Using npm:
+
+```sh
+npm install --save @babel/runtime
+```
+
+or using yarn:
+
+```sh
+yarn add @babel/runtime
+```

+ 98 - 0
node_modules/@babel/runtime/helpers/AsyncGenerator.js

@@ -0,0 +1,98 @@
+var AwaitValue = require("./AwaitValue.js");
+
+function AsyncGenerator(gen) {
+  var front, back;
+
+  function send(key, arg) {
+    return new Promise(function (resolve, reject) {
+      var request = {
+        key: key,
+        arg: arg,
+        resolve: resolve,
+        reject: reject,
+        next: null
+      };
+
+      if (back) {
+        back = back.next = request;
+      } else {
+        front = back = request;
+        resume(key, arg);
+      }
+    });
+  }
+
+  function resume(key, arg) {
+    try {
+      var result = gen[key](arg);
+      var value = result.value;
+      var wrappedAwait = value instanceof AwaitValue;
+      Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
+        if (wrappedAwait) {
+          resume(key === "return" ? "return" : "next", arg);
+          return;
+        }
+
+        settle(result.done ? "return" : "normal", arg);
+      }, function (err) {
+        resume("throw", err);
+      });
+    } catch (err) {
+      settle("throw", err);
+    }
+  }
+
+  function settle(type, value) {
+    switch (type) {
+      case "return":
+        front.resolve({
+          value: value,
+          done: true
+        });
+        break;
+
+      case "throw":
+        front.reject(value);
+        break;
+
+      default:
+        front.resolve({
+          value: value,
+          done: false
+        });
+        break;
+    }
+
+    front = front.next;
+
+    if (front) {
+      resume(front.key, front.arg);
+    } else {
+      back = null;
+    }
+  }
+
+  this._invoke = send;
+
+  if (typeof gen["return"] !== "function") {
+    this["return"] = undefined;
+  }
+}
+
+AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
+  return this;
+};
+
+AsyncGenerator.prototype.next = function (arg) {
+  return this._invoke("next", arg);
+};
+
+AsyncGenerator.prototype["throw"] = function (arg) {
+  return this._invoke("throw", arg);
+};
+
+AsyncGenerator.prototype["return"] = function (arg) {
+  return this._invoke("return", arg);
+};
+
+module.exports = AsyncGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 5 - 0
node_modules/@babel/runtime/helpers/AwaitValue.js

@@ -0,0 +1,5 @@
+function _AwaitValue(value) {
+  this.wrapped = value;
+}
+
+module.exports = _AwaitValue, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 30 - 0
node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js

@@ -0,0 +1,30 @@
+function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
+  var desc = {};
+  Object.keys(descriptor).forEach(function (key) {
+    desc[key] = descriptor[key];
+  });
+  desc.enumerable = !!desc.enumerable;
+  desc.configurable = !!desc.configurable;
+
+  if ('value' in desc || desc.initializer) {
+    desc.writable = true;
+  }
+
+  desc = decorators.slice().reverse().reduce(function (desc, decorator) {
+    return decorator(target, property, desc) || desc;
+  }, desc);
+
+  if (context && desc.initializer !== void 0) {
+    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
+    desc.initializer = undefined;
+  }
+
+  if (desc.initializer === void 0) {
+    Object.defineProperty(target, property, desc);
+    desc = null;
+  }
+
+  return desc;
+}
+
+module.exports = _applyDecoratedDescriptor, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 284 - 0
node_modules/@babel/runtime/helpers/applyDecs.js

@@ -0,0 +1,284 @@
+var _typeof = require("./typeof.js")["default"];
+
+function createMetadataMethodsForProperty(metadataMap, kind, property, decoratorFinishedRef) {
+  return {
+    getMetadata: function getMetadata(key) {
+      assertNotFinished(decoratorFinishedRef, "getMetadata"), assertMetadataKey(key);
+      var metadataForKey = metadataMap[key];
+      if (void 0 !== metadataForKey) if (1 === kind) {
+        var pub = metadataForKey["public"];
+        if (void 0 !== pub) return pub[property];
+      } else if (2 === kind) {
+        var priv = metadataForKey["private"];
+        if (void 0 !== priv) return priv.get(property);
+      } else if (Object.hasOwnProperty.call(metadataForKey, "constructor")) return metadataForKey.constructor;
+    },
+    setMetadata: function setMetadata(key, value) {
+      assertNotFinished(decoratorFinishedRef, "setMetadata"), assertMetadataKey(key);
+      var metadataForKey = metadataMap[key];
+
+      if (void 0 === metadataForKey && (metadataForKey = metadataMap[key] = {}), 1 === kind) {
+        var pub = metadataForKey["public"];
+        void 0 === pub && (pub = metadataForKey["public"] = {}), pub[property] = value;
+      } else if (2 === kind) {
+        var priv = metadataForKey.priv;
+        void 0 === priv && (priv = metadataForKey["private"] = new Map()), priv.set(property, value);
+      } else metadataForKey.constructor = value;
+    }
+  };
+}
+
+function convertMetadataMapToFinal(obj, metadataMap) {
+  var parentMetadataMap = obj[Symbol.metadata || Symbol["for"]("Symbol.metadata")],
+      metadataKeys = Object.getOwnPropertySymbols(metadataMap);
+
+  if (0 !== metadataKeys.length) {
+    for (var i = 0; i < metadataKeys.length; i++) {
+      var key = metadataKeys[i],
+          metaForKey = metadataMap[key],
+          parentMetaForKey = parentMetadataMap ? parentMetadataMap[key] : null,
+          pub = metaForKey["public"],
+          parentPub = parentMetaForKey ? parentMetaForKey["public"] : null;
+      pub && parentPub && Object.setPrototypeOf(pub, parentPub);
+      var priv = metaForKey["private"];
+
+      if (priv) {
+        var privArr = Array.from(priv.values()),
+            parentPriv = parentMetaForKey ? parentMetaForKey["private"] : null;
+        parentPriv && (privArr = privArr.concat(parentPriv)), metaForKey["private"] = privArr;
+      }
+
+      parentMetaForKey && Object.setPrototypeOf(metaForKey, parentMetaForKey);
+    }
+
+    parentMetadataMap && Object.setPrototypeOf(metadataMap, parentMetadataMap), obj[Symbol.metadata || Symbol["for"]("Symbol.metadata")] = metadataMap;
+  }
+}
+
+function createAddInitializerMethod(initializers, decoratorFinishedRef) {
+  return function (initializer) {
+    assertNotFinished(decoratorFinishedRef, "addInitializer"), assertCallable(initializer, "An initializer"), initializers.push(initializer);
+  };
+}
+
+function memberDec(dec, name, desc, metadataMap, initializers, kind, isStatic, isPrivate, value) {
+  var kindStr;
+
+  switch (kind) {
+    case 1:
+      kindStr = "accessor";
+      break;
+
+    case 2:
+      kindStr = "method";
+      break;
+
+    case 3:
+      kindStr = "getter";
+      break;
+
+    case 4:
+      kindStr = "setter";
+      break;
+
+    default:
+      kindStr = "field";
+  }
+
+  var metadataKind,
+      metadataName,
+      ctx = {
+    kind: kindStr,
+    name: isPrivate ? "#" + name : name,
+    isStatic: isStatic,
+    isPrivate: isPrivate
+  },
+      decoratorFinishedRef = {
+    v: !1
+  };
+
+  if (0 !== kind && (ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef)), isPrivate) {
+    metadataKind = 2, metadataName = Symbol(name);
+    var access = {};
+    0 === kind ? (access.get = desc.get, access.set = desc.set) : 2 === kind ? access.get = function () {
+      return desc.value;
+    } : (1 !== kind && 3 !== kind || (access.get = function () {
+      return desc.get.call(this);
+    }), 1 !== kind && 4 !== kind || (access.set = function (v) {
+      desc.set.call(this, v);
+    })), ctx.access = access;
+  } else metadataKind = 1, metadataName = name;
+
+  try {
+    return dec(value, Object.assign(ctx, createMetadataMethodsForProperty(metadataMap, metadataKind, metadataName, decoratorFinishedRef)));
+  } finally {
+    decoratorFinishedRef.v = !0;
+  }
+}
+
+function assertNotFinished(decoratorFinishedRef, fnName) {
+  if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
+}
+
+function assertMetadataKey(key) {
+  if ("symbol" != _typeof(key)) throw new TypeError("Metadata keys must be symbols, received: " + key);
+}
+
+function assertCallable(fn, hint) {
+  if ("function" != typeof fn) throw new TypeError(hint + " must be a function");
+}
+
+function assertValidReturnValue(kind, value) {
+  var type = _typeof(value);
+
+  if (1 === kind) {
+    if ("object" !== type || null === value) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
+    void 0 !== value.get && assertCallable(value.get, "accessor.get"), void 0 !== value.set && assertCallable(value.set, "accessor.set"), void 0 !== value.init && assertCallable(value.init, "accessor.init"), void 0 !== value.initializer && assertCallable(value.initializer, "accessor.initializer");
+  } else if ("function" !== type) {
+    var hint;
+    throw hint = 0 === kind ? "field" : 10 === kind ? "class" : "method", new TypeError(hint + " decorators must return a function or void 0");
+  }
+}
+
+function getInit(desc) {
+  var initializer;
+  return null == (initializer = desc.init) && (initializer = desc.initializer) && "undefined" != typeof console && console.warn(".initializer has been renamed to .init as of March 2022"), initializer;
+}
+
+function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, metadataMap, initializers) {
+  var desc,
+      initializer,
+      value,
+      newValue,
+      get,
+      set,
+      decs = decInfo[0];
+  if (isPrivate ? desc = 0 === kind || 1 === kind ? {
+    get: decInfo[3],
+    set: decInfo[4]
+  } : 3 === kind ? {
+    get: decInfo[3]
+  } : 4 === kind ? {
+    set: decInfo[3]
+  } : {
+    value: decInfo[3]
+  } : 0 !== kind && (desc = Object.getOwnPropertyDescriptor(base, name)), 1 === kind ? value = {
+    get: desc.get,
+    set: desc.set
+  } : 2 === kind ? value = desc.value : 3 === kind ? value = desc.get : 4 === kind && (value = desc.set), "function" == typeof decs) void 0 !== (newValue = memberDec(decs, name, desc, metadataMap, initializers, kind, isStatic, isPrivate, value)) && (assertValidReturnValue(kind, newValue), 0 === kind ? initializer = newValue : 1 === kind ? (initializer = getInit(newValue), get = newValue.get || value.get, set = newValue.set || value.set, value = {
+    get: get,
+    set: set
+  }) : value = newValue);else for (var i = decs.length - 1; i >= 0; i--) {
+    var newInit;
+    if (void 0 !== (newValue = memberDec(decs[i], name, desc, metadataMap, initializers, kind, isStatic, isPrivate, value))) assertValidReturnValue(kind, newValue), 0 === kind ? newInit = newValue : 1 === kind ? (newInit = getInit(newValue), get = newValue.get || value.get, set = newValue.set || value.set, value = {
+      get: get,
+      set: set
+    }) : value = newValue, void 0 !== newInit && (void 0 === initializer ? initializer = newInit : "function" == typeof initializer ? initializer = [initializer, newInit] : initializer.push(newInit));
+  }
+
+  if (0 === kind || 1 === kind) {
+    if (void 0 === initializer) initializer = function initializer(instance, init) {
+      return init;
+    };else if ("function" != typeof initializer) {
+      var ownInitializers = initializer;
+
+      initializer = function initializer(instance, init) {
+        for (var value = init, i = 0; i < ownInitializers.length; i++) {
+          value = ownInitializers[i].call(instance, value);
+        }
+
+        return value;
+      };
+    } else {
+      var originalInitializer = initializer;
+
+      initializer = function initializer(instance, init) {
+        return originalInitializer.call(instance, init);
+      };
+    }
+    ret.push(initializer);
+  }
+
+  0 !== kind && (1 === kind ? (desc.get = value.get, desc.set = value.set) : 2 === kind ? desc.value = value : 3 === kind ? desc.get = value : 4 === kind && (desc.set = value), isPrivate ? 1 === kind ? (ret.push(function (instance, args) {
+    return value.get.call(instance, args);
+  }), ret.push(function (instance, args) {
+    return value.set.call(instance, args);
+  })) : 2 === kind ? ret.push(value) : ret.push(function (instance, args) {
+    return value.call(instance, args);
+  }) : Object.defineProperty(base, name, desc));
+}
+
+function applyMemberDecs(ret, Class, protoMetadataMap, staticMetadataMap, decInfos) {
+  for (var protoInitializers, staticInitializers, existingProtoNonFields = new Map(), existingStaticNonFields = new Map(), i = 0; i < decInfos.length; i++) {
+    var decInfo = decInfos[i];
+
+    if (Array.isArray(decInfo)) {
+      var base,
+          metadataMap,
+          initializers,
+          kind = decInfo[1],
+          name = decInfo[2],
+          isPrivate = decInfo.length > 3,
+          isStatic = kind >= 5;
+
+      if (isStatic ? (base = Class, metadataMap = staticMetadataMap, 0 !== (kind -= 5) && (initializers = staticInitializers = staticInitializers || [])) : (base = Class.prototype, metadataMap = protoMetadataMap, 0 !== kind && (initializers = protoInitializers = protoInitializers || [])), 0 !== kind && !isPrivate) {
+        var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields,
+            existingKind = existingNonFields.get(name) || 0;
+        if (!0 === existingKind || 3 === existingKind && 4 !== kind || 4 === existingKind && 3 !== kind) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
+        !existingKind && kind > 2 ? existingNonFields.set(name, kind) : existingNonFields.set(name, !0);
+      }
+
+      applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, metadataMap, initializers);
+    }
+  }
+
+  pushInitializers(ret, protoInitializers), pushInitializers(ret, staticInitializers);
+}
+
+function pushInitializers(ret, initializers) {
+  initializers && ret.push(function (instance) {
+    for (var i = 0; i < initializers.length; i++) {
+      initializers[i].call(instance);
+    }
+
+    return instance;
+  });
+}
+
+function applyClassDecs(ret, targetClass, metadataMap, classDecs) {
+  if (classDecs.length > 0) {
+    for (var initializers = [], newClass = targetClass, name = targetClass.name, i = classDecs.length - 1; i >= 0; i--) {
+      var decoratorFinishedRef = {
+        v: !1
+      };
+
+      try {
+        var ctx = Object.assign({
+          kind: "class",
+          name: name,
+          addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef)
+        }, createMetadataMethodsForProperty(metadataMap, 0, name, decoratorFinishedRef)),
+            nextNewClass = classDecs[i](newClass, ctx);
+      } finally {
+        decoratorFinishedRef.v = !0;
+      }
+
+      void 0 !== nextNewClass && (assertValidReturnValue(10, nextNewClass), newClass = nextNewClass);
+    }
+
+    ret.push(newClass, function () {
+      for (var i = 0; i < initializers.length; i++) {
+        initializers[i].call(newClass);
+      }
+    });
+  }
+}
+
+function applyDecs(targetClass, memberDecs, classDecs) {
+  var ret = [],
+      staticMetadataMap = {},
+      protoMetadataMap = {};
+  return applyMemberDecs(ret, targetClass, protoMetadataMap, staticMetadataMap, memberDecs), convertMetadataMapToFinal(targetClass.prototype, protoMetadataMap), applyClassDecs(ret, targetClass, staticMetadataMap, classDecs), convertMetadataMapToFinal(targetClass, staticMetadataMap), ret;
+}
+
+module.exports = applyDecs, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 11 - 0
node_modules/@babel/runtime/helpers/arrayLikeToArray.js

@@ -0,0 +1,11 @@
+function _arrayLikeToArray(arr, len) {
+  if (len == null || len > arr.length) len = arr.length;
+
+  for (var i = 0, arr2 = new Array(len); i < len; i++) {
+    arr2[i] = arr[i];
+  }
+
+  return arr2;
+}
+
+module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 5 - 0
node_modules/@babel/runtime/helpers/arrayWithHoles.js

@@ -0,0 +1,5 @@
+function _arrayWithHoles(arr) {
+  if (Array.isArray(arr)) return arr;
+}
+
+module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 7 - 0
node_modules/@babel/runtime/helpers/arrayWithoutHoles.js

@@ -0,0 +1,7 @@
+var arrayLikeToArray = require("./arrayLikeToArray.js");
+
+function _arrayWithoutHoles(arr) {
+  if (Array.isArray(arr)) return arrayLikeToArray(arr);
+}
+
+module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 9 - 0
node_modules/@babel/runtime/helpers/assertThisInitialized.js

@@ -0,0 +1,9 @@
+function _assertThisInitialized(self) {
+  if (self === void 0) {
+    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+  }
+
+  return self;
+}
+
+module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 56 - 0
node_modules/@babel/runtime/helpers/asyncGeneratorDelegate.js

@@ -0,0 +1,56 @@
+function _asyncGeneratorDelegate(inner, awaitWrap) {
+  var iter = {},
+      waiting = false;
+
+  function pump(key, value) {
+    waiting = true;
+    value = new Promise(function (resolve) {
+      resolve(inner[key](value));
+    });
+    return {
+      done: false,
+      value: awaitWrap(value)
+    };
+  }
+
+  ;
+
+  iter[typeof Symbol !== "undefined" && Symbol.iterator || "@@iterator"] = function () {
+    return this;
+  };
+
+  iter.next = function (value) {
+    if (waiting) {
+      waiting = false;
+      return value;
+    }
+
+    return pump("next", value);
+  };
+
+  if (typeof inner["throw"] === "function") {
+    iter["throw"] = function (value) {
+      if (waiting) {
+        waiting = false;
+        throw value;
+      }
+
+      return pump("throw", value);
+    };
+  }
+
+  if (typeof inner["return"] === "function") {
+    iter["return"] = function (value) {
+      if (waiting) {
+        waiting = false;
+        return value;
+      }
+
+      return pump("return", value);
+    };
+  }
+
+  return iter;
+}
+
+module.exports = _asyncGeneratorDelegate, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 50 - 0
node_modules/@babel/runtime/helpers/asyncIterator.js

@@ -0,0 +1,50 @@
+function _asyncIterator(iterable) {
+  var method,
+      async,
+      sync,
+      retry = 2;
+
+  for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) {
+    if (async && null != (method = iterable[async])) return method.call(iterable);
+    if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable));
+    async = "@@asyncIterator", sync = "@@iterator";
+  }
+
+  throw new TypeError("Object is not async iterable");
+}
+
+function AsyncFromSyncIterator(s) {
+  function AsyncFromSyncIteratorContinuation(r) {
+    if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object."));
+    var done = r.done;
+    return Promise.resolve(r.value).then(function (value) {
+      return {
+        value: value,
+        done: done
+      };
+    });
+  }
+
+  return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) {
+    this.s = s, this.n = s.next;
+  }, AsyncFromSyncIterator.prototype = {
+    s: null,
+    n: null,
+    next: function next() {
+      return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
+    },
+    "return": function _return(value) {
+      var ret = this.s["return"];
+      return void 0 === ret ? Promise.resolve({
+        value: value,
+        done: !0
+      }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));
+    },
+    "throw": function _throw(value) {
+      var thr = this.s["return"];
+      return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));
+    }
+  }, new AsyncFromSyncIterator(s);
+}
+
+module.exports = _asyncIterator, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 37 - 0
node_modules/@babel/runtime/helpers/asyncToGenerator.js

@@ -0,0 +1,37 @@
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
+  try {
+    var info = gen[key](arg);
+    var value = info.value;
+  } catch (error) {
+    reject(error);
+    return;
+  }
+
+  if (info.done) {
+    resolve(value);
+  } else {
+    Promise.resolve(value).then(_next, _throw);
+  }
+}
+
+function _asyncToGenerator(fn) {
+  return function () {
+    var self = this,
+        args = arguments;
+    return new Promise(function (resolve, reject) {
+      var gen = fn.apply(self, args);
+
+      function _next(value) {
+        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
+      }
+
+      function _throw(err) {
+        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
+      }
+
+      _next(undefined);
+    });
+  };
+}
+
+module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 7 - 0
node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js

@@ -0,0 +1,7 @@
+var AwaitValue = require("./AwaitValue.js");
+
+function _awaitAsyncGenerator(value) {
+  return new AwaitValue(value);
+}
+
+module.exports = _awaitAsyncGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 7 - 0
node_modules/@babel/runtime/helpers/checkPrivateRedeclaration.js

@@ -0,0 +1,7 @@
+function _checkPrivateRedeclaration(obj, privateCollection) {
+  if (privateCollection.has(obj)) {
+    throw new TypeError("Cannot initialize the same private elements twice on an object");
+  }
+}
+
+module.exports = _checkPrivateRedeclaration, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 22 - 0
node_modules/@babel/runtime/helpers/classApplyDescriptorDestructureSet.js

@@ -0,0 +1,22 @@
+function _classApplyDescriptorDestructureSet(receiver, descriptor) {
+  if (descriptor.set) {
+    if (!("__destrObj" in descriptor)) {
+      descriptor.__destrObj = {
+        set value(v) {
+          descriptor.set.call(receiver, v);
+        }
+
+      };
+    }
+
+    return descriptor.__destrObj;
+  } else {
+    if (!descriptor.writable) {
+      throw new TypeError("attempted to set read only private field");
+    }
+
+    return descriptor;
+  }
+}
+
+module.exports = _classApplyDescriptorDestructureSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 9 - 0
node_modules/@babel/runtime/helpers/classApplyDescriptorGet.js

@@ -0,0 +1,9 @@
+function _classApplyDescriptorGet(receiver, descriptor) {
+  if (descriptor.get) {
+    return descriptor.get.call(receiver);
+  }
+
+  return descriptor.value;
+}
+
+module.exports = _classApplyDescriptorGet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 13 - 0
node_modules/@babel/runtime/helpers/classApplyDescriptorSet.js

@@ -0,0 +1,13 @@
+function _classApplyDescriptorSet(receiver, descriptor, value) {
+  if (descriptor.set) {
+    descriptor.set.call(receiver, value);
+  } else {
+    if (!descriptor.writable) {
+      throw new TypeError("attempted to set read only private field");
+    }
+
+    descriptor.value = value;
+  }
+}
+
+module.exports = _classApplyDescriptorSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 7 - 0
node_modules/@babel/runtime/helpers/classCallCheck.js

@@ -0,0 +1,7 @@
+function _classCallCheck(instance, Constructor) {
+  if (!(instance instanceof Constructor)) {
+    throw new TypeError("Cannot call a class as a function");
+  }
+}
+
+module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 7 - 0
node_modules/@babel/runtime/helpers/classCheckPrivateStaticAccess.js

@@ -0,0 +1,7 @@
+function _classCheckPrivateStaticAccess(receiver, classConstructor) {
+  if (receiver !== classConstructor) {
+    throw new TypeError("Private static access of wrong provenance");
+  }
+}
+
+module.exports = _classCheckPrivateStaticAccess, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 7 - 0
node_modules/@babel/runtime/helpers/classCheckPrivateStaticFieldDescriptor.js

@@ -0,0 +1,7 @@
+function _classCheckPrivateStaticFieldDescriptor(descriptor, action) {
+  if (descriptor === undefined) {
+    throw new TypeError("attempted to " + action + " private static field before its declaration");
+  }
+}
+
+module.exports = _classCheckPrivateStaticFieldDescriptor, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 9 - 0
node_modules/@babel/runtime/helpers/classExtractFieldDescriptor.js

@@ -0,0 +1,9 @@
+function _classExtractFieldDescriptor(receiver, privateMap, action) {
+  if (!privateMap.has(receiver)) {
+    throw new TypeError("attempted to " + action + " private field on non-instance");
+  }
+
+  return privateMap.get(receiver);
+}
+
+module.exports = _classExtractFieldDescriptor, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 5 - 0
node_modules/@babel/runtime/helpers/classNameTDZError.js

@@ -0,0 +1,5 @@
+function _classNameTDZError(name) {
+  throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
+}
+
+module.exports = _classNameTDZError, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 10 - 0
node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js

@@ -0,0 +1,10 @@
+var classApplyDescriptorDestructureSet = require("./classApplyDescriptorDestructureSet.js");
+
+var classExtractFieldDescriptor = require("./classExtractFieldDescriptor.js");
+
+function _classPrivateFieldDestructureSet(receiver, privateMap) {
+  var descriptor = classExtractFieldDescriptor(receiver, privateMap, "set");
+  return classApplyDescriptorDestructureSet(receiver, descriptor);
+}
+
+module.exports = _classPrivateFieldDestructureSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 10 - 0
node_modules/@babel/runtime/helpers/classPrivateFieldGet.js

@@ -0,0 +1,10 @@
+var classApplyDescriptorGet = require("./classApplyDescriptorGet.js");
+
+var classExtractFieldDescriptor = require("./classExtractFieldDescriptor.js");
+
+function _classPrivateFieldGet(receiver, privateMap) {
+  var descriptor = classExtractFieldDescriptor(receiver, privateMap, "get");
+  return classApplyDescriptorGet(receiver, descriptor);
+}
+
+module.exports = _classPrivateFieldGet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 8 - 0
node_modules/@babel/runtime/helpers/classPrivateFieldInitSpec.js

@@ -0,0 +1,8 @@
+var checkPrivateRedeclaration = require("./checkPrivateRedeclaration.js");
+
+function _classPrivateFieldInitSpec(obj, privateMap, value) {
+  checkPrivateRedeclaration(obj, privateMap);
+  privateMap.set(obj, value);
+}
+
+module.exports = _classPrivateFieldInitSpec, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 9 - 0
node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js

@@ -0,0 +1,9 @@
+function _classPrivateFieldBase(receiver, privateKey) {
+  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
+    throw new TypeError("attempted to use private field on non-instance");
+  }
+
+  return receiver;
+}
+
+module.exports = _classPrivateFieldBase, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 7 - 0
node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js

@@ -0,0 +1,7 @@
+var id = 0;
+
+function _classPrivateFieldKey(name) {
+  return "__private_" + id++ + "_" + name;
+}
+
+module.exports = _classPrivateFieldKey, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 11 - 0
node_modules/@babel/runtime/helpers/classPrivateFieldSet.js

@@ -0,0 +1,11 @@
+var classApplyDescriptorSet = require("./classApplyDescriptorSet.js");
+
+var classExtractFieldDescriptor = require("./classExtractFieldDescriptor.js");
+
+function _classPrivateFieldSet(receiver, privateMap, value) {
+  var descriptor = classExtractFieldDescriptor(receiver, privateMap, "set");
+  classApplyDescriptorSet(receiver, descriptor, value);
+  return value;
+}
+
+module.exports = _classPrivateFieldSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 9 - 0
node_modules/@babel/runtime/helpers/classPrivateMethodGet.js

@@ -0,0 +1,9 @@
+function _classPrivateMethodGet(receiver, privateSet, fn) {
+  if (!privateSet.has(receiver)) {
+    throw new TypeError("attempted to get private field on non-instance");
+  }
+
+  return fn;
+}
+
+module.exports = _classPrivateMethodGet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 8 - 0
node_modules/@babel/runtime/helpers/classPrivateMethodInitSpec.js

@@ -0,0 +1,8 @@
+var checkPrivateRedeclaration = require("./checkPrivateRedeclaration.js");
+
+function _classPrivateMethodInitSpec(obj, privateSet) {
+  checkPrivateRedeclaration(obj, privateSet);
+  privateSet.add(obj);
+}
+
+module.exports = _classPrivateMethodInitSpec, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 5 - 0
node_modules/@babel/runtime/helpers/classPrivateMethodSet.js

@@ -0,0 +1,5 @@
+function _classPrivateMethodSet() {
+  throw new TypeError("attempted to reassign private method");
+}
+
+module.exports = _classPrivateMethodSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 13 - 0
node_modules/@babel/runtime/helpers/classStaticPrivateFieldDestructureSet.js

@@ -0,0 +1,13 @@
+var classApplyDescriptorDestructureSet = require("./classApplyDescriptorDestructureSet.js");
+
+var classCheckPrivateStaticAccess = require("./classCheckPrivateStaticAccess.js");
+
+var classCheckPrivateStaticFieldDescriptor = require("./classCheckPrivateStaticFieldDescriptor.js");
+
+function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) {
+  classCheckPrivateStaticAccess(receiver, classConstructor);
+  classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+  return classApplyDescriptorDestructureSet(receiver, descriptor);
+}
+
+module.exports = _classStaticPrivateFieldDestructureSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 13 - 0
node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js

@@ -0,0 +1,13 @@
+var classApplyDescriptorGet = require("./classApplyDescriptorGet.js");
+
+var classCheckPrivateStaticAccess = require("./classCheckPrivateStaticAccess.js");
+
+var classCheckPrivateStaticFieldDescriptor = require("./classCheckPrivateStaticFieldDescriptor.js");
+
+function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
+  classCheckPrivateStaticAccess(receiver, classConstructor);
+  classCheckPrivateStaticFieldDescriptor(descriptor, "get");
+  return classApplyDescriptorGet(receiver, descriptor);
+}
+
+module.exports = _classStaticPrivateFieldSpecGet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 14 - 0
node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js

@@ -0,0 +1,14 @@
+var classApplyDescriptorSet = require("./classApplyDescriptorSet.js");
+
+var classCheckPrivateStaticAccess = require("./classCheckPrivateStaticAccess.js");
+
+var classCheckPrivateStaticFieldDescriptor = require("./classCheckPrivateStaticFieldDescriptor.js");
+
+function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
+  classCheckPrivateStaticAccess(receiver, classConstructor);
+  classCheckPrivateStaticFieldDescriptor(descriptor, "set");
+  classApplyDescriptorSet(receiver, descriptor, value);
+  return value;
+}
+
+module.exports = _classStaticPrivateFieldSpecSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 8 - 0
node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js

@@ -0,0 +1,8 @@
+var classCheckPrivateStaticAccess = require("./classCheckPrivateStaticAccess.js");
+
+function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
+  classCheckPrivateStaticAccess(receiver, classConstructor);
+  return method;
+}
+
+module.exports = _classStaticPrivateMethodGet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 5 - 0
node_modules/@babel/runtime/helpers/classStaticPrivateMethodSet.js

@@ -0,0 +1,5 @@
+function _classStaticPrivateMethodSet() {
+  throw new TypeError("attempted to set read only static private field");
+}
+
+module.exports = _classStaticPrivateMethodSet, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 22 - 0
node_modules/@babel/runtime/helpers/construct.js

@@ -0,0 +1,22 @@
+var setPrototypeOf = require("./setPrototypeOf.js");
+
+var isNativeReflectConstruct = require("./isNativeReflectConstruct.js");
+
+function _construct(Parent, args, Class) {
+  if (isNativeReflectConstruct()) {
+    module.exports = _construct = Reflect.construct, module.exports.__esModule = true, module.exports["default"] = module.exports;
+  } else {
+    module.exports = _construct = function _construct(Parent, args, Class) {
+      var a = [null];
+      a.push.apply(a, args);
+      var Constructor = Function.bind.apply(Parent, a);
+      var instance = new Constructor();
+      if (Class) setPrototypeOf(instance, Class.prototype);
+      return instance;
+    }, module.exports.__esModule = true, module.exports["default"] = module.exports;
+  }
+
+  return _construct.apply(null, arguments);
+}
+
+module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 20 - 0
node_modules/@babel/runtime/helpers/createClass.js

@@ -0,0 +1,20 @@
+function _defineProperties(target, props) {
+  for (var i = 0; i < props.length; i++) {
+    var descriptor = props[i];
+    descriptor.enumerable = descriptor.enumerable || false;
+    descriptor.configurable = true;
+    if ("value" in descriptor) descriptor.writable = true;
+    Object.defineProperty(target, descriptor.key, descriptor);
+  }
+}
+
+function _createClass(Constructor, protoProps, staticProps) {
+  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+  if (staticProps) _defineProperties(Constructor, staticProps);
+  Object.defineProperty(Constructor, "prototype", {
+    writable: false
+  });
+  return Constructor;
+}
+
+module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 60 - 0
node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js

@@ -0,0 +1,60 @@
+var unsupportedIterableToArray = require("./unsupportedIterableToArray.js");
+
+function _createForOfIteratorHelper(o, allowArrayLike) {
+  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
+
+  if (!it) {
+    if (Array.isArray(o) || (it = unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+      if (it) o = it;
+      var i = 0;
+
+      var F = function F() {};
+
+      return {
+        s: F,
+        n: function n() {
+          if (i >= o.length) return {
+            done: true
+          };
+          return {
+            done: false,
+            value: o[i++]
+          };
+        },
+        e: function e(_e) {
+          throw _e;
+        },
+        f: F
+      };
+    }
+
+    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+  }
+
+  var normalCompletion = true,
+      didErr = false,
+      err;
+  return {
+    s: function s() {
+      it = it.call(o);
+    },
+    n: function n() {
+      var step = it.next();
+      normalCompletion = step.done;
+      return step;
+    },
+    e: function e(_e2) {
+      didErr = true;
+      err = _e2;
+    },
+    f: function f() {
+      try {
+        if (!normalCompletion && it["return"] != null) it["return"]();
+      } finally {
+        if (didErr) throw err;
+      }
+    }
+  };
+}
+
+module.exports = _createForOfIteratorHelper, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 24 - 0
node_modules/@babel/runtime/helpers/createForOfIteratorHelperLoose.js

@@ -0,0 +1,24 @@
+var unsupportedIterableToArray = require("./unsupportedIterableToArray.js");
+
+function _createForOfIteratorHelperLoose(o, allowArrayLike) {
+  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
+  if (it) return (it = it.call(o)).next.bind(it);
+
+  if (Array.isArray(o) || (it = unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+    if (it) o = it;
+    var i = 0;
+    return function () {
+      if (i >= o.length) return {
+        done: true
+      };
+      return {
+        done: false,
+        value: o[i++]
+      };
+    };
+  }
+
+  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+}
+
+module.exports = _createForOfIteratorHelperLoose, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 24 - 0
node_modules/@babel/runtime/helpers/createSuper.js

@@ -0,0 +1,24 @@
+var getPrototypeOf = require("./getPrototypeOf.js");
+
+var isNativeReflectConstruct = require("./isNativeReflectConstruct.js");
+
+var possibleConstructorReturn = require("./possibleConstructorReturn.js");
+
+function _createSuper(Derived) {
+  var hasNativeReflectConstruct = isNativeReflectConstruct();
+  return function _createSuperInternal() {
+    var Super = getPrototypeOf(Derived),
+        result;
+
+    if (hasNativeReflectConstruct) {
+      var NewTarget = getPrototypeOf(this).constructor;
+      result = Reflect.construct(Super, arguments, NewTarget);
+    } else {
+      result = Super.apply(this, arguments);
+    }
+
+    return possibleConstructorReturn(this, result);
+  };
+}
+
+module.exports = _createSuper, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 400 - 0
node_modules/@babel/runtime/helpers/decorate.js

@@ -0,0 +1,400 @@
+var toArray = require("./toArray.js");
+
+var toPropertyKey = require("./toPropertyKey.js");
+
+function _decorate(decorators, factory, superClass, mixins) {
+  var api = _getDecoratorsApi();
+
+  if (mixins) {
+    for (var i = 0; i < mixins.length; i++) {
+      api = mixins[i](api);
+    }
+  }
+
+  var r = factory(function initialize(O) {
+    api.initializeInstanceElements(O, decorated.elements);
+  }, superClass);
+  var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
+  api.initializeClassElements(r.F, decorated.elements);
+  return api.runClassFinishers(r.F, decorated.finishers);
+}
+
+function _getDecoratorsApi() {
+  _getDecoratorsApi = function _getDecoratorsApi() {
+    return api;
+  };
+
+  var api = {
+    elementsDefinitionOrder: [["method"], ["field"]],
+    initializeInstanceElements: function initializeInstanceElements(O, elements) {
+      ["method", "field"].forEach(function (kind) {
+        elements.forEach(function (element) {
+          if (element.kind === kind && element.placement === "own") {
+            this.defineClassElement(O, element);
+          }
+        }, this);
+      }, this);
+    },
+    initializeClassElements: function initializeClassElements(F, elements) {
+      var proto = F.prototype;
+      ["method", "field"].forEach(function (kind) {
+        elements.forEach(function (element) {
+          var placement = element.placement;
+
+          if (element.kind === kind && (placement === "static" || placement === "prototype")) {
+            var receiver = placement === "static" ? F : proto;
+            this.defineClassElement(receiver, element);
+          }
+        }, this);
+      }, this);
+    },
+    defineClassElement: function defineClassElement(receiver, element) {
+      var descriptor = element.descriptor;
+
+      if (element.kind === "field") {
+        var initializer = element.initializer;
+        descriptor = {
+          enumerable: descriptor.enumerable,
+          writable: descriptor.writable,
+          configurable: descriptor.configurable,
+          value: initializer === void 0 ? void 0 : initializer.call(receiver)
+        };
+      }
+
+      Object.defineProperty(receiver, element.key, descriptor);
+    },
+    decorateClass: function decorateClass(elements, decorators) {
+      var newElements = [];
+      var finishers = [];
+      var placements = {
+        "static": [],
+        prototype: [],
+        own: []
+      };
+      elements.forEach(function (element) {
+        this.addElementPlacement(element, placements);
+      }, this);
+      elements.forEach(function (element) {
+        if (!_hasDecorators(element)) return newElements.push(element);
+        var elementFinishersExtras = this.decorateElement(element, placements);
+        newElements.push(elementFinishersExtras.element);
+        newElements.push.apply(newElements, elementFinishersExtras.extras);
+        finishers.push.apply(finishers, elementFinishersExtras.finishers);
+      }, this);
+
+      if (!decorators) {
+        return {
+          elements: newElements,
+          finishers: finishers
+        };
+      }
+
+      var result = this.decorateConstructor(newElements, decorators);
+      finishers.push.apply(finishers, result.finishers);
+      result.finishers = finishers;
+      return result;
+    },
+    addElementPlacement: function addElementPlacement(element, placements, silent) {
+      var keys = placements[element.placement];
+
+      if (!silent && keys.indexOf(element.key) !== -1) {
+        throw new TypeError("Duplicated element (" + element.key + ")");
+      }
+
+      keys.push(element.key);
+    },
+    decorateElement: function decorateElement(element, placements) {
+      var extras = [];
+      var finishers = [];
+
+      for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
+        var keys = placements[element.placement];
+        keys.splice(keys.indexOf(element.key), 1);
+        var elementObject = this.fromElementDescriptor(element);
+        var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
+        element = elementFinisherExtras.element;
+        this.addElementPlacement(element, placements);
+
+        if (elementFinisherExtras.finisher) {
+          finishers.push(elementFinisherExtras.finisher);
+        }
+
+        var newExtras = elementFinisherExtras.extras;
+
+        if (newExtras) {
+          for (var j = 0; j < newExtras.length; j++) {
+            this.addElementPlacement(newExtras[j], placements);
+          }
+
+          extras.push.apply(extras, newExtras);
+        }
+      }
+
+      return {
+        element: element,
+        finishers: finishers,
+        extras: extras
+      };
+    },
+    decorateConstructor: function decorateConstructor(elements, decorators) {
+      var finishers = [];
+
+      for (var i = decorators.length - 1; i >= 0; i--) {
+        var obj = this.fromClassDescriptor(elements);
+        var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
+
+        if (elementsAndFinisher.finisher !== undefined) {
+          finishers.push(elementsAndFinisher.finisher);
+        }
+
+        if (elementsAndFinisher.elements !== undefined) {
+          elements = elementsAndFinisher.elements;
+
+          for (var j = 0; j < elements.length - 1; j++) {
+            for (var k = j + 1; k < elements.length; k++) {
+              if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
+                throw new TypeError("Duplicated element (" + elements[j].key + ")");
+              }
+            }
+          }
+        }
+      }
+
+      return {
+        elements: elements,
+        finishers: finishers
+      };
+    },
+    fromElementDescriptor: function fromElementDescriptor(element) {
+      var obj = {
+        kind: element.kind,
+        key: element.key,
+        placement: element.placement,
+        descriptor: element.descriptor
+      };
+      var desc = {
+        value: "Descriptor",
+        configurable: true
+      };
+      Object.defineProperty(obj, Symbol.toStringTag, desc);
+      if (element.kind === "field") obj.initializer = element.initializer;
+      return obj;
+    },
+    toElementDescriptors: function toElementDescriptors(elementObjects) {
+      if (elementObjects === undefined) return;
+      return toArray(elementObjects).map(function (elementObject) {
+        var element = this.toElementDescriptor(elementObject);
+        this.disallowProperty(elementObject, "finisher", "An element descriptor");
+        this.disallowProperty(elementObject, "extras", "An element descriptor");
+        return element;
+      }, this);
+    },
+    toElementDescriptor: function toElementDescriptor(elementObject) {
+      var kind = String(elementObject.kind);
+
+      if (kind !== "method" && kind !== "field") {
+        throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
+      }
+
+      var key = toPropertyKey(elementObject.key);
+      var placement = String(elementObject.placement);
+
+      if (placement !== "static" && placement !== "prototype" && placement !== "own") {
+        throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
+      }
+
+      var descriptor = elementObject.descriptor;
+      this.disallowProperty(elementObject, "elements", "An element descriptor");
+      var element = {
+        kind: kind,
+        key: key,
+        placement: placement,
+        descriptor: Object.assign({}, descriptor)
+      };
+
+      if (kind !== "field") {
+        this.disallowProperty(elementObject, "initializer", "A method descriptor");
+      } else {
+        this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
+        this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
+        this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
+        element.initializer = elementObject.initializer;
+      }
+
+      return element;
+    },
+    toElementFinisherExtras: function toElementFinisherExtras(elementObject) {
+      var element = this.toElementDescriptor(elementObject);
+
+      var finisher = _optionalCallableProperty(elementObject, "finisher");
+
+      var extras = this.toElementDescriptors(elementObject.extras);
+      return {
+        element: element,
+        finisher: finisher,
+        extras: extras
+      };
+    },
+    fromClassDescriptor: function fromClassDescriptor(elements) {
+      var obj = {
+        kind: "class",
+        elements: elements.map(this.fromElementDescriptor, this)
+      };
+      var desc = {
+        value: "Descriptor",
+        configurable: true
+      };
+      Object.defineProperty(obj, Symbol.toStringTag, desc);
+      return obj;
+    },
+    toClassDescriptor: function toClassDescriptor(obj) {
+      var kind = String(obj.kind);
+
+      if (kind !== "class") {
+        throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
+      }
+
+      this.disallowProperty(obj, "key", "A class descriptor");
+      this.disallowProperty(obj, "placement", "A class descriptor");
+      this.disallowProperty(obj, "descriptor", "A class descriptor");
+      this.disallowProperty(obj, "initializer", "A class descriptor");
+      this.disallowProperty(obj, "extras", "A class descriptor");
+
+      var finisher = _optionalCallableProperty(obj, "finisher");
+
+      var elements = this.toElementDescriptors(obj.elements);
+      return {
+        elements: elements,
+        finisher: finisher
+      };
+    },
+    runClassFinishers: function runClassFinishers(constructor, finishers) {
+      for (var i = 0; i < finishers.length; i++) {
+        var newConstructor = (0, finishers[i])(constructor);
+
+        if (newConstructor !== undefined) {
+          if (typeof newConstructor !== "function") {
+            throw new TypeError("Finishers must return a constructor.");
+          }
+
+          constructor = newConstructor;
+        }
+      }
+
+      return constructor;
+    },
+    disallowProperty: function disallowProperty(obj, name, objectType) {
+      if (obj[name] !== undefined) {
+        throw new TypeError(objectType + " can't have a ." + name + " property.");
+      }
+    }
+  };
+  return api;
+}
+
+function _createElementDescriptor(def) {
+  var key = toPropertyKey(def.key);
+  var descriptor;
+
+  if (def.kind === "method") {
+    descriptor = {
+      value: def.value,
+      writable: true,
+      configurable: true,
+      enumerable: false
+    };
+  } else if (def.kind === "get") {
+    descriptor = {
+      get: def.value,
+      configurable: true,
+      enumerable: false
+    };
+  } else if (def.kind === "set") {
+    descriptor = {
+      set: def.value,
+      configurable: true,
+      enumerable: false
+    };
+  } else if (def.kind === "field") {
+    descriptor = {
+      configurable: true,
+      writable: true,
+      enumerable: true
+    };
+  }
+
+  var element = {
+    kind: def.kind === "field" ? "field" : "method",
+    key: key,
+    placement: def["static"] ? "static" : def.kind === "field" ? "own" : "prototype",
+    descriptor: descriptor
+  };
+  if (def.decorators) element.decorators = def.decorators;
+  if (def.kind === "field") element.initializer = def.value;
+  return element;
+}
+
+function _coalesceGetterSetter(element, other) {
+  if (element.descriptor.get !== undefined) {
+    other.descriptor.get = element.descriptor.get;
+  } else {
+    other.descriptor.set = element.descriptor.set;
+  }
+}
+
+function _coalesceClassElements(elements) {
+  var newElements = [];
+
+  var isSameElement = function isSameElement(other) {
+    return other.kind === "method" && other.key === element.key && other.placement === element.placement;
+  };
+
+  for (var i = 0; i < elements.length; i++) {
+    var element = elements[i];
+    var other;
+
+    if (element.kind === "method" && (other = newElements.find(isSameElement))) {
+      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
+        if (_hasDecorators(element) || _hasDecorators(other)) {
+          throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
+        }
+
+        other.descriptor = element.descriptor;
+      } else {
+        if (_hasDecorators(element)) {
+          if (_hasDecorators(other)) {
+            throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
+          }
+
+          other.decorators = element.decorators;
+        }
+
+        _coalesceGetterSetter(element, other);
+      }
+    } else {
+      newElements.push(element);
+    }
+  }
+
+  return newElements;
+}
+
+function _hasDecorators(element) {
+  return element.decorators && element.decorators.length;
+}
+
+function _isDataDescriptor(desc) {
+  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
+}
+
+function _optionalCallableProperty(obj, name) {
+  var value = obj[name];
+
+  if (value !== undefined && typeof value !== "function") {
+    throw new TypeError("Expected '" + name + "' to be a function");
+  }
+
+  return value;
+}
+
+module.exports = _decorate, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 16 - 0
node_modules/@babel/runtime/helpers/defaults.js

@@ -0,0 +1,16 @@
+function _defaults(obj, defaults) {
+  var keys = Object.getOwnPropertyNames(defaults);
+
+  for (var i = 0; i < keys.length; i++) {
+    var key = keys[i];
+    var value = Object.getOwnPropertyDescriptor(defaults, key);
+
+    if (value && value.configurable && obj[key] === undefined) {
+      Object.defineProperty(obj, key, value);
+    }
+  }
+
+  return obj;
+}
+
+module.exports = _defaults, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 24 - 0
node_modules/@babel/runtime/helpers/defineEnumerableProperties.js

@@ -0,0 +1,24 @@
+function _defineEnumerableProperties(obj, descs) {
+  for (var key in descs) {
+    var desc = descs[key];
+    desc.configurable = desc.enumerable = true;
+    if ("value" in desc) desc.writable = true;
+    Object.defineProperty(obj, key, desc);
+  }
+
+  if (Object.getOwnPropertySymbols) {
+    var objectSymbols = Object.getOwnPropertySymbols(descs);
+
+    for (var i = 0; i < objectSymbols.length; i++) {
+      var sym = objectSymbols[i];
+      var desc = descs[sym];
+      desc.configurable = desc.enumerable = true;
+      if ("value" in desc) desc.writable = true;
+      Object.defineProperty(obj, sym, desc);
+    }
+  }
+
+  return obj;
+}
+
+module.exports = _defineEnumerableProperties, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 16 - 0
node_modules/@babel/runtime/helpers/defineProperty.js

@@ -0,0 +1,16 @@
+function _defineProperty(obj, key, value) {
+  if (key in obj) {
+    Object.defineProperty(obj, key, {
+      value: value,
+      enumerable: true,
+      configurable: true,
+      writable: true
+    });
+  } else {
+    obj[key] = value;
+  }
+
+  return obj;
+}
+
+module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 95 - 0
node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js

@@ -0,0 +1,95 @@
+import AwaitValue from "./AwaitValue.js";
+export default function AsyncGenerator(gen) {
+  var front, back;
+
+  function send(key, arg) {
+    return new Promise(function (resolve, reject) {
+      var request = {
+        key: key,
+        arg: arg,
+        resolve: resolve,
+        reject: reject,
+        next: null
+      };
+
+      if (back) {
+        back = back.next = request;
+      } else {
+        front = back = request;
+        resume(key, arg);
+      }
+    });
+  }
+
+  function resume(key, arg) {
+    try {
+      var result = gen[key](arg);
+      var value = result.value;
+      var wrappedAwait = value instanceof AwaitValue;
+      Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
+        if (wrappedAwait) {
+          resume(key === "return" ? "return" : "next", arg);
+          return;
+        }
+
+        settle(result.done ? "return" : "normal", arg);
+      }, function (err) {
+        resume("throw", err);
+      });
+    } catch (err) {
+      settle("throw", err);
+    }
+  }
+
+  function settle(type, value) {
+    switch (type) {
+      case "return":
+        front.resolve({
+          value: value,
+          done: true
+        });
+        break;
+
+      case "throw":
+        front.reject(value);
+        break;
+
+      default:
+        front.resolve({
+          value: value,
+          done: false
+        });
+        break;
+    }
+
+    front = front.next;
+
+    if (front) {
+      resume(front.key, front.arg);
+    } else {
+      back = null;
+    }
+  }
+
+  this._invoke = send;
+
+  if (typeof gen["return"] !== "function") {
+    this["return"] = undefined;
+  }
+}
+
+AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
+  return this;
+};
+
+AsyncGenerator.prototype.next = function (arg) {
+  return this._invoke("next", arg);
+};
+
+AsyncGenerator.prototype["throw"] = function (arg) {
+  return this._invoke("throw", arg);
+};
+
+AsyncGenerator.prototype["return"] = function (arg) {
+  return this._invoke("return", arg);
+};

+ 3 - 0
node_modules/@babel/runtime/helpers/esm/AwaitValue.js

@@ -0,0 +1,3 @@
+export default function _AwaitValue(value) {
+  this.wrapped = value;
+}

+ 28 - 0
node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js

@@ -0,0 +1,28 @@
+export default function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
+  var desc = {};
+  Object.keys(descriptor).forEach(function (key) {
+    desc[key] = descriptor[key];
+  });
+  desc.enumerable = !!desc.enumerable;
+  desc.configurable = !!desc.configurable;
+
+  if ('value' in desc || desc.initializer) {
+    desc.writable = true;
+  }
+
+  desc = decorators.slice().reverse().reduce(function (desc, decorator) {
+    return decorator(target, property, desc) || desc;
+  }, desc);
+
+  if (context && desc.initializer !== void 0) {
+    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
+    desc.initializer = undefined;
+  }
+
+  if (desc.initializer === void 0) {
+    Object.defineProperty(target, property, desc);
+    desc = null;
+  }
+
+  return desc;
+}

+ 282 - 0
node_modules/@babel/runtime/helpers/esm/applyDecs.js

@@ -0,0 +1,282 @@
+import _typeof from "./typeof.js";
+
+function createMetadataMethodsForProperty(metadataMap, kind, property, decoratorFinishedRef) {
+  return {
+    getMetadata: function getMetadata(key) {
+      assertNotFinished(decoratorFinishedRef, "getMetadata"), assertMetadataKey(key);
+      var metadataForKey = metadataMap[key];
+      if (void 0 !== metadataForKey) if (1 === kind) {
+        var pub = metadataForKey["public"];
+        if (void 0 !== pub) return pub[property];
+      } else if (2 === kind) {
+        var priv = metadataForKey["private"];
+        if (void 0 !== priv) return priv.get(property);
+      } else if (Object.hasOwnProperty.call(metadataForKey, "constructor")) return metadataForKey.constructor;
+    },
+    setMetadata: function setMetadata(key, value) {
+      assertNotFinished(decoratorFinishedRef, "setMetadata"), assertMetadataKey(key);
+      var metadataForKey = metadataMap[key];
+
+      if (void 0 === metadataForKey && (metadataForKey = metadataMap[key] = {}), 1 === kind) {
+        var pub = metadataForKey["public"];
+        void 0 === pub && (pub = metadataForKey["public"] = {}), pub[property] = value;
+      } else if (2 === kind) {
+        var priv = metadataForKey.priv;
+        void 0 === priv && (priv = metadataForKey["private"] = new Map()), priv.set(property, value);
+      } else metadataForKey.constructor = value;
+    }
+  };
+}
+
+function convertMetadataMapToFinal(obj, metadataMap) {
+  var parentMetadataMap = obj[Symbol.metadata || Symbol["for"]("Symbol.metadata")],
+      metadataKeys = Object.getOwnPropertySymbols(metadataMap);
+
+  if (0 !== metadataKeys.length) {
+    for (var i = 0; i < metadataKeys.length; i++) {
+      var key = metadataKeys[i],
+          metaForKey = metadataMap[key],
+          parentMetaForKey = parentMetadataMap ? parentMetadataMap[key] : null,
+          pub = metaForKey["public"],
+          parentPub = parentMetaForKey ? parentMetaForKey["public"] : null;
+      pub && parentPub && Object.setPrototypeOf(pub, parentPub);
+      var priv = metaForKey["private"];
+
+      if (priv) {
+        var privArr = Array.from(priv.values()),
+            parentPriv = parentMetaForKey ? parentMetaForKey["private"] : null;
+        parentPriv && (privArr = privArr.concat(parentPriv)), metaForKey["private"] = privArr;
+      }
+
+      parentMetaForKey && Object.setPrototypeOf(metaForKey, parentMetaForKey);
+    }
+
+    parentMetadataMap && Object.setPrototypeOf(metadataMap, parentMetadataMap), obj[Symbol.metadata || Symbol["for"]("Symbol.metadata")] = metadataMap;
+  }
+}
+
+function createAddInitializerMethod(initializers, decoratorFinishedRef) {
+  return function (initializer) {
+    assertNotFinished(decoratorFinishedRef, "addInitializer"), assertCallable(initializer, "An initializer"), initializers.push(initializer);
+  };
+}
+
+function memberDec(dec, name, desc, metadataMap, initializers, kind, isStatic, isPrivate, value) {
+  var kindStr;
+
+  switch (kind) {
+    case 1:
+      kindStr = "accessor";
+      break;
+
+    case 2:
+      kindStr = "method";
+      break;
+
+    case 3:
+      kindStr = "getter";
+      break;
+
+    case 4:
+      kindStr = "setter";
+      break;
+
+    default:
+      kindStr = "field";
+  }
+
+  var metadataKind,
+      metadataName,
+      ctx = {
+    kind: kindStr,
+    name: isPrivate ? "#" + name : name,
+    isStatic: isStatic,
+    isPrivate: isPrivate
+  },
+      decoratorFinishedRef = {
+    v: !1
+  };
+
+  if (0 !== kind && (ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef)), isPrivate) {
+    metadataKind = 2, metadataName = Symbol(name);
+    var access = {};
+    0 === kind ? (access.get = desc.get, access.set = desc.set) : 2 === kind ? access.get = function () {
+      return desc.value;
+    } : (1 !== kind && 3 !== kind || (access.get = function () {
+      return desc.get.call(this);
+    }), 1 !== kind && 4 !== kind || (access.set = function (v) {
+      desc.set.call(this, v);
+    })), ctx.access = access;
+  } else metadataKind = 1, metadataName = name;
+
+  try {
+    return dec(value, Object.assign(ctx, createMetadataMethodsForProperty(metadataMap, metadataKind, metadataName, decoratorFinishedRef)));
+  } finally {
+    decoratorFinishedRef.v = !0;
+  }
+}
+
+function assertNotFinished(decoratorFinishedRef, fnName) {
+  if (decoratorFinishedRef.v) throw new Error("attempted to call " + fnName + " after decoration was finished");
+}
+
+function assertMetadataKey(key) {
+  if ("symbol" != _typeof(key)) throw new TypeError("Metadata keys must be symbols, received: " + key);
+}
+
+function assertCallable(fn, hint) {
+  if ("function" != typeof fn) throw new TypeError(hint + " must be a function");
+}
+
+function assertValidReturnValue(kind, value) {
+  var type = _typeof(value);
+
+  if (1 === kind) {
+    if ("object" !== type || null === value) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
+    void 0 !== value.get && assertCallable(value.get, "accessor.get"), void 0 !== value.set && assertCallable(value.set, "accessor.set"), void 0 !== value.init && assertCallable(value.init, "accessor.init"), void 0 !== value.initializer && assertCallable(value.initializer, "accessor.initializer");
+  } else if ("function" !== type) {
+    var hint;
+    throw hint = 0 === kind ? "field" : 10 === kind ? "class" : "method", new TypeError(hint + " decorators must return a function or void 0");
+  }
+}
+
+function getInit(desc) {
+  var initializer;
+  return null == (initializer = desc.init) && (initializer = desc.initializer) && "undefined" != typeof console && console.warn(".initializer has been renamed to .init as of March 2022"), initializer;
+}
+
+function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, metadataMap, initializers) {
+  var desc,
+      initializer,
+      value,
+      newValue,
+      get,
+      set,
+      decs = decInfo[0];
+  if (isPrivate ? desc = 0 === kind || 1 === kind ? {
+    get: decInfo[3],
+    set: decInfo[4]
+  } : 3 === kind ? {
+    get: decInfo[3]
+  } : 4 === kind ? {
+    set: decInfo[3]
+  } : {
+    value: decInfo[3]
+  } : 0 !== kind && (desc = Object.getOwnPropertyDescriptor(base, name)), 1 === kind ? value = {
+    get: desc.get,
+    set: desc.set
+  } : 2 === kind ? value = desc.value : 3 === kind ? value = desc.get : 4 === kind && (value = desc.set), "function" == typeof decs) void 0 !== (newValue = memberDec(decs, name, desc, metadataMap, initializers, kind, isStatic, isPrivate, value)) && (assertValidReturnValue(kind, newValue), 0 === kind ? initializer = newValue : 1 === kind ? (initializer = getInit(newValue), get = newValue.get || value.get, set = newValue.set || value.set, value = {
+    get: get,
+    set: set
+  }) : value = newValue);else for (var i = decs.length - 1; i >= 0; i--) {
+    var newInit;
+    if (void 0 !== (newValue = memberDec(decs[i], name, desc, metadataMap, initializers, kind, isStatic, isPrivate, value))) assertValidReturnValue(kind, newValue), 0 === kind ? newInit = newValue : 1 === kind ? (newInit = getInit(newValue), get = newValue.get || value.get, set = newValue.set || value.set, value = {
+      get: get,
+      set: set
+    }) : value = newValue, void 0 !== newInit && (void 0 === initializer ? initializer = newInit : "function" == typeof initializer ? initializer = [initializer, newInit] : initializer.push(newInit));
+  }
+
+  if (0 === kind || 1 === kind) {
+    if (void 0 === initializer) initializer = function initializer(instance, init) {
+      return init;
+    };else if ("function" != typeof initializer) {
+      var ownInitializers = initializer;
+
+      initializer = function initializer(instance, init) {
+        for (var value = init, i = 0; i < ownInitializers.length; i++) {
+          value = ownInitializers[i].call(instance, value);
+        }
+
+        return value;
+      };
+    } else {
+      var originalInitializer = initializer;
+
+      initializer = function initializer(instance, init) {
+        return originalInitializer.call(instance, init);
+      };
+    }
+    ret.push(initializer);
+  }
+
+  0 !== kind && (1 === kind ? (desc.get = value.get, desc.set = value.set) : 2 === kind ? desc.value = value : 3 === kind ? desc.get = value : 4 === kind && (desc.set = value), isPrivate ? 1 === kind ? (ret.push(function (instance, args) {
+    return value.get.call(instance, args);
+  }), ret.push(function (instance, args) {
+    return value.set.call(instance, args);
+  })) : 2 === kind ? ret.push(value) : ret.push(function (instance, args) {
+    return value.call(instance, args);
+  }) : Object.defineProperty(base, name, desc));
+}
+
+function applyMemberDecs(ret, Class, protoMetadataMap, staticMetadataMap, decInfos) {
+  for (var protoInitializers, staticInitializers, existingProtoNonFields = new Map(), existingStaticNonFields = new Map(), i = 0; i < decInfos.length; i++) {
+    var decInfo = decInfos[i];
+
+    if (Array.isArray(decInfo)) {
+      var base,
+          metadataMap,
+          initializers,
+          kind = decInfo[1],
+          name = decInfo[2],
+          isPrivate = decInfo.length > 3,
+          isStatic = kind >= 5;
+
+      if (isStatic ? (base = Class, metadataMap = staticMetadataMap, 0 !== (kind -= 5) && (initializers = staticInitializers = staticInitializers || [])) : (base = Class.prototype, metadataMap = protoMetadataMap, 0 !== kind && (initializers = protoInitializers = protoInitializers || [])), 0 !== kind && !isPrivate) {
+        var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields,
+            existingKind = existingNonFields.get(name) || 0;
+        if (!0 === existingKind || 3 === existingKind && 4 !== kind || 4 === existingKind && 3 !== kind) throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
+        !existingKind && kind > 2 ? existingNonFields.set(name, kind) : existingNonFields.set(name, !0);
+      }
+
+      applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, metadataMap, initializers);
+    }
+  }
+
+  pushInitializers(ret, protoInitializers), pushInitializers(ret, staticInitializers);
+}
+
+function pushInitializers(ret, initializers) {
+  initializers && ret.push(function (instance) {
+    for (var i = 0; i < initializers.length; i++) {
+      initializers[i].call(instance);
+    }
+
+    return instance;
+  });
+}
+
+function applyClassDecs(ret, targetClass, metadataMap, classDecs) {
+  if (classDecs.length > 0) {
+    for (var initializers = [], newClass = targetClass, name = targetClass.name, i = classDecs.length - 1; i >= 0; i--) {
+      var decoratorFinishedRef = {
+        v: !1
+      };
+
+      try {
+        var ctx = Object.assign({
+          kind: "class",
+          name: name,
+          addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef)
+        }, createMetadataMethodsForProperty(metadataMap, 0, name, decoratorFinishedRef)),
+            nextNewClass = classDecs[i](newClass, ctx);
+      } finally {
+        decoratorFinishedRef.v = !0;
+      }
+
+      void 0 !== nextNewClass && (assertValidReturnValue(10, nextNewClass), newClass = nextNewClass);
+    }
+
+    ret.push(newClass, function () {
+      for (var i = 0; i < initializers.length; i++) {
+        initializers[i].call(newClass);
+      }
+    });
+  }
+}
+
+export default function applyDecs(targetClass, memberDecs, classDecs) {
+  var ret = [],
+      staticMetadataMap = {},
+      protoMetadataMap = {};
+  return applyMemberDecs(ret, targetClass, protoMetadataMap, staticMetadataMap, memberDecs), convertMetadataMapToFinal(targetClass.prototype, protoMetadataMap), applyClassDecs(ret, targetClass, staticMetadataMap, classDecs), convertMetadataMapToFinal(targetClass, staticMetadataMap), ret;
+}

+ 9 - 0
node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js

@@ -0,0 +1,9 @@
+export default function _arrayLikeToArray(arr, len) {
+  if (len == null || len > arr.length) len = arr.length;
+
+  for (var i = 0, arr2 = new Array(len); i < len; i++) {
+    arr2[i] = arr[i];
+  }
+
+  return arr2;
+}

+ 3 - 0
node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js

@@ -0,0 +1,3 @@
+export default function _arrayWithHoles(arr) {
+  if (Array.isArray(arr)) return arr;
+}

+ 4 - 0
node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js

@@ -0,0 +1,4 @@
+import arrayLikeToArray from "./arrayLikeToArray.js";
+export default function _arrayWithoutHoles(arr) {
+  if (Array.isArray(arr)) return arrayLikeToArray(arr);
+}

+ 7 - 0
node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js

@@ -0,0 +1,7 @@
+export default function _assertThisInitialized(self) {
+  if (self === void 0) {
+    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+  }
+
+  return self;
+}

+ 54 - 0
node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js

@@ -0,0 +1,54 @@
+export default function _asyncGeneratorDelegate(inner, awaitWrap) {
+  var iter = {},
+      waiting = false;
+
+  function pump(key, value) {
+    waiting = true;
+    value = new Promise(function (resolve) {
+      resolve(inner[key](value));
+    });
+    return {
+      done: false,
+      value: awaitWrap(value)
+    };
+  }
+
+  ;
+
+  iter[typeof Symbol !== "undefined" && Symbol.iterator || "@@iterator"] = function () {
+    return this;
+  };
+
+  iter.next = function (value) {
+    if (waiting) {
+      waiting = false;
+      return value;
+    }
+
+    return pump("next", value);
+  };
+
+  if (typeof inner["throw"] === "function") {
+    iter["throw"] = function (value) {
+      if (waiting) {
+        waiting = false;
+        throw value;
+      }
+
+      return pump("throw", value);
+    };
+  }
+
+  if (typeof inner["return"] === "function") {
+    iter["return"] = function (value) {
+      if (waiting) {
+        waiting = false;
+        return value;
+      }
+
+      return pump("return", value);
+    };
+  }
+
+  return iter;
+}

Some files were not shown because too many files changed in this diff