liukang před 1 rokem
revize
eafe03de09
100 změnil soubory, kde provedl 5953 přidání a 0 odebrání
  1. 2 0
      .gitignore
  2. 23 0
      .hbuilderx/launch.json
  3. 200 0
      App.vue
  4. 35 0
      components/comment/child.vue
  5. 353 0
      components/comment/index.vue
  6. 396 0
      components/j-calendar/j-calendar.vue
  7. 229 0
      components/list-info/index.vue
  8. 66 0
      components/qiandao/index.vue
  9. 1136 0
      components/richtext-editor/richtext-editor.vue
  10. 77 0
      components/swiper-list/index.vue
  11. 58 0
      components/video-list/index.vue
  12. 74 0
      components/wenzhang-info/index.vue
  13. 222 0
      components/yx-vip/index.vue
  14. 79 0
      components/yz-qr/changelog.md
  15. 1123 0
      components/yz-qr/weapp-qrcode.js
  16. 106 0
      components/yz-qr/yz-qr.vue
  17. 20 0
      index.html
  18. 28 0
      main.js
  19. 245 0
      manifest.json
  20. binární
      nativeplugins/JG-JCore/android/libs/jcore-android-4.4.0.jar
  21. binární
      nativeplugins/JG-JCore/android/uniplugin_jcore-release.aar
  22. 17 0
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/Headers/JCoreModule.h
  23. binární
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/Info.plist
  24. binární
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/UniPluginJCore
  25. binární
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeDirectory
  26. binární
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeRequirements
  27. binární
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeRequirements-1
  28. 117 0
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeResources
  29. binární
      nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeSignature
  30. 61 0
      nativeplugins/JG-JCore/package.json
  31. binární
      nativeplugins/JG-JPush/android/HiPushSDK-7.0.61.302.aar
  32. binární
      nativeplugins/JG-JPush/android/agconnect-core-1.7.3.302.aar
  33. binární
      nativeplugins/JG-JPush/android/availableupdate-6.9.0.300.aar
  34. binární
      nativeplugins/JG-JPush/android/base-6.9.0.300.aar
  35. binární
      nativeplugins/JG-JPush/android/baselegacyapi-6.9.0.300.aar
  36. binární
      nativeplugins/JG-JPush/android/com.heytap.msp-push-3.1.0.aar
  37. binární
      nativeplugins/JG-JPush/android/device-6.9.0.300.aar
  38. binární
      nativeplugins/JG-JPush/android/firebase-common-20.3.1.aar
  39. binární
      nativeplugins/JG-JPush/android/firebase-components-17.1.0.aar
  40. binární
      nativeplugins/JG-JPush/android/firebase-datatransport-18.1.7.aar
  41. binární
      nativeplugins/JG-JPush/android/firebase-encoders-json-18.0.0.aar
  42. binární
      nativeplugins/JG-JPush/android/firebase-iid-interop-17.1.0.aar
  43. binární
      nativeplugins/JG-JPush/android/firebase-installations-17.1.3.aar
  44. binární
      nativeplugins/JG-JPush/android/firebase-installations-interop-17.1.0.aar
  45. binární
      nativeplugins/JG-JPush/android/firebase-measurement-connector-19.0.0.aar
  46. binární
      nativeplugins/JG-JPush/android/firebase-messaging-23.1.2.aar
  47. binární
      nativeplugins/JG-JPush/android/hatool-6.9.0.300.aar
  48. binární
      nativeplugins/JG-JPush/android/libs/MiPush_SDK_Client_5_7_8-C.jar
  49. binární
      nativeplugins/JG-JPush/android/libs/commons-codec-1.6.jar
  50. binární
      nativeplugins/JG-JPush/android/libs/error_prone_annotations-2.9.0.jar
  51. binární
      nativeplugins/JG-JPush/android/libs/firebase-annotations-16.2.0.jar
  52. binární
      nativeplugins/JG-JPush/android/libs/firebase-encoders-17.0.0.jar
  53. binární
      nativeplugins/JG-JPush/android/libs/firebase-encoders-proto-16.0.0.jar
  54. binární
      nativeplugins/JG-JPush/android/libs/javax.inject-1.jar
  55. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-5.2.0.jar
  56. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-plugin-fcm-v5.2.0.jar
  57. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-plugin-honor-v5.2.0.jar
  58. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-plugin-huawei-v5.2.0.jar
  59. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-plugin-meizu-v5.2.0.jar
  60. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-plugin-oppo-v5.2.0.jar
  61. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-plugin-vivo-v5.2.0.jar
  62. binární
      nativeplugins/JG-JPush/android/libs/jpush-android-plugin-xiaomi-v5.2.0.jar
  63. binární
      nativeplugins/JG-JPush/android/libs/meizu-push-4.2.3.jar
  64. binární
      nativeplugins/JG-JPush/android/libs/tasks-1.5.2.206.jar
  65. binární
      nativeplugins/JG-JPush/android/log-6.9.0.300.aar
  66. binární
      nativeplugins/JG-JPush/android/network-common-6.0.2.300.aar
  67. binární
      nativeplugins/JG-JPush/android/network-framework-compat-6.0.2.300.aar
  68. binární
      nativeplugins/JG-JPush/android/network-grs-6.0.2.300.aar
  69. binární
      nativeplugins/JG-JPush/android/opendevice-6.11.0.300.aar
  70. binární
      nativeplugins/JG-JPush/android/play-services-base-18.0.1.aar
  71. binární
      nativeplugins/JG-JPush/android/play-services-basement-18.1.0.aar
  72. binární
      nativeplugins/JG-JPush/android/play-services-cloud-messaging-17.0.1.aar
  73. binární
      nativeplugins/JG-JPush/android/play-services-stats-17.0.2.aar
  74. binární
      nativeplugins/JG-JPush/android/play-services-tasks-18.0.2.aar
  75. binární
      nativeplugins/JG-JPush/android/push-6.11.0.300.aar
  76. binární
      nativeplugins/JG-JPush/android/push_sdk_v3.0.0.7_488.aar
  77. binární
      nativeplugins/JG-JPush/android/security-base-1.2.0.307.aar
  78. binární
      nativeplugins/JG-JPush/android/security-encrypt-1.2.0.307.aar
  79. binární
      nativeplugins/JG-JPush/android/security-ssl-1.2.0.307.aar
  80. binární
      nativeplugins/JG-JPush/android/stats-6.9.0.300.aar
  81. binární
      nativeplugins/JG-JPush/android/transport-api-3.0.0.aar
  82. binární
      nativeplugins/JG-JPush/android/transport-backend-cct-3.1.8.aar
  83. binární
      nativeplugins/JG-JPush/android/transport-runtime-3.1.8.aar
  84. binární
      nativeplugins/JG-JPush/android/ui-6.9.0.300.aar
  85. binární
      nativeplugins/JG-JPush/android/uniplugin_jpush-release.aar
  86. 17 0
      nativeplugins/JG-JPush/ios/UniPluginJPush.framework/Headers/JPushModule.h
  87. binární
      nativeplugins/JG-JPush/ios/UniPluginJPush.framework/Info.plist
  88. binární
      nativeplugins/JG-JPush/ios/UniPluginJPush.framework/UniPluginJPush
  89. 165 0
      nativeplugins/JG-JPush/package.json
  90. 22 0
      node_modules/@babel/runtime/LICENSE
  91. 19 0
      node_modules/@babel/runtime/README.md
  92. 64 0
      node_modules/@babel/runtime/helpers/AsyncGenerator.js
  93. 4 0
      node_modules/@babel/runtime/helpers/AwaitValue.js
  94. 4 0
      node_modules/@babel/runtime/helpers/OverloadYield.js
  95. 24 0
      node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js
  96. 236 0
      node_modules/@babel/runtime/helpers/applyDecs.js
  97. 184 0
      node_modules/@babel/runtime/helpers/applyDecs2203.js
  98. 191 0
      node_modules/@babel/runtime/helpers/applyDecs2203R.js
  99. 222 0
      node_modules/@babel/runtime/helpers/applyDecs2301.js
  100. 134 0
      node_modules/@babel/runtime/helpers/applyDecs2305.js

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+/unpackage/
+.DS_Store

+ 23 - 0
.hbuilderx/launch.json

@@ -0,0 +1,23 @@
+{
+    // 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" : [
+        {
+            "app-plus" : {
+                "launchtype" : "local"
+            },
+            "default" : {
+                "launchtype" : "local"
+            },
+            "mp-weixin" : {
+                "launchtype" : "local"
+            },
+            "type" : "uniCloud"
+        },
+        {
+            "playground" : "standard",
+            "type" : "uni-app:app-android"
+        }
+    ]
+}

+ 200 - 0
App.vue

@@ -0,0 +1,200 @@
+<script>
+	var jpushModule = uni.requireNativePlugin("JG-JPush")
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+			if(uni.getSystemInfoSync().platform == "ios"){
+				// 请求定位权限
+				let locationServicesEnabled = jpushModule.locationServicesEnabled()
+				let locationAuthorizationStatus = jpushModule.getLocationAuthorizationStatus()
+				console.log('locationAuthorizationStatus',locationAuthorizationStatus)	
+				if (locationServicesEnabled == true && locationAuthorizationStatus < 3) {
+					jpushModule.requestLocationAuthorization((result)=>{
+						console.log('定位权限',result.status)
+					})
+				}
+				
+				
+				jpushModule.requestNotificationAuthorization((result)=>{
+					let status = result.status
+					if (status < 2) {
+						uni.showToast({
+							icon: 'none',
+							title: '您还没有打开通知权限',
+							duration: 3000
+						})
+					}
+				})
+				jpushModule.addGeofenceListener(result=>{
+					let code = result.code
+					let type = result.type
+					let geofenceId = result.geofenceId
+					let userInfo = result.userInfo
+					uni.showToast({
+						icon: 'none',
+						title: '触发地理围栏',
+						duration: 3000
+					})
+				})
+			
+			}
+			
+			jpushModule.initJPushService();
+			jpushModule.setLoggerEnable(true);
+			jpushModule.addConnectEventListener(result=>{
+				let connectEnable = result.connectEnable
+				uni.$emit('connectStatusChange',connectEnable)
+			});
+			
+			jpushModule.addNotificationListener(result=>{
+				let notificationEventType = result.notificationEventType
+				let messageID = result.messageID
+				let title = result.title
+				let content = result.content
+				let extras = result.extras
+				
+				uni.showToast({
+					icon: 'none',
+					title: JSON.stringify(result),
+					duration: 3000
+				})
+			});
+			
+			jpushModule.addCustomMessageListener(result=>{
+				let type = result.type
+				let messageType = result.messageType
+				let content = result.content
+				uni.showToast({
+					icon: 'none',
+					title: JSON.stringify(result),
+					duration: 3000
+				})
+			})
+			
+			jpushModule.addLocalNotificationListener(result=>{
+				let messageID = result.messageID
+				let title = result.title
+				let content = result.content
+				let extras = result.extras
+				uni.showToast({
+					icon: 'none',
+					title: JSON.stringify(result),
+					duration: 3000
+				})
+			})
+			
+			jpushModule.addGeofenceListener(result=>{
+				let code = result.code
+				let type = result.type
+				let geofenceId = result.geofenceId
+				let userInfo = result.userInfo
+				uni.showToast({
+					icon: 'none',
+					title: '触发地理围栏',
+					duration: 3000
+				})
+			})
+			
+			jpushModule.setIsAllowedInMessagePop(true)
+			jpushModule.pullInMessage(result=>{
+				let code = result.code
+				console.log(code)
+			})
+			
+			jpushModule.addInMessageListener(result=>{
+				let eventType = result.eventType
+				let messageType = result.messageType
+				let content = result.content
+				console.log('inMessageListener',eventType,messageType,content)
+				
+				uni.showToast({
+					icon: 'none',
+					title: JSON.stringify(result),
+					duration: 3000
+				})
+			})
+			
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "uview-ui/index.scss";
+	/*每个页面公共css */
+	.empty {
+		padding: 40rpx 0;
+	}
+	.content {
+		width: 100vw;
+		min-height: 100vh;
+		background: #F5F5F5;
+		box-sizing: border-box;
+		position: relative;
+	}
+	.hflex {
+		display: flex;
+		flex-direction: row;
+		flex-wrap: nowrap;
+	}
+	.vflex {
+		display: flex;
+		flex-direction: column;
+		flex-wrap: nowrap;
+	}
+	.jbetween {
+		justify-content: space-between;
+	}
+	.jaround {
+		justify-content: space-around;
+	}
+	.jend {
+		justify-content: flex-end;
+	}
+	.jcenter {
+		justify-content: center;
+	}
+	.acenter {
+		align-items: center;
+	}
+	.abetween {
+		align-content: space-between;
+	}
+	.astart {
+		align-items: flex-start;
+	}
+	.aend {
+		align-items: flex-end;
+	}
+	.fwrap {
+		flex-wrap: wrap;
+	}
+	.text_hide {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+	.text_hide2 {
+		text-overflow: -o-ellipsis-lastline;
+		overflow: hidden;				//溢出内容隐藏
+		text-overflow: ellipsis;		//文本溢出部分用省略号表示
+		display: -webkit-box;			//特别显示模式
+		-webkit-line-clamp: 2;			//行数
+		line-clamp: 2;					
+		-webkit-box-orient: vertical;	//盒子中内容竖直排列
+	}
+	.text_hide3 {
+		text-overflow: -o-ellipsis-lastline;
+		overflow: hidden;				//溢出内容隐藏
+		text-overflow: ellipsis;		//文本溢出部分用省略号表示
+		display: -webkit-box;			//特别显示模式
+		-webkit-line-clamp: 3;			//行数
+		line-clamp: 3;					
+		-webkit-box-orient: vertical;	//盒子中内容竖直排列
+	}
+</style>

+ 35 - 0
components/comment/child.vue

@@ -0,0 +1,35 @@
+<template>
+	<view class="content">
+		
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		onLoad() {
+			
+		},
+		onShow() {
+			
+		},
+		onPullDownRefresh() {
+			
+		},
+		onReachBottom() {
+			
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 353 - 0
components/comment/index.vue

@@ -0,0 +1,353 @@
+<template>
+	<view class="pinglun">
+		<view class="pinglun-title">
+			全部评论 
+		</view>
+		<view class="pinglun-item hflex jbetween" v-for="(item,index) in pinglunlist" :key="index">
+			<image class="user-img" :src="item.user.avatar" mode="aspectFill"></image>
+			<view class="pinglun-right">
+				<view class="pinglun-user hflex jbetween">
+					<view class="pinglun-user-center">
+						<text>{{item.user.username || '暂无昵称'}}</text>
+					</view>
+				</view>
+				<view class="pinglun-text">
+					{{item.content}}
+				</view>
+				<view class="hflex acenter jbetween">
+					<view class="pinglun-time hflex acneter">
+						<text>{{item.date}}</text>
+						<text @click="reply(item)">回复</text>
+					</view>
+					<view class="hflex acenter pinglun-dianzan">
+						<image v-if="item.is_like == 0" src="@/static/images/dianzan.png" mode="aspectFill"></image>
+						<image v-else src="@/static/images/dianzan.png" mode="aspectFill"></image>
+						<text>{{item.like_count || '0'}}</text>
+						<image src="@/static/images/cai.png" mode="aspectFill"></image>
+					</view>
+				</view>
+				<view v-if="item.children.length > 0">
+					<view class="pinglun-item2 hflex" v-for="(a,b) in item.children" :key="b">
+						<image class="user-img2" :src="a.user.avatar" mode="aspectFill"></image>
+						<view class="pinglun-right">
+							<view class="pinglun-user hflex">
+								<view class="pinglun-user-center hflex acenter">
+									<text>{{a.user.username}}</text>
+									<u-icon name="play-right-fill" color="#999999" size="16"></u-icon>
+									<text>{{a.parent_user.username}}</text>
+								</view>
+							</view>
+							<view class="pinglun-text">
+								{{a.content}}
+							</view>
+							<view class="hflex acenter jbetween">
+								<view class="pinglun-time hflex acneter">
+									<text>{{a.date}}</text>
+									<text @click="reply(a)">回复</text>
+								</view>
+								<view class="hflex acenter pinglun-dianzan">
+									<image v-if="a.is_like == 0" src="@/static/images/dianzan.png" mode="aspectFill"></image>
+									<image v-else src="@/static/images/dianzan.png" mode=""></image>
+									<text>{{a.like_count || '0'}}</text>
+									<image src="@/static/images/cai.png" mode="aspectFill"></image>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="huifu hflex acenter jbetween" v-if="show">
+			<image :src="user.avatar" mode="aspectFill"></image>
+			<u-input v-model="comment" placeholder="添加新评论" border="none" adjustPosition focus></u-input>
+			<text @click="send">发送</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		props: {
+			show_jianpan: {
+				typeof: Boolean,
+				default: false
+			},
+			type: {
+				typeof: String,
+				default: ''
+			},
+			id: {
+				typeof: String,
+				default: ''
+			},
+			user: {
+				typeof: Object,
+				default: {}
+			}
+		},
+		
+		
+		watch: {
+			show_jianpan(newval,oldval) {
+				this.show = newval
+			},
+		},
+		data() {
+			return {
+				comment: '',
+				pinglunlist: [],
+				show: false,
+				limit: 10,
+				parent_id: '0'
+			}
+		},
+		mounted() {
+			setTimeout(() => {
+				this.getlist()
+			},300)
+		},
+		methods: {
+			reply(item) {
+				this.show = true
+				this.parent_id = item.id
+			},
+			send() {
+				if(this.comment == '') {
+					uni.$u.toast('请先输入内容')
+					return
+				}
+				var _this = this
+				$api.req({
+					url: 'comment',
+					method: 'post',
+					data: {
+						source_type: _this.type,
+						source_id:  _this.id,
+						content: _this.comment,
+						parent_id: _this.parent_id
+					}
+				},function(res) {
+					if(res.code == 10000) {
+						uni.$u.toast('评论成功')
+						_this.getlist()
+					}
+				})
+			},
+			getlist() {
+				var _this = this
+				$api.req({
+					url: 'comment',
+					method: 'GET',
+					data: {
+						limit: _this.limit,
+						source_type: _this.type,
+						source_id: _this.id,
+						order_type: 'desc'
+					}
+				}, function(res) {
+					if(res.code == 10000) {
+						_this.pinglunlist = res.data
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.pinglun::v-deep {
+		padding: 0 32rpx;
+		box-sizing: border-box;
+		.huifu {
+			position: fixed;
+			bottom: 0;
+			left: 0;
+			height: 160rpx;
+			z-index: 999;
+			background: #FFFFFF;
+			// box-shadow: 0rpx 0rpx 0rpx 0rpx rgba(0,0,0,0.1);
+			padding: 20rpx 28rpx;
+			box-sizing: border-box;
+			width: 100%;
+			image {
+				width: 56rpx !important;
+				height: 56rpx;
+				border-radius: 50%;
+				margin: 0 20rpx 0 0;
+			}
+			text {
+				font-size: 32rpx;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 500;
+				color: #999999;
+			}
+		}
+		.pinglun-item {
+			box-sizing: border-box;
+			width: 100%;
+	
+			.pinglun-right {
+				width: calc(100% - 88rpx);
+				.pinglun-time {
+					margin-bottom: 28rpx;
+	
+					text:first-child {
+						font-size: 24rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #777777;
+						margin-right: 24rpx;
+					}
+	
+					text:nth-child(2) {
+						font-size: 24rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #222222;
+					}
+				}
+	
+				.pinglun-text {
+					padding: 0 36rpx 0 0;
+					font-size: 28rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					margin-bottom: 20rpx;
+				}
+				.pinglun-dianzan {
+					margin-bottom: 28rpx;
+					image {
+						width: 32rpx;
+						height: 32rpx;
+						// margin-right: 4rpx;
+					}
+					
+					text {
+						font-size: 24rpx;
+						font-family: ArialMT;
+						padding: 0 24rpx 0 12rpx;
+						color: #777777;
+					}
+				}
+				.pinglun-user {
+					margin-bottom: 24rpx;
+	
+					
+	
+	
+	
+					.pinglun-user-center {
+						height: 68rpx;
+						.u-icon {
+							padding: 0 16rpx;
+						}
+						text {
+							font-size: 28rpx;
+							font-weight: 500;
+							color: #222222;
+						}
+	
+						
+					}
+				}
+			}
+	
+			.user-img {
+				width: 68rpx;
+				height: 68rpx;
+				border-radius: 50%;
+				margin-right: 20rpx;
+			}
+	
+		}
+		.pinglun-item2 {
+			box-sizing: border-box;
+			width: 100%;
+			
+			.pinglun-right {
+				width: calc(100% - 88rpx);
+				.pinglun-time {
+					margin-bottom: 28rpx;
+			
+					text:first-child {
+						font-size: 24rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #777777;
+						margin-right: 24rpx;
+					}
+			
+					text:nth-child(2) {
+						font-size: 24rpx;
+						font-family: PingFangSC-Regular, PingFang SC;
+						font-weight: 400;
+						color: #222222;
+					}
+				}
+			
+				.pinglun-text {
+					padding: 0 36rpx 0 0;
+					font-size: 28rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #333333;
+					margin-bottom: 20rpx;
+				}
+				.pinglun-dianzan {
+					margin-bottom: 28rpx;
+					image {
+						width: 32rpx;
+						height: 32rpx;
+						// margin-right: 4rpx;
+					}
+					
+					text {
+						font-size: 24rpx;
+						font-family: ArialMT;
+						padding: 0 24rpx 0 12rpx;
+						color: #777777;
+					}
+				}
+				.pinglun-user {
+					margin-bottom: 24rpx;
+			
+					
+			
+			
+			
+					.pinglun-user-center {
+						height: 68rpx;
+						.u-icon {
+							padding: 0 16rpx;
+						}
+						text {
+							font-size: 28rpx;
+							font-weight: 500;
+							color: #222222;
+						}
+			
+						
+					}
+				}
+			}
+			
+			.user-img2 {
+				width: 68rpx;
+				height: 68rpx;
+				border-radius: 50%;
+				margin-right: 20rpx;
+			}
+			
+		}
+	
+		.pinglun-title {
+			font-size: 32rpx;
+			font-family: PingFangSC-Medium, PingFang SC;
+			font-weight: 500;
+			color: #222222;
+			line-height: 112rpx;
+		}
+	}
+</style>

+ 396 - 0
components/j-calendar/j-calendar.vue

@@ -0,0 +1,396 @@
+<template>
+	<!-- 打卡日历页面 -->
+	<view class='all'>
+		<view class="bar acenter">
+			<!-- 上一个月 -->
+			<view class="previous" @click="changeMonth(-1)">
+				<u-icon name="play-left-fill"></u-icon>
+				<!-- <button class="barbtn">{{langType=='ch'?'上一月':'Last'}}</button> -->
+			</view>
+			<!-- 显示年月 -->
+			<view class="date">{{nowYear || "--"}} 年 {{nowMonth || "--"}} 月</view>
+			<!-- 下一个月 -->
+			<view class="next" @click="changeMonth(1)">
+				<u-icon name="play-right-fill"></u-icon>
+				<!-- <button class="barbtn">{{langType=='ch'?'下一月':'Nex/'}}</button> -->
+			</view>
+		</view>
+		<!-- 显示星期 -->
+		<view class="week-area" >
+			<view class="week-txt" v-for="(item,index) in weeksTxt[langType]" :key="index">{{item}}</view>
+		</view>
+		
+		<view  class="myDateTable  hflex acenter jbetween fwrap">
+			<view v-for="(item,j) in calendarDays" :key="j" class='dateCell' :class="item.date==today&&nowMonth==toMonth&&nowYear==toYear ? 'bgBlue' : ''">
+				<view v-if="item.date==undefined||item.date == null" class='cell'></view>
+				<template v-else>
+					<!-- 已签到日期 -->
+					<view v-if="item.isSign == true" class='cell whiteColor'>
+						<u-icon name="checkmark-circle-fill" color="#00b0b0"></u-icon>
+						{{item.date}}
+					</view>
+					<!-- 漏签 -->
+					<view class="cell outSignStyle"  v-else-if="item.isBeforeToday&&item.isThisMonth">
+						<!-- redColor bgGray -->
+						<u-icon name="close-circle-fill" color="#b7b8bd"></u-icon>
+						{{item.date}}
+						<!-- <view class="redDot"></view> -->
+					</view>
+					<!-- 今日未签到-->
+					<view @click="clickSign(item.date,1)" class="cell whiteColor" v-else-if="item.date==today&&nowMonth==toMonth&&nowYear==toYear">
+						{{item.date}}
+					</view>
+					<!-- 当前日期之后 -->
+					<view class="cell" v-else>
+						<view class="circle hflex acenter jcenter">
+							<view class="circle2 hflex acenter jcenter"></view>
+						</view>
+						<!-- <u-icon name="play-left-fill"></u-icon> -->
+						{{item.date}}
+					</view>
+					
+					
+				</template>
+
+			</view>
+		</view>
+	
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				calendarDays: [],
+				SignData: [],// 已经签到的数据
+				nowYear: 0, //当前选的年
+				nowMonth: 0, //当前选的月
+				today: parseInt(new Date().getDate()), //系统本日
+				toMonth: parseInt(new Date().getMonth() + 1), //系统本月
+				toYear: parseInt(new Date().getFullYear()), //系统本年
+				weeksTxt: {
+					ch:['日', '一', '二', '三', '四', '五', '六'],
+					en: ['Sun', 'Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat'],
+				},
+			};
+		},
+		props: {
+			isReplenishSign: { // 是否允许过期补签
+				type: Boolean,
+				default: false
+			},
+			isFullCalendar: { // 是否需要填满日历,前后空的格子填入上/下个月的日期
+				type: Boolean,
+				default: true
+			},
+			yearMonth: { // 2022-01 这种格式,默认当前年月
+				type: String,
+				default: new Date().getFullYear()+'-'+ new Date().getMonth() + 1
+			},
+			dataSource: { //已签到的数据源,例: 5、6号已签到: ["2022-01-05","2022-01-06"],兼容个位数前可加可不加0
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			langType: { //只是示例一个翻译而已,要想所有都翻译自己可以再加加
+				type: String,
+				default: "ch" //en
+			},
+		},
+		created() {
+			if(!(/en|ch/g.test(this.langType))){
+				this.langType='ch'; // 非中英,则固定中文
+			}
+			const ymArr=this.yearMonth.split('-');
+			this.buildCalendar(ymArr[0], ymArr[1]);
+			this.onSignDataChange(this.dataSource);
+		},
+		watch: {
+			dataSource: 'onSignDataChange',
+		},
+		methods: {
+			clickSign(date, type) { //type=0补签,type=1当日签到	
+				return
+				var strTip = "签到";
+				
+				if (type == 0) {
+					if(!this.isReplenishSign){ // 未开启补签,阻止继续执行
+						console.log("————补签功能未开启————");
+						return;
+					}
+					strTip = "补签";
+				}
+				uni.showToast({
+					title:  date + "号" + strTip + "成功",
+					icon: 'success',
+					position:"bottom",
+				});
+				this.$emit('clickChange', this.nowYear + "-" + this.nowMonth + "-" + date); //传给调用模板页面
+				// 父页面要在clickChange里去修改输入的数据源dataSource,否则视图不更新的!
+			},
+			//构建日历数据
+			buildCalendar(y, m){
+				this.nowYear = y;
+				this.nowMonth = m;
+				this.calculateEmptyGrids(y, m);
+				this.calculateDays(y, m);
+				if(this.isFullCalendar){
+					this.fullCell()
+				}
+			},
+			// 监听到签到数据源改变
+			onSignDataChange(newData, oldData = []) {
+				this.SignData = newData;
+				this.matchSign();
+			},
+			//匹配标记已经签到的日子
+			matchSign() {
+				var signs = this.SignData;
+				var daysArr = this.calendarDays;
+				console.log('daysArr',daysArr);
+				for (var i = 0; i < signs.length; i++) {
+					var current = new Date(this.toIOSDate(signs[i].date)).getTime(); // ios只认/格式的日期
+					for (var j = 0; j < daysArr.length; j++) {
+						if(current == new Date(this.toIOSDate(daysArr[j].fullDate)).getTime()){
+								daysArr[j].isSign = signs[i].is_sign;	
+						}
+					}
+				}
+				this.calendarDays = daysArr;
+				// console.log(this.calendarDays );
+			},
+			// 计算当月1号前空了几个格子,把它填充在calendarDays数组的前面
+			calculateEmptyGrids(year, month) {
+				//计算每个月时要清零
+				this.calendarDays = [];
+				const firstDayOfWeek = this.getFirstDayOfWeek(year, month);
+				if (firstDayOfWeek > 0) {
+					for (let i = 0; i < firstDayOfWeek; i++) {
+						this.calendarDays.push({
+							date: null, // 显示的日期
+							fullDate: null, // 日期yyyy-mm-dd格式
+							isBeforeToday: true, // 今日之前
+							isSign: false, // 是否签到
+							isThisMonth:false, // 是本月
+						});
+					}
+				}
+			},
+			// 绘制当月天数占的格子,并把它放到days数组中
+			calculateDays(year, month) {
+				const thisMonthDays = this.getMonthDayLength(year, month);
+				const toDate= new Date(this.toYear+'/'+this.toMonth+'/'+this.today);
+				for (let i = 1; i <= thisMonthDays; i++) {
+					const fullDate=year+'-'+month+'-'+ i;
+					const isBeforeToday=new Date(this.toIOSDate(fullDate)) < toDate;
+					this.calendarDays.push({
+						date: i,
+						fullDate,
+						isBeforeToday,
+						isSign: false,
+						isThisMonth:true,
+					});
+				}
+				//console.log(this.calendarDays);
+			},
+			// 切换控制年月,上一个月,下一个月
+			changeMonth(type) {
+				const nowYear = parseInt(this.nowYear);
+				const nowMonth = parseInt(this.nowMonth);
+				const newObj=this.getOperateMonthDate(nowYear,nowMonth,type);
+				this.buildCalendar(newObj.year, newObj.month); // 重新构建日历数据
+				let m = this.nowMonth
+				if(m<10) {
+					m = '0' + m
+				}
+				this.$emit('dateChange', this.nowYear + "-" + m); //传给调用模板页面去拿新数据				
+			},
+			// 获取当月共多少天,也就是获取月的最后一天
+			getMonthDayLength(year, month) {
+				return new Date(year, month, 0).getDate()
+			},
+			// 获取当月第一天星期几
+			getFirstDayOfWeek(year, month, day=1) {
+				return new Date(Date.UTC(year, month - 1, day)).getDay();
+			},
+			toIOSDate(strDate){ // iso不认识"-"拼接的日期,所以转/
+				return strDate?strDate.replace(/-/g,'/'):strDate;
+			},
+			// 需要填满格子,上/下个月的日期拉出来填满格子
+			fullCell(){
+				const endDay= this.getMonthDayLength(this.nowYear, this.nowMonth);
+				const beforeEmptyLength = this.getFirstDayOfWeek(this.nowYear, this.nowMonth);
+				const afterEmptyLength =  6 - this.getFirstDayOfWeek(this.nowYear, this.nowMonth, endDay);
+
+
+				const last=this.getOperateMonthDate(this.nowYear,this.nowMonth,-1);
+				const lastMonthEndDay=this.getMonthDayLength(last.year, last.month);
+				for (let i = 0; i < beforeEmptyLength; i++) {
+					const date=lastMonthEndDay - beforeEmptyLength + i + 1;
+					this.calendarDays[i].date=date;
+					this.calendarDays[i].fullDate=last.year+"-"+last.month+"-"+date;
+				}
+				const next=this.getOperateMonthDate(this.nowYear,this.nowMonth,1);
+				for (let i = 1; i <= afterEmptyLength; i++) {
+					this.calendarDays.push({
+						date: i, // 显示的日期
+						fullDate: next.year+"-"+next.month+"-"+i, // 日期yyyy-mm-dd格式
+						isBeforeToday: false, // 今日之前
+						isSign: false, // 是否签到
+						isThisMonth:false, // 是本月
+					});
+				}
+				// console.log(beforeEmptyLength,afterEmptyLength,lastMonthEndDay);
+				
+				// console.log(this.calendarDays);
+			},
+			// 获取加/减一个月的日期
+			getOperateMonthDate(yy,mm,num){
+				let month=parseInt(mm) + 	parseInt(num);
+				let year=parseInt(yy);
+				if(month>12){
+					month=1;
+					year++;
+				}else if(month<1){
+					month=12;
+					year--;
+				}
+				return {
+					month,
+					year,
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	
+
+	.all {
+		margin-top: 20rpx;
+		background: #FFFFFF;
+		border-radius: 20rpx;
+		overflow: hidden;
+		z-index: 99;
+	}
+
+	.all .bar {
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+		/* margin: 30rpx 20rpx; */
+		/* padding: 10rpx; */
+		width: 100%;
+		height: 88rpx;
+		background: #C7E8E8;
+		padding: 34rpx;
+		box-sizing: border-box;
+	}
+
+	.bar .barbtn {
+		height: 30px;
+		line-height: 30px;
+		font-size: 12px;
+	}
+
+	.all .week-area {
+		display: flex;
+		justify-content: space-between;
+		padding: 10px 1vw;
+		box-sizing: border-box;
+		width: 91vw;
+		margin: 10px auto;
+		border-radius: 10px;
+	}
+	.all .week-txt {
+		text-align: center;
+		width: 76rpx;
+	}
+	.myDateTable {
+		margin: 0 auto;
+		width: 91vw;
+		padding: 2vw;
+		border-radius: 10px;
+		// background: linear-gradient(#74AADA, #94db98);
+	}
+	.myDateTable .dateCell {
+		width: 76rpx;
+		padding: 1vw;
+		display: inline-block;
+		text-align: center;
+		font-size: 16px;
+		box-sizing: border-box;
+		overflow: hidden;
+		background: #F7F7F7;
+		border-radius: 6rpx;
+		margin: 0 20rpx 16rpx 0;
+	}
+	.dateCell:nth-child(7n+7) {
+		margin: 0 0 16rpx;
+	}
+
+	.dateCell .cell {
+		display: flex;
+		border-radius: 50%;
+		height: 11vw;
+		justify-content: center;
+		align-items: center;
+		box-sizing: border-box;
+		flex-direction: column;
+		color: #999999;
+	}
+	
+	.circle {
+		width: 32rpx;
+		height: 32rpx;
+		background: #CFCFCF;
+		border-radius: 50%;
+	}
+	
+	.circle2 {
+		width: 25rpx;
+		height: 25rpx;
+		background: #969A9A;
+		box-shadow: inset 0rpx 1rpx 1rpx 0rpx #717575;
+		border-radius: 50%;
+	}
+
+	.whiteColor {
+		color: #333333 !important;
+	}
+
+	.greenColor {
+		color: #999999;
+		font-weight: bold;
+	}
+
+	.bgWhite {
+		background-color: #F7F7F7;
+	}
+
+	.bgGray {
+		background-color: rgba(255, 255, 255, 0.42);
+	}
+
+	.bgBlue {
+		background: rgba(0, 176, 176, .1) !important;
+	}
+
+	.redColor {
+		color: #ff0000;
+	}
+	.outSignStyle{
+		border:1px solid #ffffff;
+		color: #999999;
+	}
+	.redDot{
+		width: 3px;
+		height: 3px;
+		border-radius: 50%;
+		background-color: red;
+	}
+	
+</style>

+ 229 - 0
components/list-info/index.vue

@@ -0,0 +1,229 @@
+<template>
+	<view class="list-info" @click="toinfo">
+		<view class="info-header hflex acenter jbetween">
+			<view class="hflex acenter">
+				<image :src="data.user.avatar" mode="aspectFill" class="headera-avatar"></image>
+				<view class="avatar-right">
+					<view class="name hflex acenter">
+						<text>{{data.user.username}}</text>
+						<image src="@/static/images/zuozhe1.png" v-if="data.type == 1" mode="aspectFill" class="type-icon"></image>
+						<image src="@/static/images/zuozhe2.png" v-if="data.type == 2" mode="aspectFill" class="type-icon"></image>
+						<image src="@/static/images/zuozhe3.png" v-if="data.type == 3" mode="aspectFill" class="type-icon"></image>
+					</view>
+					<view class="time">{{data.published_at}}</view>
+				</view>
+			</view>
+			<view class="" style="padding: 20rpx 20rpx;" @click.stop="show_more = true">
+				<u-icon name="more-dot-fill" color="#777777" size="20"></u-icon>
+			</view>
+		</view>
+		<view class="info-content" v-if="type == 'post'">
+			<u-swiper :indicator="true" indicatorMode="dot" :list="data.images" height="452rpx" radius="12rpx" v-if="data.images.length > 0">
+			</u-swiper>
+			<text v-if="data.content">{{data.content}}</text>
+		</view>
+		<view class="info-content" v-if="type != 'post'">
+			<image :src="data.image" mode="aspectFill" class="content-img" v-if="data.image"></image>
+			<!-- <video :src="data.image" controls enable-danmu danmu-btn class="content-img" v-if="data.video"></video> -->
+			<view class="content-title" v-if="data.title">{{data.title}}</view>
+			<u-parse :content="data.content" class="text_hide3"></u-parse>
+		</view>
+		<view class="info-circle hflex acenter" v-if="data.topic_id != 0 && data.topic">
+			<!-- <image :src="data.circle.img" mode="aspectFill"></image> -->
+			<text>{{data.topic.title}}</text>
+		</view>
+		<view class="info-bottom hflex acenter jbetween" v-if="type != 'post'">
+			<view class="hflex acenter">
+				<text>{{data.collect_count || 0}}喜欢 · </text>
+				<text>{{data.comment_count || 0}}评论</text>
+			</view>
+		</view>
+		<view class="info-bottom hflex acenter jbetween" v-if="type =='post'">
+			<view class="hflex acenter">
+				<image src="@/static/images/dianzan.png" mode="aspectFill" v-if="!data.is_like" @click.stop="tolike(data)"></image>
+				<image src="@/static/images/dianzan2.png" mode="aspectFill" v-else @click.stop="tolike(data)"></image>
+				<text class="num" @click.stop="tolike(data)">{{data.like_count}}</text>
+				<image src="@/static/images/pinglun.png" mode="aspectFill"></image>
+				<text class="num">{{data.comment_count}}</text>
+				<image src="@/static/images/shoucang.png" mode="aspectFill" v-if="!data.is_collect" @click.stop="tocollect(data)"></image>
+				<image src="@/static/images/shoucang2.png" mode="aspectFill" v-else @click.stop="tocollect(data)"></image>
+				<text class="num" @click.stop="tocollect(data)">{{data.collect_count}}</text>
+			</view>
+			<image src="@/static/images/fenxiang.png" mode="aspectFill"></image>
+		</view>
+		<u-popup :show="show_more" @close="toclose">
+			<view class="popu">
+				
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		props: {
+			data: {
+				typeof: Object,
+				default: {}
+			},
+			type: {
+				typeof: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				show_more: false,
+			}
+		},
+		methods: {
+			tocollect(item) {
+				var _this = this
+				$api.req({
+					url: 'collect',
+					method: 'POST',
+					data: {
+						source_type: _this.type,
+						source_id: item.id
+					}
+				}, function(res) {
+					if(res.code == 10000) {
+						uni.$u.toast(res.msg)
+						if(_this.data.is_collect == 0) {
+							_this.data.is_collect = item.id
+							_this.data.collect_count += 1
+						} else {
+							_this.data.is_collect = 0
+							_this.data.collect_count -= 1
+						}
+					}
+				})
+			},
+			tolike(item) {
+				var _this = this
+				$api.req({
+					url: 'like',
+					method: 'POST',
+					data: {
+						source_type: _this.type,
+						source_id: item.id
+					}
+				}, function(res) {
+					if(res.code == 10000) {
+						uni.$u.toast(res.msg)
+						if(_this.data.is_like == 0) {
+							_this.data.is_like = item.id
+							_this.data.like_count += 1
+						} else {
+							_this.data.is_like = 0
+							_this.data.like_count -= 1
+						}
+					}
+				})
+			},
+			toclose() {
+				show_more = false
+			},
+			toinfo() {
+				uni.navigateTo({
+					url: '/pageA/info-detail?id=' + this.data.id + '&type=' + this.type
+				})
+				// this.$emit('toinfo',this.data)
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+	.list-info {
+		padding: 28rpx;
+		background: #FFFFFF;
+		margin:  0 0 20rpx;
+		.info-header {
+			.headera-avatar {
+				width: 72rpx;
+				height: 72rpx;
+				border-radius: 50%;
+			}
+			.avatar-right {
+				margin: 0 0 0 16rpx;
+				.name {
+					font-size: 28rpx;
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 500;
+					color: #333333;
+				}
+				.type-icon {
+					width: 124rpx;
+					height: 32rpx;
+					margin: 0 0 0 12rpx;
+				}
+				.time {
+					font-size: 20rpx;
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					color: #999999;
+					padding: 4rpx 0 0;
+				}
+			}
+		}
+		.info-content {
+			box-sizing: border-box;
+			padding: 20rpx 0;
+			.content-img {
+				width: 100%;
+				margin:  0 0 16rpx;
+			}
+			.content-title {
+				font-size: 32rpx;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 600;
+				color: #222222;
+				padding: 0 0 8rpx;
+			}
+			text {
+				font-size: 30rpx;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				color: #333333;
+				padding: 12rpx 0;
+				box-sizing: border-box;
+			}
+		}
+		.info-circle {
+			padding: 24rpx 0 0;
+			background: rgba(0, 176, 176, .1);
+			border-radius: 26rpx;
+			padding: 8rpx 20rpx;
+			max-width: max-content;
+			image {
+				width: 34rpx;
+				height: 34rpx;
+			}
+			text {
+				padding: 0 0 0 5rpx;
+				font-size: 24rpx;
+				font-family: AppleColorEmoji;
+				color: #00B0B0;
+			}
+		}
+		.info-bottom {
+			padding: 40rpx 0 0;
+			image {
+				width: 36rpx;
+				height: 36rpx;
+			}
+			text {
+				font-size: 20rpx;
+				font-family: SFPro, SFPro;
+				font-weight: 400;
+				color: #555555;
+			}
+			.num {
+				
+				padding: 0 50rpx 0 12rpx;
+			}
+		}
+	}
+</style>

+ 66 - 0
components/qiandao/index.vue

@@ -0,0 +1,66 @@
+<template>
+	<view class="qiandao vflex acenter jcenter">
+		<image src="/static/images/qiandao.png" mode="aspectFill"></image>
+		<text>签到成功</text>
+		<text>获得积分+ {{}}</text>
+		<view class="btn">确定</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		onLoad() {
+			
+		},
+		onShow() {
+			
+		},
+		onPullDownRefresh() {
+			
+		},
+		onReachBottom() {
+			
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.qiandao {
+		width: 550rpx;
+		image {
+			width: 270rpx;
+			height: 260rpx;
+			padding: 40rpx;
+		}
+		text {
+			font-size: 28rpx;
+			font-family: SFPro, SFPro;
+			font-weight: 400;
+			color: #222222;
+			padding: 14rpx 0 0;
+		}
+		.btn {
+			margin: 48rpx 0 60rpx;
+			width: 250rpx;
+			height: 80rpx;
+			background: #00B0B0;
+			border-radius: 8rpx;
+			font-size: 32rpx;
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			color: #FFFFFF;
+			line-height: 80rpx;
+			letter-spacing: 1px;
+			text-align: center;
+		}
+	}
+</style>

+ 1136 - 0
components/richtext-editor/richtext-editor.vue

@@ -0,0 +1,1136 @@
+<template>
+	<view class="container">
+		<!-- 编辑器内容@focus="modeShow" -->
+		<view class="main">
+			<!-- //如果不需要跟随键盘弹出注释:style="{ 'height': editorHeight + 'px' }"  mode默认改为true即可 -->
+			<editor @focus="modeShow" :style="{ 'height': editorHeight + 'px' }" @statuschange="selected"
+				class="myEditor" placeholder="写点什么儿~" show-img-size show-img-toolbar show-img-resize
+				@ready="onEditorReady" @blur="onsuccess"></editor>
+		</view>
+
+		<!-- 模块 -->
+		<view class="modes">
+			<!-- 功能选项  :style="{position: 'relative',bottom:keyboardHeight+'px'}"-->
+			<view class="tabName hflex acenter jbetween" @click="ontabtap">
+				<view class="hflex acenter">
+					<image @click="changeImg" v-show="!img" src="@/static/richtext/img.png" :data-current="3" mode="aspectFill"></image>
+					<image @click="changeImg" v-show="img" src="@/static/richtext/imgselect.png" :data-current="3" mode="aspectFill">
+					</image>
+					<image @click="changeFont" v-show="!font" src="@/static/richtext/font.png" :data-current="1" mode="aspectFill"></image>
+					<image @click="changeFont" v-show="font" src="@/static/richtext/fontselect.png" :data-current="1" mode="aspectFill">
+					</image>
+				</view>
+				<!-- <image @click="changeAlign" v-show="!align" src="@/static/richtext/leftcenter.png" :data-current="2" mode="">
+				</image>
+				<image @click="changeAlign" v-show="align" src="@/static/richtext/leftcenterSelect.png" :data-current="2"
+					mode=""></image> -->
+				
+				<view class="hflex acenter">
+					<image @click="repeal" src="@/static/richtext/backone.png" mode=""></image>
+					<image @click="recover" src="@/static/richtext/afterone.png" mode=""></image>
+				</view>
+				<!-- <image @click="modeShow" src="@/static/richtext/keyboard.png" mode=""></image> -->
+			</view>
+			<!-- 功能选项内容 -->
+			<view class="tab_card" v-show="tabIndex==1 && font==true">
+				<!-- 其他 -->
+				<view class="one">
+					<view @click="addBold" class="oneitem" :style="Bold?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/bold.png" mode=""></image>
+					</view>
+					<view @click="bias" class="oneitem" :style="slash?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/incline.png" mode=""></image>
+					</view>
+					<view @click="addDivider" class="oneitem" :style="halvingline?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/halvingline.png" mode=""></image>
+					</view>
+				</view>
+				<!-- H2 -->
+				<view class="one">
+					<view @click="Hfirst" class="oneitem" :style="H1?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/h-1.png" mode=""></image>
+					</view>
+					<view @click="Htwo" class="oneitem" :style="H2?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/h-2.png" mode=""></image>
+					</view>
+					<view @click="Hthree" class="oneitem" :style="H3?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/h-3.png" mode=""></image>
+					</view>
+					<view @click="Hfour" class="oneitem" :style="H4?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/h-4.png" mode=""></image>
+					</view>
+				</view>
+				<!-- 字号 单位px-->
+				<view class="three">
+					<view @click="thirtySix" class="threeitem" :style="thirtysix?'background-color: #ffffff;':''">
+						<text style="font-weight: 700;font-size: 38upx;">36</text>
+					</view>
+					<view @click="thirtyTwo" class="threeitem" :style="thirtytwo?'background-color: #ffffff;':''">
+						<text style="font-weight: 600;font-size: 36upx;">32</text>
+					</view>
+					<view @click="twentyEight" class="threeitem" :style="twentyeight?'background-color: #ffffff;':''">
+						<text style="font-size: 34upx;">28</text>
+					</view>
+					<view @click="twentySix" class="threeitem" :style="twentysix?'background-color: #ffffff;':''">
+						<text style="font-size: 32upx;">26</text>
+					</view>
+					<view @click="twentyFour" class="threeitem" :style="twentyfour?'background-color: #ffffff;':''">
+						<text style="font-size: 28upx;">24</text>
+					</view>
+					<view @click="Twenty" class="threeitem" :style="twenty?'background-color: #ffffff;':''">
+						<text style="font-size: 26upx;">20</text>
+					</view>
+				</view>
+				<!-- 字体颜色 -->
+				<!-- <view class="four">
+					<view @click="Black" class="fouritema" :style="black?'border: 4upx solid black;':''">
+						<text></text>
+					</view>
+					<view @click="Red" class="fouritemb" :style="red?'border: 4upx solid #92a5c7;':''">
+						<text></text>
+					</view>
+					<view @click="Gray" class="fouritemc" :style="gray?'border: 4upx solid #92a5c7;':''">
+						<text></text>
+					</view>
+					<view @click="Blue" class="fouritemd" :style="blue?'border: 4upx solid #55aaff;':''">
+						<text></text>
+					</view>
+					<view @click="Orange" class="fouriteme" :style="orange?'border: 4upx solid orange;':''">
+						<text></text>
+					</view>
+					<view @click="Green" class="fouritemf" :style="green?'border: 4upx solid green;':''">
+						<text></text>
+					</view>
+				</view> -->
+				<!-- 对齐方式 -->
+				<view class="one">
+					<view class="oneitem" @click="alignLeft" :style="leftcenter?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/leftcenter.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="alignCenter" :style="center?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/center.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="alignright" :style="rightcenter?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/rightcenter.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="Sort" :style="underline?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/underline.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="Refine" :style="refine?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/dot.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="Check" :style="check?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/addrefine.png" mode=""></image>
+					</view>
+				</view>
+			</view>
+			<view class="tab_card" v-show="tabIndex==2 && align==true">
+				<!-- 对齐方式 -->
+				<view class="one">
+					<view class="oneitem" @click="alignLeft" :style="leftcenter?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/leftcenter.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="alignCenter" :style="center?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/center.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="alignright" :style="rightcenter?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/rightcenter.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="Sort" :style="underline?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/underline.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="Refine" :style="refine?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/dot.png" mode=""></image>
+					</view>
+					<view class="oneitem" @click="Check" :style="check?'background-color: #ffffff;':''">
+						<image src="@/static/richtext/addrefine.png" mode=""></image>
+					</view>
+				</view>
+				<view class="two">
+					<view class="twoitem">
+						<image src="@/static/richtext/lineheight.png" mode=""></image>
+					</view>
+					<view @click="lineHeightone" class="twoitem" :style="heightone?'background-color: #ffffff;':''">
+						<text>1</text>
+					</view>
+					<view @click="lineHeightonea" class="twoitem" :style="heightonea?'background-color: #ffffff;':''">
+						<text>1.5</text>
+					</view>
+					<view @click="lineHeighttwo" class="twoitem" :style="heighttwo?'background-color: #ffffff;':''">
+						<text>2</text>
+					</view>
+					<view @click="lineHeighttwoa" class="twoitem" :style="heighttwoa?'background-color: #ffffff;':''">
+						<text>2.5</text>
+					</view>
+					<view @click="lineHeightthree" class="twoitem" :style="heightthree?'background-color: #ffffff;':''">
+						<text>3</text>
+					</view>
+				</view>
+
+				<!-- 背景色 -->
+				<view class="fours">
+					<view @click="Blackback" class="foursitema" :style="blackback?'border: 4upx solid black;':''">
+						<text></text>
+					</view>
+					<view @click="Redback" class="foursitemb" :style="redback?'border: 4upx solid red;':''">
+						<text></text>
+					</view>
+					<view @click="Grayback" class="foursitemc" :style="grayback?'border: 4upx solid #92a5c7;':''">
+						<text></text>
+					</view>
+					<view @click="Blueback" class="foursitemd" :style="blueback?'border: 4upx solid #55aaff;':''">
+						<text></text>
+					</view>
+					<view @click="Orangeback" class="foursiteme" :style="orangeback?'border: 4upx solid orange;':''">
+						<text></text>
+					</view>
+					<view @click="Green" class="foursitemf" :style="greenback?'border: 4upx solid green;':''">
+						<text></text>
+					</view>
+				</view>
+			</view>
+			<!-- 图片 -->
+			<view class="tab_cardimg" v-show="tabIndex==3 && img==true">
+				<view class="mo">
+					<view class="moitem" @click="insertImg">
+						<image src="@/static/richtext/img.png" mode=""></image>
+						<text>来自图库</text>
+					</view>
+					<!-- <view class="moitem">
+						<image src="@/static/richtext/photograph.png" mode=""></image>
+						<text>拍照</text>
+					</view> -->
+					<!-- @click="insertVideo" -->
+					<!-- <view class="moitem" @click="insertVideo">
+						<image src="@/static/richtext/insertvideo.png" mode=""></image>
+						<text>插入视频</text>
+					</view> -->
+				</view>
+			</view>
+		</view>
+
+		<!-- 利用rich-text来回显html内容 data是富文本编辑器html的内容-->
+		<!-- <rich-text class="ql-editor" :nodes="data"></rich-text> -->
+		<!-- uparse解析 -->
+		<!--  <u-parse :content="data" @preview="preview" @navigate="navigate" ></u-parse> -->
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		data() {
+			return {
+				mode: false, //显示模块 //如果不需要跟随键盘弹出 改为true默认显示
+				tabIndex: 1, //下标
+				Height: 0, //高度
+				font: true, //字体选项卡
+				align: false, //对齐方式选项卡
+				img: false, //图片选项卡
+				halvingline: false, //下划线
+				slash: false, //倾斜
+				Bold: false, //变量
+				H1: false, //H1
+				H2: false, //H2
+				H3: false, //H3
+				H4: false, //H4
+				thirtysix: false, //36字号px
+				thirtytwo: false, //32字号px
+				twentyeight: false, //28字号px
+				twentysix: false, //26字号px
+				twentyfour: false, //24字号px
+				twenty: false, //20字号px
+				black: true, //黑色字体
+				red: false, //红色字体
+				gray: false, //灰蓝色字体
+				blue: false, //浅蓝色字体
+				orange: false, //橙色字体
+				green: false, //绿色字体
+				blackback: true, //黑色背景
+				redback: false, //红色字体
+				grayback: false, //灰蓝色字体
+				blueback: false, //浅蓝色字体
+				orangeback: false, //橙色字体
+				greenback: false, //绿色字体
+				center: false, //居中
+				leftcenter: false, //居左
+				rightcenter: false, //居右
+				underline: false, //排序
+				refine: false, //加圆点
+				check: false, //加方格
+				spacingone: false, //字母间距1
+				heightone: false, //行高1
+				heightonea: false, //行高1.5
+				heighttwo: false, //行高2
+				heighttwoa: false, //行高2.5
+				heightthree: false, //行高3
+				editorCtx: {},
+				//键盘高度
+				keyboardHeight: 0,
+				editorHeight: 0,
+				data: ""
+			}
+		},
+		mounted() {
+			var _this = this
+			uni.getSystemInfo({
+				success: function(res) {
+					_this.Height = res.windowHeight;
+				}
+			});
+		},
+		methods: {
+			onsuccess() {
+				var that = this
+				that.editorCtx.getContents({
+					success: function(data) {
+						that.data = data.html
+						that.$emit('onsuccess', that.data)
+					},
+				})
+			},
+			modeShow() { //
+				this.mode = !this.mode
+
+				//如果不需要跟随键盘弹出注释即可
+				var _this = this
+				//  监听键盘高度变化
+				uni.onKeyboardHeightChange((obj) => {
+					_this.keyboardHeight = obj
+					_this.editorHeight = _this.Height - obj - 30
+				})
+			},
+			ontabtap(e) {
+				let index = e.target.dataset.current || e.currentTarget.dataset.current;
+				this.switchTab(index);
+
+				this.tabIndex = index;
+
+			},
+			switchTab(index) {
+				if (this.tabIndex == index) {
+					return
+				}
+				this.tabIndex = index;
+			},
+			onEditorReady(e) { //初始化
+				uni.createSelectorQuery().in(this).select('.myEditor').fields({
+					context: true
+				}, res => {
+					this.editorCtx = res.context
+					res.context.setContents({
+						html: this.data
+					})
+				}).exec()
+			},
+			changeFont() { //字体选项卡
+				this.font = !this.font
+				this.align = false
+				this.img = false
+			},
+			changeAlign() { //对齐方式选项卡
+				this.align = !this.align
+				this.font = false
+				this.img = false
+			},
+			changeImg() { //图片选项卡 
+				this.img = !this.img
+				this.font = false
+				this.align = false
+			},
+			addDivider() { //插入分割线 halvingline
+				this.halvingline = !this.halvingline //改变图标颜色
+				this.editorCtx.insertDivider()
+				this.editorCtx.getContents()
+			},
+			repeal() { //撤销
+				this.editorCtx.undo()
+			},
+			recover() { //恢复
+				this.editorCtx.redo()
+			},
+			addBold() { //字体加粗
+				this.Bold = !this.Bold //变量
+				this.editorCtx.format('bold', 'bold')
+			},
+			bias() { //字体倾斜
+				this.slash = !this.slash //改变图标颜色
+				this.editorCtx.format('italic')
+			},
+			alignCenter() { //居中对齐
+				this.center = !this.center //改变图标颜色
+				this.leftcenter = false //改变图标颜色
+				this.rightcenter = false //改变图标颜色
+				this.editorCtx.format('align', 'center') //属性,值
+			},
+			alignLeft() { //居左对齐
+				this.leftcenter = !this.leftcenter //改变图标颜色
+				this.center = false //改变图标颜色
+				this.rightcenter = false //改变图标颜色
+				this.editorCtx.format('align', 'left') //属性,值
+			},
+			alignright() { //居右对齐
+				this.rightcenter = !this.rightcenter //改变图标颜色
+				this.center = false //改变图标颜色
+				this.leftcenter = false //改变图标颜色
+				this.editorCtx.format('align', 'right') //属性,值
+			},
+			Sort() { //排序
+				this.underline = !this.underline //改变图标颜色
+				this.editorCtx.format('list', 'ordered') //属性,值 ordered 排序 bullet 点 check 方格
+			},
+			Refine() { //加圆点
+				this.refine = !this.refine //改变图标颜色
+				this.editorCtx.format('list', 'bullet') //属性,值 ordered 排序 bullet 点 check 方格
+			},
+			Check() { //加方格
+				this.check = !this.check //改变图标颜色
+				this.editorCtx.format('list', 'check') //属性,值 ordered 排序 bullet 点 check 方格
+			},
+			Hfirst() { //标题字体变大
+				this.H1 = !this.H1
+				if (this.H1) {
+					this.editorCtx.format('header', 'H1')
+				} else if (!this.H1) {
+					this.editorCtx.format('header', '0')
+				}
+			},
+			Htwo() { //标题字体变大
+				this.H2 = !this.H2
+				if (this.H2) {
+					this.editorCtx.format('header', 'H2')
+				} else if (!this.H2) {
+					this.editorCtx.format('header', '0')
+				}
+			},
+			Hthree() { //标题字体变大
+				this.H3 = !this.H3
+				if (this.H3) {
+					this.editorCtx.format('header', 'H3')
+				} else if (!this.H3) {
+					this.editorCtx.format('header', '0')
+				}
+			},
+			Hfour() { //标题字体变大
+				this.H4 = !this.H4
+				if (this.H4) {
+					this.editorCtx.format('header', 'H4')
+				} else if (!this.H4) {
+					this.editorCtx.format('header', '0')
+				}
+			},
+			thirtySix() { //36
+				this.thirtysix = !this.thirtysix
+				if (this.thirtysix) {
+					this.editorCtx.format('fontSize', '36px')
+				} else if (!this.thirtysix) {
+					this.editorCtx.format('fontSize', '')
+				}
+			},
+			thirtyTwo() { //32
+				this.thirtytwo = !this.thirtytwo
+				if (this.thirtytwo) {
+					this.editorCtx.format('fontSize', '32px')
+				} else if (!this.thirtytwo) {
+					this.editorCtx.format('fontSize', '')
+				}
+			},
+			twentyEight() { //28
+				this.twentyeight = !this.twentyeight
+				if (this.twentyeight) {
+					this.editorCtx.format('fontSize', '28px')
+				} else if (!this.twentyeight) {
+					this.editorCtx.format('fontSize', '')
+				}
+			},
+			twentySix() { //26
+				this.twentysix = !this.twentysix
+				if (this.twentysix) {
+					this.editorCtx.format('fontSize', '26px')
+				} else if (!this.twentysix) {
+					this.editorCtx.format('fontSize', '')
+				}
+			},
+			twentyFour() { //24
+				this.twentyfour = !this.twentyfour
+				if (this.twentyfour) {
+					this.editorCtx.format('fontSize', '24px')
+				} else if (!this.twentyfour) {
+					this.editorCtx.format('fontSize', '')
+				}
+			},
+			Twenty() { //20
+				this.twenty = !this.twenty
+				if (this.twenty) {
+					this.editorCtx.format('fontSize', '20px')
+				} else if (!this.twenty) {
+					this.editorCtx.format('fontSize', '')
+				}
+			},
+			spacingOne() { //字母间距1
+				this.spacingone = !this.spacingone
+				if (this.spacingone) {
+					this.editorCtx.format('letterSpacing', '100px')
+				} else if (!this.spacingone) {
+					this.editorCtx.format('letterSpacing', '')
+				}
+			},
+			lineHeightone() { //行高1
+				this.heightone = !this.heightone
+				if (this.heightone) {
+					this.editorCtx.format('lineHeight', '20px') //20upx
+				} else if (!this.heightone) {
+					this.editorCtx.format('lineHeight', '')
+				}
+			},
+			lineHeightonea() { //行高1.5
+				this.heightonea = !this.heightonea
+				// 当点击1.5时取消其他行高 根据需求自行更改 其他功能同理
+				this.heightone = false
+				this.heighttwo = false
+				this.heighttwoa = false
+				this.heightthree = false
+				if (this.heightonea) {
+					this.editorCtx.format('lineHeight', '30px') //20upx
+				} else if (!this.heightonea) {
+					this.editorCtx.format('lineHeight', '')
+				}
+			},
+			lineHeighttwo() { //行高2
+				this.heighttwo = !this.heighttwo
+				if (this.heighttwo) {
+					this.editorCtx.format('lineHeight', '40px') //20upx
+				} else if (!this.heighttwo) {
+					this.editorCtx.format('lineHeight', '')
+				}
+			},
+			lineHeighttwoa() { //行高2.5
+				this.heighttwoa = !this.heighttwoa
+				if (this.heighttwoa) {
+					this.editorCtx.format('lineHeight', '50px') //50upx
+				} else if (!this.heighttwoa) {
+					this.editorCtx.format('lineHeight', '')
+				}
+			},
+			lineHeightthree() { //行高3
+				this.heightthree = !this.heightthree
+				if (this.heightthree) {
+					this.editorCtx.format('lineHeight', '60px') //50upx
+				} else if (!this.heightthree) {
+					this.editorCtx.format('lineHeight', '')
+				}
+			},
+			Black() { //黑色字体
+				this.black = !this.black
+				if (this.black) {
+					this.editorCtx.format('color', 'black')
+				} else if (!this.black) {
+					this.editorCtx.format('color', '')
+				}
+			},
+			Red() { //黑色字体
+				this.red = !this.red
+				if (this.red) {
+					this.editorCtx.format('color', 'red')
+				} else if (!this.red) {
+					this.editorCtx.format('color', '')
+				}
+			},
+			Gray() { //灰蓝色字体
+				this.gray = !this.gray
+				if (this.gray) {
+					this.editorCtx.format('color', '#92a5c7')
+				} else if (!this.gray) {
+					this.editorCtx.format('color', '')
+				}
+			},
+			Blue() { //浅蓝色字体
+				this.blue = !this.blue
+				if (this.blue) {
+					this.editorCtx.format('color', '#00aaff')
+				} else if (!this.blue) {
+					this.editorCtx.format('color', '')
+				}
+			},
+			Orange() { //橙色字体
+				this.orange = !this.orange
+				if (this.orange) {
+					this.editorCtx.format('color', 'orange')
+				} else if (!this.orange) {
+					this.editorCtx.format('color', '')
+				}
+			},
+			Green() { //绿色字体
+				this.green = !this.green
+				if (this.green) {
+					this.editorCtx.format('color', 'green')
+				} else if (!this.green) {
+					this.editorCtx.format('color', '')
+				}
+			},
+			Blackback() { //黑色背景
+				this.blackback = !this.blackback
+				if (this.blackback) {
+					this.editorCtx.format('backgroundColor', 'black')
+				} else if (!this.blackback) {
+					this.editorCtx.format('backgroundColor', '')
+				}
+			},
+			Redback() { //黑色背景
+				this.redback = !this.redback
+				if (this.redback) {
+					this.editorCtx.format('backgroundColor', 'red')
+				} else if (!this.redback) {
+					this.editorCtx.format('backgroundColor', '')
+				}
+			},
+			Grayback() { //灰蓝色背景
+				this.grayback = !this.grayback
+				if (this.grayback) {
+					this.editorCtx.format('backgroundColor', '#92a5c7')
+				} else if (!this.grayback) {
+					this.editorCtx.format('backgroundColor', '')
+				}
+			},
+			Blueback() { //浅蓝色字体
+				this.blueback = !this.blueback
+				if (this.blueback) {
+					this.editorCtx.format('backgroundColor', '#00aaff')
+				} else if (!this.blueback) {
+					this.editorCtx.format('backgroundColor', '')
+				}
+			},
+			Orangeback() { //橙色字体
+				this.orangeback = !this.orangeback
+				if (this.orangeback) {
+					this.editorCtx.format('backgroundColor', 'orange')
+				} else if (!this.orangeback) {
+					this.editorCtx.format('backgroundColor', '')
+				}
+			},
+			Greenback() { //绿色背景
+				this.greenback = !this.greenback
+				if (this.greenback) {
+					this.editorCtx.format('backgroundColor', 'green')
+				} else if (!this.greenback) {
+					this.editorCtx.format('backgroundColor', '')
+				}
+			},
+			selected() { //选中内容
+				this.editorCtx.getSelectionText()
+			},
+			insertImg() { //插入图片
+				var _this = this
+				uni.chooseImage({
+					success: (chooseImageRes) => {
+						uni.showLoading({
+							title: '上传中...'
+						})
+						const tempFilePaths = chooseImageRes.tempFilePaths;
+						uni.uploadFile({
+							url: $api.config.baseUrl + 'upload/image', //仅为示例,非真实的接口地址
+							filePath: tempFilePaths[0],
+							name: 'image',
+							// formData: {
+							// 	'user': 'test'
+							// },
+							success: (uploadFileRes) => {
+								
+								let res = JSON.parse(uploadFileRes.data)
+								for (let i = 0; i < tempFilePaths.length; i++) {
+									_this.editorCtx.insertImage({
+										src: res.data.url //图片路径 换成服务器地址
+									})
+								}
+								uni.hideLoading()
+							}
+						});
+					}
+				});
+				/* uni.chooseImage({
+					success: res => {
+						uni.showLoading({
+							title: 'loading...'
+						})
+						//在这里先把封面截图保存到服务器拿到服务器存储地址放在这里
+						for (let i = 0; i < res.tempFilePaths.length; i++) {
+							this.editorCtx.insertImage({
+								src: res.tempFilePaths[i] //图片路径 换成服务器地址
+							})
+						}
+						uni.hideLoading()
+					}
+				}) */
+			},
+			insertVideo() { //视频				//uni.chooseMedia()
+				let that = this
+				uni.chooseMedia({
+					count: 1,
+					mediaType: ['video'],
+					sourceType: ['album', 'camera'],
+					maxDuration: 30,
+					camera: 'back',
+					success(res) {
+						that.src = res.tempFiles[0].tempFilePath
+						let imgArr = res.tempFiles[0].thumbTempFilePath
+						//在这里先把封面截图保存到服务器拿到服务器存储地址放在这里
+						that.editorCtx.insertImage({
+							//https://mp-2a0f3e44-b47a-4bd5-a925-ba63d3e2a8ab.cdn.bspapp.com/add_img/1693998858778-2023-08-21 133334.png
+							src: 'https://mp-2a0f3e44-b47a-4bd5-a925-ba63d3e2a8ab.cdn.bspapp.com/add_img/1693998858778-2023-08-21 133334.png', //视频封面图 //服务器地址
+							alt: '图片出差了',
+							extClass: 'videothumb',
+						})
+						that.getCtx()
+					}
+				})
+
+
+			},
+			// 获取编辑器内容 
+			getCtx() {
+				var that = this
+				that.editorCtx.getContents({
+					success: function(data) {
+						that.data = data.html
+						//需要把编辑器内的图片/视频地址更换成储存在服务器后的图片/视频路径
+
+						//在要显示的页面,利用rich-text来回显html内容 data是富文本编辑器html的内容
+						// <rich-text class="ql-editor" :nodes="data"></rich-text> 
+						//这里把编辑器里的视频封面截图替换成了视频
+						//uniapp富文本编辑器内不支持video无法显示视频,rich-text可以显示但需要uparse插件解析
+						//https://ext.dcloud.net.cn/plugin?id=183 这里有详细教程
+						
+						// let reg = /<img[^>]*class=['videothumb"]([^'"]+)[^>]*>/g
+						// that.data = data.html.replace(reg,
+						// 	'<video id="myVideo" class="videosrc" src="https://mp-2a0f3e44-b47a-4bd5-a925-ba63d3e2a8ab.cdn.bspapp.com/add_file/2023-09-17 172002.mp4"></video>'
+						// 	);
+
+					}
+				})
+			},
+
+
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	/* 样式二 */
+	.tabName {
+		width: 100%;
+		height: 60upx;
+		line-height: 60upx;
+		padding: 15upx 28rpx;
+		
+		border-top: 1upx solid #d9e4f9;
+		border-bottom: 1upx solid #d9e4f9;
+		image {
+			width: 40rpx;
+			height: 40rpx;
+			margin-right: 52rpx;
+		}
+	}
+
+	/* .tabName>image {
+		width: 40upx;
+		height: 40upx;
+	} */
+
+
+	/* 内容高度根据需求自定义 */
+	.tab_card {
+		width: 750upx;
+		height: 430upx;
+		/* 	margin-top: 10upx; */
+		background-color: #ffffff;
+		text-align: center;
+		line-height: 430upx;
+		padding: 5upx 0;
+
+	}
+
+	.tab_card>.one {
+		width: 690upx;
+		height: 60upx;
+		line-height: 60upx;
+		margin: 25upx 30upx;
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		background-color: #edf3fa;
+		padding: 12upx 0;
+	}
+
+	.tab_card>.one>.oneitem {
+		width: 90upx;
+		height: 60upx;
+		line-height: 60upx;
+		border-radius: 5upx;
+	}
+
+	.tab_card>.one>.oneitem>image {
+		width: 50upx;
+		height: 50upx;
+
+		margin-top: 5upx;
+	}
+
+
+	/* 行高 */
+	.tab_card>.two {
+		width: 690upx;
+		height: 60upx;
+		line-height: 60upx;
+		margin: 25upx 30upx;
+		display: flex;
+		justify-content: space-around;
+
+		align-items: center;
+		background-color: #edf3fa;
+		padding: 12upx 0;
+	}
+
+	.tab_card>.two>.twoitem {
+		width: 90upx;
+		height: 60upx;
+		line-height: 60upx;
+		border-radius: 5upx;
+	}
+
+	.tab_card>.two>.twoitem>image {
+		width: 50upx;
+		height: 50upx;
+		margin-top: 5upx;
+	}
+
+	.tab_card>.two>.twoitem>text {
+		width: 50upx;
+		height: 50upx;
+		color: #899cba;
+		font-size: 32upx;
+	}
+
+	/* 字号 */
+	.tab_card>.three {
+		width: 690upx;
+		height: 60upx;
+		line-height: 60upx;
+		margin: 25upx 30upx;
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		background-color: #edf3fa;
+		padding: 12upx 0;
+	}
+
+	.tab_card>.three>.threeitem {
+		width: 90upx;
+		height: 60upx;
+		line-height: 60upx;
+		border-radius: 5upx;
+	}
+
+	/* 字体颜色 */
+	.tab_card>.four {
+		width: 690upx;
+		height: 60upx;
+		line-height: 60upx;
+		margin: 25upx 30upx;
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		background-color: #edf3fa;
+		padding: 12upx 0;
+	}
+
+	.tab_card>.four>.fouritema {
+		width: 55upx;
+		height: 55upx;
+		line-height: 55upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border-radius: 50%;
+		/*  border: 4upx solid black; */
+	}
+
+	.tab_card>.four>.fouritema>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: black;
+		border-radius: 50%;
+	}
+
+	.tab_card>.four>.fouritemb {
+		width: 55upx;
+		height: 55upx;
+		line-height: 55upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border-radius: 50%;
+		/* border: 4upx solid red; */
+	}
+
+	.tab_card>.four>.fouritemb>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: red;
+		border-radius: 50%;
+	}
+
+	.tab_card>.four>.fouritemc {
+		width: 55upx;
+		height: 55upx;
+		line-height: 55upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border-radius: 50%;
+		/* border: 4upx solid #92a5c7; */
+	}
+
+	.tab_card>.four>.fouritemc>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: #92a5c7;
+		border-radius: 50%;
+	}
+
+	.tab_card>.four>.fouritemd {
+		width: 55upx;
+		height: 55upx;
+		line-height: 55upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border-radius: 50%;
+		/* border: 4upx solid #00aaff; */
+	}
+
+	.tab_card>.four>.fouritemd>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: #00aaff;
+		border-radius: 50%;
+	}
+
+	.tab_card>.four>.fouriteme {
+		width: 55upx;
+		height: 55upx;
+		line-height: 55upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border-radius: 50%;
+		/* border: 4upx solid orange; */
+	}
+
+	.tab_card>.four>.fouriteme>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: orange;
+		border-radius: 50%;
+	}
+
+	.tab_card>.four>.fouritemf {
+		width: 55upx;
+		height: 55upx;
+		line-height: 55upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border-radius: 50%;
+		/* border: 4upx solid green; */
+	}
+
+	.tab_card>.four>.fouritemf>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: green;
+		border-radius: 50%;
+	}
+
+
+	/* 对齐方式 背景颜色*/
+	.tab_card>.fours {
+		width: 690upx;
+		height: 60upx;
+		line-height: 60upx;
+		margin: 25upx 30upx;
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		background-color: #edf3fa;
+		padding: 12upx 0;
+	}
+
+	.tab_card>.fours>.foursitema {
+		width: 50upx;
+		height: 50upx;
+		line-height: 50upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		/*  border: 4upx solid black; */
+	}
+
+	.tab_card>.fours>.foursitema>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: black;
+	}
+
+	.tab_card>.fours>.foursitemb {
+		width: 50upx;
+		height: 50upx;
+		line-height: 50upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		/* border: 4upx solid red; */
+	}
+
+	.tab_card>.fours>.foursitemb>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: red;
+	}
+
+	.tab_card>.fours>.foursitemc {
+		width: 50upx;
+		height: 50upx;
+		line-height: 50upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		/* border: 4upx solid #92a5c7; */
+	}
+
+	.tab_card>.fours>.foursitemc>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: #92a5c7;
+	}
+
+	.tab_card>.fours>.foursitemd {
+		width: 50upx;
+		height: 50upx;
+		line-height: 50upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		/* border: 4upx solid #00aaff; */
+	}
+
+	.tab_card>.fours>.foursitemd>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: #00aaff;
+	}
+
+	.tab_card>.fours>.foursiteme {
+		width: 50upx;
+		height: 50upx;
+		line-height: 50upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		/* border-radius: 50%; */
+		/* border: 4upx solid orange; */
+	}
+
+	.tab_card>.fours>.foursiteme>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: orange;
+	}
+
+	.tab_card>.fours>.foursitemf {
+		width: 50upx;
+		height: 50upx;
+		line-height: 50upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		/* border: 4upx solid green; */
+	}
+
+	.tab_card>.fours>.foursitemf>text {
+		width: 46upx;
+		height: 46upx;
+		display: inline-block;
+		background-color: green;
+	}
+
+
+
+
+	/* 图片选项卡 */
+	.tab_cardimg {
+		width: 750upx;
+		height: 430upx;
+	}
+
+	.tab_cardimg>.mo {
+		width: 750upx;
+		height: 200upx;
+		display: flex;
+	}
+
+	.tab_cardimg>.mo>.moitem {
+		width: 140upx;
+		height: 140upx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		flex-direction: column;
+		margin-left: 40upx;
+		margin-top: 30upx;
+	}
+
+	.tab_cardimg>.mo>.moitem>image {
+		width: 80upx;
+		height: 80upx;
+	}
+
+	.tab_cardimg>.mo>.moitem>text {
+		width: 120upx;
+		height: 40upx;
+		margin-top: 10upx;
+		color: #92a5c7;
+		font-size: 24upx;
+		text-align: center;
+	}
+
+
+	/*  */
+	.main {
+		width: 100%;
+		min-height: 820upx;
+		max-height: max-content;
+		/* height: max-content; */
+	}
+	.modes {
+		height: 500rpx;
+	}
+	.myEditor {
+		min-height: 820upx;
+		max-height: max-content;
+		/* height: max-content; */
+		padding: 0 20upx;
+		font-size: 36upx;
+	}
+</style>

+ 77 - 0
components/swiper-list/index.vue

@@ -0,0 +1,77 @@
+<template>
+	<view class="swiper">
+		<u-swiper :list="swiper_list" keyName="image" height="300rpx" radius="12rpx" @change="e => swiper_current = e.current" @click="swiperclick">
+			<view slot="indicator" class="indicator">
+				<view class="indicator__dot" v-for="(item, index) in swiper_list" :key="index"
+					:class="[index === swiper_current && 'indicator__dot--active']">
+				</view>
+			</view>
+		</u-swiper>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		props: {
+			type: {
+				typeof: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				swiper_list: [],
+				swiper_current: 0,
+			}
+		},
+		mounted() {
+			this.getlist()
+		},
+		onLoad() {
+			
+		},
+		onShow() {
+			
+		},
+		onPullDownRefresh() {
+			
+		},
+		onReachBottom() {
+			
+		},
+		methods: {
+			getlist() {
+				var _this = this
+				$api.req({
+					url: 'banner',
+					method: 'GET',
+					data: {
+						type: this.type,
+						limit: 5
+					}
+				}, function(res) {
+					if(res.code == 10000) {
+						_this.swiper_list = res.data
+					}
+				})
+			},
+			swiperclick(e) {
+				var data = this.swiper_list[e]
+				if(data.is_jump == 1) {
+					if(data.jump_type == 'external') {
+						window.location.href = data.jump_url
+					} else {
+						uni.navigateTo({
+							url: data.jump_url
+						})
+					}
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 58 - 0
components/video-list/index.vue

@@ -0,0 +1,58 @@
+<template>
+	<view class="video-info" @click="toinfo">
+		<image :src="item.image" mode="aspectFill"></image>
+		<view class="name text_hide2">{{item.video_title}}</view>
+		<view class="bottom">
+			<text>{{item.like_count || 0}}喜欢· </text>
+			<text>{{item.comment_count || 0}}评论</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			item: {
+				typeof: Object,
+				default: {}
+			}
+		},
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			toinfo() {
+				uni.navigateTo({
+					url: '/pageA/info-detail?id=' + this.item.id + '&type=video'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.video-info {
+		image {
+			width: 272rpx;
+			height: 148rpx;
+			border-radius: 24rpx;
+			margin: 0 20rpx 0 0;
+		}
+		.name {
+			max-width: 272rpx;
+			font-size: 24rpx;
+			font-family: SFPro, SFPro;
+			font-weight: 500;
+			color: #333333;
+			margin: 12rpx 0 16rpx;
+		}
+		.bottom {
+			font-size: 22rpx;
+			font-family: SFPro, SFPro;
+			font-weight: 400;
+			color: #666666;
+		}
+	}
+</style>

+ 74 - 0
components/wenzhang-info/index.vue

@@ -0,0 +1,74 @@
+<template>
+	<view class="wenzhang-info hflex acenter" @click="toinfo">
+		<image :src="data.image" mode="aspectFill"></image>
+		<view class="vflex jbetween img-right">
+			<text class="text_hide2">{{data.title}}</text>
+			<view class="hflex acenter bottom">
+				<text>{{data.published_at}}</text>
+				<text>{{data.collect_count || 0}}喜欢</text>
+				<text style="padding: 0 8rpx 0 0;">·</text>
+				<text>{{data.comment_count || 0}}评论</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			data: {
+				typeof: Object,
+				default: {}
+			},
+			type: {
+				typeof: String,
+				default: ''
+			}
+		},
+		data() {
+			return {}
+		},
+		methods: {
+			toinfo() {
+				uni.navigateTo({
+					url: '/pageA/info-detail?id=' + this.data.id + '&type=' + this.type
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+	.wenzhang-info {
+		margin-bottom: 20rpx;
+		image {
+			width: 192rpx;
+			height: 108rpx;
+			border-radius: 8rpx;
+			margin-right: 20rpx;
+		}
+		.img-right {
+			width: calc(100% - 212rpx);
+			height: 108rpx;
+			text {
+				font-size: 26rpx;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 500;
+				color: #333333;
+				line-height: 36rpx;
+			}
+			.bottom {
+				text {
+					font-size: 22rpx;
+					font-family: SFPro, SFPro;
+					font-weight: 400;
+					color: #666666;
+					padding-right: 16rpx;
+				}
+			}
+		}
+	}
+	.wenzhang-info::last-child {
+		margin: 0;
+	}
+</style>

+ 222 - 0
components/yx-vip/index.vue

@@ -0,0 +1,222 @@
+<template>
+	<view class="vip-box">
+		<view class="vip_top hflex acenter jbetween">
+			<view class="vip_uesr hflex acenter">
+				<image :src="user.avatar" mode="aspectFill"></image>
+				<view class="name vflex">
+					<text>{{user.username}}</text>
+					<text>{{user.introduction}}</text>
+				</view>
+			</view>
+			<view class="btn hflex acenter" v-if="showsign" @click="tosign">
+				<image src="/static/images/rili.png" mode="aspectFill"></image>
+				<text>{{user.is_qiandao ? '签到' : '已签到'}}</text>
+			</view>
+		</view>
+		<view class="level hflex acenter jbetween" v-if="showlevel">
+			<text>LV{{user.level}}</text>
+			<u-line-progress :percentage="user.already_upgrade_rate * 100" inactiveColor="#CCCCCC" height="2" activeColor="#FFFFFF"></u-line-progress>
+			<text>LV{{Number(user.level) + 1}}</text>
+		</view>
+		<view class="bottom hflex acenter jbetween">
+			<text>{{user.is_vip ? user.vip_expired_at : '开通会员享福利'}}</text>
+			<text @click="show_buy = true">{{user.is_vip ? '立即续费' : '立即开通'}}</text>
+		</view>
+		<u-popup :show="show" mode="center" @close="toclose">
+			<view class="qiandao vflex acenter jcenter">
+				<image src="/static/images/qiandao.png" mode="aspectFill"></image>
+				<text>签到成功</text>
+				<text>获得积分+ {{jifen}}</text>
+				<view class="btn">确定</view>
+			</view>
+		</u-popup>
+		<u-popup :show="show_buy" mode="bottom" @close="toclose" :round="16">
+			<view class="vip-buy">
+				<view class="buy-title">会员充值</view>
+				<view class="buy-list hflex acenter jbetween">
+					<view class="buy-item vflex acenter jcenter" :class="buy_active == index ? 'buy-active' : ''" v-for="(item,index) in buylist" :key="index">
+						<text>{{item.name}}</text>
+						<text><span>¥</span>{{item.price}}</text>
+						<view class="text">额外获得{{item.integral}}积分</view>
+						<view class="text">额外免费拍摄{{item.sell_count}}次</view>
+						<view class="text">升级领福利</view>
+						<view class="text">积分商城折扣</view>
+					</view>
+				</view>
+				<view class="buy-title">支付方式</view>
+				<view class="hflex acenter jbetween pay-item">
+					<view class="hflex acenter">
+						<image src="../../static/images/ali-pay.png" mode="aspectFill" class="pay-icon"></image>
+						<text>支付宝支付</text>
+					</view>
+					<view class="">
+						<image src="../../static/images/check-active.png" mode="aspectFill" class="pay-select" v-if="pay_active == 1"></image>
+						<image src="../../static/images/check.png" mode="aspectFill" class="pay-select" v-else></image>
+					</view>
+				</view>
+				<view class="hflex acenter jbetween pay-item">
+					<view class="hflex acenter">
+						<image src="../../static/images/wx-pay.png" mode="aspectFill" class="pay-icon"></image>
+						<text>微信支付</text>
+					</view>
+					<view class="">
+						<image src="../../static/images/check-active.png" mode="aspectFill" class="pay-select" v-if="pay_active == 2"></image>
+						<image src="../../static/images/check.png" mode="aspectFill" class="pay-select" v-else></image>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		props: {
+			user: {
+				typeof: Object,
+				default: {}
+			},
+			showsign: {
+				typeof: Boolean,
+				default: true
+			},
+			showlevel: {
+				typeof: Boolean,
+				default: true
+			},
+		},
+		data() {
+			return {
+				show: false,
+				show_buy: false,
+				jifen: 2,
+				buylist: [],
+				pay_active: 0
+			}
+		},
+		mounted() {
+			
+		},
+		methods: {
+			toclose() {
+				this.show = false
+				this.show_buy = false
+			},
+			tosign() {
+				$api.req({
+					url: 'sign',
+					method: 'POST'
+				}, function(res) {
+					if(res.code == 10000) {
+						_this.show = true
+					}
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.vip-box {
+		background: linear-gradient(225deg, #4C4B4E 0%, #121212 100%);
+		border-radius: 16rpx;
+		box-sizing: border-box;
+		padding: 28rpx 20rpx;
+		.qiandao {
+			width: 550rpx;
+			image {
+				width: 270rpx;
+				height: 260rpx;
+				padding: 40rpx;
+			}
+			text {
+				font-size: 28rpx;
+				font-family: SFPro, SFPro;
+				font-weight: 400;
+				color: #222222;
+				padding: 14rpx 0 0;
+			}
+			.btn {
+				margin: 48rpx 0 60rpx;
+				width: 250rpx;
+				height: 80rpx;
+				background: #00B0B0;
+				border-radius: 8rpx;
+				font-size: 32rpx;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				color: #FFFFFF;
+				line-height: 80rpx;
+				letter-spacing: 1px;
+				text-align: center;
+			}
+		}
+		.bottom {
+			text {
+				font-size: 24rpx;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				color: #FFFFFF;
+			}
+			text:last-child {
+				color: #FF7B15;
+			}
+		}
+		.level {
+			padding: 44rpx 0;
+			text {
+				font-size: 32rpx;
+				font-family: Silom;
+				color: #FFFFFF;
+			}
+			text:first-child {
+				padding-right: 16rpx;
+			}
+			text:last-child {
+				padding-left: 16rpx;
+			}
+		}
+		.vip_top {
+			.btn {
+				background: #00B0B0;
+				border-radius: 40rpx;
+				padding: 8rpx 18rpx;
+				image {
+					width: 36rpx;
+					height: 36rpx;
+					margin: 8rpx;
+				}
+				text {
+					font-size: 24rpx;
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					color: #FFFFFF;
+				}
+			}
+			.vip_uesr {
+				image {
+					width: 80rpx;
+					height: 80rpx;
+					border-radius: 50%;
+					margin: 0 12rpx 0 0;
+				}
+				.name {
+					text:first-child {
+						font-size: 28rpx;
+						font-family: PingFangSC, PingFang SC;
+						font-weight: 400;
+						color: #FFFFFF;
+					}
+					text:last-child {
+						font-size: 24rpx;
+						font-family: PingFangSC, PingFang SC;
+						font-weight: 400;
+						color: #999999;
+						padding: 6rpx 0 0;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 79 - 0
components/yz-qr/changelog.md

@@ -0,0 +1,79 @@
+## 功能描述
+根据内容生成二维码,并返回图片地址
+
+## 平台兼容性
+兼容APP、H5及微信小程序。其他平台未测试
+
+## 安装方式
+安装到components文件夹,支持[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)组件模式。
+
+## 使用方式
+**<font color=#FF0000 >可根据属性自定义二维码</font>**
+``` javascript
+<yz-qr></yz-qr>
+```
+
+## 属性说明
+|属性名		|类型	|默认值		|说明				|
+|--			|--		|--			|--					|
+|text		|String	|'hello'	|二维码内容			|
+|size		|Number	|340		|单位是px			|
+|quality	|String	|'L'		|二维码解析度L/M/Q/H	|
+|colorDark	|String	|'#000000'	|黑色二维码			|
+|colorLight	|String	|'#ffffff'	|白色背景			|
+
+## 示例代码
+``` javascript
+	<template>
+		<view class="content">
+			<!-- .sync修饰符:当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定。 -->
+			<yz-qr :qrPath.sync="qrPath" :text="text" :size="size" :quality="quality" :colorDark="colorDark" :colorLight="colorLight"></yz-qr>
+			<view class="text">
+				二维码内容:<text>{{text}}</text>
+			</view>
+			<view class="text">
+				图片地址:<text>{{qrPath}}</text>
+			</view>
+		</view>
+	</template>
+	
+	<script>
+		export default {
+			data() {
+				return {
+					qrPath: '',
+					text: 'hello',
+					size: 200,
+					quality:'L',
+					colorDark: '#000000',
+					colorLight: '#ffffff'
+				}
+			},			
+			methods: {
+				
+			}
+		}
+	</script>
+	
+	<style>
+		.text {
+			background-color: #f3f3f3;
+			margin: 24rpx;
+			padding: 24rpx;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+	
+		.text text {
+			font-weight: 700;
+			margin-left: 16rpx;
+		}
+	</style>
+	
+	
+	
+```
+## <font color=#FF0000 >canvas踩坑</font>
+1. uni-app中的canvas的width、height的值依赖于父元素的宽高。canvas的父级如果被隐藏。canvas的width、height则都为0。
+2. 当父元素出现,canvas的高度也就有了。但是canvas并不会绘制显示。解决方法:可以将绘制方法写在异步方法中,同时要注意组件的生命周期,确保实例挂载成功之后再执行。

+ 1123 - 0
components/yz-qr/weapp-qrcode.js

@@ -0,0 +1,1123 @@
+//Core code comes from https://github.com/davidshimjs/qrcodejs
+
+var QRCode;
+
+(function() {
+	/**
+	 * Get the type by string length
+	 * 
+	 * @private
+	 * @param {String} sText
+	 * @param {Number} nCorrectLevel
+	 * @return {Number} type
+	 */
+	function _getTypeNumber(sText, nCorrectLevel) {
+		var nType = 1;
+		var length = _getUTF8Length(sText);
+
+		for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
+			var nLimit = 0;
+
+			switch (nCorrectLevel) {
+				case QRErrorCorrectLevel.L:
+					nLimit = QRCodeLimitLength[i][0];
+					break;
+				case QRErrorCorrectLevel.M:
+					nLimit = QRCodeLimitLength[i][1];
+					break;
+				case QRErrorCorrectLevel.Q:
+					nLimit = QRCodeLimitLength[i][2];
+					break;
+				case QRErrorCorrectLevel.H:
+					nLimit = QRCodeLimitLength[i][3];
+					break;
+			}
+
+			if (length <= nLimit) {
+				break;
+			} else {
+				nType++;
+			}
+		}
+
+		if (nType > QRCodeLimitLength.length) {
+			throw new Error("Too long data");
+		}
+
+		return nType;
+	}
+
+	function _getUTF8Length(sText) {
+		var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
+		return replacedText.length + (replacedText.length != sText ? 3 : 0);
+	}
+
+	function QR8bitByte(data) {
+		this.mode = QRMode.MODE_8BIT_BYTE;
+		this.data = data;
+		this.parsedData = [];
+
+		// Added to support UTF-8 Characters
+		for (var i = 0, l = this.data.length; i < l; i++) {
+			var byteArray = [];
+			var code = this.data.charCodeAt(i);
+
+			if (code > 0x10000) {
+				byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
+				byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
+				byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
+				byteArray[3] = 0x80 | (code & 0x3F);
+			} else if (code > 0x800) {
+				byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
+				byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
+				byteArray[2] = 0x80 | (code & 0x3F);
+			} else if (code > 0x80) {
+				byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
+				byteArray[1] = 0x80 | (code & 0x3F);
+			} else {
+				byteArray[0] = code;
+			}
+
+			this.parsedData.push(byteArray);
+		}
+
+		this.parsedData = Array.prototype.concat.apply([], this.parsedData);
+
+		if (this.parsedData.length != this.data.length) {
+			this.parsedData.unshift(191);
+			this.parsedData.unshift(187);
+			this.parsedData.unshift(239);
+		}
+	}
+
+	QR8bitByte.prototype = {
+		getLength: function(buffer) {
+			return this.parsedData.length;
+		},
+		write: function(buffer) {
+			for (var i = 0, l = this.parsedData.length; i < l; i++) {
+				buffer.put(this.parsedData[i], 8);
+			}
+		}
+	};
+
+
+	// QRCodeModel
+	function QRCodeModel(typeNumber, errorCorrectLevel) {
+		this.typeNumber = typeNumber;
+		this.errorCorrectLevel = errorCorrectLevel;
+		this.modules = null;
+		this.moduleCount = 0;
+		this.dataCache = null;
+		this.dataList = [];
+	}
+	QRCodeModel.prototype = {
+		addData: function(data) {
+			var newData = new QR8bitByte(data);
+			this.dataList.push(newData);
+			this.dataCache = null;
+		},
+		isDark: function(row, col) {
+			if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
+				throw new Error(row + "," + col);
+			}
+			return this.modules[row][col];
+		},
+		getModuleCount: function() {
+			return this.moduleCount;
+		},
+		make: function() {
+			this.makeImpl(false, this.getBestMaskPattern());
+		},
+		makeImpl: function(test, maskPattern) {
+			this.moduleCount = this.typeNumber * 4 + 17;
+			this.modules = new Array(this.moduleCount);
+			for (var row = 0; row < this.moduleCount; row++) {
+				this.modules[row] = new Array(this.moduleCount);
+				for (var col = 0; col < this.moduleCount; col++) {
+					this.modules[row][col] = null;
+				}
+			}
+			this.setupPositionProbePattern(0, 0);
+			this.setupPositionProbePattern(this.moduleCount - 7, 0);
+			this.setupPositionProbePattern(0, this.moduleCount - 7);
+			this.setupPositionAdjustPattern();
+			this.setupTimingPattern();
+			this.setupTypeInfo(test, maskPattern);
+			if (this.typeNumber >= 7) {
+				this.setupTypeNumber(test);
+			}
+			if (this.dataCache == null) {
+				this.dataCache = QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this
+					.dataList);
+			}
+			this.mapData(this.dataCache, maskPattern);
+		},
+		setupPositionProbePattern: function(row, col) {
+			for (var r = -1; r <= 7; r++) {
+				if (row + r <= -1 || this.moduleCount <= row + r) continue;
+				for (var c = -1; c <= 7; c++) {
+					if (col + c <= -1 || this.moduleCount <= col + c) continue;
+					if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r ==
+						6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
+						this.modules[row + r][col + c] = true;
+					} else {
+						this.modules[row + r][col + c] = false;
+					}
+				}
+			}
+		},
+		getBestMaskPattern: function() {
+			var minLostPoint = 0;
+			var pattern = 0;
+			for (var i = 0; i < 8; i++) {
+				this.makeImpl(true, i);
+				var lostPoint = QRUtil.getLostPoint(this);
+				if (i == 0 || minLostPoint > lostPoint) {
+					minLostPoint = lostPoint;
+					pattern = i;
+				}
+			}
+			return pattern;
+		},
+		createMovieClip: function(target_mc, instance_name, depth) {
+			var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);
+			var cs = 1;
+			this.make();
+			for (var row = 0; row < this.modules.length; row++) {
+				var y = row * cs;
+				for (var col = 0; col < this.modules[row].length; col++) {
+					var x = col * cs;
+					var dark = this.modules[row][col];
+					if (dark) {
+						qr_mc.beginFill(0, 100);
+						qr_mc.moveTo(x, y);
+						qr_mc.lineTo(x + cs, y);
+						qr_mc.lineTo(x + cs, y + cs);
+						qr_mc.lineTo(x, y + cs);
+						qr_mc.endFill();
+					}
+				}
+			}
+			return qr_mc;
+		},
+		setupTimingPattern: function() {
+			for (var r = 8; r < this.moduleCount - 8; r++) {
+				if (this.modules[r][6] != null) {
+					continue;
+				}
+				this.modules[r][6] = (r % 2 == 0);
+			}
+			for (var c = 8; c < this.moduleCount - 8; c++) {
+				if (this.modules[6][c] != null) {
+					continue;
+				}
+				this.modules[6][c] = (c % 2 == 0);
+			}
+		},
+		setupPositionAdjustPattern: function() {
+			var pos = QRUtil.getPatternPosition(this.typeNumber);
+			for (var i = 0; i < pos.length; i++) {
+				for (var j = 0; j < pos.length; j++) {
+					var row = pos[i];
+					var col = pos[j];
+					if (this.modules[row][col] != null) {
+						continue;
+					}
+					for (var r = -2; r <= 2; r++) {
+						for (var c = -2; c <= 2; c++) {
+							if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
+								this.modules[row + r][col + c] = true;
+							} else {
+								this.modules[row + r][col + c] = false;
+							}
+						}
+					}
+				}
+			}
+		},
+		setupTypeNumber: function(test) {
+			var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
+			for (var i = 0; i < 18; i++) {
+				var mod = (!test && ((bits >> i) & 1) == 1);
+				this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
+			}
+			for (var i = 0; i < 18; i++) {
+				var mod = (!test && ((bits >> i) & 1) == 1);
+				this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
+			}
+		},
+		setupTypeInfo: function(test, maskPattern) {
+			var data = (this.errorCorrectLevel << 3) | maskPattern;
+			var bits = QRUtil.getBCHTypeInfo(data);
+			for (var i = 0; i < 15; i++) {
+				var mod = (!test && ((bits >> i) & 1) == 1);
+				if (i < 6) {
+					this.modules[i][8] = mod;
+				} else if (i < 8) {
+					this.modules[i + 1][8] = mod;
+				} else {
+					this.modules[this.moduleCount - 15 + i][8] = mod;
+				}
+			}
+			for (var i = 0; i < 15; i++) {
+				var mod = (!test && ((bits >> i) & 1) == 1);
+				if (i < 8) {
+					this.modules[8][this.moduleCount - i - 1] = mod;
+				} else if (i < 9) {
+					this.modules[8][15 - i - 1 + 1] = mod;
+				} else {
+					this.modules[8][15 - i - 1] = mod;
+				}
+			}
+			this.modules[this.moduleCount - 8][8] = (!test);
+		},
+		mapData: function(data, maskPattern) {
+			var inc = -1;
+			var row = this.moduleCount - 1;
+			var bitIndex = 7;
+			var byteIndex = 0;
+			for (var col = this.moduleCount - 1; col > 0; col -= 2) {
+				if (col == 6) col--;
+				while (true) {
+					for (var c = 0; c < 2; c++) {
+						if (this.modules[row][col - c] == null) {
+							var dark = false;
+							if (byteIndex < data.length) {
+								dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
+							}
+							var mask = QRUtil.getMask(maskPattern, row, col - c);
+							if (mask) {
+								dark = !dark;
+							}
+							this.modules[row][col - c] = dark;
+							bitIndex--;
+							if (bitIndex == -1) {
+								byteIndex++;
+								bitIndex = 7;
+							}
+						}
+					}
+					row += inc;
+					if (row < 0 || this.moduleCount <= row) {
+						row -= inc;
+						inc = -inc;
+						break;
+					}
+				}
+			}
+		}
+	};
+	QRCodeModel.PAD0 = 0xEC;
+	QRCodeModel.PAD1 = 0x11;
+	QRCodeModel.createData = function(typeNumber, errorCorrectLevel, dataList) {
+		var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
+		var buffer = new QRBitBuffer();
+		for (var i = 0; i < dataList.length; i++) {
+			var data = dataList[i];
+			buffer.put(data.mode, 4);
+			buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
+			data.write(buffer);
+		}
+		var totalDataCount = 0;
+		for (var i = 0; i < rsBlocks.length; i++) {
+			totalDataCount += rsBlocks[i].dataCount;
+		}
+		if (buffer.getLengthInBits() > totalDataCount * 8) {
+			throw new Error("code length overflow. (" +
+				buffer.getLengthInBits() +
+				">" +
+				totalDataCount * 8 +
+				")");
+		}
+		if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
+			buffer.put(0, 4);
+		}
+		while (buffer.getLengthInBits() % 8 != 0) {
+			buffer.putBit(false);
+		}
+		while (true) {
+			if (buffer.getLengthInBits() >= totalDataCount * 8) {
+				break;
+			}
+			buffer.put(QRCodeModel.PAD0, 8);
+			if (buffer.getLengthInBits() >= totalDataCount * 8) {
+				break;
+			}
+			buffer.put(QRCodeModel.PAD1, 8);
+		}
+		return QRCodeModel.createBytes(buffer, rsBlocks);
+	};
+	QRCodeModel.createBytes = function(buffer, rsBlocks) {
+		var offset = 0;
+		var maxDcCount = 0;
+		var maxEcCount = 0;
+		var dcdata = new Array(rsBlocks.length);
+		var ecdata = new Array(rsBlocks.length);
+		for (var r = 0; r < rsBlocks.length; r++) {
+			var dcCount = rsBlocks[r].dataCount;
+			var ecCount = rsBlocks[r].totalCount - dcCount;
+			maxDcCount = Math.max(maxDcCount, dcCount);
+			maxEcCount = Math.max(maxEcCount, ecCount);
+			dcdata[r] = new Array(dcCount);
+			for (var i = 0; i < dcdata[r].length; i++) {
+				dcdata[r][i] = 0xff & buffer.buffer[i + offset];
+			}
+			offset += dcCount;
+			var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
+			var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
+			var modPoly = rawPoly.mod(rsPoly);
+			ecdata[r] = new Array(rsPoly.getLength() - 1);
+			for (var i = 0; i < ecdata[r].length; i++) {
+				var modIndex = i + modPoly.getLength() - ecdata[r].length;
+				ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
+			}
+		}
+		var totalCodeCount = 0;
+		for (var i = 0; i < rsBlocks.length; i++) {
+			totalCodeCount += rsBlocks[i].totalCount;
+		}
+		var data = new Array(totalCodeCount);
+		var index = 0;
+		for (var i = 0; i < maxDcCount; i++) {
+			for (var r = 0; r < rsBlocks.length; r++) {
+				if (i < dcdata[r].length) {
+					data[index++] = dcdata[r][i];
+				}
+			}
+		}
+		for (var i = 0; i < maxEcCount; i++) {
+			for (var r = 0; r < rsBlocks.length; r++) {
+				if (i < ecdata[r].length) {
+					data[index++] = ecdata[r][i];
+				}
+			}
+		}
+		return data;
+	};
+	var QRMode = {
+		MODE_NUMBER: 1 << 0,
+		MODE_ALPHA_NUM: 1 << 1,
+		MODE_8BIT_BYTE: 1 << 2,
+		MODE_KANJI: 1 << 3
+	};
+	var QRErrorCorrectLevel = {
+		L: 1,
+		M: 0,
+		Q: 3,
+		H: 2
+	};
+	var QRMaskPattern = {
+		PATTERN000: 0,
+		PATTERN001: 1,
+		PATTERN010: 2,
+		PATTERN011: 3,
+		PATTERN100: 4,
+		PATTERN101: 5,
+		PATTERN110: 6,
+		PATTERN111: 7
+	};
+	var QRUtil = {
+		PATTERN_POSITION_TABLE: [
+			[],
+			[6, 18],
+			[6, 22],
+			[6, 26],
+			[6, 30],
+			[6, 34],
+			[6, 22, 38],
+			[6, 24, 42],
+			[6, 26, 46],
+			[6, 28, 50],
+			[6, 30, 54],
+			[6, 32, 58],
+			[6, 34, 62],
+			[6, 26, 46, 66],
+			[6, 26, 48, 70],
+			[6, 26, 50, 74],
+			[6, 30, 54, 78],
+			[6, 30, 56, 82],
+			[6, 30, 58, 86],
+			[6, 34, 62, 90],
+			[6, 28, 50, 72, 94],
+			[6, 26, 50, 74, 98],
+			[6, 30, 54, 78, 102],
+			[6, 28, 54, 80, 106],
+			[6, 32, 58, 84, 110],
+			[6, 30, 58, 86, 114],
+			[6, 34, 62, 90, 118],
+			[6, 26, 50, 74, 98, 122],
+			[6, 30, 54, 78, 102, 126],
+			[6, 26, 52, 78, 104, 130],
+			[6, 30, 56, 82, 108, 134],
+			[6, 34, 60, 86, 112, 138],
+			[6, 30, 58, 86, 114, 142],
+			[6, 34, 62, 90, 118, 146],
+			[6, 30, 54, 78, 102, 126, 150],
+			[6, 24, 50, 76, 102, 128, 154],
+			[6, 28, 54, 80, 106, 132, 158],
+			[6, 32, 58, 84, 110, 136, 162],
+			[6, 26, 54, 82, 110, 138, 166],
+			[6, 30, 58, 86, 114, 142, 170]
+		],
+		G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
+		G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
+		G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
+		getBCHTypeInfo: function(data) {
+			var d = data << 10;
+			while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
+				d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
+			}
+			return ((data << 10) | d) ^ QRUtil.G15_MASK;
+		},
+		getBCHTypeNumber: function(data) {
+			var d = data << 12;
+			while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
+				d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
+			}
+			return (data << 12) | d;
+		},
+		getBCHDigit: function(data) {
+			var digit = 0;
+			while (data != 0) {
+				digit++;
+				data >>>= 1;
+			}
+			return digit;
+		},
+		getPatternPosition: function(typeNumber) {
+			return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
+		},
+		getMask: function(maskPattern, i, j) {
+			switch (maskPattern) {
+				case QRMaskPattern.PATTERN000:
+					return (i + j) % 2 == 0;
+				case QRMaskPattern.PATTERN001:
+					return i % 2 == 0;
+				case QRMaskPattern.PATTERN010:
+					return j % 3 == 0;
+				case QRMaskPattern.PATTERN011:
+					return (i + j) % 3 == 0;
+				case QRMaskPattern.PATTERN100:
+					return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
+				case QRMaskPattern.PATTERN101:
+					return (i * j) % 2 + (i * j) % 3 == 0;
+				case QRMaskPattern.PATTERN110:
+					return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
+				case QRMaskPattern.PATTERN111:
+					return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
+				default:
+					throw new Error("bad maskPattern:" + maskPattern);
+			}
+		},
+		getErrorCorrectPolynomial: function(errorCorrectLength) {
+			var a = new QRPolynomial([1], 0);
+			for (var i = 0; i < errorCorrectLength; i++) {
+				a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
+			}
+			return a;
+		},
+		getLengthInBits: function(mode, type) {
+			if (1 <= type && type < 10) {
+				switch (mode) {
+					case QRMode.MODE_NUMBER:
+						return 10;
+					case QRMode.MODE_ALPHA_NUM:
+						return 9;
+					case QRMode.MODE_8BIT_BYTE:
+						return 8;
+					case QRMode.MODE_KANJI:
+						return 8;
+					default:
+						throw new Error("mode:" + mode);
+				}
+			} else if (type < 27) {
+				switch (mode) {
+					case QRMode.MODE_NUMBER:
+						return 12;
+					case QRMode.MODE_ALPHA_NUM:
+						return 11;
+					case QRMode.MODE_8BIT_BYTE:
+						return 16;
+					case QRMode.MODE_KANJI:
+						return 10;
+					default:
+						throw new Error("mode:" + mode);
+				}
+			} else if (type < 41) {
+				switch (mode) {
+					case QRMode.MODE_NUMBER:
+						return 14;
+					case QRMode.MODE_ALPHA_NUM:
+						return 13;
+					case QRMode.MODE_8BIT_BYTE:
+						return 16;
+					case QRMode.MODE_KANJI:
+						return 12;
+					default:
+						throw new Error("mode:" + mode);
+				}
+			} else {
+				throw new Error("type:" + type);
+			}
+		},
+		getLostPoint: function(qrCode) {
+			var moduleCount = qrCode.getModuleCount();
+			var lostPoint = 0;
+			for (var row = 0; row < moduleCount; row++) {
+				for (var col = 0; col < moduleCount; col++) {
+					var sameCount = 0;
+					var dark = qrCode.isDark(row, col);
+					for (var r = -1; r <= 1; r++) {
+						if (row + r < 0 || moduleCount <= row + r) {
+							continue;
+						}
+						for (var c = -1; c <= 1; c++) {
+							if (col + c < 0 || moduleCount <= col + c) {
+								continue;
+							}
+							if (r == 0 && c == 0) {
+								continue;
+							}
+							if (dark == qrCode.isDark(row + r, col + c)) {
+								sameCount++;
+							}
+						}
+					}
+					if (sameCount > 5) {
+						lostPoint += (3 + sameCount - 5);
+					}
+				}
+			}
+			for (var row = 0; row < moduleCount - 1; row++) {
+				for (var col = 0; col < moduleCount - 1; col++) {
+					var count = 0;
+					if (qrCode.isDark(row, col)) count++;
+					if (qrCode.isDark(row + 1, col)) count++;
+					if (qrCode.isDark(row, col + 1)) count++;
+					if (qrCode.isDark(row + 1, col + 1)) count++;
+					if (count == 0 || count == 4) {
+						lostPoint += 3;
+					}
+				}
+			}
+			for (var row = 0; row < moduleCount; row++) {
+				for (var col = 0; col < moduleCount - 6; col++) {
+					if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col +
+							2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode
+						.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) {
+						lostPoint += 40;
+					}
+				}
+			}
+			for (var col = 0; col < moduleCount; col++) {
+				for (var row = 0; row < moduleCount - 6; row++) {
+					if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2,
+							col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode
+						.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) {
+						lostPoint += 40;
+					}
+				}
+			}
+			var darkCount = 0;
+			for (var col = 0; col < moduleCount; col++) {
+				for (var row = 0; row < moduleCount; row++) {
+					if (qrCode.isDark(row, col)) {
+						darkCount++;
+					}
+				}
+			}
+			var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+			lostPoint += ratio * 10;
+			return lostPoint;
+		}
+	};
+	var QRMath = {
+		glog: function(n) {
+			if (n < 1) {
+				throw new Error("glog(" + n + ")");
+			}
+			return QRMath.LOG_TABLE[n];
+		},
+		gexp: function(n) {
+			while (n < 0) {
+				n += 255;
+			}
+			while (n >= 256) {
+				n -= 255;
+			}
+			return QRMath.EXP_TABLE[n];
+		},
+		EXP_TABLE: new Array(256),
+		LOG_TABLE: new Array(256)
+	};
+	for (var i = 0; i < 8; i++) {
+		QRMath.EXP_TABLE[i] = 1 << i;
+	}
+	for (var i = 8; i < 256; i++) {
+		QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath
+			.EXP_TABLE[i - 8];
+	}
+	for (var i = 0; i < 255; i++) {
+		QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
+	}
+
+	function QRPolynomial(num, shift) {
+		if (num.length == undefined) {
+			throw new Error(num.length + "/" + shift);
+		}
+		var offset = 0;
+		while (offset < num.length && num[offset] == 0) {
+			offset++;
+		}
+		this.num = new Array(num.length - offset + shift);
+		for (var i = 0; i < num.length - offset; i++) {
+			this.num[i] = num[i + offset];
+		}
+	}
+	QRPolynomial.prototype = {
+		get: function(index) {
+			return this.num[index];
+		},
+		getLength: function() {
+			return this.num.length;
+		},
+		multiply: function(e) {
+			var num = new Array(this.getLength() + e.getLength() - 1);
+			for (var i = 0; i < this.getLength(); i++) {
+				for (var j = 0; j < e.getLength(); j++) {
+					num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
+				}
+			}
+			return new QRPolynomial(num, 0);
+		},
+		mod: function(e) {
+			if (this.getLength() - e.getLength() < 0) {
+				return this;
+			}
+			var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0));
+			var num = new Array(this.getLength());
+			for (var i = 0; i < this.getLength(); i++) {
+				num[i] = this.get(i);
+			}
+			for (var i = 0; i < e.getLength(); i++) {
+				num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+			}
+			return new QRPolynomial(num, 0).mod(e);
+		}
+	};
+
+	function QRRSBlock(totalCount, dataCount) {
+		this.totalCount = totalCount;
+		this.dataCount = dataCount;
+	}
+	QRRSBlock.RS_BLOCK_TABLE = [
+		[1, 26, 19],
+		[1, 26, 16],
+		[1, 26, 13],
+		[1, 26, 9],
+		[1, 44, 34],
+		[1, 44, 28],
+		[1, 44, 22],
+		[1, 44, 16],
+		[1, 70, 55],
+		[1, 70, 44],
+		[2, 35, 17],
+		[2, 35, 13],
+		[1, 100, 80],
+		[2, 50, 32],
+		[2, 50, 24],
+		[4, 25, 9],
+		[1, 134, 108],
+		[2, 67, 43],
+		[2, 33, 15, 2, 34, 16],
+		[2, 33, 11, 2, 34, 12],
+		[2, 86, 68],
+		[4, 43, 27],
+		[4, 43, 19],
+		[4, 43, 15],
+		[2, 98, 78],
+		[4, 49, 31],
+		[2, 32, 14, 4, 33, 15],
+		[4, 39, 13, 1, 40, 14],
+		[2, 121, 97],
+		[2, 60, 38, 2, 61, 39],
+		[4, 40, 18, 2, 41, 19],
+		[4, 40, 14, 2, 41, 15],
+		[2, 146, 116],
+		[3, 58, 36, 2, 59, 37],
+		[4, 36, 16, 4, 37, 17],
+		[4, 36, 12, 4, 37, 13],
+		[2, 86, 68, 2, 87, 69],
+		[4, 69, 43, 1, 70, 44],
+		[6, 43, 19, 2, 44, 20],
+		[6, 43, 15, 2, 44, 16],
+		[4, 101, 81],
+		[1, 80, 50, 4, 81, 51],
+		[4, 50, 22, 4, 51, 23],
+		[3, 36, 12, 8, 37, 13],
+		[2, 116, 92, 2, 117, 93],
+		[6, 58, 36, 2, 59, 37],
+		[4, 46, 20, 6, 47, 21],
+		[7, 42, 14, 4, 43, 15],
+		[4, 133, 107],
+		[8, 59, 37, 1, 60, 38],
+		[8, 44, 20, 4, 45, 21],
+		[12, 33, 11, 4, 34, 12],
+		[3, 145, 115, 1, 146, 116],
+		[4, 64, 40, 5, 65, 41],
+		[11, 36, 16, 5, 37, 17],
+		[11, 36, 12, 5, 37, 13],
+		[5, 109, 87, 1, 110, 88],
+		[5, 65, 41, 5, 66, 42],
+		[5, 54, 24, 7, 55, 25],
+		[11, 36, 12],
+		[5, 122, 98, 1, 123, 99],
+		[7, 73, 45, 3, 74, 46],
+		[15, 43, 19, 2, 44, 20],
+		[3, 45, 15, 13, 46, 16],
+		[1, 135, 107, 5, 136, 108],
+		[10, 74, 46, 1, 75, 47],
+		[1, 50, 22, 15, 51, 23],
+		[2, 42, 14, 17, 43, 15],
+		[5, 150, 120, 1, 151, 121],
+		[9, 69, 43, 4, 70, 44],
+		[17, 50, 22, 1, 51, 23],
+		[2, 42, 14, 19, 43, 15],
+		[3, 141, 113, 4, 142, 114],
+		[3, 70, 44, 11, 71, 45],
+		[17, 47, 21, 4, 48, 22],
+		[9, 39, 13, 16, 40, 14],
+		[3, 135, 107, 5, 136, 108],
+		[3, 67, 41, 13, 68, 42],
+		[15, 54, 24, 5, 55, 25],
+		[15, 43, 15, 10, 44, 16],
+		[4, 144, 116, 4, 145, 117],
+		[17, 68, 42],
+		[17, 50, 22, 6, 51, 23],
+		[19, 46, 16, 6, 47, 17],
+		[2, 139, 111, 7, 140, 112],
+		[17, 74, 46],
+		[7, 54, 24, 16, 55, 25],
+		[34, 37, 13],
+		[4, 151, 121, 5, 152, 122],
+		[4, 75, 47, 14, 76, 48],
+		[11, 54, 24, 14, 55, 25],
+		[16, 45, 15, 14, 46, 16],
+		[6, 147, 117, 4, 148, 118],
+		[6, 73, 45, 14, 74, 46],
+		[11, 54, 24, 16, 55, 25],
+		[30, 46, 16, 2, 47, 17],
+		[8, 132, 106, 4, 133, 107],
+		[8, 75, 47, 13, 76, 48],
+		[7, 54, 24, 22, 55, 25],
+		[22, 45, 15, 13, 46, 16],
+		[10, 142, 114, 2, 143, 115],
+		[19, 74, 46, 4, 75, 47],
+		[28, 50, 22, 6, 51, 23],
+		[33, 46, 16, 4, 47, 17],
+		[8, 152, 122, 4, 153, 123],
+		[22, 73, 45, 3, 74, 46],
+		[8, 53, 23, 26, 54, 24],
+		[12, 45, 15, 28, 46, 16],
+		[3, 147, 117, 10, 148, 118],
+		[3, 73, 45, 23, 74, 46],
+		[4, 54, 24, 31, 55, 25],
+		[11, 45, 15, 31, 46, 16],
+		[7, 146, 116, 7, 147, 117],
+		[21, 73, 45, 7, 74, 46],
+		[1, 53, 23, 37, 54, 24],
+		[19, 45, 15, 26, 46, 16],
+		[5, 145, 115, 10, 146, 116],
+		[19, 75, 47, 10, 76, 48],
+		[15, 54, 24, 25, 55, 25],
+		[23, 45, 15, 25, 46, 16],
+		[13, 145, 115, 3, 146, 116],
+		[2, 74, 46, 29, 75, 47],
+		[42, 54, 24, 1, 55, 25],
+		[23, 45, 15, 28, 46, 16],
+		[17, 145, 115],
+		[10, 74, 46, 23, 75, 47],
+		[10, 54, 24, 35, 55, 25],
+		[19, 45, 15, 35, 46, 16],
+		[17, 145, 115, 1, 146, 116],
+		[14, 74, 46, 21, 75, 47],
+		[29, 54, 24, 19, 55, 25],
+		[11, 45, 15, 46, 46, 16],
+		[13, 145, 115, 6, 146, 116],
+		[14, 74, 46, 23, 75, 47],
+		[44, 54, 24, 7, 55, 25],
+		[59, 46, 16, 1, 47, 17],
+		[12, 151, 121, 7, 152, 122],
+		[12, 75, 47, 26, 76, 48],
+		[39, 54, 24, 14, 55, 25],
+		[22, 45, 15, 41, 46, 16],
+		[6, 151, 121, 14, 152, 122],
+		[6, 75, 47, 34, 76, 48],
+		[46, 54, 24, 10, 55, 25],
+		[2, 45, 15, 64, 46, 16],
+		[17, 152, 122, 4, 153, 123],
+		[29, 74, 46, 14, 75, 47],
+		[49, 54, 24, 10, 55, 25],
+		[24, 45, 15, 46, 46, 16],
+		[4, 152, 122, 18, 153, 123],
+		[13, 74, 46, 32, 75, 47],
+		[48, 54, 24, 14, 55, 25],
+		[42, 45, 15, 32, 46, 16],
+		[20, 147, 117, 4, 148, 118],
+		[40, 75, 47, 7, 76, 48],
+		[43, 54, 24, 22, 55, 25],
+		[10, 45, 15, 67, 46, 16],
+		[19, 148, 118, 6, 149, 119],
+		[18, 75, 47, 31, 76, 48],
+		[34, 54, 24, 34, 55, 25],
+		[20, 45, 15, 61, 46, 16]
+	];
+	QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) {
+		var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
+		if (rsBlock == undefined) {
+			throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" +
+				errorCorrectLevel);
+		}
+		var length = rsBlock.length / 3;
+		var list = [];
+		for (var i = 0; i < length; i++) {
+			var count = rsBlock[i * 3 + 0];
+			var totalCount = rsBlock[i * 3 + 1];
+			var dataCount = rsBlock[i * 3 + 2];
+			for (var j = 0; j < count; j++) {
+				list.push(new QRRSBlock(totalCount, dataCount));
+			}
+		}
+		return list;
+	};
+	QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) {
+		switch (errorCorrectLevel) {
+			case QRErrorCorrectLevel.L:
+				return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
+			case QRErrorCorrectLevel.M:
+				return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
+			case QRErrorCorrectLevel.Q:
+				return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
+			case QRErrorCorrectLevel.H:
+				return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
+			default:
+				return undefined;
+		}
+	};
+
+	function QRBitBuffer() {
+		this.buffer = [];
+		this.length = 0;
+	}
+	QRBitBuffer.prototype = {
+		get: function(index) {
+			var bufIndex = Math.floor(index / 8);
+			return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;
+		},
+		put: function(num, length) {
+			for (var i = 0; i < length; i++) {
+				this.putBit(((num >>> (length - i - 1)) & 1) == 1);
+			}
+		},
+		getLengthInBits: function() {
+			return this.length;
+		},
+		putBit: function(bit) {
+			var bufIndex = Math.floor(this.length / 8);
+			if (this.buffer.length <= bufIndex) {
+				this.buffer.push(0);
+			}
+			if (bit) {
+				this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
+			}
+			this.length++;
+		}
+	};
+	var QRCodeLimitLength = [
+		[17, 14, 11, 7],
+		[32, 26, 20, 14],
+		[53, 42, 32, 24],
+		[78, 62, 46, 34],
+		[106, 84, 60, 44],
+		[134, 106, 74, 58],
+		[154, 122, 86, 64],
+		[192, 152, 108, 84],
+		[230, 180, 130, 98],
+		[271, 213, 151, 119],
+		[321, 251, 177, 137],
+		[367, 287, 203, 155],
+		[425, 331, 241, 177],
+		[458, 362, 258, 194],
+		[520, 412, 292, 220],
+		[586, 450, 322, 250],
+		[644, 504, 364, 280],
+		[718, 560, 394, 310],
+		[792, 624, 442, 338],
+		[858, 666, 482, 382],
+		[929, 711, 509, 403],
+		[1003, 779, 565, 439],
+		[1091, 857, 611, 461],
+		[1171, 911, 661, 511],
+		[1273, 997, 715, 535],
+		[1367, 1059, 751, 593],
+		[1465, 1125, 805, 625],
+		[1528, 1190, 868, 658],
+		[1628, 1264, 908, 698],
+		[1732, 1370, 982, 742],
+		[1840, 1452, 1030, 790],
+		[1952, 1538, 1112, 842],
+		[2068, 1628, 1168, 898],
+		[2188, 1722, 1228, 958],
+		[2303, 1809, 1283, 983],
+		[2431, 1911, 1351, 1051],
+		[2563, 1989, 1423, 1093],
+		[2699, 2099, 1499, 1139],
+		[2809, 2213, 1579, 1219],
+		[2953, 2331, 1663, 1273]
+	];
+
+	// QRCode object
+	QRCode = function(canvasId, vOption) {
+		this._htOption = {
+			width: 256,
+			height: 256,
+			typeNumber: 4,
+			colorDark: "#000000",
+			colorLight: "#ffffff",
+			correctLevel: QRErrorCorrectLevel.H
+		};
+
+		if (typeof vOption === 'string') {
+			vOption = {
+				text: vOption
+			};
+		}
+
+		// Overwrites options
+		if (vOption) {
+			for (var i in vOption) {
+				this._htOption[i] = vOption[i];
+			}
+		}
+
+		this._oQRCode = null;
+		this.canvasId = canvasId
+
+		if (this._htOption.text && this.canvasId) {
+			this.makeCode(this._htOption.text);
+		}
+	};
+
+	QRCode.prototype.makeCode = function(sText) {
+		this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption
+			.correctLevel);
+		this._oQRCode.addData(sText);
+		this._oQRCode.make();
+		this.makeImage();
+	};
+
+	QRCode.prototype.makeImage = function() {
+		var _oContext
+		if (this._htOption.usingIn) {
+			_oContext = wx.createCanvasContext(this.canvasId, this._htOption.usingIn)
+		} else {
+			_oContext = wx.createCanvasContext(this.canvasId)
+		}
+		var _htOption = this._htOption;
+		var oQRCode = this._oQRCode
+
+		var nCount = oQRCode.getModuleCount();
+		var nWidth = _htOption.width / nCount;
+		var nHeight = _htOption.height / nCount;
+		var nRoundedWidth = Math.round(nWidth);
+		var nRoundedHeight = Math.round(nHeight);
+
+		if (_htOption.image && _htOption.image != '') {
+			_oContext.drawImage(_htOption.image, 0, 0, _htOption.width, _htOption.height)
+		}
+
+		for (var row = 0; row < nCount; row++) {
+			for (var col = 0; col < nCount; col++) {
+				var bIsDark = oQRCode.isDark(row, col);
+				var nLeft = col * nWidth;
+				var nTop = row * nHeight;
+				_oContext.setStrokeStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)
+				// _oContext.setStrokeStyle('yellow')
+				_oContext.setLineWidth(1)
+				_oContext.setFillStyle(bIsDark ? _htOption.colorDark : _htOption.colorLight)
+				// _oContext.setFillStyle('red')
+				// if (bIsDark) {
+				_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
+				// }
+
+				// 안티 앨리어싱 방지 처리
+				// if (bIsDark) {
+				_oContext.strokeRect(
+					Math.floor(nLeft) + 0.5,
+					Math.floor(nTop) + 0.5,
+					nRoundedWidth,
+					nRoundedHeight
+				);
+
+				_oContext.strokeRect(
+					Math.ceil(nLeft) - 0.5,
+					Math.ceil(nTop) - 0.5,
+					nRoundedWidth,
+					nRoundedHeight
+				);
+				// }
+				// _oContext.fillRect(
+				//     Math.floor(nLeft) + 0.5,
+				//     Math.floor(nTop) + 0.5,
+				//     nRoundedWidth,
+				//     nRoundedHeight
+				// );
+				// _oContext.fillRect(
+				//     Math.ceil(nLeft) - 0.5,
+				//     Math.ceil(nTop) - 0.5,
+				//     nRoundedWidth,
+				//     nRoundedHeight
+				// );
+				// _oContext.clearRect(
+				//     Math.floor(nLeft) + 0.5,
+				//     Math.floor(nTop) + 0.5,
+				//     nRoundedWidth,
+				//     nRoundedHeight
+				// );
+				// _oContext.clearRect(
+				//     Math.ceil(nLeft) - 0.5,
+				//     Math.ceil(nTop) - 0.5,
+				//     nRoundedWidth,
+				//     nRoundedHeight
+				// );
+			}
+		}
+
+		_oContext.draw()
+	};
+
+	// 保存为图片,将临时路径传给回调
+	QRCode.prototype.exportImage = function(callback) {
+		if (!callback) {
+			return
+		}
+		wx.canvasToTempFilePath({
+			x: 0,
+			y: 0,
+			width: this._htOption.width,
+			height: this._htOption.height,
+			destWidth: this._htOption.width,
+			destHeight: this._htOption.height,
+			canvasId: this.canvasId,
+			success: function(res) {
+				console.log(res.tempFilePath)
+				callback(res.tempFilePath)
+			}
+		})
+	}
+
+	QRCode.CorrectLevel = QRErrorCorrectLevel;
+})();
+
+module.exports = QRCode

+ 106 - 0
components/yz-qr/yz-qr.vue

@@ -0,0 +1,106 @@
+<template>
+	<view>
+		<view class="qrcode">
+			<canvas :style="{width:size+ 'px', height:size+ 'px', background:bgc}" canvas-id="couponQrcode"></canvas>
+		</view>
+	</view>
+</template>
+
+<script>
+	const qrCode = require('./weapp-qrcode.js')
+	export default {
+		data() {
+			return {
+				bgc: 'rgba(200, 200, 200, 0.1)', //测试画布是否与内容相同大小
+				canvasQrPath: this.qrPath, //
+				level: ''
+			}
+		},
+
+		props: {
+			text: {
+				type: String,
+				default: 'hello'
+			},
+			size: {
+				type: Number,
+				default: 200
+			},
+			quality: {
+				type: String,
+				default: 'L' //二维码质量L/M/Q/H
+			},
+			colorDark: {
+				type: String,
+				default: '#000000'
+			},
+			colorLight: {
+				type: String,
+				default: '#ffffff'
+			},
+			qrPath: {
+				type: String,
+				default: ''
+			}
+		},
+		// 在实例挂载完成后被立即调用
+		mounted() { //兼容非动态取值(二维码为固定内容)
+			this.couponQrCode()
+		},
+		watch: {
+			text(newVal, oldVal) { //监测到text值发生改变时重新绘制
+				// console.log('最新值是:' + newVal, "原来的值是:" + oldVal);
+				this.couponQrCode()
+			}
+		},
+		methods: {
+			// 二维码生成工具
+			couponQrCode() {
+				var that = this;
+				if (this.quality == 'L') {
+					this.level = qrCode.CorrectLevel.L
+				} else if (this.quality == 'M') {
+					this.level = qrCode.CorrectLevel.M
+				} else if (this.quality == 'Q') {
+					this.level = qrCode.CorrectLevel.Q
+				} else if (this.quality == 'H') {
+					this.level = qrCode.CorrectLevel.H
+				} else {
+					this.level = qrCode.CorrectLevel.L
+				}
+				new qrCode('couponQrcode', {
+					text: this.text,
+					width: this.size,
+					height: this.size,
+					showLoading: true, // 是否显示loading
+					loadingText: '二维码生成中', // loading文字
+					colorDark: this.colorDark, //二维码暗部颜色
+					colorLight: this.colorLight, //二维码亮部颜色
+					correctLevel: this.level, //二维码质量L/M/Q/H
+					usingIn: this //在自定义组件下,第二个参数传入组件实例this
+				})
+				// 把当前画布指定区域的内容导出生成图片,并返回文件路径。
+				uni.canvasToTempFilePath({
+					canvasId: 'couponQrcode',
+					success: (res) => {
+						// 在H5平台下,tempFilePath 为 base64
+						// console.log('yz-qr图片路径:', res.tempFilePath)
+						this.canvasQrPath = res.tempFilePath
+						this.$emit('update:qrPath', this.canvasQrPath)
+					}
+				}, this);
+
+				console.log('绘制完成');
+			}
+		}
+	}
+</script>
+
+<style>
+	.qrcode {
+		padding: 24rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+</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>

+ 28 - 0
main.js

@@ -0,0 +1,28 @@
+import App from './App'
+import uView from "uview-ui";
+Vue.use(uView);
+
+// #ifndef VUE3
+import Vue from 'vue'
+
+
+
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif
+

+ 245 - 0
manifest.json

@@ -0,0 +1,245 @@
+{
+    "name" : "yixiang",
+    "appid" : "__UNI__97674D1",
+    "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" : {
+                "oauth" : {},
+                "payment" : {}
+            }
+        },
+        "nativePlugins" : {
+            "JG-JCore" : {
+                "JPUSH_APPKEY_IOS" : "07ca3eaf2d56b37620c4ab86",
+                "JPUSH_CHANNEL_IOS" : "",
+                "JPUSH_APPKEY_ANDROID" : "07ca3eaf2d56b37620c4ab86",
+                "JPUSH_CHANNEL_ANDROID" : "",
+                "__plugin_info__" : {
+                    "name" : "JG-JCore",
+                    "description" : "极光推送JCore插件",
+                    "platforms" : "Android,iOS",
+                    "url" : "",
+                    "android_package_name" : "",
+                    "ios_bundle_id" : "",
+                    "isCloud" : false,
+                    "bought" : -1,
+                    "pid" : "",
+                    "parameters" : {
+                        "JPUSH_APPKEY_IOS" : {
+                            "des" : "[iOS]极光portal配置应用信息时分配的AppKey",
+                            "key" : "JCore:APP_KEY",
+                            "value" : ""
+                        },
+                        "JPUSH_CHANNEL_IOS" : {
+                            "des" : "[iOS]用于统计分发渠道,不需要可填默认值developer-default",
+                            "key" : "JCore:CHANNEL",
+                            "value" : ""
+                        },
+                        "JPUSH_APPKEY_ANDROID" : {
+                            "des" : "[Android]极光portal配置应用信息时分配的AppKey",
+                            "key" : "JPUSH_APPKEY",
+                            "value" : ""
+                        },
+                        "JPUSH_CHANNEL_ANDROID" : {
+                            "des" : "[Android]用于统计分发渠道,不需要可填默认值developer-default",
+                            "key" : "JPUSH_CHANNEL",
+                            "value" : ""
+                        }
+                    }
+                }
+            },
+            "JG-JPush" : {
+                "JPUSH_ISPRODUCTION_IOS" : "",
+                "JPUSH_ADVERTISINGID_IOS" : "",
+                "JPUSH_DEFAULTINITJPUSH_IOS" : "",
+                "JPUSH_OPPO_APPKEY" : "",
+                "JPUSH_OPPO_APPID" : "",
+                "JPUSH_OPPO_APPSECRET" : "",
+                "JPUSH_VIVO_APPKEY" : "",
+                "JPUSH_VIVO_APPID" : "",
+                "JPUSH_MEIZU_APPKEY" : "",
+                "JPUSH_MEIZU_APPID" : "",
+                "JPUSH_XIAOMI_APPKEY" : "",
+                "JPUSH_XIAOMI_APPID" : "",
+                "JPUSH_HUAWEI_APPID" : "",
+                "JPUSH_HONOR_APPID" : "",
+                "JPUSH_GOOGLE_API_KEY" : "",
+                "JPUSH_GOOGLE_APP_ID" : "",
+                "JPUSH_GOOGLE_PROJECT_NUMBER" : "",
+                "JPUSH_GOOGLE_PROJECT_ID" : "",
+                "JPUSH_GOOGLE_STORAGE_BUCKET" : "",
+                "__plugin_info__" : {
+                    "name" : "JG-JPush",
+                    "description" : "极光推送Hbuilder插件",
+                    "platforms" : "Android,iOS",
+                    "url" : "",
+                    "android_package_name" : "",
+                    "ios_bundle_id" : "",
+                    "isCloud" : false,
+                    "bought" : -1,
+                    "pid" : "",
+                    "parameters" : {
+                        "JPUSH_ISPRODUCTION_IOS" : {
+                            "des" : "[iOS]是否是生产环境,是填true,不是填false或者不填",
+                            "key" : "JPush:ISPRODUCTION",
+                            "value" : ""
+                        },
+                        "JPUSH_ADVERTISINGID_IOS" : {
+                            "des" : "[iOS]广告标识符(IDFA)如果不需要使用IDFA,可不填",
+                            "key" : "JPush:ADVERTISINGID",
+                            "value" : ""
+                        },
+                        "JPUSH_DEFAULTINITJPUSH_IOS" : {
+                            "des" : "[iOS]是否默认初始化,是填true,不是填false或者不填",
+                            "key" : "JPush:DEFAULTINITJPUSH",
+                            "value" : ""
+                        },
+                        "JPUSH_OPPO_APPKEY" : {
+                            "des" : "厂商OPPO-appkey,示例:OP-12345678",
+                            "key" : "OPPO_APPKEY",
+                            "value" : ""
+                        },
+                        "JPUSH_OPPO_APPID" : {
+                            "des" : "厂商OPPO-appId,示例:OP-12345678",
+                            "key" : "OPPO_APPID",
+                            "value" : ""
+                        },
+                        "JPUSH_OPPO_APPSECRET" : {
+                            "des" : "厂商OPPO-appSecret,示例:OP-12345678",
+                            "key" : "OPPO_APPSECRET",
+                            "value" : ""
+                        },
+                        "JPUSH_VIVO_APPKEY" : {
+                            "des" : "厂商VIVO-appkey,示例:12345678",
+                            "key" : "com.vivo.push.api_key",
+                            "value" : ""
+                        },
+                        "JPUSH_VIVO_APPID" : {
+                            "des" : "厂商VIVO-appId,示例:12345678",
+                            "key" : "com.vivo.push.app_id",
+                            "value" : ""
+                        },
+                        "JPUSH_MEIZU_APPKEY" : {
+                            "des" : "厂商MEIZU-appKey,示例:MZ-12345678",
+                            "key" : "MEIZU_APPKEY",
+                            "value" : ""
+                        },
+                        "JPUSH_MEIZU_APPID" : {
+                            "des" : "厂商MEIZU-appId,示例:MZ-12345678",
+                            "key" : "MEIZU_APPID",
+                            "value" : ""
+                        },
+                        "JPUSH_XIAOMI_APPKEY" : {
+                            "des" : "厂商XIAOMI-appKey,示例:MI-12345678",
+                            "key" : "XIAOMI_APPKEY",
+                            "value" : ""
+                        },
+                        "JPUSH_XIAOMI_APPID" : {
+                            "des" : "厂商XIAOMI-appId,示例:MI-12345678",
+                            "key" : "XIAOMI_APPID",
+                            "value" : ""
+                        },
+                        "JPUSH_HUAWEI_APPID" : {
+                            "des" : "厂商HUAWEI-appId,示例:appid=12346578",
+                            "key" : "com.huawei.hms.client.appid",
+                            "value" : ""
+                        },
+                        "JPUSH_HONOR_APPID" : {
+                            "des" : "厂商HONOR-appId,示例:12346578",
+                            "key" : "com.hihonor.push.app_id",
+                            "value" : ""
+                        },
+                        "JPUSH_GOOGLE_API_KEY" : {
+                            "des" : "厂商google api_key,示例:g-12346578",
+                            "key" : "google_api_key",
+                            "value" : ""
+                        },
+                        "JPUSH_GOOGLE_APP_ID" : {
+                            "des" : "厂商google mobilesdk_app_id,示例:g-12346578",
+                            "key" : "google_app_id",
+                            "value" : ""
+                        },
+                        "JPUSH_GOOGLE_PROJECT_NUMBER" : {
+                            "des" : "厂商google project_number,示例:g-12346578",
+                            "key" : "gcm_defaultSenderId",
+                            "value" : ""
+                        },
+                        "JPUSH_GOOGLE_PROJECT_ID" : {
+                            "des" : "厂商google project_id ,示例:g-12346578",
+                            "key" : "project_id",
+                            "value" : ""
+                        },
+                        "JPUSH_GOOGLE_STORAGE_BUCKET" : {
+                            "des" : "厂商google storage_bucket,示例:g-12346578",
+                            "key" : "google_storage_bucket",
+                            "value" : ""
+                        }
+                    }
+                }
+            }
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

binární
nativeplugins/JG-JCore/android/libs/jcore-android-4.4.0.jar


binární
nativeplugins/JG-JCore/android/uniplugin_jcore-release.aar


+ 17 - 0
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/Headers/JCoreModule.h

@@ -0,0 +1,17 @@
+//
+//  JCoreModule.h
+//  UniPluginJCore
+//
+//  Created by huangshuni on 2021/1/21.
+//
+
+#import <Foundation/Foundation.h>
+#import "DCUniModule.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JCoreModule : DCUniModule
+
+@end
+
+NS_ASSUME_NONNULL_END

binární
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/Info.plist


binární
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/UniPluginJCore


binární
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeDirectory


binární
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeRequirements


binární
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeRequirements-1


+ 117 - 0
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeResources

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>files</key>
+	<dict>
+		<key>Headers/JCoreModule.h</key>
+		<data>
+		4aMcBALZuuQeh2JQjJqqvSkc2mA=
+		</data>
+		<key>Info.plist</key>
+		<data>
+		y1XWCofgJDUiWWpyccrUtR5p2DU=
+		</data>
+	</dict>
+	<key>files2</key>
+	<dict>
+		<key>Headers/JCoreModule.h</key>
+		<dict>
+			<key>hash</key>
+			<data>
+			4aMcBALZuuQeh2JQjJqqvSkc2mA=
+			</data>
+			<key>hash2</key>
+			<data>
+			h/0w2CaU3JBhKI3Pp4EiSWqLf/ZY1Ju+5+tBAdowZ5k=
+			</data>
+		</dict>
+	</dict>
+	<key>rules</key>
+	<dict>
+		<key>^.*</key>
+		<true/>
+		<key>^.*\.lproj/</key>
+		<dict>
+			<key>optional</key>
+			<true/>
+			<key>weight</key>
+			<real>1000</real>
+		</dict>
+		<key>^.*\.lproj/locversion.plist$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>1100</real>
+		</dict>
+		<key>^Base\.lproj/</key>
+		<dict>
+			<key>weight</key>
+			<real>1010</real>
+		</dict>
+		<key>^version.plist$</key>
+		<true/>
+	</dict>
+	<key>rules2</key>
+	<dict>
+		<key>.*\.dSYM($|/)</key>
+		<dict>
+			<key>weight</key>
+			<real>11</real>
+		</dict>
+		<key>^(.*/)?\.DS_Store$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>2000</real>
+		</dict>
+		<key>^.*</key>
+		<true/>
+		<key>^.*\.lproj/</key>
+		<dict>
+			<key>optional</key>
+			<true/>
+			<key>weight</key>
+			<real>1000</real>
+		</dict>
+		<key>^.*\.lproj/locversion.plist$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>1100</real>
+		</dict>
+		<key>^Base\.lproj/</key>
+		<dict>
+			<key>weight</key>
+			<real>1010</real>
+		</dict>
+		<key>^Info\.plist$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^PkgInfo$</key>
+		<dict>
+			<key>omit</key>
+			<true/>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^embedded\.provisionprofile$</key>
+		<dict>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+		<key>^version\.plist$</key>
+		<dict>
+			<key>weight</key>
+			<real>20</real>
+		</dict>
+	</dict>
+</dict>
+</plist>

binární
nativeplugins/JG-JCore/ios/UniPluginJCore.framework/_CodeSignature/CodeSignature


+ 61 - 0
nativeplugins/JG-JCore/package.json

@@ -0,0 +1,61 @@
+{
+    "name": "JG-JCore",
+    "id": "JG-JCore",
+    "version": "1.1.5",
+    "description": "极光推送JCore插件",
+    "_dp_type":"nativeplugin",
+    "_dp_nativeplugin":{
+        "ios": {
+            "plugins": [
+                {
+                    "type": "module",
+                    "name": "JG-JCore",
+                    "class": "JCoreModule"
+                }
+            ],
+            "integrateType": "framework",
+            "deploymentTarget": "11.0",
+            "validArchitectures": [    
+                "arm64"
+            ],
+            "parameters": {
+                "JPUSH_APPKEY_IOS": {
+                    "des": "[iOS]极光portal配置应用信息时分配的AppKey",
+                    "key": "JCore:APP_KEY"
+                },
+                "JPUSH_CHANNEL_IOS": {
+                    "des": "[iOS]用于统计分发渠道,不需要可填默认值developer-default",
+                    "key": "JCore:CHANNEL"
+                }
+            }
+        },
+        "android": {
+            "plugins": [
+                {
+                    "type": "module",
+                    "name": "JG-JCore",
+                    "class": "cn.jiguang.uniplugin_jcore.JCoreModule"
+                }
+            ],
+            "integrateType": "aar",
+            "minSdkVersion": "19",
+            "permissions": [
+            ],
+            "abis": [
+                "armeabi-v7a",
+                "arm64-v8a",
+                "x86"
+            ],
+            "parameters": {
+                "JPUSH_APPKEY_ANDROID": {
+                    "des": "[Android]极光portal配置应用信息时分配的AppKey",
+                    "key": "JPUSH_APPKEY"
+                },
+                "JPUSH_CHANNEL_ANDROID":{
+                    "des": "[Android]用于统计分发渠道,不需要可填默认值developer-default",
+                    "key": "JPUSH_CHANNEL"
+                }
+            }
+        }
+    }
+}

binární
nativeplugins/JG-JPush/android/HiPushSDK-7.0.61.302.aar


binární
nativeplugins/JG-JPush/android/agconnect-core-1.7.3.302.aar


binární
nativeplugins/JG-JPush/android/availableupdate-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/base-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/baselegacyapi-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/com.heytap.msp-push-3.1.0.aar


binární
nativeplugins/JG-JPush/android/device-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/firebase-common-20.3.1.aar


binární
nativeplugins/JG-JPush/android/firebase-components-17.1.0.aar


binární
nativeplugins/JG-JPush/android/firebase-datatransport-18.1.7.aar


binární
nativeplugins/JG-JPush/android/firebase-encoders-json-18.0.0.aar


binární
nativeplugins/JG-JPush/android/firebase-iid-interop-17.1.0.aar


binární
nativeplugins/JG-JPush/android/firebase-installations-17.1.3.aar


binární
nativeplugins/JG-JPush/android/firebase-installations-interop-17.1.0.aar


binární
nativeplugins/JG-JPush/android/firebase-measurement-connector-19.0.0.aar


binární
nativeplugins/JG-JPush/android/firebase-messaging-23.1.2.aar


binární
nativeplugins/JG-JPush/android/hatool-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/libs/MiPush_SDK_Client_5_7_8-C.jar


binární
nativeplugins/JG-JPush/android/libs/commons-codec-1.6.jar


binární
nativeplugins/JG-JPush/android/libs/error_prone_annotations-2.9.0.jar


binární
nativeplugins/JG-JPush/android/libs/firebase-annotations-16.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/firebase-encoders-17.0.0.jar


binární
nativeplugins/JG-JPush/android/libs/firebase-encoders-proto-16.0.0.jar


binární
nativeplugins/JG-JPush/android/libs/javax.inject-1.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-plugin-fcm-v5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-plugin-honor-v5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-plugin-huawei-v5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-plugin-meizu-v5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-plugin-oppo-v5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-plugin-vivo-v5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/jpush-android-plugin-xiaomi-v5.2.0.jar


binární
nativeplugins/JG-JPush/android/libs/meizu-push-4.2.3.jar


binární
nativeplugins/JG-JPush/android/libs/tasks-1.5.2.206.jar


binární
nativeplugins/JG-JPush/android/log-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/network-common-6.0.2.300.aar


binární
nativeplugins/JG-JPush/android/network-framework-compat-6.0.2.300.aar


binární
nativeplugins/JG-JPush/android/network-grs-6.0.2.300.aar


binární
nativeplugins/JG-JPush/android/opendevice-6.11.0.300.aar


binární
nativeplugins/JG-JPush/android/play-services-base-18.0.1.aar


binární
nativeplugins/JG-JPush/android/play-services-basement-18.1.0.aar


binární
nativeplugins/JG-JPush/android/play-services-cloud-messaging-17.0.1.aar


binární
nativeplugins/JG-JPush/android/play-services-stats-17.0.2.aar


binární
nativeplugins/JG-JPush/android/play-services-tasks-18.0.2.aar


binární
nativeplugins/JG-JPush/android/push-6.11.0.300.aar


binární
nativeplugins/JG-JPush/android/push_sdk_v3.0.0.7_488.aar


binární
nativeplugins/JG-JPush/android/security-base-1.2.0.307.aar


binární
nativeplugins/JG-JPush/android/security-encrypt-1.2.0.307.aar


binární
nativeplugins/JG-JPush/android/security-ssl-1.2.0.307.aar


binární
nativeplugins/JG-JPush/android/stats-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/transport-api-3.0.0.aar


binární
nativeplugins/JG-JPush/android/transport-backend-cct-3.1.8.aar


binární
nativeplugins/JG-JPush/android/transport-runtime-3.1.8.aar


binární
nativeplugins/JG-JPush/android/ui-6.9.0.300.aar


binární
nativeplugins/JG-JPush/android/uniplugin_jpush-release.aar


+ 17 - 0
nativeplugins/JG-JPush/ios/UniPluginJPush.framework/Headers/JPushModule.h

@@ -0,0 +1,17 @@
+//
+//  JPushModule.h
+//  UniPluginJPush
+//
+//  Created by huangshuni on 2021/1/12.
+//
+
+#import <Foundation/Foundation.h>
+#import "DCUniModule.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JPushModule : DCUniModule
+
+@end
+
+NS_ASSUME_NONNULL_END

binární
nativeplugins/JG-JPush/ios/UniPluginJPush.framework/Info.plist


binární
nativeplugins/JG-JPush/ios/UniPluginJPush.framework/UniPluginJPush


+ 165 - 0
nativeplugins/JG-JPush/package.json

@@ -0,0 +1,165 @@
+{
+    "name": "JG-JPush",
+    "id": "JG-JPush",
+    "version": "1.2.0",
+    "description": "极光推送Hbuilder插件",
+    "_dp_type":"nativeplugin",
+    "_dp_nativeplugin":{
+        "ios": {
+			"deploymentTarget": "11.0",	
+			"validArchitectures": [    
+				"arm64"
+			],
+            "plugins": [{
+                "type": "module",
+                "name": "JG-JPush",
+                "class": "JPushModule"
+            }],
+            "hooksClass": "JPushProxy",
+            "integrateType": "framework",
+            "frameworks": [
+                "CFNetwork.framework",
+                "CoreFoundation.framework",
+                "CoreTelephony.framework",
+                "SystemConfiguration.framework",
+                "CoreGraphics.framework",
+                "Foundation.framework",
+                "UIKit.framework",
+                "Security.framework",
+                "libz.tbd",
+                "AdSupport.framework",
+                "UserNotifications.framework",
+                "libresolv.tbd",
+                "WebKit.framework",
+                "AppTrackingTransparency.framework",
+                "StoreKit.framework"
+            ],
+            "resources": [
+                
+            ],
+            "capabilities": {
+                "entitlements": {
+                    "aps-environment":"development"
+                }
+            },
+            "privacies": [
+                            "NSLocationAlwaysAndWhenInUseUsageDescription",
+                            "NSLocationAlwaysUsageDescription",
+                            "NSLocationWhenInUseUsageDescription"
+                        ],
+            "parameters": {
+                "JPUSH_ISPRODUCTION_IOS": {
+                    "des": "[iOS]是否是生产环境,是填true,不是填false或者不填",
+                    "key": "JPush:ISPRODUCTION"
+                },
+                "JPUSH_ADVERTISINGID_IOS": {
+                    "des": "[iOS]广告标识符(IDFA)如果不需要使用IDFA,可不填",
+                    "key": "JPush:ADVERTISINGID"
+                },
+                "JPUSH_DEFAULTINITJPUSH_IOS": {
+                    "des": "[iOS]是否默认初始化,是填true,不是填false或者不填",
+                    "key": "JPush:DEFAULTINITJPUSH"
+                }
+            }
+        },
+        "android": {
+            "plugins": [
+                {
+                    "type": "module",
+                    "name": "JG-JPush",
+                    "class": "cn.jiguang.uniplugin_jpush.JPushModule"
+                }
+            ],
+            "integrateType": "aar",
+            "minSdkVersion": "19",
+            "permissions": [
+                "${applicationId}.permission.JPUSH_MESSAGE",
+                "android.permission.INTERNET",
+                "android.permission.ACCESS_NETWORK_STATE",
+                "android.permission.POST_NOTIFICATIONS",
+                "com.huawei.android.launcher.permission.CHANGE_BADGE",
+                "com.vivo.notification.permission.BADGE_ICON",
+                "com.hihonor.android.launcher.permission.CHANGE_BADGE",
+                "android.permission.VIBRATE",
+                "android.permission.ACCESS_COARSE_LOCATION",
+                "android.permission.ACCESS_FINE_LOCATION",
+                "android.permission.ACCESS_BACKGROUND_LOCATION",
+                "android.permission.READ_PHONE_STATE",
+                "android.permission.QUERY_ALL_PACKAGES",
+                "android.permission.GET_TASKS",
+                "android.permission.ACCESS_WIFI_STATE",
+                "android.permission.WRITE_EXTERNAL_STORAGE",
+                "android.permission.READ_EXTERNAL_STORAGE",
+                "${applicationId}.permission.MIPUSH_RECEIVE",
+                "com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE",
+                "com.heytap.mcs.permission.RECIEVE_MCS_MESSAGE"
+            ],
+            "parameters": {
+                "JPUSH_OPPO_APPKEY": {
+                    "des": "厂商OPPO-appkey,示例:OP-12345678",
+                    "key": "OPPO_APPKEY"
+                },
+                "JPUSH_OPPO_APPID":{
+                    "des": "厂商OPPO-appId,示例:OP-12345678",
+                    "key": "OPPO_APPID"
+                },
+                "JPUSH_OPPO_APPSECRET":{
+                    "des": "厂商OPPO-appSecret,示例:OP-12345678",
+                    "key": "OPPO_APPSECRET"
+                },
+                "JPUSH_VIVO_APPKEY":{
+                    "des": "厂商VIVO-appkey,示例:12345678",
+                    "key": "com.vivo.push.api_key"
+                },
+                "JPUSH_VIVO_APPID":{
+                    "des": "厂商VIVO-appId,示例:12345678",
+                    "key": "com.vivo.push.app_id"
+                },
+                "JPUSH_MEIZU_APPKEY":{
+                    "des": "厂商MEIZU-appKey,示例:MZ-12345678",
+                    "key": "MEIZU_APPKEY"
+                },
+                "JPUSH_MEIZU_APPID":{
+                    "des": "厂商MEIZU-appId,示例:MZ-12345678",
+                    "key": "MEIZU_APPID"
+                },
+                "JPUSH_XIAOMI_APPKEY":{
+                    "des": "厂商XIAOMI-appKey,示例:MI-12345678",
+                    "key": "XIAOMI_APPKEY"
+                },
+                "JPUSH_XIAOMI_APPID":{
+                    "des": "厂商XIAOMI-appId,示例:MI-12345678",
+                    "key": "XIAOMI_APPID"
+                },
+                "JPUSH_HUAWEI_APPID":{
+                    "des": "厂商HUAWEI-appId,示例:appid=12346578",
+                    "key": "com.huawei.hms.client.appid"
+                },
+                "JPUSH_HONOR_APPID" : {
+                    "des" : "厂商HONOR-appId,示例:12346578",
+                    "key" : "com.hihonor.push.app_id"
+                },
+                "JPUSH_GOOGLE_API_KEY" : {
+                    "des" : "厂商google api_key,示例:g-12346578",
+                    "key" : "google_api_key"
+                },
+                "JPUSH_GOOGLE_APP_ID" : {
+                    "des" : "厂商google mobilesdk_app_id,示例:g-12346578",
+                    "key" : "google_app_id"
+                },
+                "JPUSH_GOOGLE_PROJECT_NUMBER" : {
+                    "des" : "厂商google project_number,示例:g-12346578",
+                    "key" : "gcm_defaultSenderId"
+                },
+                "JPUSH_GOOGLE_PROJECT_ID" : {
+                    "des" : "厂商google project_id ,示例:g-12346578",
+                    "key" : "project_id"
+                },
+                "JPUSH_GOOGLE_STORAGE_BUCKET" : {
+                    "des" : "厂商google storage_bucket,示例:g-12346578",
+                    "key" : "google_storage_bucket"
+                }
+            }
+        }
+    }
+}

+ 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/babel-runtime) for more information.
+
+## Install
+
+Using npm:
+
+```sh
+npm install --save @babel/runtime
+```
+
+or using yarn:
+
+```sh
+yarn add @babel/runtime
+```

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

@@ -0,0 +1,64 @@
+var OverloadYield = require("./OverloadYield.js");
+function AsyncGenerator(e) {
+  var r, t;
+  function resume(r, t) {
+    try {
+      var n = e[r](t),
+        o = n.value,
+        u = o instanceof OverloadYield;
+      Promise.resolve(u ? o.v : o).then(function (t) {
+        if (u) {
+          var i = "return" === r ? "return" : "next";
+          if (!o.k || t.done) return resume(i, t);
+          t = e[i](t).value;
+        }
+        settle(n.done ? "return" : "normal", t);
+      }, function (e) {
+        resume("throw", e);
+      });
+    } catch (e) {
+      settle("throw", e);
+    }
+  }
+  function settle(e, n) {
+    switch (e) {
+      case "return":
+        r.resolve({
+          value: n,
+          done: !0
+        });
+        break;
+      case "throw":
+        r.reject(n);
+        break;
+      default:
+        r.resolve({
+          value: n,
+          done: !1
+        });
+    }
+    (r = r.next) ? resume(r.key, r.arg) : t = null;
+  }
+  this._invoke = function (e, n) {
+    return new Promise(function (o, u) {
+      var i = {
+        key: e,
+        arg: n,
+        resolve: o,
+        reject: u,
+        next: null
+      };
+      t ? t = t.next = i : (r = t = i, resume(e, n));
+    });
+  }, "function" != typeof e["return"] && (this["return"] = void 0);
+}
+AsyncGenerator.prototype["function" == typeof Symbol && Symbol.asyncIterator || "@@asyncIterator"] = function () {
+  return this;
+}, AsyncGenerator.prototype.next = function (e) {
+  return this._invoke("next", e);
+}, AsyncGenerator.prototype["throw"] = function (e) {
+  return this._invoke("throw", e);
+}, AsyncGenerator.prototype["return"] = function (e) {
+  return this._invoke("return", e);
+};
+module.exports = AsyncGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;

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

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

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

@@ -0,0 +1,4 @@
+function _OverloadYield(t, e) {
+  this.v = t, this.k = e;
+}
+module.exports = _OverloadYield, module.exports.__esModule = true, module.exports["default"] = module.exports;

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

@@ -0,0 +1,24 @@
+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;

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

@@ -0,0 +1,236 @@
+var _typeof = require("./typeof.js")["default"];
+var setFunctionName = require("./setFunctionName.js");
+var toPropertyKey = require("./toPropertyKey.js");
+function old_createMetadataMethodsForProperty(e, t, a, r) {
+  return {
+    getMetadata: function getMetadata(o) {
+      old_assertNotFinished(r, "getMetadata"), old_assertMetadataKey(o);
+      var i = e[o];
+      if (void 0 !== i) if (1 === t) {
+        var n = i["public"];
+        if (void 0 !== n) return n[a];
+      } else if (2 === t) {
+        var l = i["private"];
+        if (void 0 !== l) return l.get(a);
+      } else if (Object.hasOwnProperty.call(i, "constructor")) return i.constructor;
+    },
+    setMetadata: function setMetadata(o, i) {
+      old_assertNotFinished(r, "setMetadata"), old_assertMetadataKey(o);
+      var n = e[o];
+      if (void 0 === n && (n = e[o] = {}), 1 === t) {
+        var l = n["public"];
+        void 0 === l && (l = n["public"] = {}), l[a] = i;
+      } else if (2 === t) {
+        var s = n.priv;
+        void 0 === s && (s = n["private"] = new Map()), s.set(a, i);
+      } else n.constructor = i;
+    }
+  };
+}
+function old_convertMetadataMapToFinal(e, t) {
+  var a = e[Symbol.metadata || Symbol["for"]("Symbol.metadata")],
+    r = Object.getOwnPropertySymbols(t);
+  if (0 !== r.length) {
+    for (var o = 0; o < r.length; o++) {
+      var i = r[o],
+        n = t[i],
+        l = a ? a[i] : null,
+        s = n["public"],
+        c = l ? l["public"] : null;
+      s && c && Object.setPrototypeOf(s, c);
+      var d = n["private"];
+      if (d) {
+        var u = Array.from(d.values()),
+          f = l ? l["private"] : null;
+        f && (u = u.concat(f)), n["private"] = u;
+      }
+      l && Object.setPrototypeOf(n, l);
+    }
+    a && Object.setPrototypeOf(t, a), e[Symbol.metadata || Symbol["for"]("Symbol.metadata")] = t;
+  }
+}
+function old_createAddInitializerMethod(e, t) {
+  return function (a) {
+    old_assertNotFinished(t, "addInitializer"), old_assertCallable(a, "An initializer"), e.push(a);
+  };
+}
+function old_memberDec(e, t, a, r, o, i, n, l, s) {
+  var c;
+  switch (i) {
+    case 1:
+      c = "accessor";
+      break;
+    case 2:
+      c = "method";
+      break;
+    case 3:
+      c = "getter";
+      break;
+    case 4:
+      c = "setter";
+      break;
+    default:
+      c = "field";
+  }
+  var d,
+    u,
+    f = {
+      kind: c,
+      name: l ? "#" + t : toPropertyKey(t),
+      isStatic: n,
+      isPrivate: l
+    },
+    p = {
+      v: !1
+    };
+  if (0 !== i && (f.addInitializer = old_createAddInitializerMethod(o, p)), l) {
+    d = 2, u = Symbol(t);
+    var v = {};
+    0 === i ? (v.get = a.get, v.set = a.set) : 2 === i ? v.get = function () {
+      return a.value;
+    } : (1 !== i && 3 !== i || (v.get = function () {
+      return a.get.call(this);
+    }), 1 !== i && 4 !== i || (v.set = function (e) {
+      a.set.call(this, e);
+    })), f.access = v;
+  } else d = 1, u = t;
+  try {
+    return e(s, Object.assign(f, old_createMetadataMethodsForProperty(r, d, u, p)));
+  } finally {
+    p.v = !0;
+  }
+}
+function old_assertNotFinished(e, t) {
+  if (e.v) throw new Error("attempted to call " + t + " after decoration was finished");
+}
+function old_assertMetadataKey(e) {
+  if ("symbol" != _typeof(e)) throw new TypeError("Metadata keys must be symbols, received: " + e);
+}
+function old_assertCallable(e, t) {
+  if ("function" != typeof e) throw new TypeError(t + " must be a function");
+}
+function old_assertValidReturnValue(e, t) {
+  var a = _typeof(t);
+  if (1 === e) {
+    if ("object" !== a || null === t) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
+    void 0 !== t.get && old_assertCallable(t.get, "accessor.get"), void 0 !== t.set && old_assertCallable(t.set, "accessor.set"), void 0 !== t.init && old_assertCallable(t.init, "accessor.init"), void 0 !== t.initializer && old_assertCallable(t.initializer, "accessor.initializer");
+  } else if ("function" !== a) throw new TypeError((0 === e ? "field" : 10 === e ? "class" : "method") + " decorators must return a function or void 0");
+}
+function old_getInit(e) {
+  var t;
+  return null == (t = e.init) && (t = e.initializer) && "undefined" != typeof console && console.warn(".initializer has been renamed to .init as of March 2022"), t;
+}
+function old_applyMemberDec(e, t, a, r, o, i, n, l, s) {
+  var c,
+    d,
+    u,
+    f,
+    p,
+    v,
+    y,
+    h = a[0];
+  if (n ? (0 === o || 1 === o ? (c = {
+    get: a[3],
+    set: a[4]
+  }, u = "get") : 3 === o ? (c = {
+    get: a[3]
+  }, u = "get") : 4 === o ? (c = {
+    set: a[3]
+  }, u = "set") : c = {
+    value: a[3]
+  }, 0 !== o && (1 === o && setFunctionName(a[4], "#" + r, "set"), setFunctionName(a[3], "#" + r, u))) : 0 !== o && (c = Object.getOwnPropertyDescriptor(t, r)), 1 === o ? f = {
+    get: c.get,
+    set: c.set
+  } : 2 === o ? f = c.value : 3 === o ? f = c.get : 4 === o && (f = c.set), "function" == typeof h) void 0 !== (p = old_memberDec(h, r, c, l, s, o, i, n, f)) && (old_assertValidReturnValue(o, p), 0 === o ? d = p : 1 === o ? (d = old_getInit(p), v = p.get || f.get, y = p.set || f.set, f = {
+    get: v,
+    set: y
+  }) : f = p);else for (var m = h.length - 1; m >= 0; m--) {
+    var b;
+    void 0 !== (p = old_memberDec(h[m], r, c, l, s, o, i, n, f)) && (old_assertValidReturnValue(o, p), 0 === o ? b = p : 1 === o ? (b = old_getInit(p), v = p.get || f.get, y = p.set || f.set, f = {
+      get: v,
+      set: y
+    }) : f = p, void 0 !== b && (void 0 === d ? d = b : "function" == typeof d ? d = [d, b] : d.push(b)));
+  }
+  if (0 === o || 1 === o) {
+    if (void 0 === d) d = function d(e, t) {
+      return t;
+    };else if ("function" != typeof d) {
+      var g = d;
+      d = function d(e, t) {
+        for (var a = t, r = 0; r < g.length; r++) a = g[r].call(e, a);
+        return a;
+      };
+    } else {
+      var _ = d;
+      d = function d(e, t) {
+        return _.call(e, t);
+      };
+    }
+    e.push(d);
+  }
+  0 !== o && (1 === o ? (c.get = f.get, c.set = f.set) : 2 === o ? c.value = f : 3 === o ? c.get = f : 4 === o && (c.set = f), n ? 1 === o ? (e.push(function (e, t) {
+    return f.get.call(e, t);
+  }), e.push(function (e, t) {
+    return f.set.call(e, t);
+  })) : 2 === o ? e.push(f) : e.push(function (e, t) {
+    return f.call(e, t);
+  }) : Object.defineProperty(t, r, c));
+}
+function old_applyMemberDecs(e, t, a, r, o) {
+  for (var i, n, l = new Map(), s = new Map(), c = 0; c < o.length; c++) {
+    var d = o[c];
+    if (Array.isArray(d)) {
+      var u,
+        f,
+        p,
+        v = d[1],
+        y = d[2],
+        h = d.length > 3,
+        m = v >= 5;
+      if (m ? (u = t, f = r, 0 != (v -= 5) && (p = n = n || [])) : (u = t.prototype, f = a, 0 !== v && (p = i = i || [])), 0 !== v && !h) {
+        var b = m ? s : l,
+          g = b.get(y) || 0;
+        if (!0 === g || 3 === g && 4 !== v || 4 === g && 3 !== v) 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: " + y);
+        !g && v > 2 ? b.set(y, v) : b.set(y, !0);
+      }
+      old_applyMemberDec(e, u, d, y, v, m, h, f, p);
+    }
+  }
+  old_pushInitializers(e, i), old_pushInitializers(e, n);
+}
+function old_pushInitializers(e, t) {
+  t && e.push(function (e) {
+    for (var a = 0; a < t.length; a++) t[a].call(e);
+    return e;
+  });
+}
+function old_applyClassDecs(e, t, a, r) {
+  if (r.length > 0) {
+    for (var o = [], i = t, n = t.name, l = r.length - 1; l >= 0; l--) {
+      var s = {
+        v: !1
+      };
+      try {
+        var c = Object.assign({
+            kind: "class",
+            name: n,
+            addInitializer: old_createAddInitializerMethod(o, s)
+          }, old_createMetadataMethodsForProperty(a, 0, n, s)),
+          d = r[l](i, c);
+      } finally {
+        s.v = !0;
+      }
+      void 0 !== d && (old_assertValidReturnValue(10, d), i = d);
+    }
+    e.push(i, function () {
+      for (var e = 0; e < o.length; e++) o[e].call(i);
+    });
+  }
+}
+function applyDecs(e, t, a) {
+  var r = [],
+    o = {},
+    i = {};
+  return old_applyMemberDecs(r, e, i, o, t), old_convertMetadataMapToFinal(e.prototype, i), old_applyClassDecs(r, e, o, a), old_convertMetadataMapToFinal(e, o), r;
+}
+module.exports = applyDecs, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 184 - 0
node_modules/@babel/runtime/helpers/applyDecs2203.js

@@ -0,0 +1,184 @@
+var _typeof = require("./typeof.js")["default"];
+function applyDecs2203Factory() {
+  function createAddInitializerMethod(e, t) {
+    return function (r) {
+      !function (e, t) {
+        if (e.v) throw new Error("attempted to call addInitializer after decoration was finished");
+      }(t), assertCallable(r, "An initializer"), e.push(r);
+    };
+  }
+  function memberDec(e, t, r, a, n, i, s, o) {
+    var c;
+    switch (n) {
+      case 1:
+        c = "accessor";
+        break;
+      case 2:
+        c = "method";
+        break;
+      case 3:
+        c = "getter";
+        break;
+      case 4:
+        c = "setter";
+        break;
+      default:
+        c = "field";
+    }
+    var l,
+      u,
+      f = {
+        kind: c,
+        name: s ? "#" + t : t,
+        "static": i,
+        "private": s
+      },
+      p = {
+        v: !1
+      };
+    0 !== n && (f.addInitializer = createAddInitializerMethod(a, p)), 0 === n ? s ? (l = r.get, u = r.set) : (l = function l() {
+      return this[t];
+    }, u = function u(e) {
+      this[t] = e;
+    }) : 2 === n ? l = function l() {
+      return r.value;
+    } : (1 !== n && 3 !== n || (l = function l() {
+      return r.get.call(this);
+    }), 1 !== n && 4 !== n || (u = function u(e) {
+      r.set.call(this, e);
+    })), f.access = l && u ? {
+      get: l,
+      set: u
+    } : l ? {
+      get: l
+    } : {
+      set: u
+    };
+    try {
+      return e(o, f);
+    } finally {
+      p.v = !0;
+    }
+  }
+  function assertCallable(e, t) {
+    if ("function" != typeof e) throw new TypeError(t + " must be a function");
+  }
+  function assertValidReturnValue(e, t) {
+    var r = _typeof(t);
+    if (1 === e) {
+      if ("object" !== r || null === t) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
+      void 0 !== t.get && assertCallable(t.get, "accessor.get"), void 0 !== t.set && assertCallable(t.set, "accessor.set"), void 0 !== t.init && assertCallable(t.init, "accessor.init");
+    } else if ("function" !== r) throw new TypeError((0 === e ? "field" : 10 === e ? "class" : "method") + " decorators must return a function or void 0");
+  }
+  function applyMemberDec(e, t, r, a, n, i, s, o) {
+    var c,
+      l,
+      u,
+      f,
+      p,
+      d,
+      h = r[0];
+    if (s ? c = 0 === n || 1 === n ? {
+      get: r[3],
+      set: r[4]
+    } : 3 === n ? {
+      get: r[3]
+    } : 4 === n ? {
+      set: r[3]
+    } : {
+      value: r[3]
+    } : 0 !== n && (c = Object.getOwnPropertyDescriptor(t, a)), 1 === n ? u = {
+      get: c.get,
+      set: c.set
+    } : 2 === n ? u = c.value : 3 === n ? u = c.get : 4 === n && (u = c.set), "function" == typeof h) void 0 !== (f = memberDec(h, a, c, o, n, i, s, u)) && (assertValidReturnValue(n, f), 0 === n ? l = f : 1 === n ? (l = f.init, p = f.get || u.get, d = f.set || u.set, u = {
+      get: p,
+      set: d
+    }) : u = f);else for (var v = h.length - 1; v >= 0; v--) {
+      var g;
+      void 0 !== (f = memberDec(h[v], a, c, o, n, i, s, u)) && (assertValidReturnValue(n, f), 0 === n ? g = f : 1 === n ? (g = f.init, p = f.get || u.get, d = f.set || u.set, u = {
+        get: p,
+        set: d
+      }) : u = f, void 0 !== g && (void 0 === l ? l = g : "function" == typeof l ? l = [l, g] : l.push(g)));
+    }
+    if (0 === n || 1 === n) {
+      if (void 0 === l) l = function l(e, t) {
+        return t;
+      };else if ("function" != typeof l) {
+        var y = l;
+        l = function l(e, t) {
+          for (var r = t, a = 0; a < y.length; a++) r = y[a].call(e, r);
+          return r;
+        };
+      } else {
+        var m = l;
+        l = function l(e, t) {
+          return m.call(e, t);
+        };
+      }
+      e.push(l);
+    }
+    0 !== n && (1 === n ? (c.get = u.get, c.set = u.set) : 2 === n ? c.value = u : 3 === n ? c.get = u : 4 === n && (c.set = u), s ? 1 === n ? (e.push(function (e, t) {
+      return u.get.call(e, t);
+    }), e.push(function (e, t) {
+      return u.set.call(e, t);
+    })) : 2 === n ? e.push(u) : e.push(function (e, t) {
+      return u.call(e, t);
+    }) : Object.defineProperty(t, a, c));
+  }
+  function pushInitializers(e, t) {
+    t && e.push(function (e) {
+      for (var r = 0; r < t.length; r++) t[r].call(e);
+      return e;
+    });
+  }
+  return function (e, t, r) {
+    var a = [];
+    return function (e, t, r) {
+      for (var a, n, i = new Map(), s = new Map(), o = 0; o < r.length; o++) {
+        var c = r[o];
+        if (Array.isArray(c)) {
+          var l,
+            u,
+            f = c[1],
+            p = c[2],
+            d = c.length > 3,
+            h = f >= 5;
+          if (h ? (l = t, 0 != (f -= 5) && (u = n = n || [])) : (l = t.prototype, 0 !== f && (u = a = a || [])), 0 !== f && !d) {
+            var v = h ? s : i,
+              g = v.get(p) || 0;
+            if (!0 === g || 3 === g && 4 !== f || 4 === g && 3 !== f) 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: " + p);
+            !g && f > 2 ? v.set(p, f) : v.set(p, !0);
+          }
+          applyMemberDec(e, l, c, p, f, h, d, u);
+        }
+      }
+      pushInitializers(e, a), pushInitializers(e, n);
+    }(a, e, t), function (e, t, r) {
+      if (r.length > 0) {
+        for (var a = [], n = t, i = t.name, s = r.length - 1; s >= 0; s--) {
+          var o = {
+            v: !1
+          };
+          try {
+            var c = r[s](n, {
+              kind: "class",
+              name: i,
+              addInitializer: createAddInitializerMethod(a, o)
+            });
+          } finally {
+            o.v = !0;
+          }
+          void 0 !== c && (assertValidReturnValue(10, c), n = c);
+        }
+        e.push(n, function () {
+          for (var e = 0; e < a.length; e++) a[e].call(n);
+        });
+      }
+    }(a, e, r), a;
+  };
+}
+var applyDecs2203Impl;
+function applyDecs2203(e, t, r) {
+  return (applyDecs2203Impl = applyDecs2203Impl || applyDecs2203Factory())(e, t, r);
+}
+module.exports = applyDecs2203, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 191 - 0
node_modules/@babel/runtime/helpers/applyDecs2203R.js

@@ -0,0 +1,191 @@
+var _typeof = require("./typeof.js")["default"];
+var setFunctionName = require("./setFunctionName.js");
+var toPropertyKey = require("./toPropertyKey.js");
+function applyDecs2203RFactory() {
+  function createAddInitializerMethod(e, t) {
+    return function (r) {
+      !function (e, t) {
+        if (e.v) throw new Error("attempted to call addInitializer after decoration was finished");
+      }(t), assertCallable(r, "An initializer"), e.push(r);
+    };
+  }
+  function memberDec(e, t, r, n, a, i, o, s) {
+    var c;
+    switch (a) {
+      case 1:
+        c = "accessor";
+        break;
+      case 2:
+        c = "method";
+        break;
+      case 3:
+        c = "getter";
+        break;
+      case 4:
+        c = "setter";
+        break;
+      default:
+        c = "field";
+    }
+    var l,
+      u,
+      f = {
+        kind: c,
+        name: o ? "#" + t : toPropertyKey(t),
+        "static": i,
+        "private": o
+      },
+      p = {
+        v: !1
+      };
+    0 !== a && (f.addInitializer = createAddInitializerMethod(n, p)), 0 === a ? o ? (l = r.get, u = r.set) : (l = function l() {
+      return this[t];
+    }, u = function u(e) {
+      this[t] = e;
+    }) : 2 === a ? l = function l() {
+      return r.value;
+    } : (1 !== a && 3 !== a || (l = function l() {
+      return r.get.call(this);
+    }), 1 !== a && 4 !== a || (u = function u(e) {
+      r.set.call(this, e);
+    })), f.access = l && u ? {
+      get: l,
+      set: u
+    } : l ? {
+      get: l
+    } : {
+      set: u
+    };
+    try {
+      return e(s, f);
+    } finally {
+      p.v = !0;
+    }
+  }
+  function assertCallable(e, t) {
+    if ("function" != typeof e) throw new TypeError(t + " must be a function");
+  }
+  function assertValidReturnValue(e, t) {
+    var r = _typeof(t);
+    if (1 === e) {
+      if ("object" !== r || null === t) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
+      void 0 !== t.get && assertCallable(t.get, "accessor.get"), void 0 !== t.set && assertCallable(t.set, "accessor.set"), void 0 !== t.init && assertCallable(t.init, "accessor.init");
+    } else if ("function" !== r) throw new TypeError((0 === e ? "field" : 10 === e ? "class" : "method") + " decorators must return a function or void 0");
+  }
+  function applyMemberDec(e, t, r, n, a, i, o, s) {
+    var c,
+      l,
+      u,
+      f,
+      p,
+      d,
+      h,
+      v = r[0];
+    if (o ? (0 === a || 1 === a ? (c = {
+      get: r[3],
+      set: r[4]
+    }, u = "get") : 3 === a ? (c = {
+      get: r[3]
+    }, u = "get") : 4 === a ? (c = {
+      set: r[3]
+    }, u = "set") : c = {
+      value: r[3]
+    }, 0 !== a && (1 === a && setFunctionName(r[4], "#" + n, "set"), setFunctionName(r[3], "#" + n, u))) : 0 !== a && (c = Object.getOwnPropertyDescriptor(t, n)), 1 === a ? f = {
+      get: c.get,
+      set: c.set
+    } : 2 === a ? f = c.value : 3 === a ? f = c.get : 4 === a && (f = c.set), "function" == typeof v) void 0 !== (p = memberDec(v, n, c, s, a, i, o, f)) && (assertValidReturnValue(a, p), 0 === a ? l = p : 1 === a ? (l = p.init, d = p.get || f.get, h = p.set || f.set, f = {
+      get: d,
+      set: h
+    }) : f = p);else for (var g = v.length - 1; g >= 0; g--) {
+      var y;
+      void 0 !== (p = memberDec(v[g], n, c, s, a, i, o, f)) && (assertValidReturnValue(a, p), 0 === a ? y = p : 1 === a ? (y = p.init, d = p.get || f.get, h = p.set || f.set, f = {
+        get: d,
+        set: h
+      }) : f = p, void 0 !== y && (void 0 === l ? l = y : "function" == typeof l ? l = [l, y] : l.push(y)));
+    }
+    if (0 === a || 1 === a) {
+      if (void 0 === l) l = function l(e, t) {
+        return t;
+      };else if ("function" != typeof l) {
+        var m = l;
+        l = function l(e, t) {
+          for (var r = t, n = 0; n < m.length; n++) r = m[n].call(e, r);
+          return r;
+        };
+      } else {
+        var b = l;
+        l = function l(e, t) {
+          return b.call(e, t);
+        };
+      }
+      e.push(l);
+    }
+    0 !== a && (1 === a ? (c.get = f.get, c.set = f.set) : 2 === a ? c.value = f : 3 === a ? c.get = f : 4 === a && (c.set = f), o ? 1 === a ? (e.push(function (e, t) {
+      return f.get.call(e, t);
+    }), e.push(function (e, t) {
+      return f.set.call(e, t);
+    })) : 2 === a ? e.push(f) : e.push(function (e, t) {
+      return f.call(e, t);
+    }) : Object.defineProperty(t, n, c));
+  }
+  function applyMemberDecs(e, t) {
+    for (var r, n, a = [], i = new Map(), o = new Map(), s = 0; s < t.length; s++) {
+      var c = t[s];
+      if (Array.isArray(c)) {
+        var l,
+          u,
+          f = c[1],
+          p = c[2],
+          d = c.length > 3,
+          h = f >= 5;
+        if (h ? (l = e, 0 != (f -= 5) && (u = n = n || [])) : (l = e.prototype, 0 !== f && (u = r = r || [])), 0 !== f && !d) {
+          var v = h ? o : i,
+            g = v.get(p) || 0;
+          if (!0 === g || 3 === g && 4 !== f || 4 === g && 3 !== f) 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: " + p);
+          !g && f > 2 ? v.set(p, f) : v.set(p, !0);
+        }
+        applyMemberDec(a, l, c, p, f, h, d, u);
+      }
+    }
+    return pushInitializers(a, r), pushInitializers(a, n), a;
+  }
+  function pushInitializers(e, t) {
+    t && e.push(function (e) {
+      for (var r = 0; r < t.length; r++) t[r].call(e);
+      return e;
+    });
+  }
+  return function (e, t, r) {
+    return {
+      e: applyMemberDecs(e, t),
+      get c() {
+        return function (e, t) {
+          if (t.length > 0) {
+            for (var r = [], n = e, a = e.name, i = t.length - 1; i >= 0; i--) {
+              var o = {
+                v: !1
+              };
+              try {
+                var s = t[i](n, {
+                  kind: "class",
+                  name: a,
+                  addInitializer: createAddInitializerMethod(r, o)
+                });
+              } finally {
+                o.v = !0;
+              }
+              void 0 !== s && (assertValidReturnValue(10, s), n = s);
+            }
+            return [n, function () {
+              for (var e = 0; e < r.length; e++) r[e].call(n);
+            }];
+          }
+        }(e, r);
+      }
+    };
+  };
+}
+function applyDecs2203R(e, t, r) {
+  return (module.exports = applyDecs2203R = applyDecs2203RFactory(), module.exports.__esModule = true, module.exports["default"] = module.exports)(e, t, r);
+}
+module.exports = applyDecs2203R, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 222 - 0
node_modules/@babel/runtime/helpers/applyDecs2301.js

@@ -0,0 +1,222 @@
+var _typeof = require("./typeof.js")["default"];
+var checkInRHS = require("./checkInRHS.js");
+var setFunctionName = require("./setFunctionName.js");
+var toPropertyKey = require("./toPropertyKey.js");
+function applyDecs2301Factory() {
+  function createAddInitializerMethod(e, t) {
+    return function (r) {
+      !function (e, t) {
+        if (e.v) throw new Error("attempted to call addInitializer after decoration was finished");
+      }(t), assertCallable(r, "An initializer"), e.push(r);
+    };
+  }
+  function assertInstanceIfPrivate(e, t) {
+    if (!e(t)) throw new TypeError("Attempted to access private element on non-instance");
+  }
+  function memberDec(e, t, r, n, a, i, s, o, c) {
+    var u;
+    switch (a) {
+      case 1:
+        u = "accessor";
+        break;
+      case 2:
+        u = "method";
+        break;
+      case 3:
+        u = "getter";
+        break;
+      case 4:
+        u = "setter";
+        break;
+      default:
+        u = "field";
+    }
+    var l,
+      f,
+      p = {
+        kind: u,
+        name: s ? "#" + t : toPropertyKey(t),
+        "static": i,
+        "private": s
+      },
+      d = {
+        v: !1
+      };
+    if (0 !== a && (p.addInitializer = createAddInitializerMethod(n, d)), s || 0 !== a && 2 !== a) {
+      if (2 === a) l = function l(e) {
+        return assertInstanceIfPrivate(c, e), r.value;
+      };else {
+        var h = 0 === a || 1 === a;
+        (h || 3 === a) && (l = s ? function (e) {
+          return assertInstanceIfPrivate(c, e), r.get.call(e);
+        } : function (e) {
+          return r.get.call(e);
+        }), (h || 4 === a) && (f = s ? function (e, t) {
+          assertInstanceIfPrivate(c, e), r.set.call(e, t);
+        } : function (e, t) {
+          r.set.call(e, t);
+        });
+      }
+    } else l = function l(e) {
+      return e[t];
+    }, 0 === a && (f = function f(e, r) {
+      e[t] = r;
+    });
+    var v = s ? c.bind() : function (e) {
+      return t in e;
+    };
+    p.access = l && f ? {
+      get: l,
+      set: f,
+      has: v
+    } : l ? {
+      get: l,
+      has: v
+    } : {
+      set: f,
+      has: v
+    };
+    try {
+      return e(o, p);
+    } finally {
+      d.v = !0;
+    }
+  }
+  function assertCallable(e, t) {
+    if ("function" != typeof e) throw new TypeError(t + " must be a function");
+  }
+  function assertValidReturnValue(e, t) {
+    var r = _typeof(t);
+    if (1 === e) {
+      if ("object" !== r || null === t) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
+      void 0 !== t.get && assertCallable(t.get, "accessor.get"), void 0 !== t.set && assertCallable(t.set, "accessor.set"), void 0 !== t.init && assertCallable(t.init, "accessor.init");
+    } else if ("function" !== r) throw new TypeError((0 === e ? "field" : 10 === e ? "class" : "method") + " decorators must return a function or void 0");
+  }
+  function curryThis2(e) {
+    return function (t) {
+      e(this, t);
+    };
+  }
+  function applyMemberDec(e, t, r, n, a, i, s, o, c) {
+    var u,
+      l,
+      f,
+      p,
+      d,
+      h,
+      v,
+      y,
+      g = r[0];
+    if (s ? (0 === a || 1 === a ? (u = {
+      get: (d = r[3], function () {
+        return d(this);
+      }),
+      set: curryThis2(r[4])
+    }, f = "get") : 3 === a ? (u = {
+      get: r[3]
+    }, f = "get") : 4 === a ? (u = {
+      set: r[3]
+    }, f = "set") : u = {
+      value: r[3]
+    }, 0 !== a && (1 === a && setFunctionName(u.set, "#" + n, "set"), setFunctionName(u[f || "value"], "#" + n, f))) : 0 !== a && (u = Object.getOwnPropertyDescriptor(t, n)), 1 === a ? p = {
+      get: u.get,
+      set: u.set
+    } : 2 === a ? p = u.value : 3 === a ? p = u.get : 4 === a && (p = u.set), "function" == typeof g) void 0 !== (h = memberDec(g, n, u, o, a, i, s, p, c)) && (assertValidReturnValue(a, h), 0 === a ? l = h : 1 === a ? (l = h.init, v = h.get || p.get, y = h.set || p.set, p = {
+      get: v,
+      set: y
+    }) : p = h);else for (var m = g.length - 1; m >= 0; m--) {
+      var b;
+      void 0 !== (h = memberDec(g[m], n, u, o, a, i, s, p, c)) && (assertValidReturnValue(a, h), 0 === a ? b = h : 1 === a ? (b = h.init, v = h.get || p.get, y = h.set || p.set, p = {
+        get: v,
+        set: y
+      }) : p = h, void 0 !== b && (void 0 === l ? l = b : "function" == typeof l ? l = [l, b] : l.push(b)));
+    }
+    if (0 === a || 1 === a) {
+      if (void 0 === l) l = function l(e, t) {
+        return t;
+      };else if ("function" != typeof l) {
+        var I = l;
+        l = function l(e, t) {
+          for (var r = t, n = 0; n < I.length; n++) r = I[n].call(e, r);
+          return r;
+        };
+      } else {
+        var w = l;
+        l = function l(e, t) {
+          return w.call(e, t);
+        };
+      }
+      e.push(l);
+    }
+    0 !== a && (1 === a ? (u.get = p.get, u.set = p.set) : 2 === a ? u.value = p : 3 === a ? u.get = p : 4 === a && (u.set = p), s ? 1 === a ? (e.push(function (e, t) {
+      return p.get.call(e, t);
+    }), e.push(function (e, t) {
+      return p.set.call(e, t);
+    })) : 2 === a ? e.push(p) : e.push(function (e, t) {
+      return p.call(e, t);
+    }) : Object.defineProperty(t, n, u));
+  }
+  function applyMemberDecs(e, t, r) {
+    for (var n, a, i, s = [], o = new Map(), c = new Map(), u = 0; u < t.length; u++) {
+      var l = t[u];
+      if (Array.isArray(l)) {
+        var f,
+          p,
+          d = l[1],
+          h = l[2],
+          v = l.length > 3,
+          y = d >= 5,
+          g = r;
+        if (y ? (f = e, 0 != (d -= 5) && (p = a = a || []), v && !i && (i = function i(t) {
+          return checkInRHS(t) === e;
+        }), g = i) : (f = e.prototype, 0 !== d && (p = n = n || [])), 0 !== d && !v) {
+          var m = y ? c : o,
+            b = m.get(h) || 0;
+          if (!0 === b || 3 === b && 4 !== d || 4 === b && 3 !== d) 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: " + h);
+          !b && d > 2 ? m.set(h, d) : m.set(h, !0);
+        }
+        applyMemberDec(s, f, l, h, d, y, v, p, g);
+      }
+    }
+    return pushInitializers(s, n), pushInitializers(s, a), s;
+  }
+  function pushInitializers(e, t) {
+    t && e.push(function (e) {
+      for (var r = 0; r < t.length; r++) t[r].call(e);
+      return e;
+    });
+  }
+  return function (e, t, r, n) {
+    return {
+      e: applyMemberDecs(e, t, n),
+      get c() {
+        return function (e, t) {
+          if (t.length > 0) {
+            for (var r = [], n = e, a = e.name, i = t.length - 1; i >= 0; i--) {
+              var s = {
+                v: !1
+              };
+              try {
+                var o = t[i](n, {
+                  kind: "class",
+                  name: a,
+                  addInitializer: createAddInitializerMethod(r, s)
+                });
+              } finally {
+                s.v = !0;
+              }
+              void 0 !== o && (assertValidReturnValue(10, o), n = o);
+            }
+            return [n, function () {
+              for (var e = 0; e < r.length; e++) r[e].call(n);
+            }];
+          }
+        }(e, r);
+      }
+    };
+  };
+}
+function applyDecs2301(e, t, r, n) {
+  return (module.exports = applyDecs2301 = applyDecs2301Factory(), module.exports.__esModule = true, module.exports["default"] = module.exports)(e, t, r, n);
+}
+module.exports = applyDecs2301, module.exports.__esModule = true, module.exports["default"] = module.exports;

+ 134 - 0
node_modules/@babel/runtime/helpers/applyDecs2305.js

@@ -0,0 +1,134 @@
+var _typeof = require("./typeof.js")["default"];
+var checkInRHS = require("./checkInRHS.js");
+var setFunctionName = require("./setFunctionName.js");
+var toPropertyKey = require("./toPropertyKey.js");
+function applyDecs2305(e, t, r, n, o, a) {
+  function i(e, t, r) {
+    return function (n, o) {
+      return r && r(n), e[t].call(n, o);
+    };
+  }
+  function c(e, t) {
+    for (var r = 0; r < e.length; r++) e[r].call(t);
+    return t;
+  }
+  function s(e, t, r, n) {
+    if ("function" != typeof e && (n || void 0 !== e)) throw new TypeError(t + " must " + (r || "be") + " a function" + (n ? "" : " or undefined"));
+    return e;
+  }
+  function applyDec(e, t, r, n, o, a, c, u, l, f, p, d, h) {
+    function m(e) {
+      if (!h(e)) throw new TypeError("Attempted to access private element on non-instance");
+    }
+    var y,
+      v,
+      g = t[0],
+      b = t[3],
+      w = !u;
+    if (!w) {
+      r || Array.isArray(g) || (g = [g]);
+      var S = {},
+        A = [],
+        P = 3 === o ? "get" : 4 === o || d ? "set" : "value";
+      f ? (p || d ? S = {
+        get: setFunctionName(function () {
+          return b(this);
+        }, n, "get"),
+        set: function set(e) {
+          t[4](this, e);
+        }
+      } : S[P] = b, p || setFunctionName(S[P], n, 2 === o ? "" : P)) : p || (S = Object.getOwnPropertyDescriptor(e, n));
+    }
+    for (var j = g.length - 1; j >= 0; j -= r ? 2 : 1) {
+      var D = g[j],
+        E = r ? g[j - 1] : void 0,
+        I = {},
+        O = {
+          kind: ["field", "accessor", "method", "getter", "setter", "field", "class"][o],
+          name: n,
+          metadata: a,
+          addInitializer: function (e, t) {
+            if (e.v) throw new Error("attempted to call addInitializer after decoration was finished");
+            s(t, "An initializer", "be", !0), c.push(t);
+          }.bind(null, I)
+        };
+      try {
+        if (w) v = D.call(E, e, O);else {
+          var k, F;
+          O["static"] = l, O["private"] = f, f || !p && 2 !== o ? 2 === o ? k = function k(e) {
+            return m(e), S.value;
+          } : ((o < 2 || 3 === o) && (k = i(S, "get", f && m)), (o < 2 || 4 === o) && (F = i(S, "set", f && m))) : (k = function k(e) {
+            return e[n];
+          }, p && (F = function F(e, t) {
+            e[n] = t;
+          }));
+          var N = O.access = {
+            has: f ? h.bind() : function (e) {
+              return n in e;
+            }
+          };
+          if (k && (N.get = k), F && (N.set = F), v = D.call(E, d ? {
+            get: S.get,
+            set: S.set
+          } : S[P], O), d) {
+            if ("object" == _typeof(v) && v) (y = s(v.get, "accessor.get")) && (S.get = y), (y = s(v.set, "accessor.set")) && (S.set = y), (y = s(v.init, "accessor.init")) && A.push(y);else if (void 0 !== v) throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
+          } else s(v, (p ? "field" : "method") + " decorators", "return") && (p ? A.push(v) : S[P] = v);
+        }
+      } finally {
+        I.v = !0;
+      }
+    }
+    return (p || d) && u.push(function (e, t) {
+      for (var r = A.length - 1; r >= 0; r--) t = A[r].call(e, t);
+      return t;
+    }), p || w || (f ? d ? u.push(i(S, "get"), i(S, "set")) : u.push(2 === o ? S[P] : i.call.bind(S[P])) : Object.defineProperty(e, n, S)), v;
+  }
+  function u(e, t) {
+    return Object.defineProperty(e, Symbol.metadata || Symbol["for"]("Symbol.metadata"), {
+      configurable: !0,
+      enumerable: !0,
+      value: t
+    });
+  }
+  if (arguments.length >= 6) var l = a[Symbol.metadata || Symbol["for"]("Symbol.metadata")];
+  var f = Object.create(null == l ? null : l),
+    p = function (e, t, r, n) {
+      var o,
+        a,
+        i = [],
+        s = function s(t) {
+          return checkInRHS(t) === e;
+        },
+        u = new Map();
+      function l(e) {
+        e && i.push(c.bind(null, e));
+      }
+      for (var f = 0; f < t.length; f++) {
+        var p = t[f];
+        if (Array.isArray(p)) {
+          var d = p[1],
+            h = p[2],
+            m = p.length > 3,
+            y = 16 & d,
+            v = !!(8 & d),
+            g = 0 == (d &= 7),
+            b = h + "/" + v;
+          if (!g && !m) {
+            var w = u.get(b);
+            if (!0 === w || 3 === w && 4 !== d || 4 === w && 3 !== d) 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: " + h);
+            u.set(b, !(d > 2) || d);
+          }
+          applyDec(v ? e : e.prototype, p, y, m ? "#" + h : toPropertyKey(h), d, n, v ? a = a || [] : o = o || [], i, v, m, g, 1 === d, v && m ? s : r);
+        }
+      }
+      return l(o), l(a), i;
+    }(e, t, o, f);
+  return r.length || u(e, f), {
+    e: p,
+    get c() {
+      var t = [];
+      return r.length && [u(s(applyDec(e, [r], n, e.name, 5, f, t), "class decorators", "return") || e, f), c.bind(null, t, e)];
+    }
+  };
+}
+module.exports = applyDecs2305, module.exports.__esModule = true, module.exports["default"] = module.exports;

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů